iPhoneカメラとジャイロスコープセンサーから受信したデータを使用して、OpenGL ESで現実的なカメラをシミュレートしようとしています。基本的に、ジャイロスコープからロール、ピッチ、ヨーの回転を受け取ると、それらを openGL コンテキストに渡し、シーン内のすべてのオブジェクトを各角度のマイナスで回転させ、カメラの回転をシミュレートします。
CC3GLMatrix *modelView = [CC3GLMatrix matrix]; // cocos3D matrix
[modelView populateFromRotation:CC3VectorMake(-pitch, -roll, -yaw)];
[modelView translateBy:CC3VectorMake(0, 0, -distance)];
glUniformMatrix4fv(_modelViewUniform, 1, 0, modelView.glMatrix);
そして、それはうまく機能します。問題は、iPhone の座標系が電話とともに回転することです。たとえば、ロールは常に電話の側面に「ぶつかる」ことになります。したがって、別のオブジェクト、アルファ度を左/右に追加すると、ワールド座標系ではなく、iPhone 座標系の左/右になります。
最初の画像は回転なしで前方を見ています。
しかし、携帯電話を右に 30 ~ 40 度回転させると、オブジェクトの側面が平行でなくなっていることが明らかになります。
2 番目のオブジェクトの回転:
CC3GLMatrix *modelView2 = [CC3GLMatrix matrix];
[modelView2 populateFromRotation:CC3VectorMake(-pitch, -roll-30, -yaw)];
[modelView2 translateBy:CC3VectorMake(0, 0, -distance)];
glUniformMatrix4fv(_modelViewUniform, 1, 0, modelView2.glMatrix);
電話機が右に傾いているので、オブジェクトも同様です。オブジェクトの位置の唯一の違いは、ロールで -30 です。これは、座標系が電話機にバインドされ、電話機とともに回転することを意味します。
これらの座標を世界座標に変換する方法、または現実世界でシーン全体を回転させる他の方法はありますか?