首页 > 其他分享 >是坐标转换,也是旋转——矩阵变换

是坐标转换,也是旋转——矩阵变换

时间:2024-09-05 20:03:28浏览次数:8  
标签:begin end cn 变换 bm 矩阵 坐标 bmatrix 向量

坐标转换

一个向量可以被表示为\(v=xi+yj+zk\),其中\(i\),\(j\),\(k\)为坐标系的基向量:

\(i= \begin{bmatrix} 1\\ 0\\ 0 \end{bmatrix}\),\(j= \begin{bmatrix} 0\\ 1\\ 0 \end{bmatrix}\),\(k= \begin{bmatrix} 0\\ 0\\ 1 \end{bmatrix}\)

基向量可写成矩阵的方式:

\(\begin{bmatrix} i_x&i_y&i_z\\ j_x&j_y&j_z\\ k_x&k_y&k_z \end{bmatrix}\)

一个坐标系可以使用任意线性无关的基向量构成,如\(l\),\(m\),\(n\)

使用由\(l\),\(m\),\(n\)构成的矩阵乘以一个任意向量\(\begin{bmatrix}a&b&c\end{bmatrix}\):

\(\begin{bmatrix} a&b&c \end{bmatrix} \begin{bmatrix} l_x&l_y&l_z\\ m_x&m_y&m_z\\ n_x&n_y&n_z \end{bmatrix}= \begin{bmatrix} al_x+bm_x+cn_x&al_y+bm_y+cn_y&al_z+bm_z+cn_z \end{bmatrix}\)

\(\begin{bmatrix} al_x+bm_x+cn_x\\ al_y+bm_y+cn_y\\ al_z+bm_z+cn_z \end{bmatrix}=a \begin{bmatrix} l_x\\ l_y\\ l_z \end{bmatrix}+b \begin{bmatrix} m_x\\ m_y\\ m_z \end{bmatrix}+c \begin{bmatrix} n_x\\ n_y\\ n_z \end{bmatrix}= al+bm+cn\)

最终得到了由基向量表示的结果,由此可见

如果把矩阵的行解释为坐标系的基向量,那么乘以该矩阵就相当于执行了一次坐标转换,若有\(aM=b\),我们就可以说,\(M\)将\(a\)转换到\(b\)。

从另一个角度看,x,y,z分量分别代表了向量在每个基向量方向上分别“走了多少个单位”,变换的只是基向量的方向,而在每个方向上走多远却没有改变。

旋转

