数学笔记(三)之镜面矩阵

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

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

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

  简单解释一下图中内容:设点P(x, y, z)为平面正方向上的一点,点O是P(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和平面n和D表示出了点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,有兴趣自取~

  就这样了~

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据派THU

一文读懂支持向量机SVM(附实现代码、公式)

支持向量机(SVM),一个神秘而众知的名字,在其出来就受到了莫大的追捧,号称最优秀的分类算法之一,以其简单的理论构造了复杂的算法,又以其简单的用法实现了复杂的问...

5983
来自专栏ATYUN订阅号

只使用Numpy手动实现多层卷积神经网络(详解)

AiTechYun 编辑:yuxiangyu 在过去,我曾写过一篇关于“理解在最大池化层和转置卷积的反向传播”的文章。现在我想要使用这些知识做一个多层(或者说多...

3628
来自专栏大数据挖掘DT机器学习

R语言与机器学习(分类算法)支持向量机

说到支持向量机,必须要提到july大神的《支持向量机通俗导论》,个人感觉再怎么写也不可能写得比他更好的了。这也正如青莲居士见到崔颢的黄鹤楼后也...

3384
来自专栏人工智能

使用TensorFlow自动识别验证码(三)

先知安全技术社区独家发表本文,如需要转载,请先联系先知案件技术社区授权;未经授权请勿转载。 0X000 前言 这是该 系列的第三篇文章, 本系列最后一篇。前面几...

2637
来自专栏数说工作室

最重要的一集 | 【SAS Says·扩展篇】IML:6.作业

咱们的SAS矩阵交互语言IML就要完结了,本文将会用IML编一个回归程序。无论你需要一元的还是多元的回归模型,该程序都能计算出模型的系数、t检验以及t检验的p值...

3518
来自专栏人工智能的秘密

算法教程:能够体现文本语义关系的关键词提取算法

关键词提取能让我们快速地了解一篇文章。在信息爆炸的时代,能够有效提取文本的关键词,对于快速、及时、高效地获取信息是非常有帮助的。本文介绍一种能够体现文本语义关系...

3360
来自专栏机器之心

教程 | 百行代码构建神经网络黑白图片自动上色系统

4066
来自专栏PPV课数据科学社区

学习SVM,这篇文章就够了!

支持向量机(SVM),一个神秘而众知的名字,在其出来就受到了莫大的追捧,号称最优秀的分类算法之一,以其简单的理论构造了复杂的算法,又以其简单的用法实现了复杂的问...

5004
来自专栏机器之心

听说你用JavaScript写代码?本文是你的机器学习指南

3906
来自专栏大数据挖掘DT机器学习

R语言实现 支持向量机

一、SVM的想法 回到我们最开始讨论的KNN算法,它占用的内存十分的大,而且需要的运算量也非常大。那么我们有没有可能找到几个最有代表性的点(即保...

3143

扫码关注云+社区

领取腾讯云代金券