4
private Mat4 calcLookAtMatrix(Vec3 cameraPt, Vec3 lookPt, Vec3 upPt) {
    Vec3 lookDir = Glm.normalize(Vec3.sub(lookPt, cameraPt));
    Vec3 upDir = Glm.normalize(upPt);

    Vec3 rightDir = Glm.normalize(Glm.cross(lookDir, upDir));
    Vec3 perpUpDir = Glm.cross(rightDir, lookDir);

    Mat4 rotMat = new Mat4(1.0f);
    rotMat.setColumn(0, new Vec4(rightDir, 0.0f));
    rotMat.setColumn(1, new Vec4(perpUpDir, 0.0f));
    rotMat.setColumn(2, new Vec4(Vec3.negate(lookDir), 0.0f));

    rotMat = Glm.transpose(rotMat);

    Mat4 transMat = new Mat4(1.0f);
    transMat.setColumn(3, new Vec4(Vec3.negate(cameraPt), 1.0f));

    return rotMat.mul(transMat);
}

このコードは、レンダリングのためにopenGLで使用されるワールドからカメラへのマトリックスを生成します。

回転行列がどのように形成されるかを除いて、私はすべてを理解しています。基本的には、正規化されたベクトルを入れて行列を転置しますが、どういうわけかそれは回転行列で出てきます。その数学を説明してください。

4

1 に答える 1

8

変換行列は、頂点をある空間から別の空間に変換します。最初の空間が空間 A で、最後の空間が空間 B だとしましょう。

空間 A と空間 B は、一連の基底ベクトルによって定義されます。したがって、空間 A にはいくつかの基底ベクトルと原点があります。ただし、基底ベクトルについて数値的に話したい場合は、他の空間との相対関係について話す必要があります。それ以外の場合、スペースはベクトル内の数値の意味を定義するため、数値は意味をなさない.

空間 A から空間 B に移動する変換行列は、空間 Bに対して表現された空間 A の基底ベクトルです。変換の最初の列は、空間 B に対する空間 A の X 軸の方向です。2 番目の列は A の Y 軸で、3 番目の列は A の Z 軸です。

コードが行っていることは、指定されたワールド空間 (指定された 3 つのベクトルによって定義される) を基準にして、カメラ空間の基底ベクトルを生成することです。そのため、カメラ空間で頂点を取り、それらをワールド空間に吐き出すマトリックスを構築します。

ただし、生成したい行列は、ワールド空間からカメラ空間への変換です。したがって、前に行列を反転します。A から B へのマトリックスの逆は、B から A へのマトリックスです。豆知識: 純回転行列の逆行列はその転置行列と同じであり、計算もはるかに簡単です。

于 2013-03-16T09:38:18.977 に答える