我使用GL_POLYGON创建了一个带有显示列表的立方体。我已经在(0,0,0)中的坐标原点初始化它。在我的显示函数中,在glutDisplayFunc中调用我使用代码:< / p>
glLoadIdentity();
glOrtho(0,0,0,0,1,1);
glMatrixMode(GL_MODELVIEW);
我想使用glOrtho.Well使用正交投影,我的问题是:考虑到我的窗口大小为600x600,我仍然可以看到我的立方体是否正常?
更重要的是,我想了解如何使用相对的OpenGL函数移动我的立方体或相机的一些指导。让我说我想将相机移回(到z轴)或我的立方体移到前面(到 - z轴)。我该怎么做?
答案 0 :(得分:2)
在您致电glMatrixMode()
之前,首先还需要将GL_PROJECTION
设置为glOrtho()
,所以它看起来会像这样。
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(...); // Replace ... with your values
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
要移动方向,您只需调用以下一项或多项功能即可。
您可以单击上面的链接来阅读每个功能的工作方式和内容。但基本上是:
glTranslate*()
翻译/移动当前选定的矩阵。glRotate*()
旋转当前选定的矩阵。glScale*()
缩放当前选定的矩阵。您还可以使用glPushMatrix()和glPopMatrix()来推送和弹出当前的矩阵堆栈。
还要注意您使用旧的和已弃用的功能。您不应该使用它们,而是现在假设您要计算并创建自己的矩阵堆栈。
基本上你通过组合上述功能来做到这一点。它实际上可能听起来更难。
我将创建一个1个摄像头和2个对象的示例,基本上是为了让您了解它是如何工作的。
void render()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
// The Camera Rotations & Translation
glRotatef(camera_pitch, -1f, 0f, 0f);
glRotatef(camera_yaw, 0f, 1f, 0f);
glTranslate(-camera_x, -camera_y, -camera_z);
// Object 1
glPushMatrix();
glRotatef(...);
glTranslate(...);
// Render Object 1
glPopMatrix();
// Object 2
glPushMatrix();
glRotatef(...);
glTranslate(...);
// Render Object 2
glPopMatrix();
}
再次用您自己的值替换....
需要消除相机坐标的原因是因为为什么移动相机,我们实际上是“推”(翻译等)远离相机/中心的所有东西(从而相机始终处于中心位置。)
重要您旋转的顺序,然后翻译或翻译然后旋转,这很重要。当需要进行相机变换时,您需要旋转然后进行平移。
gluLookAt 100%相同,就像在我的例子中一样。
示例:
// The Camera Rotations & Translation
glRotatef(camera_pitch, -1f, 0f, 0f);
glRotatef(camera_yaw, 0f, 1f, 0f);
glTranslate(-camera_x, -camera_y, -camera_z);
这是我自己的功能,与gluLookAt
完全相同。 我怎么知道?因为我查看了原来的gluLookAt
函数,然后我做了以下函数。
void lookAt(float eyex, float eyey, float eyez, float centerx, float centery, float centerz)
{
float dx = eyex - centerx;
float dy = eyey - centery;
float dz = eyez - centerz;
float pitch = (float) Math.atan2(dy, Math.sqrt(dx * dx + dz * dz));
float yaw = (float) Math.atan2(dz, dx);
pitch = -pitch;
yaw = yaw - 1.57079633f;
// Here you could call glLoadIdentity() if you want to reset the matrix
// glLoadIdentity();
glRotatef(Math.toDegrees(pitch), -1f, 0f, 0f);
glRotatef(Math.toDegrees(yaw), 0f, 1f, 0f);
glTranslatef(-eyex, -eyey, -eyez);
}
您可能需要更改Math.*
次来电,因为上述代码不是用C语言编写的。