【发布时间】:2011-02-21 23:35:55
【问题描述】:
我正在尝试自己计算一个观察矩阵,而不是使用 gluLookAt()。 我的问题是我的矩阵不起作用。但是,在 gluLookAt 上使用相同的参数确实有效。
我创建观察矩阵的方式:
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 类中,因为它们在创建投影矩阵时工作正常。
【问题讨论】:
-
“视图”在将其传递给 glMultMatrix() 时是否以列主要顺序正确存储? (来自 glMultMatrix() 的 OpenGL 文档中的注释:“这与矩阵元素的标准行优先 C 排序不同。”)
-
我的代码生成的两个矩阵的存储方式与我将结果传递给 glMultMatrix() 的方式相同