web-dev-qa-db-ja.com

glm :: lookAt()を理解する

私は チュートリアル に従って、ビューを構築するためにglm::lookAt()関数を使用したOpenGLを学習していますが、glm::lookAt()の動作を理解できず、明らかに、詳細なドキュメントはありませんGLM。誰でも私がglm::lookAt()のパラメータと動作を理解するのを手伝ってくれますか?

GLMのドキュメントによると:

detail::tmat4x4<T> glm::gtc::matrix_transform::lookAt   
(   
    detail::tvec3< T > const &  eye,
    detail::tvec3< T > const &  center,
    detail::tvec3< T > const &  up 
)

私の現在の理解では、カメラはeyeにあり、centerに向かっているということです。 (そしてupが何であるかわかりません)

47
Cashif Ilyas

upベクトルは、基本的に世界の「上向き」方向を定義するベクトルです。ほとんどすべての通常の場合、これはベクトル(0, 1, 0)、つまり正のY方向になります。eyeはカメラの視点の位置であり、centerは見ている場所(位置)です。 。中心位置の代わりに方向ベクトルDを使用する場合は、eye + Dを中心位置として使用できます。たとえば、Dは単位ベクトルです。

内部の仕組みや詳細については、これはビューマトリックスを構築するための一般的な基本機能です。 gluLookAt() のドキュメントを読んでみてください。これは機能的に同等です。

64
Preet Kukreti

ここで、Upベクトルは、(このカメラの)3Dワールドの「上」方向を定義します。たとえば、vec3(0, 0, 1)の値は、Z軸が上を指すことを意味します。

Eyeは、仮想3Dカメラが配置されているポイントです。

Centerは、カメラが注視するポイント(シーンの中心)です。

何かを理解する最良の方法は、自分でそれを作ることです。 EyeCenter、およびUpの3つのベクトルを使用してカメラ変換を構築する方法を次に示します。

LMatrix4 LookAt( const LVector3& Eye, const LVector3& Center, const LVector3& Up )
{
    LMatrix4 Matrix;

    LVector3 X, Y, Z;

新しい座標系を作成します。

    Z = Eye - Center;
    Z.Normalize();
    Y = Up;
    X = Y.Cross( Z );

Y = Z cross Xの再計算:

    Y = Z.Cross( X );

クロス積の長さは平行四辺形の面積に等しく、非垂直の単位長さのベクトルでは<1.0です。ここでXYを正規化します:

    X.Normalize();
    Y.Normalize();

結果の4x4行列にすべてを入れます:

    Matrix[0][0] = X.x;
    Matrix[1][0] = X.y;
    Matrix[2][0] = X.z;
    Matrix[3][0] = -X.Dot( Eye );
    Matrix[0][1] = Y.x;
    Matrix[1][1] = Y.y;
    Matrix[2][1] = Y.z;
    Matrix[3][1] = -Y.Dot( Eye );
    Matrix[0][2] = Z.x;
    Matrix[1][2] = Z.y;
    Matrix[2][2] = Z.z;
    Matrix[3][2] = -Z.Dot( Eye );
    Matrix[0][3] = 0;
    Matrix[1][3] = 0;
    Matrix[2][3] = 0;
    Matrix[3][3] = 1.0f;

    return Matrix;
}
40
Sergey K.