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

时间:2015-11-01 13:00:09

标签: opengl math 3d rotation glm-math

这个问题的变体可能已在本网站上被问到,但我发现的答案都没有在我的案例中有效。

我正试图让相机看一眼。相机具有世界变换矩阵,用于计算前向量,最终制作视图矩阵时的眼睛位置。我的相机被视为场景中的任何其他物体,因此具有世界变换。我希望能够修改这个世界变换,这应该会自动影响相机。我想实际修改这台相机的世界变换,以便它能够" LookAt"一点。

为此,我修改了世界变换的旋转术语( T 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( );
}

基本上,我已经有一个可以设置旋转(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 ));


}

这种作品,相机开始偏离一段时间后应该看的位置。我做错了什么?

1 个答案:

答案 0 :(得分:0)

在“眼睛”点创建一个视图“看”相机矩阵,看起来像“at”,即我看起来像这样:

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]));
}

。有了这个,你不需要一个世界矩阵来移动到eye。或者我误解了你的问题?