[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) } } }