C ++ OpenGL gluLookAt

时间:2011-11-25 19:29:36

标签: c++ opengl

我使用过OpenGL命令

gluLookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ)

我基本上想要撤消此操作,以便我的相机返回原点并面向-z。 我已经阅读(在各种网站上)一些基本的glRotatef命令以及glTranslate(-eyeY, -eyeY, -eyeZ)可以实现所需的结果。

但我无法弄清楚glRotate命令究竟是什么。

6 个答案:

答案 0 :(得分:2)

为什么不用标识重新加载modelview矩阵?即:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

答案 1 :(得分:2)

您可以使用

保存矩阵
glPushMatrix();

并使用

恢复它
glPopMatrix();

但请注意性能影响。我想这可能就是你想要将gluLookAt的呼叫转回的原因。也许你可以澄清一下?

答案 2 :(得分:0)

或者不是使用极度弃用的OpenGL东西,编写自己的矩阵类,只需保存它的副本,然后在调用自己的Matrix :: LookAt方法后将其还原:)

答案 3 :(得分:0)

为什么不直接使用gluLookAt(0,0,0,0,0,-1,0,1,0)?

这会将相机置于0(眼睛位置为0,0,0)并将指向的外观设置为沿-z轴的(0,0,-1),并将向上矢量设置为(0 ,1,0),沿y轴。

gluLookAt不是添加剂(不确定这是否是正确的词)。每次调用gluLookAt都会设置整个视图矩阵。

如果你想看一些位置然后在使用gluLookAt移动后回到相同的位置,你可以保存眼睛,观察点和向上矢量并稍后使用它们。

答案 4 :(得分:0)

如果您的代码如下所示:

glMatrixMode(GL_MODELVIEW)

glLoadIdentity();

gluLookAt(......);

然后通过gluLookAt调用实现模型视图矩阵。所以首先通过调用

获取modelview矩阵
float modelViewMat[16];

glGetFloatv(GL_MODELVIEW_MATRIX, modelViewMat);

现在找到modelViewMat的反转矩阵。

float invertMat[16];

__gluInvertMatrixd(modelViewMat, invertMat);

以下是获取反转矩阵的代码。

int __gluInvertMatrixd(const float src[16], float inverse[16])
{
    int i, j, k, swap;
    float t;
    GLfloat temp[4][4];

    for (i=0; i<4; i++)
        for (j=0; j<4; j++)
            temp[i][j] = src[i*4+j];

    for(int i=0;i<16;i++)
        inverse[i] = 0;
    inverse[0] = inverse[5] = inverse[10] = inverse[15] = 1.0f;

    for(i=0; i<4; i++)
    {
        swap = i;
        for (j = i + 1; j < 4; j++)
            if (fabs(temp[j][i]) > fabs(temp[i][i]))
                swap = j;

        if (swap != i) {
            //Swap rows.
            for (k = 0; k < 4; k++) {
                t = temp[i][k];
                temp[i][k] = temp[swap][k];
                temp[swap][k] = t;

                t = inverse[i*4+k];
                inverse[i*4+k] = inverse[swap*4+k];
                inverse[swap*4+k] = t;
            }
        }

        if (temp[i][i] == 0)
            return 0;

        t = temp[i][i];
        for (k = 0; k < 4; k++) {
            temp[i][k] /= t;
            inverse[i*4+k] /= t;
        }

        for (j = 0; j < 4; j++) {
            if (j != i) {
                t = temp[j][i];
                for (k = 0; k < 4; k++) {
                    temp[j][k] -= temp[i][k]*t;
                    inverse[j*4+k] -= inverse[i*4+k]*t;
                }
            }
        }
    }

    return 1;
}

现在将invertMat乘以任何你不想添加模型视图矩阵效果的对象矩阵。

喜欢:

glPushMatrix();

glMultMatrixf(invertMat);


glRotatef(...);

glTranslatef(...);

...
...

glDrawArrays(....);


glPopMatrix();

答案 5 :(得分:0)

因为看起来你的问题是照明,我有一个可以帮助你的交易的老技巧。我在这里做了很多假设,但是你想要这样做的原因是因为当你的gluLookAt改变时你不希望你的灯光四处移动?我遇到了一些麻烦,我发现这可以用于此目的:

glMatrixMode (GL_MODELVIEW);
gluLookAt (ya know, stuff);
glLightfv (GL_LIGHTn, GL_POSITION, positionOfLight));
// ^ Putting your light positioning here will keep it in the right spot, relative only to the origin!
// Draw your stuff

希望得到了一点帮助。玩得开心。