おたくのスタジオ

视口变换矩阵推导

视口变换在投影变换之后,视口变换的作用是将投影平面上的点转换为屏幕上的点,这是一个缩放的过程。

图 1

CVV的坐标范围是:
$$
\begin{cases}
-1 \leq x \leq 1 \\
-1 \leq y \leq 1 \\
0 \leq z \leq 1
\end{cases}
$$
而viewport的坐标范围是:
$$
\begin{cases}
X \leq x \leq X + Width \\
Y \leq y \leq Y + Height \\
MinZ \leq z \leq MaxZ
\end{cases}
$$
由上图知,视口的起点为(X, Y),宽高分别为Width和Height,x轴向右为正,y轴向下为正,y轴的方向与三维坐标正好相反。视口是一个2D平面,但是在viewport变换中,Z坐标也是跟着变换的,只是在这个图中没有体现。

接下来,我们来求这个矩阵。对于原来CVV中的任一点P(x, y, z),转换至viewport的坐标为(x’, y’, z’),我们有:
$$
\dfrac{x - (-1)}{2} = \dfrac{x’ - X}{Width}
$$
解得$x’ = \dfrac{Width}{2}x + \dfrac{Width}{2} + X$。同理:
$$
\dfrac{1 - y}{2} = \dfrac{y’ - Y}{Height}
$$
解得$y’ = -\dfrac{Height}{2}y + \dfrac{Height}{2} + Y$。然后:
$$
z = \dfrac{z’ - MinZ}{MaxZ - MinZ}
$$
得到$z’ = (MaxZ - MinZ)z + MinZ$。

所以,我们得到视口变换矩阵为:
$$
\begin{bmatrix}
\dfrac{Width}{2} & 0 & 0 & 0 \\
0 & \dfrac{-Height}{2} & 0 & 0 \\
0 & 0 & MaxZ - MinZ & 0 \\
X + \dfrac{Width}{2} & Y + \dfrac{Height}{2} & MinZ & 1
\end{bmatrix}
$$

参考:

http://www.cnblogs.com/graphics/archive/2009/10/13/1582773.html