齐次坐标中的w

来源:互联网 发布:windows电脑护眼模式 编辑:程序博客网 时间:2024/05/17 02:24

 曾经接到过一个重量级的游戏公司的电话面试,问我游戏中经常出现变换方程式中的坐标除了x,y,z还有一个w,是什么含意?一时语塞。对方友善的岔开了这个话题。最近正好看一本书,专讲3D数学基础问题的,大概弄明白了这个w的来龙去脉,胡乱写几笔留着以后复习,但愿不会误人子弟。

 

2D线性变换只需要2x2矩阵,看下面的乘式:

(不会嵌入矩阵,只好分开来写,看的时候自己在纸上画吧)

v(x y)是2D坐标

M(2x2)是2x2矩阵,元素一次为m11,m12,m21,m22

v*M = (x*m11+y*m12   x*m12+y*m22)

 

如果需要加上位移变换,需要用3x3矩阵,同时令矩阵第三行为偏移量,

令M(3x3)是3x2矩阵,除上面的四个元素,增加一行元素m31,m32

 

其中前四个元素组成的2x2矩阵为2D线性变换矩阵,增加了一行(m31, m32),m31和m32分别为x和y的位移,如果只简单增加一行到原来的2x2矩阵,矩阵变成3x2,2D向量v(x,y)是1x2的,乘法没办法做了,所以将2D向量中增加一个分量扩展成3D分量v(x, y, w)。于是有

v*M = (x*m11+y*m21+w*?     x*m12+y*m22+w*?     x*m13+y*m23+w*?)

其中问号是因为只增加了一行,矩阵M没有第三列,所以为矩阵增加第三列元素m31,m32,m33,以完成上面的程式

坐标v(x y w)

矩阵M= { {m11 m12 m13} {m21 m22 m23} {m31 m32 m33}}

v*M = (x*m11+y*m21+w*m31    x*m12+y*m22+w*m32     x*m13+y*m23+w*m33)

 

这个w该取多少呢?参考上面的乘式右边的结果,要使线性变换的结果的x分量和y分量分别偏移m31和m32,只有令w=1。
而矩阵被扩充为3x3以保持向量维持在三个分量以继续应用仿射变换。


同样参考上面乘式右边的结果,为了让向量增加的第三个分量不受乘法影响,令m13和m23为0,公式就是:

v*M = (x*m11+y*m21+1*m31    x*m12+y*m22+1*m32   0+0+1*m33)

         = (x*m11+y*m21+m31    x*m12+y*m22+m32   m33)

 

为了让结果依然保持v(x y w),其中w=1的形式,只有令m33=1

所以最后得到的坐标是v(x y 1)

最后得到的矩阵是M{{m11 m12 0} {m21 m22 0} {m31 m32 1} }

 

从几何意义上来说,就是把2D点限制在z=1的平面中,对于3D点(x, y, z)且z!=w,投影到z=1的平面,就是(x/w, y/w, 1).如果w=0,几何上认为在无穷远处的点,从上面的公式可以得到没有位移的线性变换的结果,所以可以认为是对向量的变换,没有大小,只有方向。

 

以此类推到3D坐标系的4D齐次坐标,可以带来如下用途:
增加平移功能的变换矩阵,并通过w控制平移开关以区分位置和方向
类似于上面说的投影的概念,改变4x4矩阵第三列的分量可以得到投影矩阵

 

上面只是数学上的推导,实际的几何图形管道如何实现,我并不得知。回到刚开始提到的面试,不知道这样回答是否能过关并要到一个比较高的薪水,呵呵,不过估计有了上次的经历,我已经进入了对方的招聘黑名单了。

原创粉丝点击