3

私はかなり新しく、Apple の ARKit を試しています。ARCamera の回転情報について質問があります。写真をキャプチャし、撮影した各画像でカメラの現在の位置、向き、回転を保存しています。アイデアは、これらの画像を使用して 2D 平面ノードを作成し、それらをキャプチャしたときと同じ位置/方向/回転 (原点に対して) で別のビューに表示することです (あたかも画像が空中で静止しているかのように)彼らは捕らえられました)。位置情報は正常に機能しているようですが、self.sceneView.session.currentFrame?.camera.eulerAngles と self.sceneView.pointOfView? .orientation vs self.sceneView.pointOfView?.rotation.

これは、2D イメージ プレーンを設定する方法です。

let imagePlane = SCNPlane(width: self.sceneView.bounds.width/6000, height: self.sceneView.bounds.height/6000)
imagePlane.firstMaterial?.diffuse.contents = self.image//<-- UIImage here
imagePlane.firstMaterial?.lightingModel = .constant
self.planeNode = SCNNode(geometry: imagePlane)

次に、 xself.planeNode.eulerAngles.xを使用して画像がキャプチャされているビューから取得した値に設定しますself.sceneView.session.currentFrame?.camera.eulerAngles.x(y と z についても同じことを行います)。

次に、ノードの回転を次のように設定しますself.planeNode.rotation.x = self.rotX(ここで、self.rotX は取得元の情報ですself.sceneView.pointOfView?.rotation.x)。

また、次のように設定しようとしました。

let xAngle = SCNMatrix4MakeRotation(Float(self.rotX), 1, 0, 0); 
let yAngle = SCNMatrix4MakeRotation(Float(self.rotY), 0, 1, 0);
let zAngle = SCNMatrix4MakeRotation(Float(self.rotZ), 0, 0, 1);
let rotationMatrix = SCNMatrix4Mult(SCNMatrix4Mult(xAngle, yAngle), zAngle);
self.planeNode.pivot = SCNMatrix4Mult(rotationMatrix, self.planeNode.transform);

ドキュメントには、eulerAngles はロール、ピッチ、ヨーの値におけるカメラの「向き」であると記載されていますが、self.sceneView.pointOfView?.orientation は何に使用されるのでしょうか?

では、平面ノードの位置、方向、および回転を指定するとき、eulerAngles から取得した情報は、画像の正しい方向をキャプチャするのに十分でしょうか?

これに対する私のアプローチは完全に間違っていますか、それとも明らかな何かが欠けていますか? どんな助けでも大歓迎です!

4

1 に答える 1

2

基本的に、キャプチャ時にカメラに面しているビルボードを作成したい場合は、基本的にカメラの変換行列 (既に正しい向きになっています) を取得し、逆変換を適用して移動することができます。オブジェクトの場所に移動します。彼らはそのマトリックスを使用して、ビルボードを配置します。この方法では、角度を処理したり、回転を合成する正しい順序について心配したりする必要はありません。カメラの位置からオブジェクトの位置を差し引くだけなので、変換は簡単です。ARkit WWDC セッションの 1 つに、実際にこれを行う例があります (カメラの位置にビルボードを作成します)。必要な変更は、カメラの位置からビルボードを移動することだけです。

于 2018-01-17T13:11:12.977 に答える