DirectXの:マトリックス

タグのDirectX DirectXの下のブログは主に、メインの参照学習過程を記録するために使用されている「DirectXの12の3Dゲームの戦闘の開発を。」

DirectXの中行列

3D数学的記述は確かに行列が参加する最も重要な転換ジオメトリ、です。行列に関連しているBenpianメインコンテンツDirectXMathライブラリ部分。

行列

まず、次のような特徴の行列演算を確認します。

  • 行列の加算は可換と連想されます
  • 行列A、Bは、もし意味の場合のみ、乗算された行の同じ数の列AとBの数
  • 行列の乗算は、一般的に可換ではありません
  • 行列加算のスカラー乗算は、行列乗算は、スカラー加算器上に分配します
  • ベクトル行列乗算は、実際の線形結合であります
  • すなわち、主対角行列はゼロ行列の残りの部分であります
  • ファランクスのファランクス可逆場合と行列式がゼロに等しくない場合にのみ
  • i行のサブ式に基づいて、すなわち補因子Iマトリクス構成の残りのj番目の列を除去マトリックス補因子、すなわちの正方行列の行のi及び列jのI-1 + j回優れ広場
  • i及び列jの補因子は、対応する行と列のマトリックスに配置されている行列の行が補因子正方行列と呼ばれ、マトリックスは、マトリックス伴う補因子行列の転置であります
  • 決定を伴う二乗で割った行列のための広場逆行列

DirectXMathライブラリマトリックス型

3Dグラフィックスでは、典型的には4次元ベクトルと4×4の行列に対応する、4次元コンテンツまで含みます。DirectXMathライブラリは提供してXMMATRIX行列を表現するための型を。

#if (defined(_M_IX86) || defined(_M_X64) || defined(_M_ARM)) && defined(_XM_NO_INTRINSICS)
struct XMMATRIX
#else
__declspec(align(16)) struct XMMATRIX
#endif
{
    XMVECTOR R[4];
    
    XMMATRIX() {}
    
    XMMATRIX(FXMVECTOR R0, FXMVECTOR R1, FXMVECTOR R2, CXMVECTOR R3)
    { r[0] = R0; r[1] = R1; r[2] = R2; r[3] = R3; }
    
    XMMATRIX(float m00, float m01, float m02, float m03,
            float m10, float m11, float m12, float m13,
            float m20, float m21, float m22, float m23,
            float m30, float m31, float m32, float m33);
    
    explicit XMMATRIX(_In_reads_(16) const float *pArray);
    
    XMMATRIX& operator= (const XMMATRIX& M)
    { r[0] = M.r[0]; r[1] = M.r[1]; r[2] = M.r[2]; r[3] = M.r[3];
    return *this; }
}

見ることができる、DirectXMathライブラリ構造は、XMMATRIX4つの4次元ベクトルを含む行列で表されるXMVECTOR、SIMDれます。マトリックスの構成は、他のマトリックスによって生成することができる場合、それは長さ16または16に直接のさらなる配列によって4構成によって4次元ベクトルとすることができるfloat構成。

ロード/ストア

そして、XMFLOATn似ていますが、また、マトリックスは、ストレージ構造に対応しますXMFLOAT4X4

struct XMFLOAT4X4
{
    union
    {
        struct
        {
            float _11, _12, _13, _14;
            float _21, _22, _23, _24;
            float _31, _32, _33, _34;
            float _41, _42, _43, _44;
        };
        float m[4][4];
    };
    
    XMFLOAT4X4() {}
    
    XMFLOAT4X4(float m00, float m01, float m02, float m03,
            float m10, float m11, float m12, float m13,
            float m20, float m21, float m22, float m23,
            float m30, float m31, float m32, float m33);
    
    explicit XMFLOAT4X4(_In_reads_(16) const float *pArray);
    
    float operator() (size_t Row, size_t Column) const
    { return m[Row][Column]; }
    
    float& operator() (size_t Row, size_t Column)
    { return m[Row][Column]; }
    
    XMFLOAT4X4& operator= (const XMFLOAT4X4& Float4x4);
};

以下の方法は、/ストア・マトリックスをロードするために使用することができます。

inline XMMATRIX XM_CALLCONV XMLoadFloat4x4(const XMFLOAT4X4* pSource);
inline void XM_CALLCONV XMStoreFloat4x4(XMFLOAT4X4* pDestination, FXMMATRIX M);

パラメータの受け渡し

それは声明の中で述べているXMMATRIX関数の型は、あるべきときXMMATRIXみなさ4 XMVECTOR受信ではXMVECTOR2以下で、最初のものはXMMATRIX宣言されるべきではないFXMVECTOR、残りがありますCXMMATRIX注釈によって、これらの同じ規則XM_CALLCONVをサポート。同様に、コンストラクタは常にコンストラクタ使用して、特殊なケースであるCXMMATRIX種別取得XMMATRIXパラメータを、そして使用していないXM_CALLCONV注釈を。

// 在32位的Windows系统上,XM_CALLCONV转化为__fastcall调用约定
// __fastcall调用约定通过寄存器传递前3个XMVECTOR参数,但由于
// 1个XMMATRIX类型包含4个XMVECTOR,故此时所有的XMMATRIX都只能通过堆栈引用
typedef const XMMATRIX& FXMMATRIX;
typedef const XMMATRIX& CXMMATRIX;

演算子のオーバーロード

XMMATRIXこれは、行列演算演算子の種類についての情報を提供します。

XMMATRIX operator+ () const { return *this; }
XMMATRIX operator- () const;

XMMATRIX& XM_CALLCONV operator+= (FXMMATRIX M);
XMMATRIX& XM_CALLCONV operator-= (FXMMATRIX M);
XMMATRIX& XM_CALLCONV operator*= (FXMMATRIX M);

XMMATRIX& operator*= (float S);
XMMATRIX& operator/= (float S);

XMMATRIX XM_CALLCONV operator+ ( FXMMATRIX M) const;
XMMATRIX XM_CALLCONV operator- ( FXMMATRIX M) const;
XMMATRIX XM_CALLCONV operator* ( FXMMATRIX M) const;

XMMATRIX& operator*= (float S) const;
XMMATRIX& operator/= (float S) const;

friend XMMATRIX XM_CALLCONV operator* (float S, FXMMATRIX M);

行列関数

DirectXMathライブラリはまた、自然関連のユーティリティ関数の行列が含まれています。

// 单位矩阵
XMMATRIX XM_CALLCONV XMMatrixIdentity();

// 判断是否是单位矩阵
bool XM_CALLCONV XMMatrixIsIdentity(FXMMATRIX M);

// 矩阵乘法
XMMATRIX XM_CALLCONV XMMatrixMultiply(FXMMATRIX A, CXMMATRIX B);

// 求转置
XMMATRIX XM_CALLCONV XMMatrixTranspose(FXMMATRIX M);

// 求行列式,返回的XMVECTOR的每一个分量都是行列式值
XMVECTOR XM_CALLCONV XMMatrixDeterminant(FXMMATRIX M);

// 求逆矩阵,其中输入的pDeterminant为M的行列式
XMMATRIX XM_CALLCONV XMMatrixInverse(XMVECTOR* pDeterminant, FXMMATRIX M);

おすすめ

転載: www.cnblogs.com/Li-F/p/11494776.html