23

これは、z = 0 または z = 1000 または -1000 の場合、LookAt ターゲットの場所は問題ではありませんか?に関連しています。

私は試した

    gluLookAt(512, 384, 2000,
              512, 384, 0,
              0.0f, 1.0f, 0.0f);

そして問題なく動作し、3 行目 (UP ベクトル) の最後の番号を次のように変更し0.8ます。

    gluLookAt(512, 384, 2000,
              512, 384, 0,
              0.0f, 1.0f, 0.8f);

それはまったく同じです...次に、3行目の最初の番号を次のように変更してみました0.8

    gluLookAt(512, 384, 2000,
              512, 384, 0,
              0.8f, 1.0f, 0.8f);

これで、ビューは左に 45 度回転したようになります。この UP ベクトルはどのように機能しますか?

4

4 に答える 4

32

アップ ベクトルは、目と gluLookAt に供給される中心ベクトルの間の外積を作成するために使用されます。

iOS の GLKit ヘッダーから、実装を次のように確認できます。

static __inline__ GLKMatrix4 GLKMatrix4MakeLookAt(float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ)
{
    GLKVector3 ev = { eyeX, eyeY, eyeZ };
    GLKVector3 cv = { centerX, centerY, centerZ };
    GLKVector3 uv = { upX, upY, upZ };
    GLKVector3 n = GLKVector3Normalize(GLKVector3Add(ev, GLKVector3Negate(cv)));
    GLKVector3 u = GLKVector3Normalize(GLKVector3CrossProduct(uv, n));
    GLKVector3 v = GLKVector3CrossProduct(n, u);

    GLKMatrix4 m = { u.v[0], v.v[0], n.v[0], 0.0f,
        u.v[1], v.v[1], n.v[1], 0.0f,
        u.v[2], v.v[2], n.v[2], 0.0f,
        GLKVector3DotProduct(GLKVector3Negate(u), ev),
        GLKVector3DotProduct(GLKVector3Negate(v), ev),
        GLKVector3DotProduct(GLKVector3Negate(n), ev),
        1.0f };

    return m;
}

この質問で受け入れられた回答How do I use gluLookAt適切? アップ ベクトルが実際に何に影響を与えるかについての適切な説明を提供します。

(gluLookAt の「上」ベクトルの背後にある直感は単純です。何かを見てください。今度は頭を 90 度傾けます。自分のいる場所、見ている方向は変わっていませんが、あなたの画像は網膜には明らかにあります.違いは何ですか?頭のてっぺんが指している場所.それがアップベクトルです.)
于 2012-05-17T12:55:26.577 に答える
25

アップ ベクトルは、どの方向が「上」であるかを決定します。ビデオカメラのようなものだと考えてください...カメラを「適切に」保持すると、カメラの中心からカメラの上部まで上に向かう想像上の線は、ベクトル (0,1,0) で表すことができます。 . カメラを右に 45 度傾けると、カメラの中心からカメラの「上部」に向かう仮想線は、新しいベクトル (1,1,0) で表されます。次に、カメラを少しだけ「後ろ」に傾けると、「上」ベクトルは (1,1,1) [または (1,1,-1) になります...私は常に z 軸の極性を取得します。逆]。

つまり、UP ベクトルは、カメラの向きでどの点が「上」であるかを示すことで、カメラのロールを表します。

それが役立つことを願っています。:)

(コメントに従って要約を修正するために編集)

于 2012-05-17T12:52:24.873 に答える
5

gluLookAt の最初の 2 つのパラメーターは、カメラの位置とカメラのターゲットです。この 2 つだけでは、カメラは完全には拘束されません。カメラを持ってどこかに立っていると想像してみてください。カメラを横向きに構えて横向きの写真を撮ったり、カメラを縦向きに構えて縦向きの写真を撮ったりすることができます。どちらの場合も、カメラの位置と写真の被写体の位置は同じです。カメラを任意の角度に回転させることができ、これら 2 つの値は変わりません。3 番目のパラメーターであるアップ ベクトルは、カメラの向きを選択します。

于 2012-05-17T12:58:17.610 に答える
3

見た目どおりに機能します。

あなたが宇宙のある地点にいると想像してください。そして彼らは、あなたがあなたから -Z 方向に直接 2000 単位離れたところを見ていると想像します。

これらの特性を持つ可能なカメラは無数にありますが、「上」方向が異なるという点だけに基づいて異なります。したがって、異なる「上」方向は、ビューの方向を中心に異なる向きを持つことに対応します。

アップ ベクトルは、カメラに設定する「上」方向に合わせたベクトル方向です。つまり、カメラ ポイントからアップ ベクトルを描画すると、上向きの垂直の直線が表示されます。

さて、想像した景色を振り返って、その垂直線を見てください。その垂直線があなたに近づいているのか遠ざかっているのか分かりますか? いいえ; それはただの縦線です。したがって、アップ ベクトルがビューの方向を部分的に指しているかどうかは問題ではありません。重要なのは、上方向がビュー方向を正確に指していないということです。

上方向にゼロ以外の Z 座標を指定すると、部分的にビュー方向 (つまり、Z 軸) を指すようになります。その部分は最終的にあなたが得る上方向とは無関係なので、無視されます。上方向にゼロ以外のX座標を指定すると、それはビュー方向ではないため、重要です。

これのポイントは、ビューのルックアットまたはカメラの原点を変更した場合に、上方向も変更する必要がないようにすることです。アップ軸に沿って直接見ていなければ問題ありません。

于 2012-05-17T12:56:07.447 に答える