Opengl 使用世界变换矩阵使相机观察点?

Opengl 使用世界变换矩阵使相机观察点?,opengl,math,3d,rotation,glm-math,Opengl,Math,3d,Rotation,Glm Math,这个问题的变体可能在这个网站上被问到,但我发现的答案都不适用于我的情况 我正试着让一架照相机看一个点。摄像机有一个世界变换矩阵,用于在最终生成视图矩阵时计算前向量和眼睛位置。我的相机被视为场景中的任何其他对象,因此具有世界变换。我希望能够修改这个世界变换,这将自动影响相机。我想修改这个相机的世界变换,这样它就可以“看”一个点 为此,我修改了世界变换的旋转项(T*S*R)如下: void WorldTransform::SetLookAt( float x, float y, float z )

这个问题的变体可能在这个网站上被问到,但我发现的答案都不适用于我的情况

我正试着让一架照相机看一个点。摄像机有一个世界变换矩阵,用于在最终生成视图矩阵时计算前向量和眼睛位置。我的相机被视为场景中的任何其他对象,因此具有世界变换。我希望能够修改这个世界变换,这将自动影响相机。我想修改这个相机的世界变换,这样它就可以“看”一个点

为此,我修改了世界变换的旋转项(T*S*R)如下:

void WorldTransform::SetLookAt( float x, float y, float z ) {

    vec3 lookPoint = vec3 ( x, y, z );

    vec3 lookDir = normalize( lookPoint - m_position  );

    float lookLengthOnXZ = sqrtf( lookDir.z*lookDir.z + lookDir.x*lookDir.x );
    m_rotationX = degrees(atan2f( lookDir.y, lookLengthOnXZ ));
    m_rotationY = degrees(atan2f( lookDir.x, lookDir.z ));

    RotateAbs( m_rotationX, m_rotationY, m_rotationZ );

    UpdateMatLocal( );
}
Matrix4x4<T> & LookAt(Vec3<T> const & eye, Vec3<T> const & at, Vec3<T> const & up)
{
    auto d = Vec3<T>();
    auto u = Vec3<T>();
    auto r = Vec3<T>();

    d = Unit(at - eye);                     
    u = Unit(up);                       
    r = Unit(Cross(d, u));      
    u = Cross(r, d);

    v[0] = r[0];    v[1] = u[0];    v[2] = -d[0];   v[3] = 0;
    v[4] = r[1];    v[5] = u[1];    v[6] = -d[1];   v[7] = 0;
    v[8] = r[2];    v[9] = u[2];    v[10] = -d[2];  v[11] = 0;
    v[12] = 0;      v[13] = 0;      v[14] = 0;      v[15] = 1;

    return operator *= (Math::Translate<T>(-eye[0], -eye[1], -eye[2]));
}
基本上,我已经有一个函数可以设置旋转(
RotateAbs()
),所以我计算俯仰、偏航和侧倾角度,并将它们传递到那里

计算视图矩阵时,我只需执行以下操作:

void Camera::Update( ) {
    if (m_pTransform.m_pointer == nullptr) return;

    vec3& position = m_pTransform->GetPosition( );
    m_look         = m_pTransform->GetForward( );
    m_lookAt       = position + m_look;

    //Calculate the new matrix
    m_view = glm::lookAt( position, m_lookAt, glm::vec3( 0.0f, 1.f, 0.0f ));


}
这类工作,相机开始偏离它应该看的地方一段时间后。我做错了什么?

在“眼睛”点为相机创建一个视图“注视”矩阵,注视,即我的视图如下所示:

void WorldTransform::SetLookAt( float x, float y, float z ) {

    vec3 lookPoint = vec3 ( x, y, z );

    vec3 lookDir = normalize( lookPoint - m_position  );

    float lookLengthOnXZ = sqrtf( lookDir.z*lookDir.z + lookDir.x*lookDir.x );
    m_rotationX = degrees(atan2f( lookDir.y, lookLengthOnXZ ));
    m_rotationY = degrees(atan2f( lookDir.x, lookDir.z ));

    RotateAbs( m_rotationX, m_rotationY, m_rotationZ );

    UpdateMatLocal( );
}
Matrix4x4<T> & LookAt(Vec3<T> const & eye, Vec3<T> const & at, Vec3<T> const & up)
{
    auto d = Vec3<T>();
    auto u = Vec3<T>();
    auto r = Vec3<T>();

    d = Unit(at - eye);                     
    u = Unit(up);                       
    r = Unit(Cross(d, u));      
    u = Cross(r, d);

    v[0] = r[0];    v[1] = u[0];    v[2] = -d[0];   v[3] = 0;
    v[4] = r[1];    v[5] = u[1];    v[6] = -d[1];   v[7] = 0;
    v[8] = r[2];    v[9] = u[2];    v[10] = -d[2];  v[11] = 0;
    v[12] = 0;      v[13] = 0;      v[14] = 0;      v[15] = 1;

    return operator *= (Math::Translate<T>(-eye[0], -eye[1], -eye[2]));
}
Matrix4x4和LookAt(Vec3常量和眼睛、Vec3常量和at、Vec3常量和向上)
{
自动d=Vec3();
自动u=Vec3();
自动r=Vec3();
d=单位(眼睛处);
u=单位(向上);
r=单位(交叉(d,u));
u=交叉(r,d);
v[0]=r[0];v[1]=u[0];v[2]=-d[0];v[3]=0;
v[4]=r[1];v[5]=u[1];v[6]=-d[1];v[7]=0;
v[8]=r[2];v[9]=u[2];v[10]=-d[2];v[11]=0;
v[12]=0;v[13]=0;v[14]=0;v[15]=1;
返回运算符*=(数学::Translate(-eye[0],-eye[1],-eye[2]);
}

。这样,您就不需要世界矩阵来移动到
eye
。还是我误解了你的问题?

你发布的是一个构建视图矩阵的函数。我已经有了。我的相机被视为场景中的任何其他对象,因此具有世界变换。我希望能够修改此世界变换,这将自动影响相机。视图矩阵是相机的世界变换。我希望能够从世界变换推断此矩阵。我希望能够修改世界矩阵以查看一个点,然后从那里推导视图矩阵(通过求逆?)