课程大作业:多形态自由视角天体运动系统
源目录没有单独保留教师发布的大作业题面,只保存了我当时的最终报告、代码和演示视频。因此下述任务范围来自我实际提交的内容,不反推未留存的评分要求。
实际完成目标
构建一个可交互的天体运动演示程序:
- 展示原始比例太阳系、视觉优化比例太阳系与地月系。
- 为太阳、行星、地球和月球使用不同着色器与纹理。
- 模拟天体自转与公转,并考虑部分轨道或自转平面夹角。
- 支持视野平移、前后缩放、视线偏移和沿三个坐标轴观察。
- 在真实天体数据与可观察性冲突时,提供非线性比例调整。
查看项目实现与效果
1. 程序结构
- Sphere.py:生成球面顶点、纹理坐标、索引和法线,负责纹理加载、MVP 更新与绘制。
- Shader.py:保存并编译恒星、行星、地月系着色器。
- Data.py:保存天体名称、半径、轨道半径、自转周期与公转周期。
- AuxFunc.py:窗口、键盘控制、视口调整与资源释放。
- main.py:选择场景、实例化天体并运行 GLFW 渲染循环。
2. 几何与运动
天体共用球体网格类,每个实例带自己的尺度、纹理和运动参数。模型矩阵同时表达:
- 绕自身轴的自转。
- 绕系统中心的公转。
- 视效需要的尺度调整。
真实太阳系尺度跨度太大,若完全等比例显示,除太阳外的行星几乎不可见。因此我在项目中同时保留“原始比例”与“优化比例”模式,并在报告中明确说明后者是展示性缩放,不是物理尺度还原。
3. 着色
太阳使用恒星着色器并作为点光源,不再接受外部光照。行星使用表面纹理与 Phong shading,按环境、漫反射和镜面分量计算太阳光照。地月系着色器把太阳近似为远处平行光,用于表现晨昏变化。
4. 相机与交互
键盘可让 eye 与 center 同步平移以移动视野,也可单独改变 center 调整视线。窗口尺寸变化后重新计算投影与 glViewport,避免宽高比改变造成星球拉伸。
5. 输出效果
视觉优化后的太阳系:

地月系:

这两张图只能说明我当时的最终渲染状态;源目录另有动态演示视频,但这里没有复制整段视频。