从变换矩阵中向前移动向量
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);
将变换应用到旧前锋上。
对不起,我昨晚回复了一半。这完全符合预期。以上是关于从变换矩阵中向前移动向量的主要内容,如果未能解决你的问题,请参考以下文章