镜像矩阵(Reflection)

        镜像(反射)矩阵是n维空间中的沿n-1维平面的一种矩阵变换,常见的应用场景是在2维空间图像处理、3维空间物体场景变换。先直观看看镜像变换的效果:

                                                 

        直观的感受了镜像变换的效果之后,接下来我们看看这个变换的数学表达式是什么样的。首先n维度空间的镜像变换是基于某个n-1维度平面(对于2维度就是某条直线)来说的,线性代数的知识知道n维空间的n-1维平面存在法向量,假设u=(u_{1},u_{2},...,u_{n})是要做镜像平面的单位法向量,单位法向量||u||=1,定义镜像矩阵Q=I-2uu^{T}

        1. Q是对称和标准正交的,\because Q^{T}=(I-2uu^{T})^{T}=I-2uu^{T}\therefore Q是对称的。\becauseQ^{T}Q=I-4uu^{T}+4uu^{T}uu^{T}=I\thereforeQ是标准正交的。如果对矩阵运算背后的原理不太熟悉,我们也可以将Q展开:

        Q=I-2uu^{T}=\begin{bmatrix} 1-2u_{1}^{2} &-2u_{1}u_{2} &... &-2u_{1}u_{n} \\ -2u_{2}u_{1}&1-2u_{2}^{2} &... &-2u_{2}u_{n} \\ ...& ... & ... &... \\ -2u_{n}u_{2} & -2u_{n}u_{2} &... & 1-2u_{n}^{2} \end{bmatrix}

        由Q的矩阵展开形式,很明显看到Q_{ij}=Q_{ji}=-2u_{i}u_{j},i\neq j,所以Q是对称的。标准正交:q_{i},q_{j}是Q的两列,由标准正交的定义,需要满足如下条件:

        q_{i}q_{j}=\begin{cases} 0& \text{ if } x\neq j \\ 1& \text{ if } x=j \end{cases}

        q_{i}q_{j}=(1-2u_{i}^2)^{2}+4u_{i}^2u_{1}^2+...+4u_{i}^{2}u_{n}^2

                =1+4u_{i}^4-4u_{i}^2+4u_{i}^2u_{1}^2+...+4u_{i}^{2}u_{n}^2

                =1+4u_{i}^2(u_{1}^{2}+...+u_{n}^{2})-4\overset{||u||^{2}=1}{\rightarrow}

                =1 (i=j)

         q_{i}q_{j}=(1-2u_{i}^2)(-2u_{i}u{j})+(1-2u_{j}^{2})(-2u_{j}u_{i})+4u_{i}u_{j}u_{1}^2+...4u_{i}u_{j}u_{k}^2...+4u_{i}u_{j}u_{n}^2,k\neq i,j

                      =-4u_{i}u_{j}+4u_{i}u{j}(u_{1}^2+...+u_{n}^2)

                      =0

         2.Q^{2}=Q^{T}Q=I,这条性质反应了镜像的特点,镜像两次等于原空间。

        上面是镜像矩阵的定义和它的一些性质和推导,那么我们再做一点深层次的思考:为什么镜像的表达会是一个矩阵变换,如果我做旋转是不是也是一个矩阵变换?首先,问题2的答案:YES,2维空间的旋转的变换矩阵是:\begin{bmatrix} cos\Theta & -sin\Theta \\ sin\Theta& cos\Theta \end{bmatrix}

        对于问题1,矩阵变换的本质可以理解成坐标系的变换,对于镜像和旋转我们都是对原坐标系中的向量(坐标系中的点可以表示成原点指向该点的向量)用新的坐标系中的基进行了表示。比如二维直角坐标系x0y的坐标基向量是(1,0)和(0,1),如果用矩阵表示:\begin{bmatrix} 1 &0 \\ 0 &1 \end{bmatrix},基向量就是矩阵的列向量,(1,1)点这个坐标系下的坐标(x,y)由方程组\begin{bmatrix} 1 &0 \\ 0 &1 \end{bmatrix}\begin{bmatrix} x\\ y \end{bmatrix}=\begin{bmatrix} 1\\ 1 \end{bmatrix}求得(x,y)=(1,1)因为在原坐标系下,假设我们对(1,1)点做沿x轴做镜像,这里的镜像很简单,x轴和原坐标系相同,y轴与原坐标系反号,所以镜像之后新的坐标系基向量是(1,0)和(0,-1)(如果你通过上面的镜像公式可以求得同样的答案,u=(0,1)),新的坐标系的矩阵表示\begin{bmatrix} 1 &0 \\ 0 &-1 \end{bmatrix},原坐标系下(1,1)点在新坐标系下的坐标有方程组\begin{bmatrix} 1 &0 \\ 0 &-1 \end{bmatrix}\begin{bmatrix} x\\ y \end{bmatrix}=\begin{bmatrix} 1\\ 1 \end{bmatrix}求得(x,y)=(1,-1),和我们直观认知一样:

                                                     

        最后我们说说2维度空间和3维空间的镜像矩阵的表达式,首先是2维空间,对于2-D空间的某个条直线做镜像,假设该直线的单位法向量u(x,y),由Q=I-2uu^{T}计算得到2-D空间的镜像矩阵:

        Q_{2d}=\begin{bmatrix} 1-2x^{2} &-2xy \\ -2xy& 1-2y^{2} \end{bmatrix}

        对于3-D空间的某平面做镜像:

        Q_{3d}=\begin{bmatrix} 1-2x^{2} &-2xy &-2xz \\ -2xy& 1-2y^{2} &-2yz \\ -2xz& -2yz &1-2z^{2} \end{bmatrix}

        镜像矩阵的另一种表示形式:Q'=2P-I, 其中P是投影矩阵,这个表达式和Q=I-2uu^{T}等价。我们证明一下2纬空间沿着某条线做镜像的情况下这两个矩阵的等价性。

