Swift - 如何更改SCNNode对象的Pivot

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift - 如何更改SCNNode对象的Pivot相关的知识,希望对你有一定的参考价值。

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

答案

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

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

如果你设置boxNodeposition,那个点对应于立方体的中心,如果你旋转它(就像模板在动画中那样),它会围绕它的中心旋转。

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

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

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

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

另一答案

在pivot主题:

如果您没有几何体/节点的尺寸,这样的东西可能会有所帮助(特别是对于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)
}

以上是关于Swift - 如何更改SCNNode对象的Pivot的主要内容,如果未能解决你的问题,请参考以下文章

swift:安全访问 SCNNode 数组的字典

将 collada (dae) 文件加载到 SCNNode (Swift - SceneKit)

Swift 3 将 .dae 文件加载到 SCNNode

更改 SCNNode 位置而不更改方向

如何将 ARKit SCNNode 对象位置 SCNVector3 转换为纬度和经度? [关闭]

如何检索 PIV 卡的打印信息容器?