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 as! Scene
AR空間を認識させる
バックカメラを使い、デバイスの位置、向き、AR空間の認識などを行う。開始時に行われ、数秒間待たされる。
let configuration = ARWorldTrackingConfiguration()
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? { }新しい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を返してやればいい。
そこで空のSKNodeを作り(仮にreturnNodeとする)、それにaddChildeした上で、そのreturnNodeを返してやればいい。
let returnNode = SKNode()
中略
returnNode.addChild(spriteNode)
return returnNode
Spriteを消す時には、このダミーの親ノードも消さないとゴミが残っちゃうぞ。
Spriteを消す時には、このダミーの親ノードも消さないとゴミが残っちゃうぞ。
0 件のコメント:
コメントを投稿