行列主序矩阵

因为之前接触的是虚幻,用的是DX,所以接触的是行矩阵。最近一年接触自研引擎,用的是OpenGL的列矩阵。然而我之前图形基础没打好,以至于很长一段时间没弄清楚涉及到矩阵相关的一些问题。所以乘着自己意识清醒,还是应该梳理一下。

1、什么是行主序和列主序

2、什么时候向量是前乘什么时候是后乘

3、构造旋转位移缩放矩阵时,矩阵乘法应该按照什么样顺序

 

主序

r11 r12 r13 0
r21 r22 r23 0
r31 r32 r33 0
tx  ty  tz  1

其实记住行主序只要记住矩阵中,表示平移的3个分量是在一行就是行主序。行主序需要用向量去前乘来完成变化,即Vector4*Mat。一般为了节省矩阵存储的内存开销,我们只存储左边4*3的部分,默认最后一列是0 0 0 1

主序

r11 r21 r31 tx
r12 r22 r32 ty
r13 r23 r33 tz
0   0   0   1

列主序其实就是将行主序的内容直接进行转置,这样平移的3个分量就是在一列了,就是列矩阵。列主序需要用向量去后乘来完成变化,即Mat*Vector4。一般为了节省矩阵存储的内存开销,我们只存储上边3*4的部分,默认最后一行是0 0 0 1

GLSL矩阵构造

CPU传给GPU的顺序 M00、M01、M02、M03...

GLSL中接收并构造的顺序
M00    M10    M20    M30
M01    M11    M21    M31
M02    M12    M22    M32
M03    M13    M23    M33

下面的m03对应上面M03的位置,很容易误写成Mat[3][0]来取值,实际应该是如下写法
float m03 = Mat[0][3];

https://cloud.tencent.com/developer/article/1504864 GLSL矩阵语法

构造矩阵时的乘法顺序

无论是行矩阵还是列矩阵在做乘法的时候,都是当前状态的矩阵前乘以另一个矩阵。例如我先平移再旋转,就是RT

因为矩阵乘法是不满足交换律,也就意味着矩阵相乘时需要按指定顺序才能达到我们的目的。当我们有旋转位移缩放信息想构造矩阵时,我们可以按照RST或者SRT的方式去构造,意味着先旋转再缩放和先缩放再旋转的结果是一样的。而先旋转再平移和先平移再旋转结果是不一样的,因为旋转过后坐标系就变了,就会按照旋转过后的坐标系去平移。所以我们都是先移动再旋转缩放,或者先移动再缩放旋转。但是矩阵相乘的时候是反方向也就是T再后面,所以这也是经常会搞混的点。对于这部分详细的解释可以参考这篇博客,我觉的写的就挺清晰

 

在C语言中计算对称矩阵行列式,可以使用高斯消元或者利用矩阵的特性来简化计算。对称矩阵意味着它的对角线元素相等,其他元素关于对角线是对称的。例如,一个3x3的对称矩阵会看起来像这样: ``` | a b c | | b a d | | c d a | ``` 其中a = d且b = c。 对于这类矩阵,有快速的算法可以利用这种特殊结构来计算行列式。你可以选择以下几种方法之一: 1. **LU分解**:首先将对称矩阵转换成上三角形式(U),然后通过乘积 `det(A) = det(U) * det(L)` 计算行列式,其中L是下三角矩阵,因为对称矩阵的LU是对称的,这一步可以用递归公式完成。 2. **特征值方法**:由于对称矩阵的实数特征值是唯一确定的,可以先找到特征值,然后行列式就是特征值之积。计算特征值通常涉及解特征多项式,但这需要额外的库支持,比如数值计算库。 3. **展开**:可以选择(即按交替展开法则),对称矩阵在这种情况下展开后的系数是相同的,这能简化计算过程。 ```c // 示例代码片段(非完整版) #include <stdio.h> double determinant(int n, double matrix[n][n]) { if (n == 2) { return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]; } else { int i; double sub_determinant = 0.0; for (i = 0; i < n; i++) { // 按交替展开 sub_determinant += matrix[0][i] * determinant(n - 1, &matrix[1][i]); } return sub_determinant; } } int main() { double symmetric_matrix[3][3] = { {1, 2, 2}, {2, 1, 2}, {2, 2, 1} }; printf("The determinant is: %.2f\n", determinant(3, symmetric_matrix)); return 0; } ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值