D3D坐标系统下3D世界坐标映射到2D屏幕坐标的平移矩阵,有需要的朋友可以参考下。
D3D中绘画3D模型基本上就是靠3个矩阵World, View, Projection来联合进行模型位置定位、视角定位及透视变形的,这与2D绘制一个图形只需要给出屏幕上的一个像素坐标就能进行定位有着非常大的不同。在某些场合,我们想根据屏幕上的像素坐标来绘制3D模型,一般可以通过用正交投影代替透视投影就能轻松进行绘制,但在一些极其特殊的情况下我们还想让绘制出的3D模型保持原先指定的3个矩阵所有变换,这就需要通过这3个矩阵及目标像素点反求出一个平移矩阵,这篇文章就是介绍该怎么做的。
先简单介绍一下在D3D里3D空间坐标在不做任何变化情况下是怎么转换成2D屏幕坐标。D3D的空间坐标在3个轴范围是[-1,1],D3D绘画到2D屏幕上的区域叫做ViewPort,ViewPort的横坐标范围是[Left, Right],纵坐标范围是[Top, Bottom],ViewPort还有近点(near)和远点(far)2个值代表z轴,则D3D空间坐标里的一点sp(x,y,z)的x坐标Xsp对应到屏幕上坐标sc(x,y)的x坐标Xsc的对应公式就是(这个详细解释网上有,这里不再赘述):
X s c − L e f t R i g h t − L e f t = X s p − ( − 1 ) 1 − ( − 1 ) \dfrac{Xsc−Left}{Right−Left}=\dfrac{Xsp−(−1)}{1−(−1)} Right−LeftXsc−Left=1−(−1)Xsp−(−1)
让Width = Right - Left,上面公式最后就变成:
Xsc=(Xsp+1)∗Width/2+Left
同样得出y轴:
Ysc=(Ysp+1)∗Height/2+Top
z轴(虽然屏幕上是没有z坐标的,但这里给出是为了后面推导的时候能统一处理):
Zsc=Zsp∗(far−near)+near
接下来简单说一下齐次坐标,D3D系统里用得坐标并不只是(x,y,z),而是用4维坐标(x,y,z,w)来表示,这里齐次坐标与3维坐标的转换关系为:
[ x y z w ] = [ x / w y / w z / w 1 ] \left[\begin{array} {c} x \\ y \\ z \\ w \end{array} \right] = \left[ \begin{array} {c} x/w \\ y/w \\ z/w \\ 1 \end{array} \right] ⎣⎢⎢⎡xyzw⎦⎥⎥⎤=