日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

XNA中三维空间物体的几种旋转方法

發(fā)布時間:2025/3/15 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 XNA中三维空间物体的几种旋转方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
  • 通過繞三個坐標軸的旋轉(zhuǎn)之和。
  • X、Y、Z分別描述繞三個坐標軸的旋轉(zhuǎn)角度(0~360)。這三個角度稱為歐拉角。繞X軸旋轉(zhuǎn)的角稱為傾斜角(pitch),繞Y軸旋轉(zhuǎn)的角稱為翻滾角(head或yaw),繞Z軸旋轉(zhuǎn)的角稱為搖擺角(roll)。物體的朝向一般可以用歐拉角表示,因此朝向的插值問題可以簡單地轉(zhuǎn)化為三個歐拉角的插值問題。但歐拉角表示也有它的局限性。因為旋轉(zhuǎn)矩陣是不可交換的,基于歐拉角的旋轉(zhuǎn)一定要按某個特定的次序進行;此外。等量的歐拉角變化不一定引起等量的旋轉(zhuǎn)變化,從而導(dǎo)致旋轉(zhuǎn)的不均勻;歐拉角還有可能導(dǎo)致自由度的喪失,出現(xiàn)萬向節(jié)死鎖現(xiàn)象。在使用三個旋轉(zhuǎn)值來分別進行旋轉(zhuǎn)變換的組合時,由于各個旋轉(zhuǎn)是順序進行的,繞一個軸的旋轉(zhuǎn)會覆蓋繞別的軸的旋轉(zhuǎn),會導(dǎo)致推動旋轉(zhuǎn)的某個角度。例如:如果一個平行X軸的向量繞一個Y軸旋轉(zhuǎn)90度,平等于X軸,那么,所有繞Z軸的旋轉(zhuǎn)都不再起作用。

    ?

    XNA中主要通過Matrix. CreateRotationX、Matrix. CreateRotationY、Matrix. CreateRotationZ方法實現(xiàn)歐拉角的旋轉(zhuǎn)。這三個方法都是通過旋轉(zhuǎn)角度生成一個旋轉(zhuǎn)矩陣。如生成繞Y軸的旋轉(zhuǎn)的矩陣代碼如下:

    ?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方法,起初我也以為它是生成歐拉角旋轉(zhuǎn)矩陣的,但在分析過他的實現(xiàn)代碼后才發(fā)現(xiàn),它其實是生成了一個四元數(shù):

    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}

    這里是傳說中將歐拉角轉(zhuǎn)換為四元數(shù)的方法:

    ?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.繞任意軸旋轉(zhuǎn)

    繞任意軸旋轉(zhuǎn)需要兩個參數(shù):一個向量和一個角度,其中向量表示旋轉(zhuǎn)軸,角度表示將要旋轉(zhuǎn)的角度(0~360度)。

    使用這種方法來進行旋轉(zhuǎn)變化時,兩個方向之間的插值不夠夠平滑,容易導(dǎo)致出現(xiàn)抖動等問題,如下圖所示:

    ?

    這種方法在XNA中主要通過 Matrix.CreateFromYawPitchRoll方法來實現(xiàn)。方法內(nèi)容如下:

    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.四元數(shù)旋轉(zhuǎn)。

    我們知道在實現(xiàn)繞任意軸旋轉(zhuǎn)方面,以上兩種方法都不夠完美,而使用四元數(shù)來旋轉(zhuǎn)則顯得非常得體。

    XNA中通過Matrix.CreateFromQuaternion方法創(chuàng)建旋轉(zhuǎn)矩陣。實現(xiàn)方法如下:

    ?

    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類的構(gòu)造為Quaternion(float x, float y, float z, float w),當然也還可以通過CreateFromAxisAngle、CreateFromRotationMatrix、CreateFromYawPitchRoll等方法將其它的旋轉(zhuǎn)方法轉(zhuǎn)換為四元數(shù)。??

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/desmend/archive/2008/09/20/1294880.html

    總結(jié)

    以上是生活随笔為你收集整理的XNA中三维空间物体的几种旋转方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。