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