2016-09-14 6 views
0

저는 Direct3D를 시작하려고합니다. 하지만 나는 fov 카메라를 작동시키지 못합니다. 최소한 수직 운동이 아닙니다. 나는 이유를 알았지 만 나는 아직도 그것을 고칠 수 없다.Direct3D9 수직 fov 카메라가 작동하지 않습니다

내가 C를 사용하고 있습니다 ++ (140) 및 D3DX9

코드 :

D3DXMATRIX viewMat; 

static D3DXMATRIX viewRotXMat; 
static D3DXMATRIX viewRotYMat; 
static D3DXMATRIX viewRotZMat; 

static float rotY = 0.0f; 
static float rotXZ = 0.0f; 

if (GetAsyncKeyState(VK_LEFT)) { rotY += 0.1f; } 
if (GetAsyncKeyState(VK_RIGHT)) { rotY -= 0.1f; } 

if (GetAsyncKeyState(VK_UP)) { rotXZ += 0.1f; } 
if (GetAsyncKeyState(VK_DOWN)) { rotXZ -= 0.1f; } 

//POINT pMO = getMouseOffset(); 
//rotY += pMO.x/10; 
//rotXZ += pMO.y/10; 

D3DXMatrixLookAtLH(&viewMat, 
    &D3DXVECTOR3(10.0f, 10.0f, 0.0f), //pos 
    &D3DXVECTOR3(0.0f, 10.0f, 0.0f), //look-at 
    &D3DXVECTOR3(0.0f, 1.0f, 0.0f)); //weird values 


D3DXMatrixRotationY(&viewRotYMat, rotY); 
D3DXMatrixRotationX(&viewRotXMat, cos(rotY) * rotXZ); 
D3DXMatrixRotationZ(&viewRotZMat, (sin(rotY) * rotXZ) * -1); 

d3ddev->SetTransform(D3DTS_VIEW, &(viewMat * viewRotXMat * viewRotYMat * viewRotZMat)); 


D3DXMatrixPerspectiveFovLH(&projMat, 
          D3DXToRadian(90), 
          (FLOAT)SIZEX/(FLOAT)SIZEY, 
          1.0f, 
          1000.0f); 
d3ddev->SetTransform(D3DTS_PROJECTION, &projMat); 

이 내 RenderFrame 기능의 중요한 부분입니다. 작동하지 않는 이유는 rotY 및 rotXZ 때문입니다. 어떤 이유로 약 45 ° 회전 할 때 rotY 변수가 3-4로 바뀝니다. 그렇다면 왜 D3DXMatrixRotationY 함수는 매개 변수로 각도를 사용하지만 일부는 부동 상태입니까? 이 매개 변수는 심지어 angle이라는 이름입니다 ... 지금 약 3 일 동안이 문제가 있습니다. 네가 나를 도울 수 있기를 바랍니다. 회전 행렬에 대한

+1

각도가 "rotY"라디안 또는도로되어 있습니까? 그것은'D3DXMatrixRotationY' (그리고 그 문제에 대해서는'cos' /'sin')에 라디안으로 전달되어야합니다. 또한'& (viewMat * viewRotXMat * viewRotYMat * viewRotZMat)'의 임시 값의 주소는 표준에 맞지 않지만 컴파일러가 지원할 수 있습니다. – user4407569

+0

이것은 directx 튜토리얼에서 보여주는 방법입니다 .http : //www.directxtutorial.com/ –

+0

rotY는 분명히 라디안 단위입니다. 하지만 sin cos의 경우 도수가 roty 인 새로운 float을 정의했습니다. 그러나 그것은 여전히 ​​이전과 같은 실패를합니다. 그것은 arround 45 *, 135 * 등을 뒤집습니다. –

답변

2

귀하의 설정이 조금 이상한 같습니다

D3DXMatrixRotationY(&viewRotYMat, rotY); 
D3DXMatrixRotationX(&viewRotXMat, cos(rotY) * rotXZ); 
D3DXMatrixRotationZ(&viewRotZMat, (sin(rotY) * rotXZ) * -1); 
정확히 당신이 여기 달성하기 위해 노력하고 무엇

? 일반적으로 두 축 회전을 수행 한 다음 결합하면 코드가 정확히 같지만 행렬 조합이 뒤죽박죽 된 순서로 표시되고 명시 적 삼각법으로 보정됩니다. 그렇지 않으면 당신은 적어도 하나의 줄에 3 개 각도를 결합 D3DXMatrixRotationYawPitchRoll를 사용할 수 방금

D3DXMatrixRotationY(&viewRotYMat, rotY); 
D3DXMatrixRotationX(&viewRotXMat, rotXZ); 

와 동일한 기능을 수행 할 수있는 좋은 기회가있다.

rotY 값은 라디안 단위로 측정되어야하므로 3-4는 180 °에 해당합니다. 대신 45 °를 관찰하면 rotXZ가 기여할 수 있습니다.

+0

감사합니다. 하지만 여하튼 카메라는 여전히 0 * 90 * usw를 내 보냅니다. 변경 : float deg = rotY * (180/PI); \tD3DXMatrixRotationYawPitchRoll (& viewRotXMat, rotY, sin (deg) * rotXZ, (cos (deg) * rotXZ) * -1); 나는 rotationxyz 설정을 주석 처리했습니다. –

+0

내가 말했듯이 이상한 3 앵글 조합을 사용하면 짐벌 잠금 및 모든 종류의 뒤집기로 이어질 수 있습니다. POV 카메라의 경우 삼각법 호출이없는 각도로 두 번 시도하십시오 – Ap31

+0

그런 기능은 완벽하지만 찾을 수 없습니다. 혹시 그 이름을 아십니까? –