我有一些使用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/
,我也遇到了同样的问题。
答案 0 :(得分:3)
Microsoft在DirectXMathVector.inl标头中提供了运算符重载,该标头包含在DirectXMath.h的末尾。但是,为了能够使用它,您必须在尝试使用运算符的范围内使用“使用命名空间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;
}
答案 1 :(得分:-1)
XMVector的减号和除法运算符不会重载,因为XMVector不是类 - 它是用于SSE操作的__m128数据类型的typedef。
在升级到DirectXMath时,Microsoft打算通过使其具有“SSE功能”来加速矢量操作。他们还提供了XMVectorSubtract等人的功能。让你在执行算术运算时使用SSE。
您可以在此处找到更多信息:http://msdn.microsoft.com/en-us/library/windows/desktop/ee415656(v=vs.85).aspx