使用单位且正交的基向量\(x'\),\(y'\),\(z'\)构成新的坐标系,使用基向量构成的矩阵乘以向量\(v\)

\(\begin{bmatrix} v_x&v_y&v_z \end{bmatrix} \begin{bmatrix} x_x&x_y&x_z\\ y_x&y_y&y_z\\ z_x&z_y&z_z \end{bmatrix}= \begin{bmatrix} v'_x&v'_y&v'_z \end{bmatrix}\)

可以发现,在矩阵变换向量的过程中,也完成了旋转。

应用

首先确定一个\(forward\)正方向,利用世界空间的\(up\)方向\((0,1,0)\)通过叉积运算得到与\(forward\)正交的\(right\)方向,然后再利用计算得到的\(right\)方向通过叉积运算得到正确的\(up\)方向。

float3 forward = direction;
half isParallel = step(0.999, forward.y);
float3 up = isParallel * float3(0, 0, 1) + (1 - isParallel) * float3(0, 1, 0);
float3 right = normalize(cross(up, forward));
up = normalize(cross(forward, right));

在\(up\)的计算中,为了防止\(forward\)方向与世界空间的\(up\)方向平行得到错误的计算,加入判断选择需要使用的向量。

例如可以使用计算得到的三个基向量变换模型空间的顶点位置,以此达到旋转模型的目的:

float3 newPos = positionOS.x * right + positionOS.y * up + positionOS.z * forward;

或者构成矩阵用以旋转向量:

float3x3 rotationMatrix = float3x3(right, up, forward);

在实际使用过程中注意左乘和右乘的区别,即行向量与列向量的使用区别:

\(\begin{bmatrix} a&b&c \end{bmatrix} \begin{bmatrix} l_x&l_y&l_z\\ m_x&m_y&m_z\\ n_x&n_y&n_z \end{bmatrix}= \begin{bmatrix} al_x+bm_x+cn_x&al_y+bm_y+cn_y&al_z+bm_z+cn_z \end{bmatrix}\)

\(\begin{bmatrix} l_x&m_x&n_x\\ l_y&m_y&n_y\\ l_z&m_z&n_z \end{bmatrix} \begin{bmatrix} a\\ b\\ c \end{bmatrix}= \begin{bmatrix} al_x+bm_x+cn_x\\ al_y+bm_y+cn_y\\ al_z+bm_z+cn_z \end{bmatrix}\)

在Unity Shader中,float3x3(right, up, forward)表示将向量以行向量的方式组成矩阵,故变换向量时使用mul(vector, rotationMatrix)方式计算,若rotationMatrix以列向量方式存储,故变换向量时使用mul(rotationMatrix, vector)方式计算。

参考

《3D数学基础:图形与游戏开发》

标签:begin,end,cn,变换,bm,矩阵,坐标,bmatrix,向量
From: https://www.cnblogs.com/WoBok/p/18399163

相关文章

  • Android开发 - Matrix 处理图像变换解析
    Matrix是什么Matrix是一个用于处理图像变换的类,它可以对图像进行缩放、旋转、平移和倾斜等操作。通俗来讲,Matrix就像是一个数学公式,用来定义如何改变图像的位置、形状或者方向Matrix的主要功能缩放(Scale):可以改变图片的大小,比如放大或缩小旋转(Rotate):可以将图片绕某个......
  • 只有经纬高坐标系下的飞行数据,怎么转换得到姿态角?
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%ConvertsLLA(Latitude,Longitude,Altitude)datatoanextendedstate%vectorincludingattitude(psi,theta,phi).%%ConversionProcess:%1.ConvertLLAtoECEF(Earth......
  • 获取方形矩阵两串对角线数字之和的差值
    1/**2*获取方形矩阵两串对角线数字之和的差值3*4*1235*4566*7897*8*1+5+9=15;9*3+5+7=15;10*15-15=0;11*@paramarr12*@return13*/14publicstaticInteg......
  • WGS84、BD09、GCJ02坐标转换
    名词解释WGS84此坐标系解释参考笔者另一篇博客GIS坐标系、投影与转换GCJ02GCJ-02是由中国国家测绘局(G表示Guojia国家,C表示Cehui测绘,J表示Ju局)制订的地理信息系统的坐标系统。是中国大陆地区的地图数据使用的坐标系。基于WGS84进行加密后形成。BD09BD09是中国的百度地图......
  • 【稀疏矩阵】使用torch.sparse模块
    @目录稀疏矩阵的格式coocsrcscConstructionofSparseCOOtensorsConstructionofCSRtensorsLinearAlgebraoperations(稀疏与稠密之间混合运算)Tensormethodsandsparse(与稀疏有关的tensor成员函数)coo张量可用的tensor成员函数(经实测,csr也有一些可以用,比如dim())Torchfunctio......
  • ABB工具坐标系报错质心重量不适配问题
    机器人在运行时为了避免机器人(如传动装置和轴承)出现过载。必须输入正确的负载数据(质量、重心位置、惯性矩),也就是进行负载测试。对于ABB机器人来说,负载测试的方法如下:1、在【主菜单】下,打开【程序编辑器】;   2、选择一个程序,如main程序。点击【调试】;  3、点击......
  • 机械臂运动学-旋转矩阵
    Rotationmatrix的三种用法:1.描述一个坐标系(相对于另一个坐标系)的姿态2.将某一点由某一个坐标系转换到另一个和此坐标系有相对运动的坐标系来表示3.将某一点在同一个坐标系中进行转动 以对三个主轴旋转的矩阵为基础:固定轴旋转:转动顺序不一样,旋转矩阵也不一样:......
  • 【稀疏矩阵】使用torch.sparse模块
    (文章目录)稀疏矩阵的格式目前,torch.sparse和scipy.sparse模块比较支持的主流的稀疏矩阵格式有coo格式、csr格式和csc格式,这三种格式中可供使用的API也最多。coo将矩阵中非零元素的坐标和值分开存储在3个数组中,3个数组长度必须相同,表示有n个非零元素。csr分IndexPointers......
  • 矩阵乘法
    矩阵可以看成一个二维数组,\(A_{i,j}\)表示第\(i\)行第\(j\)列的元素。一般来说,定义广义上的加法\(\oplus\)和乘法\(\otimes\),那么矩阵乘法定义如下:设\(A\)是\(P\timesM\)的矩阵,\(B\)是\(M\timesQ\)的矩阵,\(C=AB\)是\(P\timesQ\)的矩阵,那么有,\[C_{i,j}=\bi......
  • Leetcode面试经典150题-54.螺旋矩阵
      解法都在代码里,不懂就留言或者私信这个题可能和算法关联不大,coding技巧为上classSolution{publicList<Integer>spiralOrder(int[][]matrix){/**先定义结果集*/List<Integer>ans=newArrayList<>();/**当前位置从(0,0)开始*/......