一.空间变换流程
在渲染流水线中对物件进行空间变换,实现3D坐标转换到屏幕绘制空间的作用;
1 变换过程:局部坐标系→世界坐标系→观察坐标系→投影坐标系→屏幕坐标系
2 采用的变换矩阵:世界矩阵,观察矩阵,投影矩阵,屏幕矩阵
二.变换矩阵的原理和作用
1世界矩阵
作用:平移,旋转,伸缩(实现不同3D物件位置,大小和方向的相对位置关系)
a)平移矩阵:Mt=⎧⎩⎨⎪⎪⎪⎪⎪⎪100Px010Py001Pz0001⎫⎭⎬⎪⎪⎪⎪⎪⎪
(x y z 1)*Mt = (x+Px,y+Py,z+Pz,1)
b) 旋转矩阵Mr =⎧⎩⎨⎪⎪⎪⎪⎪⎪10000Cosθ−Sinθ00SinθCosθ00001⎫⎭⎬⎪⎪⎪⎪⎪⎪ 为绕X轴旋转θ度
此外,还有绕任意轴的旋转矩阵;
c) 缩放矩阵Ms =⎧⎩⎨⎪⎪⎪⎪⎪⎪Sx0000Sy0000Sz00001⎫⎭⎬⎪⎪⎪⎪⎪⎪
(x y z 1) * Ms = (x*Sx, y*Sy, z*Sz, 1)
最终的世界矩阵:Mworld = Mt * Mr * Ms
2 观察矩阵
观察矩阵是模拟摄像机行为,以摄像机为坐标原点,摄像机的局部坐标轴与世界坐标轴对齐;
概况来说就是:世界坐标系中的物体在以摄像机为中心坐标系时如何进行描述
1)构建观察矩阵:
a)使用D3DX的APT接口:D3DXMatrixLookAtLH()
b)自构建一个Camer类----核心:摄像机位置,3个正交基向量;
2)观察矩阵作用:
实现摄像机的平移和绕坐标轴的旋转:Pitch, Yaw, Row
3 投影矩阵
投影矩阵的创建组成:视域体(FOV:filed of view) ---- 远/近裁剪面,投影平面,视域角.
1)投影矩阵的作用
a)实现近大远小的效果(利用透视投影)
b)进行深度缓冲插值计算,实现物体的前后遮挡效果
2)投影矩阵拆分
a)透视投影降低维度,近大远小:
Ma =⎧⎩⎨⎪⎪⎪⎪⎪⎪1000010000100011⎫⎭⎬⎪⎪⎪⎪⎪⎪
b)视域角控制缩放
横纵比R = Zoomy/Zoomx = WinWidth/WinHeight
横纵比:可矫正"正方形"到"矩阵"映射引起的畸变
Zoomy =Cos(fov/2)Sin(fov/2), Zoomx =ZoomySin(fov/2)
Mb =⎧⎩⎨⎪⎪⎪⎪⎪⎪Zoomx0000Zoomy0000000000⎫⎭⎬⎪⎪⎪⎪⎪⎪
c)对Z值进行插值
将Z值范围由[n, f], 映射到[0, 1],作为深度缓冲使用
n:近裁剪面; f:元裁剪面
Mc =⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪1000010000f/f−nnf/n−f0000⎫⎭⎬⎪⎪⎪⎪⎪⎪⎪⎪
最终投影矩阵:Mproj =⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪Zoomx0000Zoomy0000f/f−nnf/n−f0010⎫⎭⎬⎪⎪⎪⎪⎪⎪⎪⎪
4屏幕矩阵:视口变换
Mport =⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪Width/200Windth/20−Height/20Height/200100001⎫⎭⎬⎪⎪⎪⎪⎪⎪⎪⎪ 将坐标原点由投影正中心转换到屏幕左顶点