0

球の内部を表示している 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));

}

4

0 に答える 0