围绕具有3x3矩阵和平移向量的点旋转



我有一个openGL格式的3x3矩阵和一个平移向量。当围绕一个点旋转时,我会感到困惑,因为我的旋转函数不考虑平移。

对于旋转,我假设我可以简单地将3x3矩阵更改为四元数,旋转它,然后将其改回。当围绕对象当前位置以外的任何对象旋转时,这将不起作用。

4x4床垫的正常程序是:

-(point - position) 转换点

旋转

(point - position) 转换点

可选建议:

子弹物理使用这种格式,这就是为什么我考虑使用他们的数据格式来存储转换。我最终不得不转换为4x4矩阵来进行投影,但这并不重要。Bullet的格式很有吸引力,因为它删除了无用的剪切数据。将转换保持为项目符号格式值得吗?

想出了一个。只要做矩阵运算。手动或从四元数创建旋转矩阵,然后将它们相乘。子弹为你做这件事,但我会展示子弹内部的作用。

*psuedo代码

void Transform::rotateAroundPoint(axis, angle, point)
{
Matrix3x3 mat = createMatrixFromQuaternion(axis, angle);
Transform rotateTransform;
trans.basis = mat; // <- 3x3 matrix
trans.origin = Vector3(0,0,0); // <- Translation vector
// "this" is a pointer to the transform being edited since I decided to write 
// this as a member function.
Vector3 pos = this->origin;
this->origin = this->origin - point; 
(*this) = rotateTransform * (*this);
this->origin = this->origin + point;
}
// Internally bullet does basically this
resultTransform.basis = t1.basis * t2.basis;
resultTransform.origin = t1.basis * t2.origin + t1.origin;

我还没有测试代码。我有点害怕它可能会受到万向节锁定的影响,所以在我的实际代码中,当我必须乘以2个基矩阵时,我可能只会做四元数数学。

相关内容

  • 没有找到相关文章

最新更新