DirectX 12 持续整理 ——2. 矩阵

本文介绍了DirectX 12中的矩阵概念,包括矩阵类型、加载与存储函数、4x4矩阵在表示三维坐标中的作用。重点讨论了为何在DirectX中使用4x4矩阵进行几何变换,以及矩阵运算函数的应用。
摘要由CSDN通过智能技术生成

跳过线性代数的数学概念部分。
绝大部分内容来自于《Introduction to 3D Game Programming with DirectX12 Frank D. Luna》
引用(值得一看):http://www.360doc.com/content/14/0824/14/202378_404267225.shtml

  刚刚送走了“向量”,而现在迎来了“矩阵”。英语没过四级的我在这里遇到了前所未有的阻碍……
  理解向量还是比较容易的事情,但是矩阵,有太多的东西令我无法理解。比如矩阵可以作为什么东西的模型?为什么矩阵的乘法规则定义得如此奇怪?我在想,我是不是应该看看类似于《矩阵论》之类的东西……



2.矩阵(Matrix)

  向量可以被认为是具有n个相互独立的性质(维度)的对象的表示,它能够模拟弹道,力,物体运动等。矩阵能用来做什么?
  我们使用矩阵可以简洁地描述几何变换,如缩放、旋转和平移,也可以从一个结构到另一个结构中改变一个点或是向量的坐标。(待补充)

2.1 矩阵类型(Matrix Types)

  在DirectX Math 中,使用XMMATRIX类来表示一个4x4的矩阵。当然,它被定义在DirectXMath.h文件中。不管怎么样,先来看看它是如何定义的。虽然大多数时候这些底层的定义很难懂,但是更多的时候它会给你对一个事物更深入的理解,这样有利于思考的深度。总之我的学习习惯就是这样的。

#if (defined(_M_IX86) || defined(_M_X64) || defined(_M_ARM)) && defined(_XM_NO_INTRINSICS_)
struct XMMATRIX
#else
__declspec(align(16)) struct XMMATRIX
#endif
{
#ifdef _XM_NO_INTRINSICS_
    union
    {
        XMVECTOR r[4];
        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];
    };
#else
    XMVECTOR r[4];
#endif

    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);

#ifdef _XM_NO_INTRINSICS_
    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]; }
#endif

    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; }

    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     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值