2

我刚买了一台新电脑,现在必须让我的演示程序使用 SDL2/OpenGL 运行。我使用该程序尝试了各种技术并使用了 gluLookAt(显然,它不应该再使用,甚至不应该使用)。

现在我正在寻找一种方法来替换 gluLookAt 方法,方法是构建一个与 gluLookAt 相同的转换矩阵。我遇到了这个声称是 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());
}

谁做错了——我的信息来源还是我?我该如何解决这个问题?注意:我不会在我的实际项目中使用它,但我仍然需要它用于我的演示程序,该程序也将被审核以进行评分。

4

1 回答 1

3

我刚刚有了实现 gluLookAt 兼容性方法的想法,例如 gluLookAt 在旧版本的 Mesa3D 中实现:(Mesa3D 3.2 的 glu.c

现在它看起来如下所示并且可以工作:

//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 x, y, z;
    z = Vector3f(eyeX-lookAtX, eyeY-lookAtY, eyeZ-lookAtZ).normalize();
    y = Vector3f(upX, upY, upZ);
    x = y ^ z;
    y = z ^ x;
    x = x.normalize();
    y = y.normalize();
    // mat is given transposed so OpenGL can handle it.
    Matrix4x4 mat (new GLfloat[16]
                     {x.getX(), y.getX(),   z.getX(),   0,
                     x.getY(),  y.getY(),   z.getY(),   0,
                     x.getZ(),  y.getZ(),   z.getZ(),   0,
                     -eyeX,     -eyeY,      -eyeZ,      1});
    glMultMatrixf(mat.getComponents());
}

我知道这是今天不使用 OpenGL 的一种方式,但不知何故,所有教程似乎都在使用gluLookAt,因此传达了 OpenGL 中相机的存在。我自己还是要摆脱这种关于 OpenGL 的观点……

于 2014-06-30T15:53:10.273 回答