定义一个简单形体(OpenGL提供的基础形体,如立方体、球体等),并生成正交投影及透视投影视图;
时间: 2023-08-18 16:09:55 浏览: 116
以下是一个使用OpenGL库生成立方体并生成正交投影和透视投影视图的代码示例:
```c++
#include <GL/glut.h>
void display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除颜色和深度缓冲区
// 设置正交投影视图
glViewport(0, 0, 400, 400); // 视口大小
glMatrixMode(GL_PROJECTION); // 选择投影矩阵
glLoadIdentity(); // 重置矩阵
glOrtho(-2.0, 2.0, -2.0, 2.0, -2.0, 2.0); // 设置正交投影范围
glMatrixMode(GL_MODELVIEW); // 选择模型视图矩阵
glLoadIdentity();
gluLookAt(0.0, 0.0, 1.0, // 相机位置
0.0, 0.0, 0.0, // 观察点位置
0.0, 1.0, 0.0); // 相机朝向
glColor3f(1.0, 0.0, 0.0); // 设置颜色为红色
glutWireCube(1.0); // 绘制边框立方体
// 设置透视投影视图
glViewport(400, 0, 400, 400); // 视口大小
glMatrixMode(GL_PROJECTION); // 选择投影矩阵
glLoadIdentity(); // 重置矩阵
gluPerspective(60.0, 1.0, 0.1, 10.0); // 设置透视投影范围
glMatrixMode(GL_MODELVIEW); // 选择模型视图矩阵
glLoadIdentity();
gluLookAt(0.0, 0.0, 3.0, // 相机位置
0.0, 0.0, 0.0, // 观察点位置
0.0, 1.0, 0.0); // 相机朝向
glColor3f(0.0, 1.0, 0.0); // 设置颜色为绿色
glutSolidCube(1.0); // 绘制实心立方体
glutSwapBuffers(); // 交换前后缓冲区
}
int main(int argc, char** argv) {
glutInit(&argc, argv); // 初始化GLUT库
glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); // 设置显示模式
glutInitWindowSize(800, 400); // 设置窗口大小
glutCreateWindow("OpenGL Cube Projection"); // 创建窗口
glutDisplayFunc(display); // 设置绘制回调函数
glEnable(GL_DEPTH_TEST); // 开启深度测试
glutMainLoop(); // 进入消息循环
return 0;
}
```
代码中使用了GLUT库来创建窗口和进行基本的OpenGL绘制操作。在`display()`函数中,首先使用`glClear()`函数清除颜色和深度缓冲区。然后根据需要,分别设置正交投影视图和透视投影视图。在每个视图中,使用`glViewport()`函数设置视口大小和位置,`glMatrixMode()`函数选择矩阵模式并重置矩阵,然后分别设置投影范围和相机位置与朝向。最后,使用`glutWireCube()`和`glutSolidCube()`函数绘制边框立方体和实心立方体,并使用`glutSwapBuffers()`函数交换前后缓冲区,完成绘制。
阅读全文