前面提到了将顶点的坐标或者向量的分量放入一个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
本站由北京市万商天勤律师事务所王兴未律师提供法律服务