2017-06-08 14 views
2

SCNNodeからスクリーン座標を取得したいので、これらの座標をSpriteKitオーバーレイで使用できます。 ノードは子ノードです。 親ノードのピボットを回転すると、projectPointは文字化けした結果を返します。SCNNode.pivotを回転させた後でSceneKit projectPointが正しくない

SCNScene:

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 = "planet" 
     nodePlanet.position = SCNVector3(2, 0, 0) 
     nodeCenterOfUniverse.addChildNode(nodePlanet) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

SCNSceneRenderDelegate:

extension ViewController:SCNSceneRendererDelegate { 
    func renderer(_ renderer: SCNSceneRenderer, didRenderScene scene: SCNScene, atTime time: TimeInterval) { 
     if let planet = scene.rootNode.childNode(withName: "planet", 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 
     } 
    } 
} 

は誰が正しいscreencoordinatesを取得する方法を知っていますか?

答えて

0

世界座標の惑星の位置が正しくないように見えます。 私が手作業で地球の位置を計算すると、私は異なる結果を得て、projectPointsは宣伝されているように機能します。 [私はworldTransformに関して別の質問を投稿するかもしれない]。

// 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 
関連する問題