帮助理解gluLookAt()

时间:2011-09-03 14:50:58

标签: opengl-es

想象一下,你站在地上仰望着天空中的立方体。当你倾斜头部时,立方体会移动。我试图在iPhone上使用OpenGL ES通过操纵相机的倾斜来复制它,同时查看围绕原点绘制的简单3D立方体。我正在使用来自Cocos2d的gluLookAt()函数,该函数应该模拟OpenGL版本,而且当我尝试修改任何值时,我的立方体似乎消失了。

我的问题是:你能在这里提供一个gluLookAt()用法,让我开始操作相机,这样我就可以弄清楚它是如何工作的吗?我真的很有兴趣学习如何沿Y轴倾斜相机。

这是我目前的代码:

视口配置

glBindFramebufferOES(GL_FRAMEBUFFER_OES, _viewFramebuffer);
glViewport(0, 0, _backingWidth, _backingHeight);

投影矩阵

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

// Maybe this should be a perspective projection?? If so,
// can you provide an example using gluPerspective()?
glOrthof(-_backingWidth, _backingWidth,-_backingHeight, _backingHeight, -1, 1);

ModelView Matrix

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

gluLookAt() // What goes here?

绘图代码

static const GLfloat cubeVertices[] = {
    -1.0, -1.0,  1.0,
    1.0, -1.0,  1.0,
    -1.0,  1.0,  1.0,
    1.0,  1.0,  1.0,
    -1.0, -1.0, -1.0,
    1.0, -1.0, -1.0,
    -1.0,  1.0, -1.0,
    1.0,  1.0, -1.0,
};

static const GLushort cubeIndices[] = {
    0, 1, 2, 3, 7, 1, 5, 4, 7, 6, 2, 4, 0, 1
};

static const GLubyte cubeColors[] = {
    255, 255,   0, 255,
    0,   255, 255, 255,
    0,     0,   0,   0,
    255,   0, 255, 255,
    255, 255,   0, 255,
    0,   255, 255, 255,
    0,     0,   0,   0,
    255,   0, 255, 255
};

glVertexPointer(3, GL_FLOAT, 0, cubeVertices);
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, cubeColors);
glEnableClientState(GL_COLOR_ARRAY);    
glDrawElements(GL_TRIANGLE_STRIP, 14, GL_UNSIGNED_SHORT, cubeIndices);

1 个答案:

答案 0 :(得分:5)

我不完全确定你想要什么,但这里有一些解释:

gluLookAt需要3个向量(每个为3个双倍):首先是摄像机的位置(眼点),然后是你所看到的位置(中心点),最后是向上指定向上的向量-direction(这不一定是完美的正交向上方向,因为无论如何它都是重新正交化的。)

因此,如果你站在(0,0,5)并查看你的立方体(位于中心)并希望y轴为向上方向,你可以调用gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)来查看你的立方体充满美感。

如果你想将头部向侧面倾斜,你只需要改变向上矢量并将其向侧面旋转一点。或者如果你想向上看,但是没有将头部倾斜到侧面,你仍然使用y轴作为向上矢量,但是你只看另一个点,所以你将中心点改为上面和前面的一个点你的(可能围绕眼睛位置旋转)。但是如果你想直视,这将不起作用,在这种情况下你需要将向上矢量更改为与y轴正交的东西(除了将中心点设置为直接在你上方的点之外,当然)。

但我认为你想要一个透视投影。你的当前正交至少非常不适合你的坐标,因为它指定了一个坐标系,其中坐标的像素大小,所以你的[-1,1] - 立方体大约是屏幕上像素的大小。试试gluPerspective(60.0, ((double)_backingWidth)/_backingHeight, 0.1, 100.0)。如果你真的想要一个没有任何真实透视失真的正交投影,你可以使用glOrtho,但在这种情况下你应该保持glOrtho参数的大小比例和你的模型的坐标大致同步(因此不指定屏幕大小的正交并使用[-1,1]范围内的坐标。)