如何只用4D向量表示旋转?

时间:2018-02-10 12:28:45

标签: 3d rotation scenekit

我正在学习如何使用SceneKit,我对涉及SCNVector4的方法/属性非常困惑,例如SCNPhysicsBody.applyTorqueSCNNode.rotation。显然,您可以使用4个值表示3D对象的旋转。我不明白为什么会这样。

我在网上搜索"用4d矢量表示3d旋转"并发现很多关于4D空间旋转的东西,这不是我想要的。我也看到很多关于罪和cos的网页,但我不明白他们的意思。我对sin和cos的了解仅限于找到直角三角形的角度/边长。

在我看来,3D对象的旋转需要用7个值表示,即7D向量:

  • 旋转轴一端位置的3个值
  • 旋转轴另一端位置的3个值
  • 您按
  • 旋转的角度的1个值

我认为我很了解SpriteKit中的2D旋转:每个节点都有一个锚点,因此rotation属性就是关于锚点的弧度。但是,我无法在SCNNode中找到这样的定位点。当我查找"锚点scnnode"我得到关于ARSCNNode的东西,这不是我想要的。

我还看了this,其中说:

  

x,y和z分量确定旋转轴,而w分量确定旋转角度,即扭矩的大小。

只有x,y,z组件如何指定旋转轴?

你能解释一下我如何能够解决这种疯狂问题吗?

2 个答案:

答案 0 :(得分:3)

  

我猜现在问题变成“节点上的哪个地方是'起源'”

由(减去)SCNNode.positionsource)给出。这是相对于其父节点应用于它的转换。

  

......以及“你如何用3个标量表达2个角度”......

根据Euler's Displacement Theorem 3D中的任何旋转都可以用轴和旋转角度表示。这些可以反过来存储为:

  1. 两个(建议为@OliverCharlesworth)指定轴的2个球面极角和另一个旋转角
  2. 或平行于轴的矢量,其大小与围绕它的顺时针(或逆时针)旋转成比例;这是例如通常如何表示角速度
  3. SceneKit仅使用4D向量来避免必须以笛卡尔坐标((1)所需)重新计算轴或检索角度(对于(2))。

      

    在我看来,3D对象的旋转需要用7来表示   值,即7D向量:

         
        
    • 旋转轴一端位置的3个值
    •   
    • 旋转轴另一端位置的3个值
    •   
    • 您按
    • 旋转的角度的1个值   

    问题在于:您对“轴”这个词的两个定义感到困惑,可能是:

    • 空间中的固定线,例如X轴
    • 一系列行彼此平行的方向

    按照惯例,第二个用于指定旋转。此旋转的中心是节点的中心位置(通常是其AABB的中点)。

答案 1 :(得分:0)

我意识到我可以编写一些“SceneKit控制台”来测试向量中的四个值的作用。

我将文本字段,按钮和SCNView放入视图控制器的视图中。在场景中,我添加了一个带有运动物理体的地面节点和一个带有动态物理体的盒子节点。然后我做了这个,以便当点击按钮时,在文本字段中输入的命令将运行。这就是我解析命令的方法:

func executeCommand(_ command: String) {
    let parts = command.components(separatedBy: " ")
    let node: SCNNode
    guard let nodeString = parts.first else { return }
    switch nodeString {
    case "box": node = box
    case "ground": node = ground
    default: return
    }
    guard let selector = parts.dropFirst().first else { return }
    switch selector {
    case "applyTorque":
        if parts.count == 6 {
            let x = Double(parts[2])!
            let y = Double(parts[3])!
            let z = Double(parts[4])!
            let w = Double(parts[5])!
            let direction = SCNVector4(x, y, z, w)
            node.physicsBody?.applyTorque(direction, asImpulse: true)
        }
    // I decided to add other commands as well, but they're irrelevant so I left them out
    default: break
    }
}

现在,我尝试输入box applyTorque 1 0 0 1之类的命令,看看发生了什么。以下是我的发现:

  • 前三个值分别代表节点绕x,y和z轴旋转的程度。
  • 最后一个值似乎就像一个“整体力量”。如果我将其设置为0,则无论其他值是什么,该框都不会移动。
  • 围绕y轴的旋转似乎“更容易”。 Y值为1可以将立方体“旋转”90度,但X值为1只能使盒子从一侧抬起一点点。

以下是截图:

enter image description here