2014-06-30 49 views
1

我刚拿到一台新电脑,现在必须让我的演示程序运行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()); 
} 

谁做了错误的东西 - 我的信息来源或者我?我该如何解决这个问题? 注意:我不会在我的实际项目中使用它,但我仍然需要它用于我的演示程序,该程序也将用于评分。

+0

“甚至从来不应该使用”......为什么不呢? glu有很多有用的功能。 –

+0

我特别指gluLookAt。这很有用 - 是的,但它传达了OpenGL中不存在的“相机”的想法。因此,现在很难理解如何正确使用转换矩阵。 (至少对我来说) – s3lph

+0

当然相机存在,默认情况下(0,0,0),并沿正z轴向下看。尝试绘制而不设置任何其他视图投影矩阵(或将它们全部设置为标识),您将看到我的意思(这称为同质的剪辑空间btw ...)。 –

回答

3

我只是有这个想法实现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的这种观点......

+0

“所有的教程”我假设你的意思是NeHe?该网站非常过时,几乎没用,你应该避免它。我发现http://www.arcsynthesis.org/gltut/更有帮助。 – Dan

+0

谢谢,这似乎是一个很好的教程。 – s3lph

+0

您可以通过在矩阵的底部包含-eyeX,-eyeY,-eyeZ来摆脱glTranslate。 – Aumnayan