2013-07-04 3 views
2

저는 DirectX에서 일부 3D 작업을하려고합니다 (저는 OpenGL에서 마이그레이션 중입니다).XMMatrix -() 연산자의 부동 소수점이 작동하지 않습니다.

내가 XMMATRIX의 값에 액세스하고 Microsoft 설명서를보고 것은() 연산자가 있어야합니다 :

float& operator()(
    size_t Row, 
    size_t Column 
); 

그래서 내가 같은 사용하여 시도 :

XMMATRIX i = XMMatrixIdentity(); 
float j = i(0,0); 

그러나 인텔리 나에게 오류를 준다 :

IntelliSense: call of an object of a class type without appropriate operator() or conversion functions to pointer-to-function type.

나는 인텔리 센스를 무시하고 어쨌든 컴파일하면 전자 컴파일 시간 오류 :

error C2064: term does not evaluate to a function taking 2 arguments

아무도 왜 이런 일이 일어나고 있는지 알 수 없습니까? 또는 매트릭스의 요소에 액세스하는 다른 방법은 무엇입니까?

감사합니다.

P. 이 정보가 도움이된다면 Windows 8 용 C++/DirectX Modern UI App을 만들고 있습니다.

+0

가) ((0,0) 무엇을 i.operator 어떻게됩니까? – Alex1985

+0

@ LuchianGrigore 내 질문 좀 봐 - 나도 컴파일 ... – poncho

답변

4

this MSDN link을 확인하면 현재 사용중인 DirectX 또는 XNA 수학 헤더와 프로세서 사전 정의에 따라 달라집니다. 기본적으로 최적화를 위해 행렬 및 벡터 구조는 SSE 및 내장 함수를 사용하여 구현되므로 행/열 액세스를 제공하는 것이 어렵고 비용이 많이 듭니다.

DirectX 헤더를 사용하기 전에 프로젝트 속성의 C++ 항목 사전 처리기 지시문에 _XM_NO_INTRINSICS_을 정의하거나 #define _XM_NO_INTRINSICS_을 정의하십시오.

이 오류 얻을 왜 내 Windows 8 VS2012 시스템 DirectXMath.h에서이 발췌 보여줍니다

struct XMMATRIX 
{ 
    // ... code removed for clarity 

#ifdef _XM_NO_INTRINSICS_ 
    float  operator() (size_t Row, size_t Column) const { return m[Row][Column]; } 
    float&  operator() (size_t Row, size_t Column) { return m[Row][Column]; } 
#endif 

    // ... code removed for clarity 
}; 
+0

정보 주셔서 감사합니다. – poncho

+0

내가 액세스하고자하는 유일한 이유는 여기 튜토리얼 때문입니다. http://www.braynzarsoft.net/index.php?p=D3D11PICKING 'camProjection'을 사용하여 화면 공간에서 X/Y 마우스 코드를 돌립니다. 보기 공간으로. 나는 camProjection (0,0) 등을 사용하지 않고 그것을하는 수학을 정말로 이해하지 못합니다. 누군가가 저에게 Z에 대해 왜 그렇게해야하는지에 대한 자습서에 대한 빠른 설명/링크를 줄 수 있다면 크게 감사하겠습니다. – poncho

+0

@poncho ok,하지만 새로운 질문으로 제기하는 것이 더 낫습니다. 위의 질문은 SO 질문/답변 형식에 매우 잘 맞습니다. 매우 깨끗합니다. 따라서 관련성이있는 질문에 새로운 질문을 추가하지 마십시오. 암호. –

0

당신은 시도 할 수 있습니다 : XMVECTORXMMATRIX에 대한

XMMATRIX i = XMMatrixIdentity(); 
float j = i.r[0].m128_f32[0]; 
+0

ARM-NEON에는 이식 할 수 없습니다. ''float j = XMVectorGetX (i.r [0]); ''작동하지만 코드를 작성하는 특별한 방법은 아닙니다. –

1

개별 요소 접근으로 인해 매우 비효율적이다 기본 SIMD 명령어 세트에 적용되므로 DirectXMath 라이브러리는 멤버 메소드를 통해이를 지원하지 않습니다. 필요에 따라이를 달성하는 데는 여러 가지 방법이 있습니다. 당신은 단지 (0,0) 요소가 필요한 경우

, 당신은 사용할 수 있습니다

float j = XMVectorGetX(i.r[0]); 

가장 또는 XMMATRIX의 각각의 모든 요소에 액세스하려는 경우, 가장 좋은 방법은 덤프하는 것입니다 XMFLOAT4X4에 그것은 : MSDN에 언급 된 연산자() 실제로 "XNAMath"가 아닌 "DirectXMath"때문에

XMFLOAT4X4 tmp; 
XMStoreFloat4x4(&tmp, i); 
float j = tmp.m[0][0]; // or float j = tmp._11 

나는 의사 버그를 제출합니다. 배경에 대해서는 this blog post을 참조하십시오.

귀하의 요구에 맞는 약간의 하드 코어를 찾는다면 DirectX Tool Kit에서 SimpleMath을 사용하는 것이 좋습니다.

1

이 코드가 작동하는 것을 발견했습니다. 동일한 코드를 튜토리얼에서 찾아내어 xnamath에서 directxmath로 옮깁니다.

SSE Intrinsics를 비활성화하지 않고도 매트릭스에서 올바른 값을 선택합니다.

"projection"은 카메라의 뷰 매트릭스가 포함 된 XMMATRIX입니다. 그것은 대단히 프로그램을 느리게하기 때문에 정의와

XMVECTOR xv = projection.r[0]; 
    XMVECTOR yv = projection.r[1]; 
    PRVecX = (((2.0f * mouseX)/Window::ClientWidth) - 1)/XMVectorGetX(xv); 
    PRVecY = -(((2.0f * mouseY)/Window::ClientHeight) - 1)/XMVectorGetY(yv); 

비활성화 내장 함수는 나쁜 생각이다. 가능한 경우 코드를 위와 같이 고유 값을 올바르게로드하고 저장하도록 코드를 변환하십시오.

1

파일의 머리에 #DEFINE의 _XM_NO_INTRINSICS_를 추가합니다. 통화를 변경하는 경우

#include <windows.h> 
#define _XM_NO_INTRINSICS_//must before #include <DirectXMath.h> 
#include <DirectXMath.h> 
#include <iostream> 
관련 문제