1

opengl-es2.03DアプリにPowerVRライブラリと一緒にGLKitを使用しています。3Dシーンには、ガレージ環境をシミュレートするいくつかのメッシュがロードされます。ガレージの中央に車があります。アプリにタッチ処理を追加しようとしています。この場合、ユーザーは部屋を回転させることができます(たとえば、車を囲む4つの壁すべてを表示できます)。また、狭い範囲に制限されていますが、x軸を中心に回転できるようにします。基本的に、彼らは車の上部の少しから床の高さのすぐ上まで見ることができます。

YまたはXで回転できますが、両方では回転できません。両方の軸を回転させるとすぐに、車は軸外に投げ出されます。車はもうカメラと同じ高さではありません。これをもっとよく説明できればいいのですが、皆さんが理解してくれることを願っています。

これが私のタッチの実装です:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch * touch = [touches anyObject];
    CGPoint location = [touch locationInView:self.view];    
    CGPoint lastLoc = [touch previousLocationInView:self.view];
    CGPoint diff = CGPointMake(lastLoc.x - location.x, lastLoc.y - location.y);

    float rotX = -1 * GLKMathDegreesToRadians(diff.x / 4.0);
    float rotY = GLKMathDegreesToRadians(diff.y / 5.0);

    PVRTVec3 xAxis = PVRTVec3(1, 0, 0);
    PVRTVec3 yAxis = PVRTVec3(0,1,0);

    PVRTMat4 yRotMatrix, xRotMatrix;

    // create rotation matrices with angle
    PVRTMatrixRotationXF(yRotMatrix, rotY);
    PVRTMatrixRotationYF(xRotMatrix, -rotX);

    _rotationY = _rotationY * yRotMatrix;
    _rotationX = _rotationX * xRotMatrix;
}

これが私の更新方法です:

- (void)update {

    // Use the loaded effect
    m_pEffect->Activate();


    PVRTVec3    vFrom, vTo, vUp;
    VERTTYPE    fFOV;
    vUp.x = 0.0f;
    vUp.y = 1.0f;
    vUp.z = 0.0f;

    // We can get the camera position, target and field of view (fov) with GetCameraPos()
    fFOV = m_Scene.GetCameraPos(vFrom, vTo, 0);

    /*
     We can build the world view matrix from the camera position, target and an up vector.
     For this we use PVRTMat4LookAtRH().
     */
    m_mView = PVRTMat4::LookAtRH(vFrom, vTo, vUp);

    // rotate the camera based on the users swipe in the X direction (THIS WORKS)
    m_mView = m_mView * _rotationX;

    // Calculates the projection matrix
    bool bRotate = false;
    m_mProjection = PVRTMat4::PerspectiveFovRH(fFOV, (float)1024.0/768.0, CAM_NEAR, CAM_FAR, PVRTMat4::OGL, bRotate);
}

最初に新しいX回転行列を現在のシーンの回転に乗算し、次に新しいY回転行列を乗算してみました。掛け算の順番が私の問題だと思って、その逆を試しました。それは役に立ちませんでした。次に、現在の回転に乗算する前に、新しいX回転行列とY回転行列を一緒に追加しようとしましたが、それも機能しませんでした。身近に感じますが、現時点ではアイデアが足りません。

助けてもらえますか?ありがとう。-ヴァレリー

更新:これを解決するために、私はそれを少し単純化しようとしています。上記のコードを更新し、Y回転の範囲の制限を削除しました。基本的に、ユーザーが画面をスワイプすることに基づいて、XとYの回転を計算します。

これを正しく理解していれば、_rotationXの計算でビューマトリックス(カメラ/目)を回転させたいと思います。

_rotationYの計算には、ワールドマトリックス(原点0,0,0)を使用する必要があると思います。私が話していることを正確にいくつかの画像を取得しようとします。

4

1 に答える 1

0

ワフー、これが機能しました!ビューマトリックス(LookAtメソッドで作成)をX回転マトリックスで回転させました。モデルビューマトリックスをY回転マトリックスで回転させました。

変更されたUpdateメソッドは次のとおりです。

- (void)update {

    PVRTVec3    vFrom, vTo, vUp;
    VERTTYPE    fFOV;

    // We can get the camera position, target and field of view (fov) with GetCameraPos()
    fFOV = m_Scene.GetCameraPos(vFrom, vTo, 0);

    /*
     We can build the world view matrix from the camera position, target and an up vector.
     For this we use PVRTMat4LookAtRH().
     */
    m_mView = PVRTMat4::LookAtRH(vFrom, vTo, PVRTVec3(0.0f, 1.0f, 0.0f));

    // rotate on the X axis (finger swipe Y direction)
    m_mView = m_mView * _rotationY;

    // Calculates the projection matrix
    m_mProjection = PVRTMat4::PerspectiveFovRH(fFOV, (float)1024.0/768.0, CAM_NEAR, CAM_FAR, PVRTMat4::OGL, false);

}

変更されたタッチ移動方法は次のとおりです。

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch * touch = [touches anyObject];
    CGPoint location = [touch locationInView:self.view];    
    CGPoint lastLoc = [touch previousLocationInView:self.view];
    CGPoint diff = CGPointMake(lastLoc.x - location.x, lastLoc.y - location.y);

    float rotX = -1 * GLKMathDegreesToRadians(diff.x / 2.5);
    float rotY = GLKMathDegreesToRadians(diff.y / 2.5);

    PVRTMat4 rotMatrixX, rotMatrixY;

    // create rotation matrices with angle
    PVRTMatrixRotationYF(rotMatrixX, -rotX);
    PVRTMatrixRotationXF(rotMatrixY, rotY);

    _rotationX = _rotationX * rotMatrixX;
    _rotationY = _rotationY * rotMatrixY;

}
于 2012-12-29T18:45:17.603 に答える