博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数学笔记(三)之镜面矩阵
阅读量:4224 次
发布时间:2019-05-26

本文共 1801 字,大约阅读时间需要 6 分钟。

  镜面变换在游戏中并不少见,相关资料网上也俯拾即是,不过自己总是感觉略显生疏,在此简单一记,算作是加深印象吧~

 

  问题很简单,假设存在点P(x, y, z)以及平面(n, D)(不太清楚为何平面如此表示的朋友可以参考),求解P相对与平面的镜像变换矩阵~

 

  为了方便推导,画张图先:

 

  

 

  简单解释一下图中内容:设点P(x, y, z)为平面正方向上的一点,点OP(x, y, z)在平面上的投影,点A(xa, ya, za)是平面上任取的一点,而P’(x’, y’, z’)则是点P(x, y, z)相对与平面的镜像点,另外的,我们还假设由点A到点P的向量为a(x - xa, y - ya, z - za),由点O到点P的向量为b,平面法向量为n(xn, yn, zn),平面到原点的带符号距离为D

 

  准备就绪,开始~

 

  由图易知:

  

    P’ = P - 2 * b

  

  接着往下,如何求解b呢?其实很简单,只要求解a在平面法向量n上的投影即可:

 

    b = a * n * n

 

  OK,此处我们稍停,由于a * n是一个标量,我们先简单求解一下:

 

    a * n = (x - xa, y - ya, z - za) * (xn, yn, zn) = (x - xa) * xn + (y - ya) * yn + (z - za) * zn

             = x * xn + y * yn + z * zn - xa * xn - ya * yn - za * zn

  因为点A(xa, ya, za)为处于平面上的点,自然满足(再次提醒,不清楚的朋友可以参考):

 

    xa * xn + ya * yn + za * zn + D = 0 

    D = - xa * xn - ya * yn - za * zn

 

  基于此,上面的a * n可以简化为:

 

    a * n = x * xn + y * yn + z * zn + D

 

  好了,我们计算出了 a * n,接着就可以用它来表示b了:

 

    b = a * n * n = (x * xn + y * yn + z * zn + D) * n

 

  考虑最之前P’点的表达式,我们将上式代入,得到:

 

    P’ = P - 2 * b = P - 2 * (x * xn + y * yn + z * zn + D) * n

 

  OK,到此,我们使用点P和平面nD表示出了点P’,接着就可以推导变换矩阵了:

 

  首先尝试计算点P’的x分量,我们有:

 

    P’x = x - 2 * (x * xn + y * yn + z * zn + D) * xn

       = (1 - 2 * xn * xn) * x - 2 * xn * yn * y - 2 * xn * zn * z - 2 * xn * D

 

  根据这个表达式,并根据矩阵乘法规则,我们便可以得到变换矩阵的第一行元素:

 

    m11 = 1 - 2 * xn * xn

    m12 = -2 * xn * yn

    m13 = -2 * xn * zn

    m14 = -2 * xn * D

 

  同样的方法,点P’的y,z分量分别为:

 

    P’y = y - 2 * (x * xn + y * yn + z * zn + D) * yn

       = - 2 * xn * yn * x + (1 - 2 * yn * yn) * y - 2 * yn * zn * z - 2 * yn * D

 

    P’z = z - 2 * (x * xn + y * yn + z * zn + D) * zn

       = - 2 * xn * zn * x - 2 * yn * zn * y + (1 - 2 * zn * zn) * z - 2 * zn * D

 

 对应的,矩阵的第二行元素和第三行元素分别为:

 

    m21 = -2 * xn * yn

    m22 = 1 - 2 * yn * yn

    m23 = -2 * yn * zn

    m24 = -2 * yn * D

 

    m31 = -2 * xn * zn

    m32 = -2 * yn * zn

    m33 = 1 - 2 * zn * zn

    m34 = -2 * zn * D

 

  至于矩阵的最后一行,在此我们暂不关心,简单设置:

 

    m41 = 0

    m42 = 0

    m43 = 0

    m44 = 1

 

  至此,我们推导出了镜面变换的矩阵,为了演示简单搞了个Demo,有兴趣~

 

  就这样了~

你可能感兴趣的文章
综述 | 近年来深度学习的重要研究成果(附PDF)
查看>>
2018计算机图形学研究报告(附PDF下载)
查看>>
收藏 | 12个ggplot2拓展程序助你强化R可视化
查看>>
收藏 | 数据分析师最常用的10个机器学习算法!(附图解)
查看>>
收藏 | 15个CNN关键回答集锦,2019校招面试必备!
查看>>
独家|一文解读合成数据在机器学习技术下的表现
查看>>
竞赛 | 上汽拿出了2000辆车的真实数据集,千万级投资+直接录用机会等你来战!...
查看>>
盘点 | 2018全球人工智能突破性技术TOP10(附报告)
查看>>
干货 | 纽约大学陈溪: AlphaGo Zero技术演进的必然性(附PPT)
查看>>
竞赛 | 我们标注了34G真实线下门店数据,等你pick!
查看>>
独家 | 一文带你读懂特征工程!
查看>>
送你8个Python高效数据分析的技巧(附代码)
查看>>
13张动图助你彻底看懂马尔科夫链、PCA和条件概率!
查看>>
关于TensorFlow,你应该了解这9件事(附代码&链接)
查看>>
独家 | 一文读懂PySpark数据框(附实例)
查看>>
清华“法律数据科研平台”向校内师生开放试运行
查看>>
终结谷歌AutoML的真正杀手!Saleforce开源TransmogrifAI
查看>>
六个维度、数万条数据帮你揭穿房租大涨的背后(附代码)
查看>>
干货 | 只有100个标记数据,如何精确分类400万用户评论?
查看>>
独家 | 全解用Python建立能源市场算法交易的机器学习框架(附链接)
查看>>