五、三维图形变换原理和实践
1、原理
1)四种坐标系
为了将三维立体图形投影到平面上,应该首先理解以下四种坐标系:
本体坐标系(模型坐标系):是为规定基本形体而引入的便于描述的坐标系,也就是立体图形自身的坐标系。
用户坐标系(世界坐标系):是用户引入描述整个形体的坐标系。
观察坐标系(视坐标系或目坐标系):为说明观察的姿态而引入,也就是观察者所处的位置。
设备坐标系(屏幕坐标系或显示坐标系):最终的图形显示设备的坐标系。
2)图形显示的坐标变换过程
为了方便计算三维立体图形的变化过程,程序中应该存储的是立体图形在模型坐标系下的坐标,所以为了将该立体图形投影到屏幕上,需要先将模型坐标系下的坐标转换为世界坐标系下的坐标,然后在转换为设备坐标。
设模型坐标系中任意一点P的坐标为P=(x, y, z),做了三维图形几何变换后得到的点P’的坐标为P’=(x’, y’, z’),可得下面的三维图形几何变换:
(1)平移变换
x’= x + Dx;y’= y + Dy;z’= z + Dz。
(2)比例变换
x’ = x * Sx;y’ = y * Sy;z’ = z * Sz。
(3)旋转变换
① 绕Z轴旋转
x’ = xcosθ – ysinθ;
y’ = xsinθ + ycosθ;
z’ = z。
② 绕X轴旋转
x’ = x;
y’ = ycosθ - zsinθ;
z’ = ysinθ + zcosθ。
③ 绕Y轴旋转
x’ = xcosθ + zsinθ;
y’ = y;
z’ = -xsinθ + zcosθ。
3)透视投影
将三维立体坐标投影到屏幕上后再采用多边形的扫描转换算法进行填充。
主消失点:如果一组平行直线平行于三个坐标轴中的一个,那么对应的消失点将落在坐标轴上,这样的消失点称为主消失点。
因为只有三个坐标轴,所以最多只有三个主消失点。根据主消失点的数目,透视投影可以分为一点透视、二点透视、三点透视。
4)消除隐藏面
将三维立体图形投影到屏幕上时,首先应该判断面的可见性,若面不可见则无需投影。
设观察方向由指向观察位置的一个方向向量k给出,所考查的面的外法向量是n,则这两个向量的夹角α满足0≤α<π/2时,所考查面是可见的,否则就是不可见的。
把n和k记作:n(nx, ny, nz),k(kx, ky, kz),则nx * kx + ny * ky + nz * kz为正,则0≤α<π/2,该面可见,否则不可见。
2、实践
1)题目要求
建立立方体的数据模型,将该立方体在视图中绘制出来,要求采用透视投影(选择显示效果较好的投影中心),并且能够通过按键实现三维图形绕x、y、z坐标轴的平移和旋转变换。
2)分析
(1)采用一点透视投影。首先确定四个坐标系的位置,以世界坐标系为主,将模型坐标系原点以及观察坐标系原点在世界坐标系中的位置确定下来,并且设备坐标系(即屏幕坐标)就是世界坐标系的z坐标值取0。
(2)初始化立方体八个顶点在模型坐标系中的坐标,在进行平移和旋转变换时,首先在模型坐标系中进行变换。
(3)在进行投影时,然后判断面的可见性,如果可见,将该面的四个顶点的坐标从模型坐标系转化为设备坐标系,然后构建边表。当立方体的六个面都判断后,通过多边形的扫描转换算法进行填充即可。
3)代码实现
(1)进行以下初始化:
1 | //定义面类 |
(2)一组坐标转换方法:
1 | //方法定义: |
(3)坐标变换:
1 | //沿x轴平移 |
(4)实现OnDraw函数:
1 | TDCoor viewInModel; |