镜面反射矩阵推导

最近公司游戏正在准备上线,所以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

时间: 2024-10-21 22:50:31

镜面反射矩阵推导的相关文章

D3D的投影矩阵推导[转贴]

原帖地址:http://blog.csdn.net/popy007/article/details/4091967       上一篇文章中我们讨论了透视投影变换的原理,分析了OpenGL所使用的透视投影矩阵的生成方法.正如我们所说,不同的图形API因为左右手坐标系.行向量列向量矩阵以及变换范围等等的不同导致了矩阵的差异,可以有几十个不同的透视投影矩阵,但它们的原理大同小异.这次我们准备讨论一下Direct3D(以下简称D3D)的透视投影矩阵,主要出于以下几个目的: (1) 我们在写图形引擎的时

OpenGLES 中实用基本几何变换 - 平移、缩放、旋转

几何变换详解 在三维图形学中,几何变换大致分为三种,平移变换(Translation),缩放变换(Scaling),旋转变换(Rotation).以下讨论皆针对DirectX,所以使用左手坐标系. 平移变换 将三维空间中的一个点[x, y, z, 1]移动到另外一个点[x', y', z', 1],三个坐标轴的移动分量分别为dx=Tx, dy=Ty, dz=Tz, 即 x' = x + Tx y' = y + Ty z' = z + Tz 平移变换的矩阵如下. 缩放变换 将模型放大或者缩小,本质

irrlicht引擎:镜子效果

最近在用irrlicht做一个3D试衣间的小项目,为了给项目增添点花样,于是想实现一面镜子. 我记得D3D龙书上有一个使用模板缓冲区实现的例子.网上也有OPENGL实现的例子. 但这一次,我想用irrlicht的RTT实现一面镜子效果. 其实原理和水面反射原理是一样的, 只是没有加扰动而已   第一步:渲染反射贴图 反射贴图的渲染,其实就是将摄相机通过镜面镜像即可,irrlicht中我找了半天,没有发现镜像矩阵的算法,倒是在网上搜到了一个. 很是不错. 同时,也翻阅了一下先前公司引擎项目的代码,

线性回归之最小二乘法

线性回归 线性回归是很常见的一种回归,线性回归可以用来预测或者分类,主要解决线性问题. 最小二乘法 线性回归过程主要解决的就是如何通过样本来获取最佳的拟合线.最常用的方法便是最小二乘法,它是一种数学优化技术,它通过最小化误差的平方和寻找数据的最佳函数匹配. 代数推导: 假设拟合直线为y=ax+b 对任意样本点(xi,yi) 误差为e=yi−(axi+b) 当S=∑ni=1ei2为最小时拟合度最高,即∑ni=1(yi−axi−b)2最小. 分别求一阶偏导 ∂S∂b=−2(∑i=1nyi−nb−a∑

1个掷硬币问题,4个Python解法:读书笔记

首发于知乎,再发到阿里社区看看人气如何 关键词:统计,概率,机器学习,Pandas, Numpy, sympy scipy 预计阅读时间-10分钟 我在学习机器学习算法和玩Kaggle 比赛时候,不断地发现需要重新回顾概率.统计.矩阵.微积分等知识.如果按照机器学习的标准衡量自我水平,这些知识都需要重新梳理一遍. 网上或许有各种各样知识片断,却较难找到一本书将概率,统计.矩阵.微积分公式和Python结合起来. 要么是讲的比较浅显,要么跨度比较大. 最近看到一本书,恰好把上面的问题解决了.着重讲

[3D基础]投影矩阵的推导(1)

转眼我做游戏行业已经八个月了,游戏行业入门门槛低,所以还算学习得比较轻松,总结了当初自己迷惑的几个知识点,本来想写出来给初学者解惑,无赖我是一个懒散的人,一直拖到现在,终于决心白纸黑字的搬到Blog上来,希望大家喜欢. 投影变换:我觉得这个是3D到2D变换中最让初学者头晕的问题,但又是最重要的. 请看上面这张我用爪子抓出来的图.这个坐标系是DX的左手坐标系,Y向上,X向右,Z向内,几何坐标已经经过了相机坐标系的变换,相机位置为(0,0,0),假设远裁减面距离为f,近裁减面距离为n,近裁减面左边为

视图矩阵的推导

        把物体从世界坐标系转化到视点坐标系的矩阵称为视图矩阵.      下面我们先看下OpenGL中视图矩阵的推导过程:      假设视点或camera的局部坐标系为UVN,UVN分别指向右方.上方和后方从而构成右手坐标系,视点则处于局部坐标系的原点位置.      就如OpenGL中的函数gluLookAt(eyex, eyey, eyez, lookatx, lookaty, lookatz, upx, upy, upz)一样,给定视点.观察点.以及up向量之后,我们就可以求得视

梯度下降的矩阵分解公式推导

目标函数是要最小化C: 求其梯度: 梯度下降求最小值:

Python中的推导式使用详解

  这篇文章主要介绍了Python中的推导式使用详解,本文分别讲解了列表推导式.字典推导式.集合推导式使用实例,需要的朋友可以参考下 推导式是Python中很强大的.很受欢迎的特性,具有语言简洁,速度快等优点.推导式包括: 1.列表推导式 2.字典推导式 3.集合推导式 嵌套列表推导式 NOTE: 字典和集合推导是最近才加入到Python的(Python 2.7 和Python 3.1以上版). 下面简要介绍下: [列表推导式] 列表推导能非常简洁的构造一个新列表:只用一条简洁的表达式即可对得到