从变换矩阵中向前移动向量

Posted

技术标签:

【中文标题】从变换矩阵中向前移动向量【英文标题】:Getting Forward Right Up Vector From Transformation Matrix 【发布时间】:2019-12-01 22:59:42 【问题描述】:

如何从变换矩阵中获得前向、右向和向上向量?

我想以这些向量为基础,向不同方向的刚体施加力。

btTransform Trans = _RigidBody->getWorldTransform();

btVector3 Forward;  // ???
btVector3 Right;    // ???
btVector3 Up;       // ???

_RigidBody->activate(true);
//
//  Move forward/backward
_RigidBody->applyCentralForce(Forward * 5);
_RigidBody->applyCentralForce(-Forward * 5);
//
//  Jump
_RigidBody->applyCentralForce(Up * 5);
//
//  Move left/right
_RigidBody->applyCentralForce(Right * 5);
_RigidBody->applyCentralForce(-Right * 5);

我还有一个 GLM 模型矩阵,它本质上是 glm::mat4 内的子弹变换矩阵的副本,我可以在这里使用它并将结果向量转换为子弹,但更愿意完全留在子弹地带这部分的内容。

【问题讨论】:

我不知道btVector3 类型的规范,但我想bt3Vector3 Forward 1,0,0; 应该可以工作(假设x 方向是您的前进方向。) 问题是对象在世界中存在一段时间后,并与其他对象交互,前进方向不会像x+1或z+1那么简单。它需要相对于当前旋转的对象。 btTransform 中包含的信息。 【参考方案1】:

您应该始终明确说明您使用的是什么库。我假设,你使用this。

operator() 为您提供了转换下的矢量图像,因此我假设以下内容可以满足您的需求:

btVector3 Forward = Trans(btVector31,0,0);

【讨论】:

这将不起作用,因为物理对象旋转后,x+1 将不再是它的正向。前向必须从它当前的世界变换中提取出来,其中考虑了物体当前的旋转。 @KKlouzal 我知道这一点。现在假设Trans 是围绕z 轴旋转约90°,所以(1,0,0) 变成(0,1,0),现在正向应该是(0,1,0)(或者我误会了吗?)。但这正是Trans(btVector31,0,0); 的输出,因为它只是应用了旋转。换句话说:新前锋是旧前锋在变换下的形象,Trans(btVector31,0,0); 将变换应用到旧前锋上。 对不起,我昨晚回复了一半。这完全符合预期。

以上是关于从变换矩阵中向前移动向量的主要内容,如果未能解决你的问题,请参考以下文章

具有基本矩阵变换(WebGL)的类FPS相机运动

将变换矩阵从着色器移动到 Javascript 应用程序

《计算机图形学基础》之变换矩阵

CSS3 matrix3d矩阵变换和动画变换

顶点法向量从物体坐标系变换到世界坐标系

3D计算机图形学变换矩阵欧拉角四元数