【问题标题】:Scenekit - multiple rotation of SCNNode and direction of axesScenekit - SCNNode 的多次旋转和轴的方向
【发布时间】:2018-03-22 16:01:34
【问题描述】:

我有一个 SCNNode,我以 90 度为增量继续以平移手势旋转。前几次旋转按预期工作,在节点轴沿相反方向旋转的情况下,旋转以错误的方向执行。每次旋转后如何确定轴的方向?

场景(为简单起见使用立方体):

  • 我将立方体沿 Y 轴旋转 90 度。 Y 指向上方,X 现在指向相机,Z 指向右侧
  • 我再次将立方体沿 Y 旋转 90 度。X 现在指向左侧,Z 指向相机
  • 问题 - 我现在尝试沿 X 轴旋转 90 度。因为 X 旋转了 180 度,所以现在反转了。

我如何理解何时旋转 (-1,0,0) 以及何时旋转 (1,0,0) ?

我对 3D 数学世界很陌生,希望我正确解释了我的问题。

【问题讨论】:

    标签: ios swift 3d rotation scenekit


    【解决方案1】:

    经过进一步研究,我意识到我选择了完全错误的方法。实现我想要的方法是使用 rootNode 的轴旋转节点 - 这样我就不需要担心节点的局部轴。

    编辑:根据 Xartec 的建议更新代码

    let rotation = SCNMatrix4MakeRotation(angle,  x, y, Float(0))
    let newTransform = SCNMatrix4Mult(bricksNode.transform, rotation)
    let animation = CABasicAnimation(keyPath: "transform")
    animation.fromValue = bricksNode.transform
    animation.toValue = scnScene.rootNode.convertTransform(newTransform,from: nil)
    animation.duration = 0.5
    bricksNode.addAnimation(animation, forKey: nil)
    

    【讨论】:

    • 使用另一个节点本质上代表世界空间并不是实现您想要的最直接的方法。如果场景,您可以使用 rootNode 而不是虚拟节点。而不是 worldTransform,您可以使用 .transform 并以相反的顺序将矩阵相乘。
    • 感谢 Xartec 的宝贵意见,我会更新答案!
    • 如果我可以再问一个问题 - 如果旋转节点的位置不是 (0,0,0) 是否同样适用?
    • 不,对于在不同位置有父节点并且可能旋转的节点,事情会变得更加复杂。请在此处查看我对您的问题的解决方案,以获得更完整的方法。 stackoverflow.com/questions/46723827/…
    猜你喜欢
    • 2018-03-15
    • 2020-04-24
    • 2014-12-05
    • 2015-02-14
    • 2013-03-24
    • 2017-08-31
    • 2020-04-07
    • 2018-07-09
    • 2014-10-07
    相关资源
    最近更新 更多