【问题标题】:Compatibility function for gluLookAtgluLookAt 的兼容函数
【发布时间】: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轴。尝试在不设置任何其他视图投影矩阵的情况下进行绘制(或将它们全部设置为身份),您会明白我的意思(顺便说一句,这称为同质剪辑空间......)。

标签: c++ opengl glulookat


【解决方案1】:

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

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

//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的观点……

【讨论】:

  • 我认为“所有教程”是指NeHe?该网站非常过时且几乎没用,您应该避免使用它。我发现 arcsynthesis.org/gltut 更有帮助。
  • 您可以通过在矩阵的底行包含 -eyeX、-eyeY、-eyeZ 来摆脱 glTranslate。
  • 有道理...感谢旁注...我会添加这个。
猜你喜欢
  • 2021-11-15
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2013-08-09
相关资源
最近更新 更多