想象一下,你站在地上仰望着天空中的立方体。当你倾斜头部时,立方体会移动。我试图在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);
答案 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]范围内的坐标。)