Вращающаяся камера выходит из строя вдоль одной оси - PullRequest
0 голосов
/ 07 января 2011

Редактировать: я решил эту конкретную проблему, но создал новую с довольно похожим базовым описанием. После того, как камера поворачивается несколько раз, она начинает вращаться, когда не должна. У меня есть рыскание и высота, связанные с мышью, так что я знаю, что 0 передается для броска. Проблема в том, что у меня нет никакого алгоритмического способа даже узнать, происходит ли это, не говоря уже о том, чтобы исправить проблему.

Это мой существующий код:

D3DXMATRIX CameraRotationMatrix;
D3DXVECTOR3 CameraPosition;
//D3DXVECTOR3 CameraRotation;

inline D3DXMATRIX GetRotationMatrix() {
    return CameraRotationMatrix;
}
inline void TranslateCamera(float x, float y, float z) {
    D3DXVECTOR3 rvec, vec(x, y, z);
    #pragma warning(disable : 4238)
    D3DXVec3TransformNormal(&rvec, &vec, &GetRotationMatrix());
    #pragma warning(default : 4238)
    CameraPosition += rvec;
    RecomputeVPMatrix();
}
inline void RotateCamera(float x, float y, float z) {
    D3DXVECTOR3 RotationRequested(x, y, z);
    D3DXVECTOR3 XAxis, YAxis, ZAxis;
    D3DXMATRIX rotationx, rotationy, rotationz;
    XAxis = D3DXVECTOR3(1, 0, 0);
    YAxis = D3DXVECTOR3(0, 1, 0);
    ZAxis = D3DXVECTOR3(0, 0, 1);

    #pragma warning(disable : 4238)
    D3DXVec3TransformNormal(&XAxis, &XAxis, &GetRotationMatrix());
    D3DXVec3TransformNormal(&YAxis, &YAxis, &GetRotationMatrix());
    D3DXVec3TransformNormal(&ZAxis, &ZAxis, &GetRotationMatrix());
    #pragma warning(default : 4238)
    D3DXMatrixIdentity(&rotationx);
    D3DXMatrixIdentity(&rotationy);
    D3DXMatrixIdentity(&rotationz);
    D3DXMatrixRotationAxis(&rotationx, &XAxis, RotationRequested.x);
    D3DXMatrixRotationAxis(&rotationy, &YAxis, RotationRequested.y);
    D3DXMatrixRotationAxis(&rotationz, &ZAxis, RotationRequested.z);
    CameraRotationMatrix *= rotationx;
    CameraRotationMatrix *= rotationy;
    CameraRotationMatrix *= rotationz;
    RecomputeVPMatrix();
}

Ответы [ 2 ]

1 голос
/ 07 января 2011

Если вы сделали много поворотов, используя углы Эйлера, возможно, вы попали в замок подвеса.

Страница Википедии о замке подвеса

0 голосов
/ 10 января 2011

Как именно вы составляете свои вращения? Если вам просто нужны рыскание и тангаж, легко избежать нежелательных вращений, комбинируя вращения с разных сторон.

Например, если у вас есть новый ввод мыши, который дает вам кватернион pitch_diff и yaw_diff, вы можете сделать: my_rotation = yaw_diff * my_rotation * pitch_diff. Таким образом, «левая половина» my_rotation всегда будет рысканием, а «правая половина» всегда будет высотой тона. И вы никогда не получите рулонный компонент!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...