镜面反射矩阵推导

简介:

最近公司游戏正在准备上线,所以FlasCC也就没有研究了,偶尔有闲功夫,也是玩玩3DMAX和UNITY3D。 感觉不会3DMAX,是一种局限。

回到主题,记录一下镜面反射矩阵的推导。

在用Irrlicht和RTT做镜面效果的时候,用到了反射矩阵。 就是需要把摄相机镜像,渲染一个RT,贴到镜面模型上。这个其实还纠结了许久,因为之前做水面渲染的时候,水面是平的,很好计算摄相机在水面以下的位置。 但是换成镜面,就不一样了,因为镜面可能是任意面。 于是就需要一个通用的反射矩阵。

反射矩阵的计算是基于平面的,因为,任何反射,都需要一个反射面。

所以,我们先给出平面表示 Plane(nx,ny,nz,d); 其中(nx,ny,nz)已经单位化。

然后,我们假设空间中有任意一点P(x,y,z,1)

设这个点P以Plane为反射面的镜像点为P1(x1,y1,z1,w)。

 

---------------------------------------------

根据定理,我们知道, 若两个点以某一点为镜像,则两个点的坐标之和除以2,就刚好是中点。

这个理论我们用到这里的话, 那这个中点就刚好是平面上的一个点。 平面上的这个点就是 P(x,y,z,1) - (nx,ny,nz,0)*D .  其中D就是点P到平面的距离

而D=Plane dot P = (x*nx+y*ny+z*nz+d);

由上面的描述,我们马上想到,那么要求点P1的话,就是这样 

(P+P1)/2 = P(x,y,z,1) - (nx,ny,nz,0)*D

=> P1 = P(x,y,z,1) - 2(nx,ny,nz,0)*D

=>P1 = P(x,y,z,1) - 2(nx,ny,nz,0)*(x*nx+y*ny+z*nz+d)

 

换成矩阵形式则为

                            |1-2*nx*nx   -2*nx*ny         -2*nx*nz         0  |

                             | -2*ny*nx     1 - 2*ny*ny     -2*ny*nz         0  |

P1 = {x,y,z,1}   x   | -2*nz*nx     -2*nz*ny         1-2*nz*nz        0  |

                             | -2*d*nx      -2*d*ny           -2*d*nz           1  |

 

大功告成

btw:这是行主矩阵表示法

作者:码瘾少年·麒麟子 
出处:http://www.cnblogs.com/geniusalex/ 
蛮牛专栏:麒麟子 
简介:09年入行,喜欢游戏和编程,对3D游戏和引擎尤其感兴趣。 
版权声明:本文版权归作者和博客园共有,欢迎转载。转载必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/geniusalex/archive/2013/06/15/3137061.html

目录
相关文章
|
5月前
|
机器学习/深度学习 算法
专题六数值微积分与方程求解-2
专题六数值微积分与方程求解
64 0
|
2月前
|
算法 测试技术 C++
【动态规划】【数学】【C++算法】805 数组的均值分割
【动态规划】【数学】【C++算法】805 数组的均值分割
|
5月前
|
算法 Serverless
专题六数值微积分与方程求解-1
专题六数值微积分与方程求解
63 0
|
5月前
21 高斯的推导(1809)
21 高斯的推导(1809)
20 0
|
6月前
|
算法 测试技术 C#
C++前缀和算法:构造乘积矩阵
C++前缀和算法:构造乘积矩阵
|
C语言
二维数组实验题:按如下公式递归计算矩阵行列式的值:(C语言)
二维数组实验题:按如下公式递归计算矩阵行列式的值:(C语言)
173 1
二维数组实验题:按如下公式递归计算矩阵行列式的值:(C语言)
|
10月前
数学|如何求解线性方程系数?
数学|如何求解线性方程系数?
87 0
|
10月前
|
移动开发
半正定矩阵和正定矩阵的一些理解和补充
半正定矩阵和正定矩阵的一些理解和补充
1109 0
罗尔(Rolle)、拉格朗日(Lagrange)和柯西(Cauchy)三大微分中值定理的定义
罗尔(Rolle)、拉格朗日(Lagrange)和柯西(Cauchy)三大微分中值定理的定义
罗尔(Rolle)、拉格朗日(Lagrange)和柯西(Cauchy)三大微分中值定理的定义