2019年10月2日水曜日

ARAnchorの追加と削除

以下はARKit3とSpriteNodeで作る、XcodeのARのテンプレート(AR空間にインベーダー👾の絵文字スプライトを表示させるやつ)を基に直したもの。

ARAnchorの追加

Scene.swiftの方でARAnchorの位置を決めて
sceneView.session.add(anchor: )
すると、ViewControllerのARSKViewDelegateメソッド
view(_ view: ARSKView, nodeFor anchor: ARAnchor) -> SKNode?
が呼ばれるので、そこで貼りたいSpriteNodeをreturnしてやると、それがAnchorに貼られるという変則的なやり方になっている。
実際にどうやってanchorにspriteを貼ってるのかは知らない。

Scene.swift

//カメラ前方の位置にSpriteを表示するためのanchorを貼る
func addAlienAnchor(sceneView: ARSKView) -> Void {
if let currentFrame = sceneView.session.currentFrame {
var translation = matrix_identity_float4x4 //世界座標と向きを表す4*4の行列
//前方の多少ランダムな位置を決定
//行列の3列目のz値に-0.4なら前方0.4m
let x:Float = 0
let y:Float = 0
let z:Float = -4
translation.columns.3.x = x
translation.columns.3.y = y
translation.columns.3.z = z
//カメラの向いてる方向に対しての表示位置を計算
let transform = simd_mul(currentFrame.camera.transform, translation)
//セッションに新しいARアンカーを追加
let anchor = ARAnchor(transform: transform)
sceneView.session.add(anchor: anchor) //sceneViewのsessionにアンカー追加
//アンカー追加によってViewControllerのdelegateが呼ばれる
}
}

ViewController.swift

引数anchorがこれからspriteを貼るanchor。

func view(_ view: ARSKView, nodeFor anchor: ARAnchor) -> SKNode? {
//省略するが、ここにAnchorに貼りたいSpriteNodeを作り、returnで返す
return spriteNode
}

ARAnchorの削除

新たなARAnchorを貼るとき、または貼るSpriteNodeを作った時、anchorを管理用の変数に入れておき、削除が必要になったらそれを削除すると、それに貼り付いているSpriteNodeもろとも削除される。
sceneView.session.remove(anchor: anchor)

貼る時も削除する時も、sceneView.sessionに対してのメソッドを使ってるわけだ。

0 件のコメント:

コメントを投稿