2

わかりましたので、C++ と OpenGL を使用してオブジェクトをクリック アンド ドラッグして回転させようとしています。私が持っている方法は、原点を中心に gluLookAt を使用することであり、球のパラメトリック方程式を使用して目の座標を取得しています (eyex = 2* cos(theta) * sin(phi); eyey = 2* sin( theta) * sin(phi); eyez = 2* cos(phi);)。クリックして水平方向に回転できるため、これはほとんど機能しますが、垂直方向に回転しようとすると、垂直方向に回転するのではなく、きつい円になります。カメラの位置と xz 平面に沿って 90 度の角度のベクトルを使用し、その外積をとることで、アップ ベクトルを取得しようとしています。私が持っているコードは次のとおりです。

double dotProduct(double v1[], double v2[]) {
    return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2];
}
void mouseDown(int button, int state, int x, int y) {
    if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN ) {
        xpos = x;
        ypos = y;
    }
}
void mouseMovement(int x, int y) {
    diffx = x - xpos;
    diffy = y - ypos;
    xpos = x;
    ypos = y;
}
void camera (void) {

    theta += 2*PI * (-diffy/glutGet(GLUT_SCREEN_HEIGHT));
        phi += PI * (-diffx/glutGet(GLUT_WINDOW_WIDTH));

    eyex = 2* cos(theta) * sin(phi);
    eyey = 2* sin(theta) * sin(phi);
    eyez = 2* cos(phi);

    double rightv[3], rightt[3], eyes[3];
    rightv[0] = 2* cos(theta + 2/PI) * sin(phi);
    rightv[1] = 0;
    rightv[2] = 2* cos(phi);
    rightt[0] = rightv[0];
    rightt[1] = rightv[1];
    rightt[2] = rightv[2];
    rightv[0] = rightv[0] / sqrt(dotProduct(rightt, rightt));
    rightv[1] = rightv[1] / sqrt(dotProduct(rightt, rightt));
    rightv[2] = rightv[2] / sqrt(dotProduct(rightt, rightt));

    eyes[0] = eyex;
    eyes[1] = eyey;
    eyes[2] = eyez;
    upx = (eyey/sqrt(dotProduct(eyes,eyes)))*rightv[2] + (eyez/sqrt(dotProduct(eyes,eyes)))*rightv[1];
    upy = (eyez/sqrt(dotProduct(eyes,eyes)))*rightv[0] + (eyex/sqrt(dotProduct(eyes,eyes)))*rightv[2];
    upz = (eyex/sqrt(dotProduct(eyes,eyes)))*rightv[1] + (eyey/sqrt(dotProduct(eyes,eyes)))*rightv[0];

    diffx = 0;
    diffy = 0;
}         

私はこれに基づいていますが、うまくいかないので、代わりに自分のやり方を試しました。

4

1 に答える 1

2

これはあなたがそれをしている方法の正確な解決策ではありませんが、私は先日同様のことをしました。私はDXを使用してそれを行いD3DXMatrixRotationAxisました。メソッドD3DXVec3TransformCoordの背後にある計算D3DXMatrixRotationAxisは、次のページの下部にあります。D3DXMatrixRotationAxis Mathは、DXを使用できない場合に使用します。これにより、渡す任意の軸を中心に回転できるようになります。私のオブジェクトコードでは、方向と上向きのベクトルを追跡し、移動軸(この場合はヨーとピッチ)を中心にそれぞれを回転させます。

このような固定距離カメラを実装するには、現在のカメラの位置と原点の位置の内積を実行し(これが変更されない場合は、一度だけ実行できます)、次にカメラを原点に移動してその量を回転させます次に、新しい方向と上の値でカメラを元に戻す必要があります。

于 2012-05-09T06:26:17.693 に答える