9

我玩 SCNNode 对象已经有一段时间了,我迷失了 Pivot。如何更改 SCNNode 的枢轴(SCNBox 作为条形)并将枢轴放置在条形的边缘之一上?

4

2 回答 2

17

一个节点的是一个变换矩阵,它的逆矩阵在其属性生效pivot之前应用于该节点。transform例如,看一下 Xcode 中默认的 SceneKit 游戏模板中的这一点:

let boxNode = SCNNode()
boxNode.geometry = SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0.02)

如果您设置boxNode's position,该点对应于立方体的中心,如果您旋转它(就像动画中的模板所做的那样),它会围绕其中心旋转。

要更改锚点,请将 设置pivot为平移变换:

boxNode.pivot = SCNMatrix4MakeTranslation(0.5, 0.5, 0.5)

现在,当您设置该position点对应于立方体的右上角,当您旋转立方体时,它会围绕该角旋转。

更一般地,枢轴相对于节点自身的变换来变换节点的内容。假设您想模拟地球自转轴的进动。您可以通过创建两个动画来做到这一点:一个动画pivot使节点围绕其自己的 Y 轴旋转,另一个动画rotation使该轴相对于包含节点的空间移动。

于 2014-07-14T22:18:43.953 回答
4

On the pivot topic:

Just in case you do not have dimensions for your geometry/node something like this might help (especially for SCNText).

var minVec = SCNVector3Zero
var maxVec = SCNVector3Zero

if node.getBoundingBoxMin(&minVec, max: &maxVec) {

    let bound = SCNVector3(x: maxVec.x + minVec.x,
                           y: maxVec.y + minVec.y,
                           z: maxVec.z + minVec.z)
  
    node.pivot = SCNMatrix4MakeTranslation(bound.x / 2, 
                                           bound.y / 2, 
                                           bound.z / 2)
}
于 2014-10-18T21:23:20.120 回答