3

基本的に、Maya でカメラが回転する方法を模倣しようとしています。Maya のアークボールは常に y 軸に位置合わせされます。したがって、アップ ベクトルがどこを指していても、y 軸に沿ってアップ ベクトルで回転または登録されます。

C++ と Qt を使用して、OpenGL でアークボールを実装することができました。しかし、アップベクターの位置合わせを維持する方法がわかりません。以下のコードによって、時々整列させることができました。

void ArcCamera::setPos (Vector3 np)
{
    Vector3 up(0, 1, 0);

    Position = np;
    ViewDir = (ViewPoint - Position); ViewDir.normalize();

    RightVector =  ViewDir ^ up; RightVector.normalize();

    UpVector = RightVector ^ ViewDir;  UpVector.normalize();
}

これは、位置が 90 度になるまで機能し、その後、右のベクトルが変化し、すべてが反転します。

代わりに、総回転 (クォータニオン単位) を維持し、それによって元の位置 (上、右、正) を回転させています。これはすべての一貫性を維持するのに最適ですが、アップベクターを y 軸に揃えることができません。以下は、回転の関数です。

void CCamera::setRot (QQuaternion q)
{
    tot = tot * q;

    Position  = tot.rotatedVector(PositionOriginal);

    UpVector = tot.rotatedVector(UpVectorOriginal);
    UpVector.normalize();

    RightVector  = tot.rotatedVector(RightVectorOriginal);
    RightVector.normalize();
}

QQuaternion q は、マウスのドラッグから派生した軸と角度のペアから生成されます。これは正しく行われていると確信しています。回転自体は問題ありませんが、向きが揃っていないだけです。

選択した実装で気づいたのは、コーナーをドラッグすると、ビュー方向を中心に回転し、常にアップベクターを再調整して、ワールドの y 軸方向にまっすぐにすることができることです。したがって、どれだけ転がすかがわかれば、毎回2回転して、すべてがまっすぐになるようにすることができます. ただし、これについてどうすればよいかわかりません。

4

2 に答える 2

0

ビューと右のベクトルを最初から追跡し、回転行列で更新します。次に、アップ ベクトルを計算します。

于 2013-05-14T07:43:04.920 に答える