gluLookAt替代方案不起作用

时间:2010-05-20 16:35:35

标签: c++ opengl

我正在尝试自己计算一个lookat矩阵,而不是使用gluLookAt()。 我的问题是我的矩阵不起作用。然而,在gluLookAt上使用相同的参数确实有效。

我创建一个lookat矩阵的方法:

Vector3 Eye, At, Up; //these should be parameters =)

Vector3 zaxis = At - Eye;           zaxis.Normalize();
Vector3 xaxis = Vector3::Cross(Up, zaxis);  xaxis.Normalize();
Vector3 yaxis = Vector3::Cross(zaxis, xaxis);   yaxis.Normalize();

float r[16] = 
{
    xaxis.x,    yaxis.x,    zaxis.x,    0,
    xaxis.y,    yaxis.y,    zaxis.y,    0,
    xaxis.z,    yaxis.z,    zaxis.z,    0,
    0,          0,          0,          1,
};
Matrix Rotation;
memcpy(Rotation.values, r, sizeof(r));

float t[16] = 
{
     1,      0,      0,     0,
     0,      1,      0,     0,
     0,      0,      1,     0,
    -Eye.x, -Eye.y, -Eye.z, 1,
};
    Matrix Translation;
    memcpy(Translation.values, t, sizeof(t));


View = Rotation * Translation; // i tried reversing this as well (translation*rotation)

现在,当我尝试使用这个矩阵来调用glMultMatrixf时,我的引擎中没有显示任何内容,而使用相同的眼睛,gluLookAt上的lookat和up值就像我之前说的那样完美。

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMultMatrixf(View);

问题必须在我发布的代码中的某处,我知道问题不在我的Vector3 / Matrix类中,因为它们在创建投影矩阵时工作正常。

1 个答案:

答案 0 :(得分:3)

我假设你有一个右手坐标系(它在OpenGL中是默认的)。 请尝试以下代码。我想你忘了规范化了,你必须在矩阵中放入“-zaxis”。

Vector3 Eye, At, Up; //these should be parameters =)

Vector3 zaxis = At - Eye; zaxis.Normalize();
Up.Normalize();
Vector3 xaxis = Vector3::Cross(Up, zaxis);  xaxis.Normalize();
Vector3 yaxis = Vector3::Cross(zaxis, xaxis);   yaxis.Normalize();

float r[16] = 
{
    xaxis.x,    yaxis.x,    -zaxis.x,    0,
    xaxis.y,    yaxis.y,    -zaxis.y,    0,
    xaxis.z,    yaxis.z,    -zaxis.z,    0,
    0,          0,          0,          1,
};