第2章 ARKit 堤 修一/@shu223
2.9.4 その他の実装のポイント
■デバイス位置の取得タイミング
ARSCNViewDelegateプロトコルはSCNSceneRendererDelegateプロトコルを継承しています。
ARSCNViewDelegate <SCNSceneRendererDelegate, ARSessionObserver>
デバイス位置の取得タイミングとして、本節ではこのSCNSceneRendererDelegateプロトコルに定義されているrenderer(_:updateAtTime:)メソッドを用います。このデリゲートメソッドはARSCNViewにおいて毎フレームのアニメーションや物理計算の評価前に呼ばれるため、公式リファレンスではレンダリングループに対する更新処理をここで行うよう教示しています。
func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval)
■精度を安定させる
描いた線が空間に安定するように、トラッキング品質がベストではない間は描画を許可しないようにします注26)。
private func isReadyForDrawing(trackingState: ARCamera.TrackingState) -> Bool { switch trackingState { case .normal: return true default: return false } } override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { guard let frame = sceneView.session.currentFrame else {return} guard isReadyForDrawing(trackingState: frame.camera.trackingState) else {return}
以上のように実装したアプリの実行結果を図2.16に示します。各時点でのデバイス位置から動的に線としてのカスタムジオメトリを構成し、現実の3D空間に設置できていることがわかります。
図2.16 ARKitを利用して空中に文字を描く