我刚拿到一台新电脑,现在必须让我的演示程序运行SDL2/OpenGL。我使用该程序来尝试各种技术,并使用gluLookAt(显然,不应该再使用它,甚至不应该使用它)。gluLookAt的兼容性功能
现在我正在寻找一种方法来替代gluLookAt方法,方法是构建一个与gluLookAt相同的转换矩阵。我碰到this声称是gluLookAt可用的替代品(答案 - 不是问题)。
我对它的实现看起来像这样(我假设j^k
意味着J和K的交叉产品 - 纠正我,如果我错了):
//Compat method: gluLookAt deprecated
void util_compat_gluLookAt(GLfloat eyeX, GLfloat eyeY, GLfloat eyeZ, GLfloat lookAtX, GLfloat lookAtY, GLfloat lookAtZ, GLfloat upX, GLfloat upY, GLfloat upZ) {
Vector3f up (upX, upY, upZ);
Vector3f lookAt (-lookAtX, -lookAtY, -lookAtZ);
Vector3f eye (eyeX, eyeY, eyeZ);
Vector3f i = up^lookAt;
Matrix4x4 mat (new GLfloat[16]
{i.getX(), upX, lookAt.getX(), 0,
i.getY(), upY, lookAt.getY(), 0,
i.getZ(), upZ, lookAt.getZ(), 0,
0, 0, 0, 1});
Vector3f translate = mat * (Vector3f()-eye); // Not yet correctly implemented: Negative of vector eye ([0,0,0]-[eyeX,eyeY,eyeZ])
mat.setItem(3,0,translate.getX());
mat.setItem(3,1,translate.getX());
mat.setItem(3,2,translate.getX());
glMultMatrixf(mat.transpose().getComponents());
}
谁做了错误的东西 - 我的信息来源或者我?我该如何解决这个问题? 注意:我不会在我的实际项目中使用它,但我仍然需要它用于我的演示程序,该程序也将用于评分。
“甚至从来不应该使用”......为什么不呢? glu有很多有用的功能。 –
我特别指gluLookAt。这很有用 - 是的,但它传达了OpenGL中不存在的“相机”的想法。因此,现在很难理解如何正确使用转换矩阵。 (至少对我来说) – s3lph
当然相机存在,默认情况下(0,0,0),并沿正z轴向下看。尝试绘制而不设置任何其他视图投影矩阵(或将它们全部设置为标识),您将看到我的意思(这称为同质的剪辑空间btw ...)。 –