0

ノードで SCNAction を実行するかどうかを誰かが知っているかどうか疑問に思っていましたが、そのノードがアクションを実行している間に、シーン座標系での位置を見つける方法はありますか?

2 つの 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 を取得すると、デフォルトの Zero Vector が取得されます

解決済みの質問

さらに調査した結果、SCNSceneRendererDelegate の使用方法を見つけ、ノード A の位置を更新する (void) メソッドを作成し、同じメソッド内で B を A の更新位置に移動する SCNAction を作成しました。

誰かが同様の問題を抱えていたり、コードを見たい場合は、私に知らせてください。投稿します!

4

2 に答える 2

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
    })

申し訳ありませんが、Objective-C ではなく Swift ですが、元に戻すのは非常に簡単です。

この種のことは非常に醜いですが、Apple は一連のアクションを通じて状態を伝達する明確な方法を実際には提供していません。

于 2018-07-01T13:04:01.267 に答える