菜鸟教程小白 发表于 2022-12-11 19:49:17

ios - 旋转 SCNNode.pivot 后 SceneKit 项目点不正确


                                            <p><p>我想从 SCNNode 检索屏幕坐标,以便可以在 SpriteKit-overlay 中使用这些坐标。
该节点是一个子节点。
当我旋转父节点的枢轴 projectPoint 返回乱码结果。</p>

<p>SCN场景:</p>

<pre><code>class ScenekitScene:SCNScene {
    override init() {
      super.init()

      let nodeCamera = SCNNode()
      nodeCamera.camera = SCNCamera()
      rootNode.addChildNode(nodeCamera)

      let geoPyramid = SCNPyramid(width: 0.2, height: 0.5, length: 0.2)
      let nodeCenterOfUniverse = SCNNode(geometry: geoPyramid)
      nodeCenterOfUniverse.position = SCNVector3(0, 0, -5)
      nodeCenterOfUniverse.pivot = SCNMatrix4MakeRotation(CGFloat.pi/4, 0.0, 0.0, 1.0)
      rootNode.addChildNode(nodeCenterOfUniverse)

      let geoSphere = SCNSphere(radius: 0.3)
      let nodePlanet = SCNNode(geometry: geoSphere)
      nodePlanet.name = &#34;planet&#34;
      nodePlanet.position = SCNVector3(2, 0, 0)
      nodeCenterOfUniverse.addChildNode(nodePlanet)
    }

    required init?(coder aDecoder: NSCoder) {
      fatalError(&#34;init(coder:) has not been implemented&#34;)
    }
}
</code></pre>

<p>SCNSceneRenderDelegate:</p>

<pre><code>extension ViewController:SCNSceneRendererDelegate {
    func renderer(_ renderer: SCNSceneRenderer, didRenderScene scene: SCNScene, atTime time: TimeInterval) {
      if let planet = scene.rootNode.childNode(withName: &#34;planet&#34;, recursively: true) {
            let position = planet.convertPosition(planet.position, to: scene.rootNode)
            let screencoords = renderer.projectPoint(position)
            print (screencoords)

            # result:
            # SCNVector3(x: 461.913848876953, y: 2.58612823486328, z: 0.808080852031708)
            # y should clearly be more to the center of the screen somewhere between 100-200
      }
    }
}
</code></pre>

<p>有谁知道如何获得正确的屏幕坐标?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>世界坐标中的行星位置似乎不正确。
当我手动计算行星位置时,我得到不同的结果,并且 projectPoints 像宣传的那样工作。 [我可能会发布一个关于 worldTransform 的不同问题]。</p>

<pre><code>// using SIMD
let pivCou = float4x4(nodeCenterOfUniverse.pivot)
let posCou = float3(nodeCenterOfUniverse.position)
let posCou4 = float4(posCou.x, posCou.y, posCou.z, 1.0) // convert float3 to float4
let posPlanet = float3(nodePlanet.position)
let posPlanet4 = float4(posPlanet.x, posPlanet.y, posPlanet.z, 1.0)

let worldcoordinatesPlanet = posCou4 + posPlanet4 * pivCou
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 旋转 SCNNode.pivot 后 SceneKit 项目点不正确,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/44430385/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/44430385/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 旋转 SCNNode.pivot 后 SceneKit 项目点不正确