我有一个循环,其中更新了sceneView
的{{1}}属性的位置。我很惊讶地看到更新位置之后,pointOfView
方法仍然返回相同的值。我想念什么?
projectPoint
答案 0 :(得分:1)
这些值不会更新,因为您在一次渲染过程中多次设置了sceneView.pointOfView.position
。 SceneKit不会应用这些值,这就是projectPoint()
总是返回相同值的原因。
如果将两个projectPoint()
调用包含在持续时间为零的SCNTransaction
块中,则会看到值已更改:
SCNTransaction.begin()
SCNTransaction.animationDuration = 0
let pos = SCNVector3(Float(arc4random()), Float(arc4random()), Float(arc4random()))
let a = SCNVector3(3,4,5)
print("Projecting before updating pointOfView position \(scnView.projectPoint(a))")
scnView.pointOfView!.position = pos
SCNTransaction.commit()
SCNTransaction.begin()
SCNTransaction.animationDuration = 0
print("Projecting after updating pointOfView position \(scnView.projectPoint(a))")
SCNTransaction.commit()
但是,这会减慢循环的执行时间,因为SCNTransaction
会自动将所有更改应用于演示场景图。我测试时花了两倍的时间。
如果这是一个问题,那么我想您将不得不推出自己的projectPoint()