Opengl es 帮助理解gluLookAt()

Opengl es 帮助理解gluLookAt(),opengl-es,Opengl Es,想象你站在地上仰望天空中的一个立方体。当你倾斜你的头,立方体移动。我试图在iPhone上使用OpenGL ES复制这一点,方法是在观察围绕原点绘制的简单3D立方体时,操纵相机的倾斜。我正在使用Cocos2d中的gluLookAt()函数,该函数应该模拟OpenGL版本,似乎当我尝试修补任何值时,我的多维数据集都消失了 我的问题是:你能在这里提供一个gluLookAt()用法,让我开始操作相机,这样我就可以知道它是如何工作的了?我真的很有兴趣学习如何沿Y轴倾斜相机 这是我目前的代码: 视口配置 g

想象你站在地上仰望天空中的一个立方体。当你倾斜你的头,立方体移动。我试图在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);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

gluLookAt() // What goes here?
模型视图矩阵

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);
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);

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

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

因此,如果你站在(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轴正交的方向(当然,除了将中心点设置为你正上方的点之外)


但我想你需要一个透视投影。您当前的ortho至少不适合您的坐标,因为它指定了一个坐标系,其中坐标的大小为像素,因此您的[-1,1]-立方体的大小约为屏幕上的像素。请尝试
glupperspective(60.0,((双)\u backingWidth)/\u backingHeight,0.1100.0)
。如果您确实希望正交投影没有任何真实的透视失真,可以使用
glOrtho
,但在这种情况下,您应该保持
glOrtho
参数的大小比例与模型坐标大致同步(因此不指定屏幕大小的正交并使用[-1,1]范围内的坐标).

@Christan-谢谢,这开始有意义了。还有一个问题:如果我操纵第三组双倍体(向上方向),我希望我的立方体沿着Y轴移动,对吗?@Jesse不,不一定。上方向向量指定摄影机的向上方向(例如真实摄影机的三脚架)。操纵立方体时,立方体可能会垂直于屏幕旋转。要使其沿y轴移动(对应于您向上看),您需要更改眼睛或中心位置。例如,如果您向上移动中心位置(沿y轴),您将看到立方体上方的一个点(因此立方体在屏幕上向下移动,或者更准确地说向下旋转)。要垂直于屏幕向下移动,请改变眼睛和中心点。@Jesse
gluLookAt
功能用于指定相机的位置和方向。它不应该用于在世界空间中移动立方体(或者至少没有那么容易,这可能解释了您的问题)。为此,您应该使用标准的OpenGL转换函数,如
glTranslate
glRotate
glScale
;相反,我想移动倾斜相机(这将移动并扭曲屏幕上的立方体)。我注意到,我可以通过操纵注视点来做到这一点。完美的谢谢你的帮助。