转转悠悠,这个坑,还没有爬出来,之前做游戏的时候以为不需要了,现在做渲染又绕回来,从另外一个角度说明,我面对的问题本质上是一类的。目录看了几遍,决定还是用“曳光弹”打法,从当前最需要的地方入手。这书翻译的不咋滴,以后看看原版—2020年4月23日 13点04分
第7章 渲染3D线框世界
- 线框引擎的总体体系结构
- 1.1 数据结构和3D流水线
物体->多边形->顶点->变换->光栅化->屏幕
所有的物体都会转化成多边形,然而,在简单的引擎中,物体将原封不动作为实体进行处理和渲染。 - 1.2
主多边形列表
(当游戏中涉及多个物体时,会形成列表,跳过不看) - 1.3
新的软件模块
(没什么用,跳过不看。)
编写一个简单的3D文件加载器
(主动忽视,我并不需要这一部分内容。)- 建立3D流水线
-
3.1 通用变换函数
旋转、平移、投影 -
3.2 局部坐标到世界坐标变换
物体列表的局部坐标到世界坐标变换:手工变换、矩阵变换。
渲染列表的局部坐标到世界坐标变换 -
3.3 欧拉相机模型
视距、视野、远近裁剪面、一定宽度和高度的视平面(表示实际的光栅窗口)。
相机的结构:
typedef struct cam4dv1_typ
{
int state; //记录相机的状态
int attr;//定义相机属性
POINT4D pos;//相机在世界坐标系中的位置
VECTOR4D dir;//欧拉角度或UVN相机模型的注视方向
VECTOR4D u;//UVN相机模型的朝向向量
VECTOR4D v;
VECTOR4D n;
POINT4D target;//UVN模型的目标位置
float view_dist_h;//水平视距和垂直视距
float view_dist_v;
float fov; //水平方向和垂直方向的视野
……
MATAIX4X4 macm;//用于存储世界坐标到相机坐标变换矩阵
MATAIX4X4 mper;//用于存储相机坐标到透视坐标变换矩阵
MATAIX4X4 mscr;//用于存储透视坐标到屏幕坐标变换矩阵
}
-
3.4 UVN相机模型
基于球面坐标 -
3.5 世界坐标到相机坐标变换
相机模型根据相机的位置和朝向信息创建了一个矩阵,这包括两部:平移和旋转。第一步使用该矩阵的逆矩阵对世界中的所有物体、顶点和多边形等进行平移,这时所有的几何体都被平移到相机位于原点时的相对位置。第二部是旋转,依次执行三次旋转,欧拉相机中一般用YXZ或ZYX, -
3.6
物体剔除 -
3.7
背面消除 -
3.8 相机坐标到透视坐标变换
两种方法:手工执行数学运算,矩阵执行变换。 -
3.9 透视坐标到屏幕(视口)坐标变换
视平面的中心为原点,其+x轴指向右方,+y轴指向上方。光栅屏幕的原点位于左上角,y轴方向与此相反。 -
3.10 合并透视变换和屏幕变换
ps:所谓的网格绘制就是在重复的画三角形,画一个和画若干个的区别。