Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用3x3矩阵和平移向量围绕点旋转_C++_Opengl_Linear Algebra_Opengl 3 - Fatal编程技术网

C++ 使用3x3矩阵和平移向量围绕点旋转

C++ 使用3x3矩阵和平移向量围绕点旋转,c++,opengl,linear-algebra,opengl-3,C++,Opengl,Linear Algebra,Opengl 3,我有一个openGL格式的3x3矩阵和一个翻译向量。我在绕一个点旋转时会感到困惑,因为我的旋转函数不考虑平移。< /P> 对于旋转,我假设我可以简单地将3x3矩阵更改为四元数,旋转它,然后再将其更改回。当围绕对象当前位置以外的任何对象旋转时,此选项不起作用 4x4材料的正常程序为: 按-(点-位置) 轮换 按转换点(点-位置) 可选建议: Bullet physics使用这种格式,这就是为什么我考虑使用他们的数据格式来存储转换。我最终不得不转换成4x4矩阵来进行投影,但这并不重要。Bullet的

我有一个openGL格式的3x3矩阵和一个翻译向量。我在绕一个点旋转时会感到困惑,因为我的旋转函数不考虑平移。< /P> 对于旋转,我假设我可以简单地将3x3矩阵更改为四元数,旋转它,然后再将其更改回。当围绕对象当前位置以外的任何对象旋转时,此选项不起作用

4x4材料的正常程序为:

-(点-位置)

轮换

转换点(点-位置)

可选建议:


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;
void变换::rotateAroundPoint(轴、角度、点)
{
Matrix3x3 mat=创建四元数矩阵(轴、角度);
变换旋转变换;
trans.basis=mat;//原点=此->原点-点;
(*此)=旋转变换*(*此);
本->原点=本->原点+点;
}
//子弹基本上就是这样
结果transform.basis=t1.basis*t2.basis;
结果transform.origin=t1.basis*t2.origin+t1.origin;

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

想出了一个。只要做矩阵数学。手动或从四元数创建旋转矩阵,然后将它们相乘。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;
void变换::rotateAroundPoint(轴、角度、点)
{
Matrix3x3 mat=创建四元数矩阵(轴、角度);
变换旋转变换;
trans.basis=mat;//原点=此->原点-点;
(*此)=旋转变换*(*此);
本->原点=本->原点+点;
}
//子弹基本上就是这样
结果transform.basis=t1.basis*t2.basis;
结果transform.origin=t1.basis*t2.origin+t1.origin;

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

子弹向量实际上占用了更多的空间,但比特征向量更简单,所以我仍然要使用它。子弹向量实际上占用了更多的空间,但它们比本征函数更简单,所以我还是要使用它。