【问题标题】:SceneKit `projectPoint` issue after updating sceneView's pointOfView position property更新场景视图的 pointOfView 位置属性后的 SceneKit `projectPoint` 问题
【发布时间】:2025-11-24 12:10:01
【问题描述】:

我有一个循环,在其中更新sceneViewpointOfView 属性的位置。我很惊讶地看到更新位置后,projectPoint 方法仍然返回相同的值。我错过了什么?

for phi in stride(from: 0, through: 90.0, by: 5) {
    for theta in stride(from: 0.0, through: 180.0, by: 5) {
        iter += 1
        print("Iteration \(iter)")
        let pos = sphericalToCartesian(r: 2.0, theta: theta, phi: phi)
        let a = SCNVector3(3,4,5)
        print("Projecting before updating pointOfView position \(sceneView.projectPoint(a))")

        sceneView.pointOfView!.position = pos
        print("Projecting after updating pointOfView position \(sceneView.projectPoint(a))")

【问题讨论】:

    标签: scenekit


    【解决方案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() 实现

    【讨论】:

      最近更新 更多