2014-02-10 12 views
0

을 사용하는 일부 DirectX C++ 코드가 있습니다.바이너리 '-': 'DirectX :: XMVECTOR'가이 연산자 또는 변환을 정의하지 않습니다 (xnamath에서 DirectXMath 로의 마이그레이션이 쉽지 않음)

DirectX::XMFLOAT3 vector; 

내가했다 : 나는 또한 DirectX 네임 스페이스, 예를 추가 한

#include <xnamath.h> 

#include <DirectXMath.h> 

에 : 나는 "새로운 브랜드" DirectXMath로 마이그레이션 싶어서 변경했습니다 고난을 당할 준비가되어 있습니다.

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; 

내가 일하고 있어요 64 윈도우 7에, 프로젝트의 목표는 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

당신은'CursorObjectSpace'와'RayOrigin' 두 유형 '의 DirectX 것을 확신 :: XMVECTOR'? – ciamej

+0

저는 100 % 확신합니다. 복잡한 코드도 게시했습니다. 여기에서'CursorObjectSpace'와'RayOrigin' 선언을 볼 수 있습니다. – PolGraphic

+0

['SimpleMath'] (http://blogs.msdn.com/b/shawnhar/archive/2013/01/08/simplemath-a-simplified-wrapper-for-directxmath.aspx)를 사용하는 것이 현명 할 수도 있습니다 , 훨씬 쉽습니다. –

답변

-1

XMVector에 대한 마이너스 및 나누기 연산자는 오버로드되지 않습니다. 이는 XMVector가 클래스가 아니므로 SSE 연산에 사용되는 __m128 데이터 형식의 typedef입니다.

DirectXMath 로의 업그레이드에서 Microsoft는 벡터 작업을 "SSE 가능"하도록하여 속도를 향상 시키려고했습니다. 그들은 또한 XMVectorSubtract et al. 산술 연산을 수행 할 때 SSE를 사용할 수있게 해줍니다.

당신은 여기에 더 많은 정보를 찾을 수 있습니다 http://msdn.microsoft.com/en-us/library/windows/desktop/ee415656(v=vs.85).aspx

3

Microsoft는 DirectXMath.h의 끝 부분에 포함되어 DirectXMathVector.inl 헤더의 연산자 오버로드를 제공합니다.그러나이를 사용하려면 연산자를 사용하려는 범위에서 "네임 스페이스 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; 
}