SCNNode 枢轴位置

Posted

技术标签:

【中文标题】SCNNode 枢轴位置【英文标题】:SCNNode Pivot Location 【发布时间】:2019-05-02 05:22:34 【问题描述】:

假设我有 2 个SCNNodes node1 和 node2。

我希望 node1 的位置为node1.position = SCNVector3(0, 0, 0)

我希望 node2 的位置为node2.position = SCNVector3(0, 0, 1)

现在,我希望 node2 围绕 node1 旋转。因此,我尝试这样做,node2.pivot = self.phone.pivot = SCNMatrix4MakeTranslation(0, 0, -1)

这提供了它围绕 node1 旋转的位置,这样如果我将 node2 旋转 Pi/2,那么它就在节点的顶部,即,如果我旋转 node1.rotate(Double.pi/2, 0, 0),它实际上是在 node1 的顶部。

如何在 ndoe2 围绕 node1 旋转的位置获得它?

编辑1:

self.container = SCNNode()
self.container.position = SCNVector3(0, 0, 0)

self.node2 = SCNNode(geometry: geom2)
self.node2.position = SCNVector3(0, 0, 1)
self.container.addChildNode(self.node2)

let constraint = SCNLookAtConstraint(target: self.node2)
constraint.isGimbalLockEnabled = false

self.node1 = SCNNode(geometry: geom)
self.node1.position = SCNVector(0, 0, 0)
self.node1.constraints = [constraint]

Node1 从不移动,因为 node2 从不移动。即,node2 将始终位于位置(0, 0, 1),因为容器是唯一旋转的东西。

【问题讨论】:

我刚刚在操场上进行了测试,正如预期的那样,node1 确实与 node2 一起旋转 见鬼,我会再试一次,哈哈。 你的工作是不可能的...node2 永远不会移动,因为它总是在位置上。我在操场上,正如预期的那样,当我旋转时,node2 会旋转,但是,node1 不会移动。 node2 卡在位置 (0, 0, 1) 并且从未真正移动过。因此,node1 永远不会旋转。 【参考方案1】:

如果您根本不想处理 pivot 元素,请使用节点层次结构。

这样的东西应该可以工作

- node1
|
| - rotation center
  | - node 2

然后旋转旋转中心,而不是直接旋转节点2。由于一个节点总是围绕它的坐标中心旋转,并且一个节点的坐标空间总是相对于它的父节点,这很好。

【讨论】:

虽然我通常同意,但我正在尝试拥有第三个节点,look(at:) 另一个节点。如果我只是在你的情况下旋转一个中心节点node1node2 永远不会真正移动,因此,我如何将它转移到look(at:) node2 确实移动了,SCNLookAtConstraint 应该可以正常工作。 我不能使用 SCNLookAtConstraint,因为我需要在轴以特定方式旋转时更改它们。即,现在最好的选择是创建一个枢轴

以上是关于SCNNode 枢轴位置的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 如何更改SCNNode对象的Pivot

如何在不重置 SCNNode 位置的情况下重置 SCNNode 的 SCNPhysicsBody?

更改 SCNNode 位置而不更改方向

未经许可将 SCNNode 向北旋转以进行位置跟踪

在 ARKit 中检测对 SCNNode 不同位置的触摸

多次添加 SCNNode 只显示一次