在图形学、CAD和CAE软件的代码中,我们看代码的时候经常会看到4x4, 3x4的矩阵,熟悉这个领域的人,不看代码大概也知道这个矩阵是干啥的,这也是很多人所说的代码感觉,其实就是代码看的多了、理论看的多了很多东西大概干啥也就知道了。今天就大概说一说这个常见的4x4, 3x4的矩阵,总的来说4x4, 3x4的矩阵主要用于仿射变换,其核心作用是统一表示线性变换(旋转、缩放、切变)和平移变换的组合。以下具体说说其用法法:
4×4矩阵通过将3×3的线性变换矩阵与平移向量结合,支持平移、旋转、缩放、镜像、切变等操作的组合,也就是说你对一个坐标、一堆坐标、一个向量的操作通过这个3x4的矩阵基本都能做了。例如:
tx, ty, tz
)实现。这么写有个好处,当你想转换坐标的时候(因为坐标需要考虑参考系统的平移), 那么就把需要转换的坐标,写成这样的形式(x, y, z, 1)
然后通过上述3×4的矩阵与这个4×1向量的矩阵乘法,就可以得到变换后的坐标。
而当你想转换方向向量的时候,比如载荷方向啥的,平移量没有用,用(x, y, z, 0)
表示方向向量,然后同理通过矩阵乘法,就可以得到变换后的方向向量。
在图形学中,需要在视图界面将一个东西显示出来,那么大家可能就会想3D的东西是如何在一个2D屏幕上显示出来的呢?这就需要在不同坐标系(如局部坐标系、世界坐标系、视图坐标系)间转换,需通过矩阵乘法组合变换。以下是典型场景:
以下代码展示了如何通过4×4矩阵将点从局部坐标系变换到世界坐标系:
import numpy as np
# 定义局部坐标点(齐次坐标)
point_local = np.array([1, 0, 0, 1]) # 原点局部坐标
# 构建变换矩阵:绕Y轴旋转90度 + 平移(2, 3, 4)
theta = np.radians(90)
R = np.array([
[np.cos(theta), 0, np.sin(theta), 0],
[0, 1, 0, 0],
[-np.sin(theta), 0, np.cos(theta), 0],
[0, 0, 0, 1]
])
T = np.array([[1, 0, 0, 2], [0, 1, 0, 3], [0, 0, 1, 4], [0, 0, 0, 1]])
# 组合变换矩阵
M = T @ R
# 应用变换
point_world = M @ point_local
print("世界坐标系坐标:", point_world[:3]) # 输出: [2, 0, 4]
总的来说4x4, 3x4 (隐式处理)的矩阵形式提供了一种统一的矩阵变换方式,通过合理的设置一连串变换矩阵,可高效实现跨坐标系的几何变换,是图形学和CAE中的核心数学工具,一般来说成熟的代码或库有一大堆这样相关的应用函数,对此大家就算自己不写最好也知道,这样看代码的时候一看到就会有 “啊,原来是他啊!”这种感觉。