日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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中三维空间物体的几种旋转方法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。