您好,欢迎来到好土汽车网。
搜索
您的当前位置:首页3D编程知识--矩阵变换

3D编程知识--矩阵变换

来源:好土汽车网
为了对一个顶点进行变换(旋转、平移等),可以把它与一个4*4的的变换矩阵来相乘。变换思路如下:设置一个4*4的矩阵,使其表示某一具体的变换。然后将顶点的坐标或者向量的分量放入一个1*4的行向量v中。乘积vX就生成了经过变换的顶点或者向量v'。例如,如果X表示沿着x轴平移10个单位,v=[2,6,−3,1],则乘积vX=v'=[12,6,−3,1]。

前面提到了将顶点的坐标或者向量的分量放入一个1*4的行向量v中。但是在几何学中,顶点和向量都是使用3个分量(XYZ)来表示的。为了使向量-矩阵相乘有意义,我们必须将顶点或向量拓展为4D行向量。如何设置第四个分量?这个分量我们用w表示,其中w叫做齐次坐标。取值为0或者1。把W分量设置为1时,是为了保证点的平移变换能正确进行。而对于向量,没有必要进行平移变换,所以将W分量设为0,防止对向量实施平移变换。


(1) 从普通坐标转换成齐次坐标时
   如果(x,y,z)是个点,则变为(x,y,z,1)
   如果(x,y,z)是个向量,则变为(x,y,z,0)
(2) 从齐次坐标转换成普通坐标时   
   如果是(x,y,z,w),则知道它是个点,变成(x/w,y/w,z/w)     其中w不为0
   如果是(x,y,z,0),则知道它是个向量,仍然变成(x,y,z)


==================================================================

下面这篇文章详细讲解了一个模型映射到屏幕上的详细的矩阵变换过程: 

==================================================================


由于向量Vector的存储方式不同,导致了向量-矩阵相乘时有左乘和右乘的区别。

D3D中的向量是行向量,存储方式为 Vector=(x, y, z) 。与矩阵相乘时,向量在左,矩阵在右;

       例如:vector * MatrixWorld * MatrixView * MatrixProjection

OpenGL中的向量是列向量,存储方式为 Vector=(x,  

                                                                             y,

                                                                             z)与矩阵相乘时,矩阵在左,向量在右;

       例如:MatrixProjection * MatrixView * MatrixWorld * vector

==================================================================


OpenGL, GLSL, DirectX, HLSL中的矩阵存储形式
OpenGL:  按列存储矩阵(column-major)。调用API形成的矩阵用来和一个列向量相乘,矩阵在左,列向量在右。
GLSL:    存储方式和OpenGL相同(column-major)
DirectX:    按行存储矩阵(row-major)。调用API形成的矩阵用来和一个行向量相乘,矩阵在右,行向量在左。
HLSL:  存储方式和OpenGL相同(column-major)


在将DX API构造的矩阵传递给HLSL之前,先要对该矩阵做Transpose,然后把转置后的矩阵传递给HLSL。
但是,如果是用的effect system里的setMatrix()来传递矩阵,那么不必做Transpose,因为该函数会自动将矩阵由row-major改为colunn-major存储,再将其导入shader。

==================================================================


3*3矩阵转换成4*4矩阵:

上面这张图片里面,我发现关于“sx,sy,sz as scaling”的部分是不正确的

==================================================================


把四元数转换成旋转矩阵:XMMatrixRotationQuaternion

把四元数转换成一个轴向量和角度值:XMQuaternionToAxisAngle

把旋转矩阵转换成四元数:XMQuaternionRotationMatrix











因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- howto234.com 版权所有 湘ICP备2022005869号-3

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务