jsf*_*jsf 8 c# math quaternions euler-angles
我想为现有的四元数添加一个euler角度.这是我得到的:
Quaternion oldTransform = transform.Rotation;
float YawRotation = mouseDiff.x * RotationSpeed;
Quaternion YawRotationQuaternion = new Quaternion();
YawRotationQuaternion.CreateFromAxisAngle (0, 1, 0, YawRotation);
float PitchRotation = mouseDiff.y * RotationSpeed;
Quaternion PitchRotationQuaternion = new Quaternion();
PitchRotationQuaternion.CreateFromAxisAngle ( 1, 0, 0, PitchRotation);
Quaternion result = oldTransform * YawRotationQuaternion * PitchRotationQuaternion;
transform.Rotation = result;
Run Code Online (Sandbox Code Playgroud)
我想只有偏航和俯仰旋转.旧变换具有此属性.我添加的我的欧拉角也只是俯仰和偏航旋转.当我乘以它时会发生的事情是oldTransform描述的旋转引入了滚动旋转.
然后我试过:
Quaternion result = YawRotationQuaternion * oldTransform * PitchRotationQuaternion;
Run Code Online (Sandbox Code Playgroud)
这不会引入滚动旋转.当oldTransform将偏航轴旋转到俯仰轴上时,此选项更加糟糕,因为它具有万向节锁定.
现在我能想象的是,从旧的变形获得旧的偏航和俯仰旋转,并修改偏航和俯仰轴,使它们不再是(0,1,0)和(1,0,0).这里的问题是,当我从四元数中提取欧拉角时,我也会得到万向节锁.
那么如何将特定轴的euler角度添加到四元数?
解:
更改转换的顺序.
Quaternion result = PitchRotationQuaternion * oldTransform * YawRotationQuaternion;
Run Code Online (Sandbox Code Playgroud)
说明:
您有一个具有本地参考框架的对象.我会说+ x_o朝向对象的右边,-z_o是"前进"而+ y_o是相对于对象的"向上".该对象存在于世界的参考框架中.世界有自己的轴:(x_w,y_w,z_w),+ y_w是世界上的.当对象改变方向时,您希望它在俯仰(围绕x_o旋转)和偏航(围绕y_w旋转).
在您的代码中,您创建两个四元数.应用它们的方式表示围绕x_w和y_w的旋转.如果已经对转换应用了任何偏航,则x_o不再与x_w对齐; 因此,你会得到一些滚动.幸运的是,对于你正在应用的变换,万向节锁定不是问题.万向锁将在这里表现为如果你俯仰 90度,偏航和滚动变成同样的事情.但你不使用roll ; 所以没关系.
您的变换总是可以表示为围绕x_w的旋转,然后围绕y_w旋转.将新的" 音高四元数 "放在旧变换的左侧会将其添加到其他累积音高.保持右侧的" 偏航四元数 "将其加到累积的偏航上.所以,如果你是代表最终四元数一堆或乘法运算,这将是围绕纯转动的字符串x_w其次是围绕旋转的字符串y_w.只要对象以x_o与x_w平行开始,就可以实现所需.
| 归档时间: |
|
| 查看次数: |
3033 次 |
| 最近记录: |