首页 文章

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

提问于
浏览
0

我想知道是否有人知道你是否在一个节点上执行 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 的更新位置?

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

已解决的问题

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

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

2 回答

  • 0

    在创建操作时,A.position仅进行一次评估:

    [SCNAction moveTo:A.position]
    

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

  • 0

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

    您也可以简单地在 B 上创建一个指定 A 的属性。然后,对于 B,使用自定义操作来访问它。 e.g.

    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 但很容易翻译回来。

    这种事情像火焰一样丑陋,但苹果并没有真正提供任何干净的方式来通过一系列行动来沟通国家。

相关问题