在SCNNode上执行SCNAction是否会更改节点位置?

时间:2015-05-04 18:59:17

标签: scenekit scnnode

我想知道是否有人知道你是否在一个节点上执行SCNAction,当节点执行动作时有没有办法,你可以在哪里找到它在场景坐标系中的位置?

假设我有两个SCNNode 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的更新位置? / p>

旁注:当我拿A.presentationNode.position时,我得到默认的零矢量

已解决的问题

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

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

2 个答案:

答案 0 :(得分:0)

创建操作时,

A.position只会被评估一次:

[SCNAction moveTo:A.position]

此处没有涉及任何阻止,让您有机会随着时间的推移自定义操作。

答案 1 :(得分:0)

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

您也可以简单地在分配A的B上创建一个属性。然后,对于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中,但是翻译回去很容易。

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