0

opengl で 3D ビューを作成し、デバイスの動きを使用してその中を見回すコードがいくつかあります。3D キューブを自分の周りの空間に配置して、それらが適切な場所にあることを確認できるので、これが機能していることはわかっています。(私は x/y/z 座標でそれらを作成しています)。

このコードは、デバイスの回転行列を使用してから、さまざまなブロックに適用します。

CMRotationMatrix r = dm.attitude.rotationMatrix;
GLKMatrix4 baseModelViewMatrix = GLKMatrix4Make(r.m11, r.m21, r.m31, 0.0f,
                                                r.m12, r.m22, r.m32, 0.0f,
                                                r.m13, r.m23, r.m33, 0.0f,
                                                0.0f,  0.0f,  0.0f,  1.0f);


float aspect = fabsf(self.view.bounds.size.width / self.view.bounds.size.height);

GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, kNearZ, kFarZ);

block.effect.transform.projectionMatrix = projectionMatrix;

私ができるようにしたいのは、自分がどこを見ているのかを把握し、目の前にブロックを作成することです.

一方向にベクトルを作成し、それに回転行列を適用してから、新しい値を読み取ることで、ある程度の成功を収めました。しかし、それは一部の方向でのみ機能します-回転しすぎると、めちゃくちゃになります。

GLKVector4 vect = GLKVector4Make(0.0f,0.0f,10.0f,1.0f);

GLKVector4 newVec = GLKMatrix4MultiplyVector4(baseModelViewMatrix,vect);

次に、newVec.x、newVec.y、newVec.z を読み取り、それらを使用して立方体を配置します。

私がここで正しい軌道に乗っているかどうか誰かに教えてもらえますか? これを達成する簡単な方法はありますか?

そのすべての計算は非常に困難です。

アップデート:

私はいくつかの部分的な成功を収めました

 GLKVector3 newVec1 = GLKVector3Make(-r.m22, -r.m33, r.m21);

これは、1 つの風景の向きでのみ機能し、現在の場所の周りの円柱でのみ機能します。上下の軸が正しくありません。

回転行列のこれらの部分は、私の周りのポイントを取得するのに十分ですか?

更新 2:

本当に明確にするために、さらにコードを投稿すると役立つかもしれないと考えました。

これは、すべてが表示される方法です。

//1- get device position
CMDeviceMotion *dm = motionManager.deviceMotion;
CMRotationMatrix r = dm.attitude.rotationMatrix;

GLKMatrix4 baseModelViewMatrix = GLKMatrix4Make(r.m11, r.m21, r.m31, 0.0f,
                                    r.m12, r.m22, r.m32, 0.0f,
                                    r.m13, r.m23, r.m33, 0.0f,
                                    0.0f,  0.0f,  0.0f,  1.0f);

GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(45.0f), aspect, kNearZ, kFarZ);


//2- work out position ahead of current view
GLKVector3 newVector = GLKVector3Make(-r.m22, -r.m33, r.m21);

//place cube in 3d space- this works fine when just positioning with x,y,z co-ordinates
cube.effect.transform.projectionMatrix = projectionMatrix;
GLKMatrix4 modelViewMatrix = GLKMatrix4Identity;

modelViewMatrix = GLKMatrix4Translate(modelViewMatrix, newVector.x*100, newVector.y*100, newVector.z*100);
modelViewMatrix = GLKMatrix4Multiply(baseModelViewMatrix, modelViewMatrix);

cube.effect.transform.modelviewMatrix = modelViewMatrix;
4

1 に答える 1