0

我想知道是否有人知道您是否在节点上执行 SCNAction,有没有办法在该节点执行操作时,您可以找到它在场景坐标系中的位置?

假设我有两个 SCNNodes A 和 B ...

SCNNode *A, *B;

我想为 A 运行一个 SCNAction

A.position = SCNVector3Make(0.0,0.0,0.0);
[A runAction:[SCNAction moveTo:SCNVector3Make(10.0,0.0,0.0)]];

当 A 运行它的动作时,B 是否实时跟随它?

[B runAction:[SCNAction repeatActionForever:[SCNAction moveTo:A.position]]];

所以每次 B 重复给定一个新的更新位置 A 移动到。

我遇到的问题是,即使我将 A 的presentationNode 设置为上面的 SCNAction,它仍然会返回我设置的初始输入(这是有道理的),但是如何获得 A 的更新位置?

旁注:当我采用 A.presentationNode.position 时,我得到默认的零向量

已解决的问题

经过进一步研究,我发现了如何使用 SCNSceneRendererDelegate 然后创建了一个(void)方法来更新节点 A 的位置,然后在同一个方法中我有一个 SCNAction 将 B 移动到 A 的更新位置。

如果有人遇到类似问题或只想查看代码,请告诉我,我会发布!

4

2 回答 2

0

A.position当您创建操作时,仅评估一次:

[SCNAction moveTo:A.position]

这里不涉及任何块,让您有机会随着时间的推移自定义操作。

于 2015-05-04T19:19:17.093 回答
0

我知道这是一个老问题,但您可以使用距离为零的 SCNDistanceConstraint。

您也可以简单地在 B 上创建一个您将 A 分配给的属性。然后,对于 B,使用自定义操作来访问它。例如

class BNode : SCNNode
   var ANodeInstance : SCNNode? = nil

   init(withANode: SCNNode) {
     super.init()
     self.ANodeInstance = withANode
   }
}

B.runAction(SCNAction.repeatActionForever(
    SCNAction.customAction(duration: duration, action: { (node, timeElapsed) in
        let selfAsBNode = node as! BNode
        selfAsBNode.position = selfAsBNode.ANodeInstance.position
    })

抱歉,它在 Swift 中而不是在 Objective-C 中,但它很容易翻译回来。

这种事情是丑陋的,但苹果并没有真正提供任何干净的方式来通过一系列动作来传达状态。

于 2018-07-01T13:04:01.267 回答