2012-01-31 3 views
4

DirectX3D 11을 사용하여 응용 프로그램을 작성하고 카메라 목표 벡터는 xdelta, ydelta 및 zdelta 변수로 결정됩니다.마우스 이동을 카메라 패닝으로 변환하는 방법

화면을 가로 질러 마우스를 움직이면 & LMB을 눌러 XY로 내보기를 PAN해야합니다.

나는 그것이 새로운 것,

그러나 내 생각이 아니라 세계 X에 X 및 Y 상대적으로 패닝와 Y 그래서 내가, 내 VIEW 공간에 마우스 이동에 델타를 추가 할 필요가 있다고 생각

이, 내 VIEW 좌표를 다시 WORLD 좌표로 변환하는 방법을 모르겠습니다.

모든 형식 규칙을 따르기를 바랍니다. 여기에 모두 정확하게 기억하지 않아도됩니다.

도움을 주시면 감사하겠습니다. 아래 코드는 내 스 니펫입니다. 아마도 더 좋은 방법이있을 수도 있습니다.

if (m_Input->RMBPressed() == true && m_Input->LMBPressed() == true) // Pan View 
{ 
if (curX != mouseX || curY != mouseY) { 
//Get Target Coordinates in View Space 
D3DXVECTOR3 targetView = (D3DXVECTOR3 (mView(2,0), mView(2,1), mView(2,2)); 
//Add mouse XY delta vector to target View Coordinates 
    D3DXVECTOR3 delta ((float)curX-(float)mouseX, 
         (float)curY-(float)mouseY, zdelta); 
targetView += delta; 
//Convert back to World Coordinates 


} 
} 

나는 다른 접근 방식을 시도하고 있습니다. 올바른 접근 방식이라고 생각하지만 여전히 올바르게 작동하지 않습니다. 마우스가 움직이고 "xdelta"및 "ydelta"변수에 변수를 저장하면 델타가 화면에서 X 및 Y로 나타납니다.

그때 그때 행렬의 값을 채울 변환 행렬

D3DXMATRIX mTrans; 

을 만들

이제
// Rotation 
mTrans(0,0) = delta.x; 
mTrans(1,1) = delta.y; 
// Translation 
mTrans(0,3) = delta.x; 
mTrans(1,3) = delta.y; 

얻기 위해 자신의보기 좌표에 대응, 내가보기 매트릭스에 의해 그것을 곱해야한다고 생각 mView라고 부릅니다.

mTrans= mTrans*mView; 

지금, 내 타겟 벡터를 이동해야하는 변수 "target_x"및 "target_y"에 의해 결 정해야 내 전류 목표 X 및 Y 이러한 번역 된 값을 추가 내보기에 상대적인 X 및 Y (즉 좌표 내 현재보기와 직각).

target_x += mTrans(0,3); 
target_y += mTrans(1,3); 

그러나 그렇지 않습니다. 내 목표 X 축 및 Y 축을 따라 내 X 및 Y 축보기가 아닌 내 목표를 이동합니다.

더 조각

은 내가 D3DXMatrixLookAtLH 기능을 사용 할 수 있지만, 그 함수에 공급하는 새로운 목표를 얻기 위해 내 마우스 움직임에 따라 대상 위치의 변화를 계산하기 위해 노력하고있어. 일부 코드 스 니펫에 다음을 추가했습니다.

if (m_Input->RMBPressed() == true && m_Input->LMBPressed() == true) // Pan View 
    { 
     if (curX != mouseX || curY != mouseY) { 
      //Get mouse XY delta vector 
      D3DXVECTOR3 delta ((float)curX-(float)mouseX, (float)curY-(float)mouseY, zdelta); 
      //Create Transformation Matrix 
      D3DXMATRIX mTemp; 
      // Rotation 
      mTemp (0,0) = delta.x; 
      mTemp (1,1) = delta.y; 
      mTemp (2,2) = delta.z; 
     // Translation 
      mTemp (0,3) = delta.x; 
      mTemp (1,3) = delta.y; 
      mTemp (2,3) = delta.z; 
      //Convert to View Coordinates 
      mTemp = mTemp*mView; 
      xdelta += mTemp(0,3); 
      ydelta += mTemp(1,3); 

    // Convert Spherical to Cartesian coordinates: mPhi measured from +y 
    // and mTheta measured counterclockwise from z. 
    float height = mRadius * cosf(mPhi); 
    float sideRadius = mRadius * sinf(mPhi); 
    float x = xdelta + sideRadius * cosf(mTheta); 
     float z = zdelta + sideRadius * sinf(mTheta); 
    float y = ydelta + height; 

    // Build the view matrix. 
    D3DXVECTOR3 pos(x, y, z); 

    D3DXVECTOR3 target(xdelta, ydelta, zdelta); 

    D3DXVECTOR3 up(0.0f, 1.0f, 0.0f); // Y Axis is up. Looking down Z. 

    D3DXMatrixLookAtLH(&mView, &pos, &target, &up); 

우선 모든 정보를 제공해 주셔서 감사합니다. 그것은 내가 천천히 DirectX 행렬을 이해하도록 돕고있다. 아래 논리에서 맞습니까? 내 마우스가 X에서 5.0, Y가 5.0으로 변경되었다고 가정합니다. 그게 내 델타 야. Z는 항상 0.0입니다. 다음과 같이 뷰 좌표를 찾을 수 있습니다.

D3DXVECTOR3 up(0.0f, 1.0f, 0.0f); // Y Axis is up. Looking down Z. 
D3DXVECTOR3 delta (5.0f, 5.0f, 0.0f); 
D3DXVECTOR3 origin (0.0f. 0.0f, 0.0f); 
D3DMATRIX mTemp; 
D3DXMatrixIdentity (&mTemp); 
D3DXMatrixLookAtLH (&mTemp, &delta, &origin, &up); 

이제는 mTemp보기 매트릭스에 저장된 XY 델타의보기 좌표를 가져야합니까?

그렇다면, XY 델타보기 좌표를 mView XY 좌표에 추가 한 다음 월드 좌표로 다시 변환하여 대상을 설정해야하는 실제 XY 세계 값을 얻는 가장 좋은 방법입니까?

나는 이것을 달성하는 방법에 관해서 분실 상태입니다. 정말로 나에게 명확한 전부는 아니며 주제에 대해 구입 한 모든 책은 분명하지 않습니다.

답변

2

로컬 좌표를 월드 행렬에 곱하여 로컬 좌표에서 세계 좌표를 계산할 수 있습니다. 카메라를 움직이려면 3D 벡터를 사용하여 현재 위치를 정의한 다음 D3DXMatrixLookAtLH를 사용하여 현재 위치에서 뷰 행렬을 계산하십시오. 자세한 내용은이 튜토리얼을 확인하십시오. http://www.braynzarsoft.net/index.php?p=D3D11WVP

+0

나는 D3DXMatrixLookAtLH 함수를 사용하지만, 필자는 마우스의 움직임에 따라 타겟 위치의 변화를 계산하여 새로운 타겟을 그 함수로 공급하려고한다. 일부 코드 조각에 다음을 추가했습니다. – JeffS

+0

대상이 표준화 된 벡터 일 수 있습니다. 카메라가 보이는 방향 만 정의하므로 카메라 벡터를 이동해도 대상 벡터와 동일하게 수행됩니다. – asmi84

+0

오, 이제 알겠습니다. 우선, 행렬 곱셈은 의사 소통이되지 않습니다. 순서는 중요합니다. 두 번째로 회전에 따라 뷰 방향 벡터를 계산합니다. 그런 다음 카메라 위치 벡터를 계산하십시오. 두 좌표를 추가하여 목표 좌표를 얻은 다음 D3DXMatrixLookAtLH 함수에 입력합니다. 그리고 마지막으로 중요한 것은 행렬 연산에 익숙하지 않은 경우 직접 설정을 시도하지 말고 D3DXMatrix * 함수를 사용하십시오. – asmi84

관련 문제