定义一个简单形体(OpenGL提供的基础形体,如立方体、球体等),并生成正交投影及透视投影视图
时间: 2023-11-22 08:55:43 浏览: 44
以下是使用OpenGL生成一个简单的立方体,并生成正交投影和透视投影的代码示例:
```c++
#include <GL/glut.h>
void init()
{
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 设置正交投影
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-2, 2, -2, 2, -10, 10);
// 设置视点
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, 0, 5, 0, 0, 0, 0, 1, 0);
// 绘制立方体
glPushMatrix();
glColor3f(1.0f, 0.0f, 0.0f);
glutSolidCube(1.0f);
glPopMatrix();
// 设置透视投影
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60, 1, 1, 100);
// 设置视点
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, 0, 5, 0, 0, 0, 0, 1, 0);
// 绘制立方体
glPushMatrix();
glColor3f(0.0f, 1.0f, 0.0f);
glTranslatef(2.5f, 0.0f, 0.0f);
glutSolidCube(1.0f);
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(800, 600);
glutCreateWindow("OpenGL Demo");
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
```
在上述代码中,我们首先启用了深度测试和光照,然后在 `display()` 函数中先设置了正交投影,绘制了一个红色的立方体,接着设置了透视投影,绘制了一个绿色的立方体。在每次绘制前,我们都需要使用 `glPushMatrix()` 和 `glPopMatrix()` 函数保存和恢复当前的矩阵状态,以避免不必要的变换影响后续的绘制。最后使用 `glutSwapBuffers()` 函数实现双缓冲,避免绘制过程中出现闪烁。