2018年9月13日木曜日

ARのお勉強/Sprite版

ARSessionの開始手順

AR空間に表示するSpriteや3Dオブジェクトは別として、とりあえずARSessionだけ開始する方法

SKSceneを読み込み、SKSceneViewのsceneとして表示

@IBOutlet var sceneView: ARSKView! //StoryboardのSceneViewと接続されてる

if let scene = SKScene(fileNamed: "Scene") {
sceneView.presentScene(scene)
}

Scene.swiftへのアクセスは以下のようにすればできる。
let s = sceneView.scene asScene

AR空間を認識させる

バックカメラを使い、デバイスの位置、向き、AR空間の認識などを行う。開始時に行われ、数秒間待たされる。

let configuration = ARWorldTrackingConfiguration()

ARSession開始

ARWorldTrackingConfigurationで認識したAR設定に基づいてARSessionを開始する。
sceneView.session.run(configuration)

AR空間にオブジェクトを表示させる

ARAnchor

ARのオブジェクトを表示する位置を指定するのがARAnchor。
ARAnchorをAR空間に貼り付けた後、動かせるのか、動かせないのかはまだ不明。

行列でできている

ARAnchorの値は4*4の行列(matrix_identity_float4x4)で示される。
例)以下は変数に作られたばかりの行列の値
simd_float4x4([[1.0, 0.0, 0.0, 0.0)], [0.0, 1.0, 0.0, 0.0)], [0.0, 0.0, 1.0, 0.0)], [0.0, 0.0, 0.0, 1.0)]])

その行列の4個目(0オリジンなのでindexなら3)の要素のうちx, y, zがそれぞれAR空間の軸に対応しており、デバイスを中心にしたARAnchorの位置を1m = 1.0としてFloatで指定する。
  • xは0がデバイス位置、プラスが下↓、マイナスが上↑
  • yは0がデバイス位置、プラスが右方向→、マイナスが左方向←
  • zは0がデバイス位置、プラスが後方(液晶モニタ側)、マイナスが前方(カメラの先)

指定方法

//世界座標と向きを表す4*4の行列
var transform = matrix_identity_float4x4
//行列の3列目のz値に-0.2で前方0.2mを指定
transform.columns.3.x = 0
transform.columns.3.y = 0
transform.columns.3.z = -0.2

ARSKViewDelegate

AR空間に表示するものには、2DのSpriteと3Dのオブジェクトの2つあるが、今回は2DのSprite。
ARAnchorに実際にSpriteを貼るには以下のDelegateメソッドを利用する。

新規ARAnchor追加で呼ばれる

func view(_ view: ARSKView, nodeFor anchor: ARAnchor) -> SKNode? { }

ARKitのテンプレートで使われてるのがこちら。
新しいARAnchorが追加されると呼ばれ、そこに貼りたいSpriteをreturnしてやればいい。

ARAnchorにSKNodeが貼られると呼ばれる

func view(_ view: ARSKView, didAdd node: SKNode, for anchor: ARAnchor) { }

SpriteのActionを使う

view(_ view: ARSKView, nodeFor anchor: ARAnchor) -> SKNode? で返すSpriteNodeにActionを設定してやればいいのだが、直接そのSpriteNodeを返してもARAnchorに固定されているため、思ったような動きをしてくれない。
そこで空のSKNodeを作り(仮にreturnNodeとする)、それにaddChildeした上で、そのreturnNodeを返してやればいい。

let returnNode = SKNode()
中略
returnNode.addChild(spriteNode)
return returnNode

Spriteを消す時には、このダミーの親ノードも消さないとゴミが残っちゃうぞ。

0 件のコメント:

コメントを投稿