我玩 SCNNode 对象已经有一段时间了,我迷失了 Pivot。如何更改 SCNNode 的枢轴(SCNBox 作为条形)并将枢轴放置在条形的边缘之一上?
问问题
11696 次
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 回答