gpt4 book ai didi

c++ - 使用 3x3 矩阵和平移 vector 围绕一个点旋转

转载 作者:太空宇宙 更新时间:2023-11-04 13:22:27 26 4
gpt4 key购买 nike

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

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

4x4 矩阵的正常程序是:

通过-(point - position)翻译点

旋转

通过(point - position)翻译点

可选建议:

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

最佳答案

想到了一个。只是做矩阵数学。手动或从四元数创建旋转矩阵,然后将它们相乘。 Bullet 会为您完成此操作,但我也会展示 bullet 内部的功能。

*伪代码

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 个基矩阵时,我可能只会做四元数数学运算。

关于c++ - 使用 3x3 矩阵和平移 vector 围绕一个点旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34621172/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com