2014-03-13 13 views
0

여러 개의 정점 좌표를 CPU의 클립/투영 공간으로 변환해야하는 코드를 작성했습니다 (기존 응용 프로그램과 통합하기 위해 셰이더는 여기 응용 프로그램으로 사용할 수 없습니다). 나중에 자체 쉐이더를 제공합니다.) 결과는 X 축을 중심으로 회전하는 카메라를 내려다 보는 기본적인 '카메라 스타일'변환 + 투영이 될 테스트 케이스가 있습니다. 다음투영 행렬 변환 'around wrapping'

테스트 케이스는 다음

#include <windows.h> 
#include <xnamath.h> 
#include <stdio.h> 

int main() 
{ 
    XMVECTOR atPos = XMVectorSet(925.0f, -511.0f, 0.0f, 0.0f); 
    XMVECTOR eyePos = XMVectorSet(925.0f, -311.0f, 200.0f, 0.0f); 
    XMVECTOR upDir = XMVectorSet(0.f, 0.f, 1.f, 0.0f); 

    XMMATRIX viewMatrix = XMMatrixLookAtLH(eyePos, atPos, upDir); 
    XMMATRIX projectionMatrix = XMMatrixPerspectiveFovLH(XMConvertToRadians(55.f), 1.0f, 0.1f, 5000.0f); 

    XMMATRIX viewProjMatrix = viewMatrix * projectionMatrix; 

    XMVECTOR coord1 = XMVectorSet(925.0f, -500.0f, 0.0f, 0.0f); 
    XMVECTOR coord2 = XMVectorSet(925.0f, 0.0f, 0.0f, 0.0f); 
    XMVECTOR coord3 = XMVectorSet(925.0f, -1000.0f, 0.0f, 0.0f); 

    coord1 = XMVector3TransformCoord(coord1, viewProjMatrix); 
    coord2 = XMVector3TransformCoord(coord2, viewProjMatrix); 
    coord3 = XMVector3TransformCoord(coord3, viewProjMatrix); 

    printf(" 0: %g %g %g\n", XMVectorGetX(coord2), XMVectorGetY(coord2), XMVectorGetZ(coord2)); 
    printf(" -500: %g %g %g\n", XMVectorGetX(coord1), XMVectorGetY(coord1), XMVectorGetZ(coord1)); 
    printf("-1000: %g %g %g\n", XMVectorGetX(coord3), XMVectorGetY(coord3), XMVectorGetZ(coord3)); 

    getc(stdin); 
} 

I 단지 뷰 매트릭스 변환하면 I 정확하게 좌표 입력 Y 값과 상관 이동하는 Y 값에 주목하고있어; 그러나 투영 행렬을 추가하면 Y 값은 투영 공간에서 뷰의 '북쪽'에있는 좌표와 뷰의 '남쪽'에있는 좌표가 같은 방향으로 확장되어 감싸는 것처럼 보입니다. 최종 응용 프로그램에서 유사한 코드를 사용하여 변형 된 최종면이 올바른 순서로 그리는 대신 서로 중첩됩니다.

이 점에있어서 내가 뭘 잘못하고 있으며, 적어도이 입력에 대해 올바른 결과를 얻을 수 있습니까? 즉, 입력 Y가 앞으로 나아갈 때와 같은 방식으로 확장 할 수 있습니까? 범위, 나는 의심해야한다) 문제?

+0

XMVECTOR 상수를 작성하는 효율적인 방법은 "XMVECTORF32"유형을 사용하는 것입니다. 예를 들어''static const XMVECTORF32 atPos = {925.0f, -511.0f, 0.0f, 0.0f};''XMVectorSet''의 사용은 실제로 변수를위한 것이지 상수 값을위한 것이 아닙니다. –

+0

전체 벡터를 인쇄하는 효율적인 방법은 다음과 같습니다 :''XMFLOAT4A tmp; XMStoreFloat4 (& tmp, coord2); printf ("0 : % g % g % g \ n", tmp.x, tmp.y, tmp.z); " –

답변

0

XMVECTOR upDir = XMVectorSet (0.0f, 1f, 0.0f, 0.0f);