本实验通过编程模拟和可视化技术,构建一个简化的二维太阳系模型,探索行星运动规律及其相互作用。
### 实验七:2D太阳系绘制
#### 一、实验背景及目的
本实验旨在通过实际编程操作让学生深入理解计算机图形学的基本原理和技术应用。通过2D太阳系的绘制,学生能够掌握二维图形变换的基本方法,了解矩阵堆栈的操作流程,并实现复合2D图形的变换。
具体实验目标包括:
1. **掌握2D太阳系的绘制方法**:学会利用基本元素如点、线等来构建太阳系模型。
2. **掌握矩阵堆栈的使用流程**:理解并实践矩阵堆栈在图形变换中的应用。
3. **进一步掌握复合2D图形变换**:结合多种变换技术,实现复杂的图形变换。
#### 二、实验内容详解
1. **基础设定**:
- 太阳半径Rs表示太阳的大小;
- 地球半径Re表示地球的大小;
- 月球半径Rm表示月球的大小。
2. **基本框架程序**:提供了一个名为`2DSunSystem.cpp`的基本OpenGL环境初始化结构。
3. **设计世界坐标系**:
设定合适的世界坐标系,以便于后续图形绘制。例如,太阳位于原点(0, 0),地球和月球的位置根据它们与太阳的相对距离确定。
4. **裁剪窗口大小**:合理设置裁剪窗口以确保整个2D太阳系在视口中完整显示。
5. **编写2D太阳系代码**:
基于上述设定,编写绘制程序。这包括位置确定、自转和公转动画实现等步骤。
6. **效果截图展示**:
实验图7-2展示了最终的渲染效果,包含各天体运动状态。
7. **添加中文字体标识**:在太阳、地球和月球的位置上使用中文标签如“太阳”、“地球”、“月球”。
8. **点缀修饰性图形**:为增加可视化效果,在基本模型基础上添加额外装饰元素,例如行星环或星座图案等。
#### 三、参考函数及参数设置
1. **OpenGL函数**:
- `glPushMatrix(void)`用于保存当前矩阵。
- `glPopMatrix(void)`用于恢复之前保存的矩阵。
2. **参数设置**:
- 设置点大小为`glPointSize(16);`
- 设置线宽为`glLineWidth(10);`
3. **中文字体绘制**:
使用以下函数选择字体样式和大小,以及绘制中文文本。
```cpp
void selectFont(int size, int charset, const char* face);
```
```cpp
void drawCNString(const char* str);
```
#### 四、思考题解答
1. **太阳不在原点时的程序修改**:
如果太阳位置改变,可以通过调整地球和月球坐标来适应新位置。具体来说,使用OpenGL中的平移变换(`glTranslatef`)将坐标系移动到新的太阳位置。
2. **OpenGL图形变换原理**:
OpenGL通过矩阵操作实现旋转、缩放和平移等基本变换。
3. **`glPushMatrix`和`glPopMatrix`的工作机制**:
- `glPushMatrix()`复制当前模型视图矩阵至堆栈顶部,保存状态;
- `glPopMatrix()`从堆栈中弹出最近的矩阵并恢复为当前模型视图矩阵。
通过本实验的学习,学生不仅能够理解计算机图形学的基础理论,还能掌握实际编程技巧,并为进一步深入研究打下坚实基础。