You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

未安装旧版SDK时,DirectX 9中如何操作D3DMATRIX?

解决方案

一、手动实现D3DMATRIX的基础变换函数

Windows SDK的DirectX 9组件中没有提供直接操作D3DMATRIX的官方变换函数(原D3DXMatrix*系列属于旧版DirectX SDK),你可以手动构造这些矩阵。D3DMATRIX本质是列优先的4x4浮点矩阵,结构定义如下:

typedef struct _D3DMATRIX {
    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];
    };
} D3DMATRIX;

1. 平移矩阵

构造单位矩阵后,将第4列前三个元素设为平移量x、y、z:

D3DMATRIX MatrixTranslation(float x, float y, float z) {
    D3DMATRIX mat = {
        1.0f, 0.0f, 0.0f, 0.0f,
        0.0f, 1.0f, 0.0f, 0.0f,
        0.0f, 0.0f, 1.0f, 0.0f,
        x,    y,    z,    1.0f
    };
    return mat;
}

2. 缩放矩阵

将对角线上的元素设为缩放系数sx、sy、sz:

D3DMATRIX MatrixScaling(float sx, float sy, float sz) {
    D3DMATRIX mat = {
        sx,   0.0f, 0.0f, 0.0f,
        0.0f, sy,   0.0f, 0.0f,
        0.0f, 0.0f, sz,   0.0f,
        0.0f, 0.0f, 0.0f, 1.0f
    };
    return mat;
}

3. 旋转矩阵(以绕Y轴为例)

用三角函数构造旋转矩阵,θ为弧度制旋转角度:

#include <math.h>
D3DMATRIX MatrixRotationY(float theta) {
    float cosTheta = cosf(theta);
    float sinTheta = sinf(theta);
    D3DMATRIX mat = {
        cosTheta, 0.0f, sinTheta, 0.0f,
        0.0f,     1.0f, 0.0f,     0.0f,
        -sinTheta,0.0f, cosTheta, 0.0f,
        0.0f,     0.0f, 0.0f,     1.0f
    };
    return mat;
}

4. 矩阵乘法(组合变换用)

遵循列优先规则实现矩阵乘法:

D3DMATRIX MatrixMultiply(const D3DMATRIX& a, const D3DMATRIX& b) {
    D3DMATRIX result = {};
    for (int row = 0; row < 4; row++) {
        for (int col = 0; col < 4; col++) {
            result.m[row][col] = 
                a.m[row][0] * b.m[0][col] +
                a.m[row][1] * b.m[1][col] +
                a.m[row][2] * b.m[2][col] +
                a.m[row][3] * b.m[3][col];
        }
    }
    return result;
}

二、使用DirectXMath库(XMMATRIX)配合DirectX 9

你遇到XMMatrixTranslation未定义的问题,大概率是缺少正确的头文件包含或宏定义,正确使用步骤如下:

  1. 包含必要头文件:
#include <directxmath.h>
#include <directxmath.inl> // 包含内联函数实现
  1. 确保项目使用Windows 7 SDK及以上版本(均支持DirectXMath)。
  2. 将XMMATRIX转换为D3DMATRIX适配DirectX 9接口:
// 创建平移矩阵
XMMATRIX xmmatTranslate = XMMatrixTranslation(x, y, z);
// 转换为D3DMATRIX
D3DMATRIX matTranslate;
XMMatrixStoreIntoD3DMATRIX(&matTranslate, xmmatTranslate);
// 传入SetTransform
pD3DDevice->SetTransform(D3DTS_WORLD, &matTranslate);

DirectXMath提供了全套矩阵变换函数(XMMatrixScaling、XMMatrixRotationX/Y/Z、XMMatrixMultiply等),可完全替代旧D3DXMatrix*系列,且兼容DirectX 9。

三、DX10 XMMATRIX入门要点

若转向DirectX 10及以上,核心要点包括:

  • XMMATRIX是SIMD优化的矩阵类型,适配现代CPU架构。
  • 所有变换函数均在directxmath.h中,使用时注意参数为FXMVECTOR或CXMMATRIX等SIMD类型。
  • 矩阵变换遵循“缩放→旋转→平移”顺序,因DX采用列向量,变换矩阵按从右到左顺序相乘。

内容的提问来源于stack exchange,提问作者Nick Gris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 16:17:05