You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

OpenGL技术问询:如何从4x4变换矩阵获取局部向上与向右向量?

从组合变换矩阵中提取局部向上/向右向量

嘿,刚好对GLM的矩阵布局和变换组合熟得很,我来给你掰扯清楚!

首先得记住:GLM是列主序的矩阵库,这意味着变换矩阵的前三个列向量,正好对应你局部坐标系的三个基向量在世界空间中的表现——其中:

  • 第0列 = 局部向右(Right)向量
  • 第1列 = 局部向上(Up)向量
  • 第2列 = 局部向前(Forward)向量(通常是-z方向,取决于你的坐标系约定)

不过你的矩阵里叠加了全局+局部的缩放,所以直接取列向量的话,会带有缩放因子。根据你的需求,分两种情况处理:

1. 提取带缩放的局部向量(包含缩放后的轴长度)

如果需要保留缩放带来的向量长度(比如用于碰撞检测、尺寸相关的计算),直接取矩阵的列即可:

// 提取局部向右向量
glm::vec3 localRight = glm::vec3(matrix[0]);
// 提取局部向上向量
glm::vec3 localUp = glm::vec3(matrix[1]);

2. 提取单位化的方向向量(仅保留方向,去掉缩放影响)

如果只需要纯方向(比如相机朝向、物体的朝向判断),就得对提取出的向量做归一化,消除缩放的影响:

// 单位化的局部向右方向
glm::vec3 localRightDir = glm::normalize(glm::vec3(matrix[0]));
// 单位化的局部向上方向
glm::vec3 localUpDir = glm::normalize(glm::vec3(matrix[1]));

为什么这样可行?

你构建矩阵的顺序是:全局旋转 → 平移 → 全局缩放 → 局部旋转 → 局部缩放。所有这些变换叠加后,最终矩阵的每一列本质上就是局部空间的基向量(右、上、前)经过所有变换后的结果。平移只影响第4列的位置信息,完全不改变方向向量,所以直接取前三个列的xyz部分就够了。

举个简单的例子:如果你的物体先绕Y轴转90度,再缩放2倍,那么矩阵的第0列(右向量)就会变成(0,0,2)(假设右手坐标系),归一化后就是(0,0,1),正好对应旋转后的向右方向。

内容的提问来源于stack exchange,提问作者Skarab

火山引擎 最新活动