【问题标题】:Does performing a SCNAction on a SCNNode change the nodes position?在 SCNNode 上执行 SCNAction 会改变节点位置吗?
【发布时间】:2015-07-14 07:07:42
【问题描述】:

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

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

【问题讨论】:

    标签: scenekit scnnode


    【解决方案1】:

    A.position 在您创建操作时被评估一次且仅一次:

    [SCNAction moveTo:A.position]
    

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

    【讨论】:

    • 那么,是否有可能创建一个自定义的动作块来计算节点在任何给定时刻的位置?
    【解决方案2】:

    我知道这是一个老问题,但您可以使用距离为零的 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 编写的,但很容易翻译回来。

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

    【讨论】:

      猜你喜欢
      • 2015-04-17
      • 2016-11-18
      • 2019-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多