【问题标题】:I am trying to make my SCNNode rotate but I cannot seem to get it to work我试图让我的 SCNNode 旋转,但我似乎无法让它工作
【发布时间】:2020-05-17 01:24:31
【问题描述】:

我的SCNNode 是一个我想向北旋转的指南针。

compassNode = scene?.rootNode.childNodes[0]

我已成功获取航向数据并将其转换为弧度并将其存储在一个名为角度的变量中。

angle = newHeading.trueHeading.toRadians

我现在尝试了三种方法:

rotate = SCNAction.rotate(by: CGFloat(angle), around: SCNVector3(0, 1, 0), duration: 0.5)
compassNode?.runAction(rotate)

compassNode?.rotation = SCNVector4Make(0, 1, 0, Float(angle))

let oldTransform = compassNode?.transform
let newTransform = SCNMatrix4MakeRotation(Float(angle), 0, 1, 0)
SCNTransaction.begin()
SCNTransaction.animationDuration = 0.5
compassNode?.transform = SCNMatrix4Mult(newTransform, oldTransform!)
SCNTransaction.commit()

他们都没有对指南针进行任何明显的转变。它似乎是静止的。

【问题讨论】:

  • 一些建议:确定 compassNode 是 child[0]?改变它的位置 x+10 什么的,确保它移动。尝试对角度值进行硬编码 - 确保它在做你认为应该做的事情。尝试先将其旋转到位,然后再围绕某物旋转
  • @Voltan 我可以通过改变 x 值来改变它的位置。因为当我创建场景时,我使用了作为场景的指南针模型文件,所以它应该是场景中的事物列表中的 child[0]。本质上,我确实希望指南针旋转。我只是想绕 y 轴旋转和旋转是一样的吗?
  • 好的,那么节点就好了。我确实认为'around'有效,但它可能取决于节点的枢轴点以及模型是否以正确的旋转开始(我可以提供如何做到这一点的链接),但这就是为什么我建议对角度进行硬编码,这样在 90 度时,你确定它指向你认为它应该指向的点,然后你就可以回到数学问题中了。
  • @Voltan 如何将其硬编码为指向 90 度?另外我认为我可能对枢轴点有问题。我相信它可能不是指南针的死点,而是在它和指针之间。

标签: swift scenekit scnnode


【解决方案1】:

评论字符用完了......对不起 - 必须把它放在答案部分。

将 90 度转换为弧度,旋转到那个值。旋转模型在 3D 中可能会令人困惑(无论如何对我来说),有时首先使用 SCNBox 会更容易 - 如果您没有更改相机视图,则默认情况下它会具有正确的旋转,前提是您向下看 -Z。您可以打开 3D 轮廓,有时这有助于提供更好的视觉效果,或者只是用不同颜色的纹理贴图框,这样红色是顶部,绿色是前面或其他。

然后你可以重塑盒子,以不同的角度旋转它,直到你掌握了rotateTo、rotateBy、rotateAround的窍门。我不是数学大师,所以不幸的是,有时对我来说是反复试验,但一旦我了解发生了什么,我就可以将模型放入并知道我的数学有效 - 然后如果我必须对模型做一些工作,例如枢轴点或需要更改模型 - 设置 Z-UP 或其他任何东西(这篇文章:59766878),然后我一次只专注于一件事,而不是要解决一系列问题。

我还使用了 lookAt 并将各种(隐藏的)节点放置在特定位置,以便我可以看到 X、Y、Z 旋转在游戏中不同点和不同视角的样子。

【讨论】:

  • 我的意思是不能任意旋转它。我尝试将它旋转 180 度,这只是弧度的 pi,它不会移动。我还没有找到有效的方法。它不像指南针是对称的,我只是不知道它是否移动了。朝北的一侧故意更长,末端有一个箭头。
  • 让我们放慢速度,看看会发生什么:vRotate1 = SCNAction.rotateBy(x: 0, y: CGFloat(GLKMathDegreesToRadians(450)), z: 0, duration: 3)
  • 所以我试了一下,做了 compassNode?.runAction(vRotate1) 什么也没发生
  • 好的,你的渲染循环是什么样的 - RU 使用 SCNSceneRendererDelegate?
  • 改变?至 ! - 强制它,如果它崩溃你的节点不正确
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-14
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 2017-01-18
  • 2017-12-04
相关资源
最近更新 更多