2012-01-31 48 views
4

我使用DirectX3D 11來應用程序,並且我的Camera目標向量由變量xdelta,ydelta和zdelta確定。如何將鼠標移動轉換爲Camera Panning

我必須在XY屏幕上查看我的視圖,因爲我在移動鼠標的同時按下了RMB & LMB。

我想,我需要在鼠標移動增加增量,以我的觀點的空間,使得它在X和Y相對平移,我認爲,世界上沒有X和Y

然而,作爲新這,我不知道如何將我的VIEW座標轉換回世界座標。

我希望我遵循所有的格式化規則,因爲我沒有在這裏發佈足夠的信息來準確記住所有的格式。

任何幫助,將不勝感激。下面是我的代碼片段。也許還有更好的辦法。

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; 

現在這些轉換值添加到我的當前目標的X和Y是由變量「target_x」和「target_y」 determind,它應該將我的目標向量,相對於我的觀點座標X和Y(即正交於我目前的觀點)。

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

但它沒有。它沿着世界X軸和Y軸移動我的目標,而不是我的View X和Y軸。

更多SNIPPETS

我使用的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。那是我的三角洲。 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 delta視圖座標添加到mView XY座標,然後轉換回世界座標來獲得實際的XY世界值,我必須將目標設置爲?

我不知道如何實現這一點。這對我來說真的不是那麼清楚,我在這個主題上購買的所有書籍都不清楚。

回答

2

您可以將本地座標乘以世界矩陣,從本地座標計算世界座標。 如果您希望攝像機移動,而不是僅使用3D矢量定義其當前位置,然後使用D3DXMatrixLookAtLH從當前位置計算視圖矩陣。 看看這個教程的詳細信息:http://www.braynzarsoft.net/index.php?p=D3D11WVP

+0

我使用的D3DXMatrixLookAtLH功能,但我試圖計算基於我的鼠標移動目標位置的變化來獲得新的目標送入該功能。我添加了一些代碼片段: – JeffS 2012-02-01 15:28:24

+0

目標可以只是一個規格化的矢量,它只定義相機看起來的方向,所以當您移動相機矢量時,請按照目標矢量進行。 – asmi84 2012-02-01 15:39:17

+0

哦,我明白了。首先,請記住,矩陣乘法不是交流的 - 訂單確實很重要。第二,只根據你的旋轉計算視圖方向矢量。然後計算你的相機位置矢量。添加這兩個來獲得目標座標,然後將它們提供給D3DXMatrixLookAtLH函數。 最後但並非最不重要 - 如果你不熟悉矩陣操作,不要嘗試直接設置它們,使用D3DXMatrix *函數。 – asmi84 2012-02-01 15:48:06