球の内部を表示している OpenGL ワールドがあります。カメラは 0,0,0 にあり、CMMotionManager(加速度計) 回転マトリックスを使用して modelViewMatrix を適切に回転させ、modelViewMatrix から回転しています。
この問題は、タッチ スクリーンと CMMotionManager マトリックスを使用してワールドを回転させようとすると発生します。
CMMotionManager によって返されたヨー、ピッチ、ロールにタッチ スクリーンの動きの値を追加し、新しい modelViewMatrix を作成しようとしました。私はこれに近いですが、タッチで X (ロール) または Y (ピッチ) に沿って 90 度回転させてから、携帯電話を横向きから縦向き (90 度のヨー回転) に回転させたときに、マトリックスが適切に回転しません。 x 軸と z 軸上にあると思われるものを回転させ始めます。
問題は、ヨーから _rotationX と _rotationY を計算する方法だと思います。現在のmodelViewMatrixのヨー/ピッチ/ロールから取得する必要があると思います。この式/現在のmodelViewMatrix状態で_rotationXと_rotationYを計算する方法がわかりません。
カメラを更新するコード:
- (void)update
{
roll = motionManager.deviceMotion.attitude.roll + _rotationX;
pitch = motionManager.deviceMotion.attitude.pitch + _rotationY + M_PI;//M_PI is to offset to look at front
yaw = motionManager.deviceMotion.attitude.yaw; //+ _rotationZ;
float aspect = fabsf(self.view.bounds.size.width / self.view.bounds.size.height);
_projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f),
-aspect,
0.2f, //camera Position
25.0f); //view zDistance
_modelViewMatrix = GLKMatrix4Make(cos(yaw)*cos(pitch), cos(yaw)*sin(pitch)*sin(roll) - sin(yaw)*cos(roll), cos(yaw)*sin(pitch)*cos(roll) + sin(yaw)*sin(roll), 0,
sin(yaw)*cos(pitch), sin(yaw)*sin(pitch)*sin(roll) + cos(yaw)*cos(roll), sin(yaw)*sin(pitch)*cos(roll) - cos(yaw)*sin(roll), 0,
-sin(pitch), cos(pitch)*sin(roll), cos(pitch)*cos(roll), 0,
0, 0, 0, 1);
_modelViewProjectionMatrix = GLKMatrix4Multiply(_projectionMatrix, _modelViewMatrix);
}
タッチを更新するコード:
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
float distX = [touch locationInView:touch.view].x -
[touch previousLocationInView:touch.view].x;
float distY = [touch locationInView:touch.view].y -
[touch previousLocationInView:touch.view].y;
distX *= 0.005;
distY *= 0.005;
//Update rotationX and rotationY based off the position of the phone's yaw landscape = 0, portrait = 90deg
_rotationX += ((fabsf(cos(yaw))*distY + fabsf(sin(yaw))*distY));
_rotationY += (-(fabsf(cos(yaw))*distX + fabsf(sin(yaw))*distX));
}