【问题标题】:Scenekit rotate node to face tapped pointScenekit 旋转节点以面对点击点
【发布时间】:2018-12-24 08:42:53
【问题描述】:

我正在使用默认的 scenekit 游戏项目来尝试实现一些点击控件来让飞船四处飞行,这是该项目附带的默认控件。我想弄清楚的是如何旋转我的船头以面对屏幕上点击的点。我一直在关注我见过的所有例子,并想出了这个:

let point:CGPoint = sender.location(in: sender.view)
let deltaY:Float = Float(point.y) - ship.position.y
let deltaX:Float = Float(point.x) - ship.position.x
let degreesToRadians = Float.pi / 180
let angle = atan2(deltaY, deltaX) + (90 * degreesToRadians)
ship.rotation = SCNVector4(0,1,0,angle)

需要注意的几点:

  • 我不会更改装载船舶的 rotationposition,这两个属性都打印为每个点的 0
  • 当我加载项目时,船指向下方。据我了解,您需要将 angle 的计算偏移为 0 度,这就是我在 angle 计算中使用 + (90 * degreesToRadians) 的原因。

当我用手指在船周围轻敲一圈时,船会从 0 度到 90 度以 90 度的弧度旋转。以防万一不清楚(或不正确),无论我在屏幕上的哪个位置点击,它都会在东方和北方之间移动。

最后一件事要注意。我的相机被锁定为俯视图,所以我只想旋转 Y 轴,这是方向和第一个加载位置的快速截图:

如果您有任何提示、想法或知识可以发送给我,那就太好了。这个问题把我难住了。

【问题讨论】:

    标签: ios swift scenekit


    【解决方案1】:

    您已接近尾声,您只缺少几个转换步骤。

    先在views坐标中转换tap的位置,这个和你的代码一样,只是名字不同。

    let viewPoint = gestureRecognize.location(in: scnView)
    

    由于视图是 2D 而 SCNScene 是 3D,因此您需要使用 scnView.unprojectPoint 转换为场景坐标。

    let camera = cameraNode.camera
    let distance = camera.zFar - camera.zNear / cameraNode.position.y
    let scenePoint = scnView.unprojectPoint(SCNVector3(viewPoint.x, viewPoint.y, CGFloat(distance)))
    

    然后计算角度。在您的情况下,重要的是您正向下看,因此您要使用的轴是 X 和 Z。此外,正 X 在右侧,但正 Z 指向下方,需要考虑到这一点。

    let deltaZ = scenePoint.z - ship.position.z
    let deltaX = scenePoint.x - ship.position.x
    let angle = atan2(deltaZ, deltaX) - .pi / 2
    ship.rotation = SCNVector4(0, -1, 0, angle)
    

    应该这样做。也不是说如果您的相机旋转了任何不是 90 度的倍数的量,那么 2D -> 3D 转换和角度计算将更加复杂,因为它不像将一个轴视为另一个轴那么简单。


    编辑 - 跨越 0/360 度边界的旋转

    您需要检查顺时针或逆时针旋转是否需要更多移动并更新角度。

    if abs(angle - .pi * 2 - ship.rotation.w) < abs(angle - ship.rotation.w) {
        angle -= .pi * 2
    }
    

    另外,我认为四元数可能会自动处理此问题,但我对它们还不够熟悉,无法发布解决方案。

    【讨论】:

    • 这很好用,谢谢。只需几个可选和数字类型的修复,一切都很好。一个小问题是,当我使用SCNAction.rotate(toAxisAngle: rotationVector, duration: 0.5) 对其进行动画处理时,节点不会越过 360 度/0 度边界,它会一直返回动画。这绝对是有道理的......从 360 到 0,你有没有处理过这样的事情?
    • 哇,太棒了,谢谢你。我以前研究过四元数,但我刚刚进入所有这些东西,他们让我很困惑哈哈,所以我现在就坚持下去。再说一次,你真的帮助我理解了这些东西,我真的很感激!
    猜你喜欢
    • 2018-12-17
    • 2016-07-22
    • 2015-07-10
    • 2017-04-25
    • 2018-07-05
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多