四元数旋转错误
Quaternion Rotation errors
最近,我正在使用源对我的3D模型进行旋转。但是,调用该函数时出现问题:RotationBetweenVectors,在教程 17( 链接:http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/)。 我想使用四元数方法将向量_from旋转到向量_to。 两个向量定义为如下,并计算它们之间的四分位数。
vec3 _from(0, -0.150401f, 0.93125f), _to(-0.383022f, -0.413672f, 1.24691f);
quat _rot = RotationBetweenVectors(_from, _to);
vec3 _to1 = _rot * _from;
vec3 _to2 = _rot * _from * inverse(_rot);
然后我用这个四分_rot乘以向量_from。不幸的是,结果_to1和_to2都不等于向量_to。
_rot gives {x=0.0775952041 y=-0.140000001 z=-0.0226106234 w=0.986847401}
_to1 gives {x=-0.264032304 y=-0.285160601 z=0.859544873 }
_to2 gives {x=-0.500465572 y=-0.390112638 z=0.697992325 }
如果有任何朋友可以帮助我解决这个问题,我将不胜感激? 非常感谢!
我在这里看到了两个问题。
首先,如果您希望矢量 v1 在与矢量 v2 完全相同的位置旋转和完成,则它们的长度必须相同。
在您的情况下,_to
的长度与_from
不同。我建议你规范化它们:
_to = normalize(_to);
_from = normalize(_from);
其次,正如您所提示的,通过四元数旋转由此运算符完成:
v1 = quat * Pin * inverse(quat);
问题是 Pin 也必须是四元数,而不是向量(您已将_from
定义为 vec3)。请注意,在原始运算符中,它可以重写为:
vec3 _to2 = (_rot * _from) * inverse(_rot);
其中,内部括号产生乘以inverse(_rot)
的 vec3 。
因此,要解决此问题,这意味着您的运算符必须是类似的(四元数乘法):
quat Pin = {0, _from};
quat result = _rot * Pin * inverse(_rot);
现在,您只需要再次将此四元数转换为 vec3:
_to2 = axis(result);
我相信,你不能将vec3
乘以quat
,如下所示:
vec3 _to1 = _rot * _from;
您必须通过在第四处添加1
来将_from
从vec3
转换为vec4
,即
vec4 _from2 = vec4(_from, 1);
另外,将_rot
从quat
转换为 4x4 矩阵,比如_rot2
.您引用的教程提到可以使用以下内容完成:
mat4 RotationMatrix = quaternion::toMat4(quaternion);
然后,您应该能够将_from2
乘以_rot2
以获得_to
向量。
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的旋转数组代码给出了大数组大小的错误
- D3DXMatrix旋转轴旋转错误的轴
- 四元数旋转错误
- 旋转数组 - 错误
- 直接相机旋转的错误控制
- AVL树双重旋转错误
- GLM::旋转似乎会导致错误的旋转
- 有人能在我的代码中找到矩阵旋转的错误
- 旋转实现错误
- boost::几何多边形的 outer() 在多边形旋转后有错误的坐标