9

宿題をしなければならず、lookAt 関数を実装しようとしています。いろいろ試しましたが、ブルースクリーンしか出ませんでした。私のプログラムの残りの部分は非常にうまく機能します.glm::lookAtを使用すると、すべてがうまくいきます. これは私のコードです:

mat4 Transform::lookAt(const vec3 &eye, const vec3 &center, const vec3 &up) 
{
    vec3 w(glm::normalize(eye - center)) ;
        vec3 u(glm::normalize(glm::cross(up, w)));
        vec3 v(glm::cross(w, u)) ;
    mat4 ret = mat4 (
        vec4 (u.x,v.x,w.x,0),
            vec4 (u.y,v.y,w.y,0),
            vec4 (u.z,v.z,w.z,0),
        vec4 (-u.x*eye.x-u.y*eye.y-u.z*eye.z,
             -v.x*eye.x-v.y*eye.y-v.z*eye.z,
             -w.x*eye.x-w.y*eye.y-w.z*eye.z,
             1)
    );
  return ret;
4

1 に答える 1

16

行列演算に glm ライブラリを使用しているのを見たので、glm コードから見ると、lookat の実装は次のようになります。

mat4x4 lookAt(vec3  const & eye, vec3  const & center, vec3  const & up)
{
    vec3  f = normalize(center - eye);
    vec3  u = normalize(up);
    vec3  s = normalize(cross(f, u));
    u = cross(s, f);

    mat4x4 Result(1);
    Result[0][0] = s.x;
    Result[1][0] = s.y;
    Result[2][0] = s.z;
    Result[0][1] = u.x;
    Result[1][1] = u.y;
    Result[2][1] = u.z;
    Result[0][2] =-f.x;
    Result[1][2] =-f.y;
    Result[2][2] =-f.z;
    Result[3][0] =-dot(s, eye);
    Result[3][1] =-dot(u, eye);
    Result[3][2] = dot(f, eye);
    return Result;
}

まず、使用するベクトルを正規化します ( fは見ている方向、uは上、sは正しいベクトルです)。次に、上向きのベクトルが方向右向きのベクトル垂直であることを確認するために、外積として再計算します。あなたに正しいベクトルを与える平面を形成しているだけです。

マトリックスはこれらから構築されます。詳細については、http://www.songho.ca/opengl/gl_transform.htmlページを確認してください。要するに、これは新しい座標系を作成するマトリックスなので、列は軸です。次に、最後の列で変換マトリックスが適用されます。

(恒等行列を見てください:

AXIS     TRANSFORM
x  y  z  transl.
1, 0, 0, 0
0, 1, 0, 0,
0, 0, 1, 0
0, 0, 0, 1

これにより、変換なしの標準座標系が得られます。)

次に、これに射影行列とモデル行列 (p*v*m) を掛けます。順序が重要です。実装を作成するときは、opengl のために列の主要な行列を使用するか、それらを転置してください。

お役に立てば幸いです。

于 2013-11-02T09:54:17.513 に答える