使用Quaternion设置角度的单轴旋转

我正在使用四元数表示一些对象的旋转,我想让用户可以使用文本框一次旋转一个轴,所以他会写对象旋转的角度(例如at X轴),则物体旋转被设置为该旋转。
我知道,这个操作q1 * q会按q1旋转q ,但是我不知道如何设置单个轴的旋转,难道有人帮我完成这个function吗?

 public void SetRotationX(float Angle) { } 

根据你的function命名,我把它只是试图将旋转设置为沿着该角度的全新旋转,而不是将旋转偏移一定量。

在这种情况下,不是将四元数连接到当前元素,而是完全创建一个新的四元数。 请注意,您仍然可能想要将xyz值传递给函数,与其他文本框相关,或者沿着这些角度传递当前旋转。

假设没有先前的代码来创建这些欧拉转换已经(请注意,伪代码以避免语言问题),以下是计算四元数的每个轴的公式的大纲:

 void EulerAnglesToQuaternion( Quaternion q , double x , double y , double z ) { double cx = cos(x*0.5); double cy = cos(y*0.5); double cz = cos(z*0.5); double sx = sin(x*0.5); double sy = sin(y*0.5); double sz = sin(z*0.5); qw = (cz*cx*cy)+(sz*sx*sy); qx = (cz*sx*cy)-(sz*cx*sy); qy = (cz*cx*sy)+(sz*sx*cy); qz = (sz*cx*cy)-(cz*sx*sy); } 

从四元数定义为三维旋转 ,我们可以通过在这个方向上取一个单位vector来表示一个关于任意三维坐标系的旋转,用旋转角度的一半的正弦标定它,并且用它作为3个虚部四元数。 剩余的实部就是角的一半余弦,保持单位长度的四元数。

 Quaternion AngleAxis(Vector3 axis, float angle) { Vector3 imaginary = axis.normalized * sin(angle/2f); Quaternion q; qx = imaginary.x; qy = imaginary.y; qz = imaginary.z; qw = cos(angle/2f); return q; } 

绕x轴旋转是一个简单的特例:

 Quaternion RotationAroundX(float angle) { // Equivalent to AngleAxis(new Vector3(1, 0, 0), angle) Quaternion q; qx = sin(angle/2f); qy = 0f; qz = 0f; qw = cos(angle/2f); return q; }