首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >二进制“-”:“DirectX::XMVECTOR”不定义此运算符或转换(从xnamath迁移到DirectXMath并不那么容易)

二进制“-”:“DirectX::XMVECTOR”不定义此运算符或转换(从xnamath迁移到DirectXMath并不那么容易)
EN

Stack Overflow用户
提问于 2014-02-10 21:41:53
回答 2查看 2.6K关注 0票数 0

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

代码语言:javascript
运行
复制
#include <xnamath.h>

代码语言:javascript
运行
复制
#include <DirectXMath.h>

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

代码语言:javascript
运行
复制
DirectX::XMFLOAT3 vector;

我已经准备好迎接麻烦了,他们来了!

在编译过程中,我得到了错误

代码语言:javascript
运行
复制
error C2676: binary '-' : 'DirectX::XMVECTOR' does not define this operator 
    or a conversion to a type acceptable to the predefined operator 

对于xnamth.h运行良好的行

代码语言:javascript
运行
复制
DirectX::XMVECTOR RayDir = CursorObjectSpace - RayOrigin;

我真的不知道怎么解决它。我不认为operator-已经“不受支持”了,,但是是什么导致了这个错误,以及如何修复

下面是更复杂的源代码:

代码语言:javascript
运行
复制
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上运行得很好。

工作解决办法是:

代码语言:javascript
运行
复制
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工作的人相比,这有点令人毛骨悚然。

代码语言:javascript
运行
复制
    XMVECTOR RayDir = CursorObjectSpace - RayOrigin;

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

对于operator/.,我也有同样的问题

EN

回答 2

Stack Overflow用户

发布于 2014-05-10 22:07:54

Microsoft在DirectXMath.h末尾包含的DirectXMathVector.inl头中提供了操作符重载。但是,为了能够使用它,您必须在尝试使用运算符的作用域中有“使用命名空间DirectX”。

例如:

代码语言:javascript
运行
复制
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;
}
票数 4
EN

Stack Overflow用户

发布于 2014-02-20 20:21:36

XMVector的减除运算符没有重载,因为XMVector不是类--它是用于SSE操作的__m128数据类型的类型。

在升级到DirectXMath时,微软打算通过使矢量操作“具有SSE能力”来加快矢量操作的速度。他们还提供了XMVectorSubtract等人的功能。让您在执行算术操作时使用SSE。

您可以在这里找到更多信息:http://msdn.microsoft.com/en-us/library/windows/desktop/ee415656(v=vs.85).aspx

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21688529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档