[swift] scenekit / 3Dモデルを追跡する2Dテキストとマーカー

scenekit / 3Dモデルを追跡する2Dテキストとマーカーを作成する。

SCNSceneRendererDelegateを実装し、rendererが呼び出されるごとに、3Dモデルの表示位置を「scnView.projectPoint」で2Dに変換し、ラベルやカーソルを変換した2Dの位置に表示させている。

コードは以下の通り

 

var scene = SCNScene()
var targetedNode = SCNNode()
class GameViewController: UIViewController,SCNSceneRendererDelegate {

 override func viewDidLoad() {
        super.viewDidLoad()
        
        //カメラなどのシーン設定は省略
        targetedNode = //適当にノード作成

        scnView.delegate = self
        scnView.overlaySKScene = OverlayScene(size:scnView.bounds.size)

 }

 class OverlayScene: SKScene {
        var labelNode = SKLabelNode()
        var cursorNode: SKShapeNode?
        
        override public init(size: CGSize){
            super.init(size: size)
            
            self.scaleMode = SKSceneScaleMode.resizeFill
            
            //テキストラベル
            labelNode.fontSize = 20
            labelNode.position.y = 0
            labelNode.position.x = 0
            self.addChild(labelNode)

            //緑の丸カーソル
            cursorNode = SKShapeNode(circleOfRadius: 25.0)
            cursorNode?.strokeColor = UIColor.green
            self.addChild(cursorNode!)
            
        }
        
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    }

    
    //renderer delegate
    func renderer(_ renderer: SCNSceneRenderer, didRenderScene scene: SCNScene, atTime time: TimeInterval)  {

            if let overlay = scnView.overlaySKScene as? OverlayScene {
                
                //ノードの現在地を2Dに変換
                let p = scnView.projectPoint(targetedNode.presentation.position)

                //テキストに3Dモデルのx y zを記述
                overlay.labelNode.text = String(format: "%03.1f, %03.1f, %03.1f",
                    targetedNode.presentation.position.x,
                    targetedNode.presentation.position.y,
                    targetedNode.presentation.position.z)

                let x = p.x
                let y = p.y

                //カーソルをx y に移動
                overlay.cursorNode?.position = CGPoint(x:CGFloat(x), y:scnView.bounds.maxY - CGFloat(y))

                //ラベルをx y に移動
                overlay.labelNode.position = CGPoint(x:CGFloat(x), y:scnView.bounds.maxY - CGFloat(y)+50)
                
            }
        }
}


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です