XNA中三维空间物体的几种旋转方法
X、Y、Z分別描述繞三個坐標軸的旋轉角度(0~360)。這三個角度稱為歐拉角。繞X軸旋轉的角稱為傾斜角(pitch),繞Y軸旋轉的角稱為翻滾角(head或yaw),繞Z軸旋轉的角稱為搖擺角(roll)。物體的朝向一般可以用歐拉角表示,因此朝向的插值問題可以簡單地轉化為三個歐拉角的插值問題。但歐拉角表示也有它的局限性。因為旋轉矩陣是不可交換的,基于歐拉角的旋轉一定要按某個特定的次序進行;此外。等量的歐拉角變化不一定引起等量的旋轉變化,從而導致旋轉的不均勻;歐拉角還有可能導致自由度的喪失,出現萬向節死鎖現象。在使用三個旋轉值來分別進行旋轉變換的組合時,由于各個旋轉是順序進行的,繞一個軸的旋轉會覆蓋繞別的軸的旋轉,會導致推動旋轉的某個角度。例如:如果一個平行X軸的向量繞一個Y軸旋轉90度,平等于X軸,那么,所有繞Z軸的旋轉都不再起作用。
?
XNA中主要通過Matrix. CreateRotationX、Matrix. CreateRotationY、Matrix. CreateRotationZ方法實現歐拉角的旋轉。這三個方法都是通過旋轉角度生成一個旋轉矩陣。如生成繞Y軸的旋轉的矩陣代碼如下:
?1public?static?Matrix?CreateRotationX(float?radians)?2{
?3????Matrix?matrix;
?4????float?num2?=?(float)?Math.Cos((double)?radians);
?5????float?num?=?(float)?Math.Sin((double)?radians);
?6????matrix.M11?=?1f;
?7????matrix.M12?=?0f;
?8????matrix.M13?=?0f;
?9????matrix.M14?=?0f;
10????matrix.M21?=?0f;
11????matrix.M22?=?num2;
12????matrix.M23?=?num;
13????matrix.M24?=?0f;
14????matrix.M31?=?0f;
15????matrix.M32?=?-num;
16????matrix.M33?=?num2;
17????matrix.M34?=?0f;
18????matrix.M41?=?0f;
19????matrix.M42?=?0f;
20????matrix.M43?=?0f;
21????matrix.M44?=?1f;
22????return?matrix;
23}
24
25?
26
27?
28
XNA中也有一個Matrix.CreateFromYawPitchRoll方法,起初我也以為它是生成歐拉角旋轉矩陣的,但在分析過他的實現代碼后才發現,它其實是生成了一個四元數:
Code
1public?static?Matrix?CreateFromYawPitchRoll(float?yaw,?float?pitch,?float?roll)
2{
3????Matrix?matrix;
4????Quaternion?quaternion;
5????Quaternion.CreateFromYawPitchRoll(yaw,?pitch,?roll,?out?quaternion);
6????CreateFromQuaternion(ref?quaternion,?out?matrix);
7????return?matrix;
8}
這里是傳說中將歐拉角轉換為四元數的方法:
?1public?static?void?CreateFromYawPitchRoll(float?yaw,?float?pitch,?float?roll,?out?Quaternion?result)
?2{
?3????float?num9?=?roll?*?0.5f;
?4????float?num6?=?(float)?Math.Sin((double)?num9);
?5????float?num5?=?(float)?Math.Cos((double)?num9);
?6????float?num8?=?pitch?*?0.5f;
?7????float?num4?=?(float)?Math.Sin((double)?num8);
?8????float?num3?=?(float)?Math.Cos((double)?num8);
?9????float?num7?=?yaw?*?0.5f;
10????float?num2?=?(float)?Math.Sin((double)?num7);
11????float?num?=?(float)?Math.Cos((double)?num7);
12????result.X?=?((num?*?num4)?*?num5)?+?((num2?*?num3)?*?num6);
13????result.Y?=?((num2?*?num3)?*?num5)?-?((num?*?num4)?*?num6);
14????result.Z?=?((num?*?num3)?*?num6)?-?((num2?*?num4)?*?num5);
15????result.W?=?((num?*?num3)?*?num5)?+?((num2?*?num4)?*?num6);
16}
17
18?
19
20?
21
2.繞任意軸旋轉
繞任意軸旋轉需要兩個參數:一個向量和一個角度,其中向量表示旋轉軸,角度表示將要旋轉的角度(0~360度)。
使用這種方法來進行旋轉變化時,兩個方向之間的插值不夠夠平滑,容易導致出現抖動等問題,如下圖所示:
?
這種方法在XNA中主要通過 Matrix.CreateFromYawPitchRoll方法來實現。方法內容如下:
Code
?1public?static?Quaternion?CreateFromAxisAngle(Vector3?axis,?float?angle)
?2{
?3????Quaternion?quaternion;
?4????float?num2?=?angle?*?0.5f;
?5????float?num?=?(float)?Math.Sin((double)?num2);
?6????float?num3?=?(float)?Math.Cos((double)?num2);
?7????quaternion.X?=?axis.X?*?num;
?8????quaternion.Y?=?axis.Y?*?num;
?9????quaternion.Z?=?axis.Z?*?num;
10????quaternion.W?=?num3;
11????return?quaternion;
12}
3.四元數旋轉。
我們知道在實現繞任意軸旋轉方面,以上兩種方法都不夠完美,而使用四元數來旋轉則顯得非常得體。
XNA中通過Matrix.CreateFromQuaternion方法創建旋轉矩陣。實現方法如下:
?
Code?1public?static?Matrix?CreateFromQuaternion(Quaternion?quaternion)
?2{
?3????Matrix?matrix;
?4????float?num9?=?quaternion.X?*?quaternion.X;
?5????float?num8?=?quaternion.Y?*?quaternion.Y;
?6????float?num7?=?quaternion.Z?*?quaternion.Z;
?7????float?num6?=?quaternion.X?*?quaternion.Y;
?8????float?num5?=?quaternion.Z?*?quaternion.W;
?9????float?num4?=?quaternion.Z?*?quaternion.X;
10????float?num3?=?quaternion.Y?*?quaternion.W;
11????float?num2?=?quaternion.Y?*?quaternion.Z;
12????float?num?=?quaternion.X?*?quaternion.W;
13????matrix.M11?=?1f?-?(2f?*?(num8?+?num7));
14????matrix.M12?=?2f?*?(num6?+?num5);
15????matrix.M13?=?2f?*?(num4?-?num3);
16????matrix.M14?=?0f;
17????matrix.M21?=?2f?*?(num6?-?num5);
18????matrix.M22?=?1f?-?(2f?*?(num7?+?num9));
19????matrix.M23?=?2f?*?(num2?+?num);
20????matrix.M24?=?0f;
21????matrix.M31?=?2f?*?(num4?+?num3);
22????matrix.M32?=?2f?*?(num2?-?num);
23????matrix.M33?=?1f?-?(2f?*?(num8?+?num9));
24????matrix.M34?=?0f;
25????matrix.M41?=?0f;
26????matrix.M42?=?0f;
27????matrix.M43?=?0f;
28????matrix.M44?=?1f;
29????return?matrix;
30}
31
32?
33
34?
35
?
Quaternion類的構造為Quaternion(float x, float y, float z, float w),當然也還可以通過CreateFromAxisAngle、CreateFromRotationMatrix、CreateFromYawPitchRoll等方法將其它的旋轉方法轉換為四元數。??
?
轉載于:https://www.cnblogs.com/desmend/archive/2008/09/20/1294880.html
總結
以上是生活随笔為你收集整理的XNA中三维空间物体的几种旋转方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何开发ORACLE存储过程
- 下一篇: C语言这么难,为何大家都如飞蛾扑火般学习