我有一些使用xnamath.h的DirectX C ++代码。我想迁移到“全新” DirectXMath,所以我进行了更改:

#include <xnamath.h>




#include <DirectXMath.h>


我还添加了DirectX命名空间,例如:

DirectX::XMFLOAT3 vector;


我已经准备好遇到麻烦了,他们来了!

在编译期间,出现错误:

error C2676: binary '-' : 'DirectX::XMVECTOR' does not define this operator
    or a conversion to a type acceptable to the predefined operator


对于xnamth.h正常工作的行:

DirectX::XMVECTOR RayDir = CursorObjectSpace - RayOrigin;


我真的不知道该如何解决。我不认为operator-不再受支持,但是什么会导致该错误以及如何解决该错误?

这是更复杂的源代码:

DirectX::XMVECTOR RayOrigin = DirectX::XMVectorSet(cPos.getX(), cPos.getY(), cPos.getZ(), 0.0f);
POINT mouse;
GetCursorPos(&mouse);

DirectX::XMVECTOR CursorScreenSpace = DirectX::XMVectorSet(mouse.x, mouse.y, 0.0f, 0.0f);

RECT windowRect;
GetWindowRect(*hwnd, &windowRect);
DirectX::XMVECTOR CursorObjectSpace = XMVector3Unproject( CursorScreenSpace, windowRect.left, windowRect.top, screenSize.getX(), screenSize.getY(), 0.0f, 1.0f, XMLoadFloat4x4(&activeCamera->getProjection()), XMLoadFloat4x4(&activeCamera->getView()), DirectX::XMMatrixIdentity());

DirectX::XMVECTOR RayDir = CursorObjectSpace - RayOrigin;


我正在Windows 7 x64上工作,项目目标是x32调试,到目前为止,它对于xnamath.h都工作正常。



可行的解决方案是:

DirectX::XMVECTOR RayDir = DirectX::XMVectorSet( //write more, do less..
    DirectX::XMVectorGetX(CursorObjectSpace) - DirectX::XMVectorGetX(RayOrigin),
    DirectX::XMVectorGetY(CursorObjectSpace) - DirectX::XMVectorGetY(RayOrigin),
    DirectX::XMVectorGetZ(CursorObjectSpace) - DirectX::XMVectorGetZ(RayOrigin),
    DirectX::XMVectorGetW(CursorObjectSpace) - DirectX::XMVectorGetW(RayOrigin)
); //oh my God, I'm so creepy solution


但是与以前的相比,它太恐怖了,适用于xnamath

    XMVECTOR RayDir = CursorObjectSpace - RayOrigin;


我真的不相信这是唯一的方法,我不能只像上面那样使用operator-

对于operator/,我也有完全相同的问题。

最佳答案

Microsoft在DirectXMathVector.inl标头中提供了运算符重载,该标头包含在DirectXMath.h的末尾。但是,为了能够使用它,您在尝试使用运算符的范围内必须具有“ using namespace DirectX”。

例如:

void CalculateRayDirection(const DirectX::XMVECTOR& rayOrigin, DirectX::XMVECTOR& rayDirection)
{
    using namespace DirectX;

    POINT mouse;
    GetCursorPos(&mouse);
    XMVECTOR CursorScreenSpace = XMVectorSet(mouse.x, mouse.y, 0.0f, 0.0f);

    rayDirection = CursorObjectSpace - rayOrigin;
}

关于c++ - 二进制'-':'DirectX::XMVECTOR'没有定义此运算符或转换(从xnamath迁移到DirectXMath并不容易),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21688529/

10-11 23:19