证明:

        假设a是P投影方向上的单位向量,u是垂直与投影方向上的单位向量,那么p=aa^{T},Q'=2P-I=2aa^{T}-I

        Q'-Q=2aa^{T}+2uu^{T}-2I=\begin{bmatrix} 2a_{1}^{2}+2u_{1}^{2} -2 &2a_{1}a_{2}+2u_{1}u_{2} \\ 2a_{2}a_{1}+2u_{2}u_{1}&2a_{2}^{2}+2u_{2}^2-2 \end{bmatrix}

        假设a与x轴的夹角为\theta,那么u与x轴的夹角为\theta +\pi /2,那么:

         a_{1}=cos\theta ,a_{2}=sin\theta

        u_{1}=cos(\theta+\pi/2)=-sin(\theta),u_{2}=sin(\theta+\pi/2)=cos\theta

        带入Q’-Q中得到:

        2a_{1}^{2}+2u_{1}^{2}-2=0

        2a_{2}^{2}+2u_{2}^{2}-2=0

        2a_{1}a_{2}+2u_{1}u_{2}=0

        所以Q'-Q=0,所以Q'-Q得证。

 

 

 

  • 14
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Unity中,如果要将一个对象沿着某个轴进行镜像操作,可以使用Matrix4x4类型来表示矩阵,并使用它进行镜像变换。对于中心点镜像来说,可以先将对象移动到原点(中心点),再进行镜像变换,最后再移回原来的位置。具体的实现方式如下: ``` // 将对象移动到中心点 Transform objTransform = obj.transform; Vector3 centerPoint = objTransform.position; objTransform.position = Vector3.zero; // 进行镜像变换 Matrix4x4 mirrorMatrix = Matrix4x4.identity; // 创建一个单位矩阵 mirrorMatrix[0, 0] = -1; // 将第一行第一列的元素设为-1,即关于x轴进行镜像变换 Vector3 point = new Vector3(x, y, z); // 创建一个向量 Vector3 mirrorPoint = mirrorMatrix.MultiplyPoint(point); // 使用矩阵进行变换 // 将对象移回原来的位置 objTransform.position = 2 * centerPoint - mirrorPoint; ``` 其中,首先将对象移动到中心点,然后进行镜像变换,最后再移回原来的位置。Matrix4x4.identity表示创建一个单位矩阵,mirrorMatrix[0, 0]表示将第一行第一列的元素设为-1,即关于X轴进行镜像变换。使用Matrix4x4.MultiplyPoint方法可以将一个点进行矩阵变换,得到变换后的点。最后,将对象移回原来的位置,可以使用公式2 * centerPoint - mirrorPoint来计算。 需要注意的是,Unity中的Matrix4x4是列主序矩阵,即第一列的元素存储在数组的前4个元素中,第二列的元素存储在数组的第5-8个元素中,以此类推。因此,可以使用matrix[row, col]的形式来获取或设置矩阵中的元素。而Matrix4x4.MultiplyPoint方法可以将一个点乘以矩阵的前3x3部分,并加上矩阵的第4列,得到变换后的点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值