【发布时间】:2014-06-30 14:19:50
【问题描述】:
我刚买了一台新电脑,现在必须让我的演示程序使用 SDL2/OpenGL 运行。我使用该程序尝试了各种技术并使用了 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 中不存在的“相机”的概念。因此,现在更难理解如何正确使用转换矩阵。 (至少对我来说)
-
相机当然是存在的,默认在(0,0,0)并且向下看正z轴。尝试在不设置任何其他视图投影矩阵的情况下进行绘制(或将它们全部设置为身份),您会明白我的意思(顺便说一句,这称为同质剪辑空间......)。