zoukankan      html  css  js  c++  java
  • 镜面反射矩阵推导 [转]

    镜面反射矩阵推导

    最近公司游戏正在准备上线,所以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:这是行主矩阵表示法

    posted on 2013-06-15 00:48 麒麟子 阅读(5733) 评论(2)  编辑 收藏 引用 所属分类: ProgrammingGPU and GraphicGame and Engine

    评论

    # re: 镜面反射矩阵推导 2013-11-04 10:24 ITboy_Lemon

    博主,最近看到你的帖子,但是对最后一步不是太明白,
    怎么从
    P1 = P(x,y,z,1) - 2(nx,ny,nz,0)*(x*nx+y*ny+z*nz+d)
    推导出变换矩阵的。
    通过矩阵运算的话,要用到逆矩阵,可是{x,y,z,1}并不是可逆的啊???
    不是太懂线性代数,能给点解释吗?或者给点资料也可以  回复  更多评论   

    # re: 镜面反射矩阵推导 2014-05-22 10:53 Anonymous

    博主的推导基本都是正确的,但是最后一步错误了,正确形式是P(x,y,z,1) - 2 * (x*nx + y*ny + z*na +d) * (nx, ny, nz, 0)T(就是矩阵的tranpose)
    合并得到P(x, y, z, 1) * (1 - 2 * (nx, ny, nz, d) * (nx, ny, nz, 1)T), 把1变成4x4单位矩阵I, 即可得到博主的答案了。  回复  更多评论  

    http://www.cppblog.com/Leaf/archive/2013/06/15/201017.html

  • 相关阅读:
    sysbench测试
    ab压力测试
    kubernetes之Pod水平自动伸缩(HPA)
    JAVA实现Excel批量导入
    Json对象转为实体对象
    Java Web用Freemarker生成带图片的Word文档
    Spring3 MVC 深入核心研究
    SpringMVC深度探险(四) —— SpringMVC核心配置文件详解
    SpringMVC深度探险(三) —— DispatcherServlet与初始化主线
    SpringMVC深度探险(二) —— SpringMVC概览
  • 原文地址:https://www.cnblogs.com/mazhenyu/p/6141430.html
Copyright © 2011-2022 走看看