【问题标题】:How to dump XMMATRIX member value?如何转储 XMMATRIX 成员值?
【发布时间】:2013-06-22 09:58:30
【问题描述】:

有什么好的方法可以转储 XMMATRIX 和 XMVECTOR 吗?

XMMATRIX mx = XMMatrixScaling(...) * XMMatrixTranslation(...);

DumpMatrix(mx); // printf the 4x4 matrix member

我想要DumpMatrix 喜欢的功能。

我检查了DirectMath.h。并找到了

typedef __m128 XMVECTOR;

如何从__m128中提取(x, y, z, w)

【问题讨论】:

    标签: directx directxmath


    【解决方案1】:

    DirectX 数学库设计不允许直接访问 XMMATRIXXMVECTOR 成员。这可能是因为它们将值存储在特殊的 SIMD data types 中。

    要读取XMVECTOR 的组件,您可以使用XMVectorGet* acces functions,例如:

    XMVECTOR V;
    float x = XMVectorGetX(V);
    float w;
    XMVectorGetWPtr(&w, V);
    

    XMStore* functions 将其存储到XMFLOAT4 中,该XMFLOAT4 具有可直接访问的标量成员:

    XMVECTOR vPosition;
    XMFLOAT4 fPosition;
    XMStoreFloat4(&fPosition, vPosition);
    float x = fPosition.x;
    

    XMMATRIX你可以存入XMFLOAT4X4

    XMMATRIX mtxView;
    XMFLOAT4X4 fView;
    XMStoreFloat4x4(&fView, mtxView);
    float fView_11 = fView._11;
    

    也有Load functions做相反的事情:写信给XMVECTORXMMATRIX

    如需更多信息,请参阅DirectXMath Programming Reference

    编码愉快!

    【讨论】:

    • 谢谢。我是 Win32 和 DirectX 的新手。 D3D11的架构很有意思。
    • 稍微扩展一下,您还可以使用XMVectorGet 函数访问XMMATRIX 值:XMMATRIX m = XMMatrixIdentity(); float r2c2 = XMVectorGetZ(m.r[2]);(使用从0 开始的索引)。我相信XMMATRIX 提供了对其 4 行向量的公共访问权限。
    【解决方案2】:

    我无法评论答案,但我相信 XMMATRIX 的正确代码是:

    XMMATRIX mtxView;
    XMFLOAT4X4 fView;
    XMStoreFloat4x4(&fView, mtxView);
    float fView_11 = fView._11;
    

    这样您就可以使用新创建的 XMFLOAT4X4 访问矩阵成员值

    【讨论】:

    • 你是对的,有几个错别字。我确定了我的答案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 2023-03-14
    • 2015-01-09
    • 2014-10-09
    • 2017-11-28
    • 2019-07-02
    • 1970-01-01
    相关资源
    最近更新 更多