计算机图形学:用 GL 程序实现透视投影立方体绘制及关键逻辑解析
```c #include <GL/glut.h> GLint winwidth = 600, winheight = 600; // 设置初始化窗口大小 GLfloat xo = 0.0, yo = 0.0, zo = 5.0; // 设置观察坐标系原点 GLfloat xref = 0.0, yref = 0.0, zref = 0.0; // 设置观察坐标系参考点(视点) GLfloat vx = 0.0, vy = 1.0, vz = 0.0; // 设置观察坐标系向上向量(y轴) GLfloat xwmin = -1.0, ywmin = -1.0, xwmax = 1.0, ywmax = 1.0; // 设置裁剪窗口坐标范围 GLfloat znear = 1.0, zfar = 25.0; // 设置远近裁剪面深度范围分别为25.0,1.0 void init(void) { glClearColor(1.0, 1.0, 1.0, 0.0); // 设置颜色为白色 gluLookAt(xo, yo, zo, xref, yref, zref, vx, vy, vz); // 指定三维观察参数 } void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除颜色缓冲区和深度缓冲区 glEnable(GL_DEPTH_TEST); // 启用深度测试 glMatrixMode(GL_PROJECTION); // 切换到投影矩阵 glLoadIdentity(); // 重置当前矩阵 gluPerspective(45.0, (GLfloat)winwidth / (GLfloat)winheight, znear, zfar); // 设置透视投影 glMatrixMode(GL_MODELVIEW); // 切换回模型视图矩阵 glLoadIdentity(); // 重置当前矩阵 // 绘制立方体 glColor3f(1.0, 0.0, 0.0); // 设置绘制颜色为红色 glutWireCube(2.0); // 绘制线框立方体 glFlush(); // 强制执行所有 OpenGL 命令 } void reshape(int w, int h) { winwidth = w; winheight = h; glViewport(0, 0, w, h); // 设置视口大小 glMatrixMode(GL_PROJECTION); // 切换到投影矩阵 glLoadIdentity(); // 重置当前矩阵 gluPerspective(45.0, (GLfloat)w / (GLfloat)h, znear, zfar); // 设置透视投影 glMatrixMode(GL_MODELVIEW); // 切换回模型视图矩阵 } int main(int argc, char argv) { glutInit(&argc, argv); // 初始化 GLUT glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); // 设置显示模式 glutInitWindowSize(winwidth, winheight); // 设置窗口大小 glutCreateWindow("透视投影立方体"); // 创建窗口 init(); // 初始化 OpenGL 环境 glutDisplayFunc(display); // 注册绘制函数 glutReshapeFunc(reshape); // 注册窗口调整函数 glutMainLoop(); // 进入 GLUT 主循环 return 0; } ``` 需要注意的逻辑点: 1. 深度测试:确保启用了深度测试 (`glEnable(GL_DEPTH_TEST)`),否则立方体的前后关系可能会出错。 2. 视口设置:在 `reshape` 函数中设置视口大小 (`glViewport`),以适应窗口大小的变化。 3. 投影矩阵:在 `display` 和 `reshape` 函数中都重新设置投影矩阵,确保投影效果正确。 ######[AI写代码神器 | 830点数解答 | 2024-12-18 21:44:24]
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)338
- C++游戏代码中枚举类型定义报错原因及解决方案(字节豆包 | 371点数解答 | 2026-02-27 20:29:12)22
- Golang开发:解析JSON数据时数值默认类型及示例解析(百度文心 | 393点数解答 | 2023-11-09 18:13:06)269
- Java实现Student类:计算三门课程总分、平均分、最高分与最低分( | 2332点数解答 | 2024-03-12 10:23:27)258
- Python 字典基本操作全解析:创建、查找与遍历示例( | 313点数解答 | 2024-05-06 09:52:01)370
- SQL Working Areas Sizing: Manual vs. Automatic Policy - A Comprehensive Analysis(阿里通义 | 530点数解答 | 2024-05-13 10:55:58)299
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)306
- 不用VS!C#工程师必知的命令行编译方法(百度文心 | 19点数解答 | 2023-11-09 17:47:59)238
- C++实现单门课程成绩管理系统:教师学生双身份操作全解析(GPT | 6361点数解答 | 2024-05-24 02:01:02)529
- C++实现:功能完备的单门课程成绩管理系统(GPT | 4293点数解答 | 2024-05-24 10:20:03)372
- C++ 实现:轻松将键盘输入字符串大写字母转小写并输出(讯飞星火 | 191点数解答 | 2024-06-06 20:27:13)213
- C++ 实现:根据人员行为记录计算同学间好感度(字节豆包 | 252点数解答 | 2024-10-17 15:50:40)332