2014-02-10 5 views
0

У меня есть код DirectX C++, который использует xnamath.h. Я хотел бы перейти на "новенькое" DirectXMath, поэтому я изменил:binary '-': 'DirectX :: XMVECTOR' не определяет этот оператор или преобразование (переход с xnamath на 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

Вы уверены, что и '' 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 не является классом - это typedef для типа данных __m128, используемого для операций SSE.

В обновлении до DirectXMath Microsoft призвана ускорить векторные операции, сделав их «SSE способными». Они также предоставили функции XMVectorSubtract et al. чтобы вы могли использовать SSE при выполнении арифметических операций.

Вы можете найти более подробную информацию здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/ee415656(v=vs.85).aspx

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; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^