首页/文章/ 详情

当你发现4x4或3x4矩阵,你会想到啥

5天前浏览34

在图形学、CAD和CAE软件的代码中,我们看代码的时候经常会看到4x4, 3x4的矩阵,熟悉这个领域的人,不看代码大概也知道这个矩阵是干啥的,这也是很多人所说的代码感觉,其实就是代码看的多了、理论看的多了很多东西大概干啥也就知道了。今天就大概说一说这个常见的4x4, 3x4的矩阵,总的来说4x4, 3x4的矩阵主要用于仿射变换,其核心作用是统一表示线性变换(旋转、缩放、切变)和平移变换的组合。以下具体说说其用法法: 



一、4×3矩阵的核心作用:仿射变换的统一表示


4×4矩阵通过将3×3的线性变换矩阵与平移向量结合,支持平移、旋转、缩放、镜像、切变等操作的组合,也就是说你对一个坐标、一堆坐标、一个向量的操作通过这个3x4的矩阵基本都能做了。例如:

  • 旋转:通过3×3旋转矩阵实现 (大家都熟悉吧,空间中3x3的旋转矩阵)。 

  • 平移:通过最后一列的平移分量(tx, ty, tz)实现。
  • 缩放:通过3×3矩阵的对角线元素实现均匀或非均匀缩放。

这么写有个好处,当你想转换坐标的时候(因为坐标需要考虑参考系统的平移), 那么就把需要转换的坐标,写成这样的形式(x, y, z, 1)然后通过上述3×4的矩阵与这个4×1向量的矩阵乘法,就可以得到变换后的坐标

而当你想转换方向向量的时候,比如载荷方向啥的,平移量没有用,用(x, y, z, 0)表示方向向量,然后同理通过矩阵乘法,就可以得到变换后的方向向量

二、不同坐标系下的转换方法

在图形学中,需要在视图界面将一个东西显示出来,那么大家可能就会想3D的东西是如何在一个2D屏幕上显示出来的呢?这就需要在不同坐标系(如局部坐标系、世界坐标系、视图坐标系)间转换,需通过矩阵乘法组合变换。以下是典型场景:

1. 局部坐标系 → 世界坐标系

  • 变换矩阵:      
  • 应用:将物体从局部坐标变换到全局坐标系。

2. 世界坐标系 → 视图坐标系(摄像机视角)

  • 变换矩阵:      (摄像机坐标系到世界坐标系的逆变换)。
  • 应用:将世界坐标变换到摄像机视角下的坐标。

3. 视图坐标系 → 裁剪坐标系(投影变换)

  • 变换矩阵:      (包含透视或正交投影)。
  • 应用:将视图坐标映射到标准化设备坐标(NDC)。

三、代码示例(Python)

以下代码展示了如何通过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中的核心数学工具,一般来说成熟的代码或库有一大堆这样相关的应用函数,对此大家就算自己不写最好也知道,这样看代码的时候一看到就会有 “啊,原来是他啊!”这种感觉。


来源:大狗子说数值模拟
pythonUM理论
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2025-08-15
最近编辑:5天前
大狗子说数值模拟
博士 传播国际一流的数值模拟算法
获赞 10粉丝 25文章 71课程 0
点赞
收藏
作者推荐

接触基础知识:调整初始穿透的接触面

在很多模型中,划分完网格的两个物体都存在初始穿透,这是大体出于两个原因:本来的3D模型就是穿透的,常见于螺栓处,因为3D模型很多时候螺纹并不是直接画出来,而是用外径画个圆柱体3D模型不 穿透,但是划分完网格,由于网格的离散造成网格单元直接穿透。 这个时候,如果恰巧这两个”穿透“的物体,我们又设置了接触,就会造成过大的应力,所以很多商业软件中都提供了”调整“功能,在Abaqus中用ADJUST表示,以消除初始的穿透。此逻辑在定义接触和定义绑定Tie的时候均可以采用,在Abaqus中设置方式分别如下: 这样呢,程序在真正计算前就会有个预处理的流程,将这些定义接触的地方的初始穿透量给消除掉,具体消除的方法也很容易理解,那就是:沿着法向方向将穿透的从面节点推回到刚好不 穿透的位置。那么很多朋友就会问了,这个法向方向,对于两个平面还好说,对于不是平的面,是哪里的法向方向呢?Abaqus中采用了如下的方式,仔细想一下会发现非常符合点对面(NTS)和面对面(STS)两种算法的计算逻辑:对于点对面,采用主面的法向方向对于面对面,采用从面法向方向 具体如下图所示,其中圆柱体为主面,左边是面对面算法的调整方式,右边面为点对面算法的调整方式。 通过这种方式,这些人为的初始穿透就会在计算之前被解决,避免由于设置了接触且有初始穿透造成的应力过大的情况,避免被程序误认为这是一个过盈配合的过程,而相反对于真正想进行过盈配合计算的地方,只要不这么设置就好了。来源:大狗子说数值模拟

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