如何在课堂上使用Xmfloat(从d3dx迁移)

时间:2015-02-15 13:07:16

标签: d3dx directxmath

我正在尝试迁移到directxmath,但是新代码给了我一些麻烦..

 class Vec3 : public XMFLOAT3
{
public:
    inline float Length() { return XMVector3Length(this); }
    inline Vec3 *Normalize() { return static_cast<Vec3 *>(  XMVector3Normalize(this, this)); }
    inline float Dot(const Vec3 &b) { return  XMVector3Dot(this, &b); }
    inline Vec3 Cross(const Vec3 &b) const;

    Vec3(XMFLOAT3 &v3) { x = v3.x; y = v3.y; z = v3.z; }
    Vec3() : XMFLOAT3() { XMVectorZero(); }
    Vec3(const float _x, const float _y, const float _z) { x=_x; y=_y; z=_z; }
     Vec3(const double _x, const double _y, const double _z) { x = (float)_x; y = (float)_y; z = (float)_z; }
    inline Vec3(const class Vec4 &v4);
 };

旧代码看起来像:

 class Vec3 : public D3DXVECTOR3 
     {
    public:
        inline float Length() { return D3DXVec3Length(this); }
        inline Vec3 *Normalize() { return static_cast<Vec3 *(D3DXVec3Normalize(this, this)); }
        inline float Dot(const Vec3 &b) { return D3DXVec3Dot(this, &b); }
        inline Vec3 Cross(const Vec3 &b) const;

        Vec3(D3DXVECTOR3 &v3) { x = v3.x; y = v3.y; z = v3.z; }
        Vec3() : D3DXVECTOR3() { x = 0; y = 0; z = 0; }
        Vec3(const float _x, const float _y, const float _z) { x=_x; y=_y; z=_z; }
         Vec3(const double _x, const double _y, const double _z) { x = (float)_x; y = (float)_y; z = (float)_z; }
        inline Vec3(const class Vec4 &v4);
     };

所以,我现在遇到的问题是XMVector3Length无法从Vec3 *转换为_m128

编辑:

  

https://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.geometric.xmvector3length.aspx

     

https://msdn.microsoft.com/en-us/library/windows/desktop/bb205510%28v=vs.85%29.aspx

似乎返回类型更改为向量,结果相同而不是只有一个浮点数。

1 个答案:

答案 0 :(得分:0)

XMFLOAT3未隐式转换为DirectXMath库中的XMVECTOR。您必须使用XMLoadFloat3。上面的Length方法是:

inline float Length() const
    { XMVECTOR v = XMLoadFloat3(this);
      return XMVectorGetX( XMVector3Length(v) ); }

我建议您在SimpleMath中查看DirectXMath的DirectX Tool Kit包装器。它通过大量使用C ++隐式转换使得使用这些类型更加宽容,就像你在上面所假设的那样。 SimpleMath::Vector3类基本上就是您在上面尝试编写的内容。 SimpleMath版本具有转换为本机DirectXMath类型的优势,因此理论上您可以比使用上面的抽象更有效地使用SIMD。