2011-08-17 104 views
2

這是我的變換。我從一個簡單的2D相機的例子中得到它。XNA/C#2D座標縮放到3D視圖矩陣的世界矩陣?

public Matrix Transform(GraphicsDevice graphicsDevice) 
    { 
     float ViewportWidth = graphicsDevice.Viewport.Width; 
     float ViewportHeight = graphicsDevice.Viewport.Height; 

     matrixTransform = 
      Matrix.CreateTranslation(new Vector3(-cameraPosition.X, -cameraPosition.Y, 0)) * 
       Matrix.CreateRotationZ(Rotation) * 
       Matrix.CreateScale(new Vector3(Zoom, Zoom, 0)) * 
       Matrix.CreateTranslation(
        new Vector3(ViewportWidth * 0.5f, ViewportHeight * 0.5f, 0)); 
     return matrixTransform; 
    } 

如果我理解正確的話,它可以讓世界和相機之間的輥(旋轉),在變焦精靈規模的變化,並翻譯爲簡單的上,下,左,右控制。但是,它不會改變Z的深度。

但我需要的是讓遊戲世界縮放,而不僅僅是繪製的精靈。我假設爲了做到這一點,我需要改變相機與世界矩陣之間的Z距離。

我對編程非常新奇,對矩陣一般只有一個簡單的理解。我對XNA如何在繪畫方法中使用它們有所瞭解。到目前爲止,我想讓我的頭髮脫離尋找答案的無果而終......我只需要世界座標來縮放縮放,以便在我的鼠標在預縮放X.60 Y.60之前將X .600 Y.600後縮放(即:縮放級別0.1)。但我的鼠標沒有移動,只有世界變得更大(或縮小)。

+0

我目前正在消化這種矩陣教程中,希望它能幫助我理解我做錯了什麼。 http://stevehazen.wordpress.com/2010/02/15/matrix-basics-how-to-step-away-from-storing-an-orientation-as-3-angles/ – RogueDeus

+0

您是否試過改變ViewportWidth和ViewportHeight ?我認爲這可能會產生你想要的效果。 –

+0

所有似乎要做的就是改變相機的位置。仍然獲得相同數量的窗口中的座標。無論縮放級別如何,它們似乎都以1:1鎖定。 – RogueDeus

回答

1

我知道這個問題是舊的,但這是萬一任何人遇到此問題,無法找到解決方案。 @RogueDeus在使用相機放大或縮小時試圖轉換縮放後的輸入座標。爲了縮放鼠標,您需要的只是獲取比例的逆矩陣。

所以,如果他的大規模矩陣創建爲這樣:

Matrix.CreateScale(zoom, zoom, 0); 

鼠標座標應反向縮放和必要的翻譯轉移:

float ViewportWidth = graphicsDevice.Viewport.Width; 
float ViewportHeight = graphicsDevice.Viewport.Height; 

Matrix scale = Matrix.CreateScale(zoom, zoom, 0); 
Matrix inputScalar = Matrix.Invert(scale); 

... 

public MouseState transformMouse(MouseState mouse) 
{ 
    /// Shifts the position to 0-relative 
    Vector2 newPosition = new Vector2(mouse.X - ViewportWidth, 
             mouse.Y - ViewportHeight); 

    /// Scales the input to a proper size 
    newPosition = Vector2.Transform(newPosition, InputScalar); 

    return new MouseState((int)newPosition.X, (int)newPosition.Y, 
          mouse.ScrollWheelValue, mouse.LeftButton, 
          mouse.MiddleButton, mouse.RightButton, 
          mouse.XButton1, mouse.XButton2); 
} 
0

您使用的是二維座標,因此Z座標是絕對不重要的。實際上,您使用的比例矩陣(Matrix.CreateScale(new Vector3(Zoom, Zoom, 0)))將Z座標乘以0,將其有效地設置爲0.

由於此比例矩陣位於視圖矩陣中,因此它將縮放整個世界。我不確定要真正理解你的問題。你可以試着再解釋一下嗎?

+0

例如:我在位置600,600(右下角)點擊我的鼠標,我獲得600,600的世界位置回報。我縮小到0.1,因此應該有10倍的座標在屏幕上,所以沒有移動我的鼠標,我應該能夠點擊相同的位置,但得到一個距離上一個世界座標更遠的座標。 ..但是,當我這樣做,它仍然返回600,600。所以,我移動相機+ 25,+ 25(仍然沒有移動我的鼠標)並點擊,返回625,625的新世界座標。 – RogueDeus

+0

因此,我知道我正在獲取世界座標而不是查看座標。但是世界座標並不是根據我的縮放級別進行縮放。這會對以鼠標點擊爲中心的任何嘗試或使用世界點位置將相機轉換到適當位置的其他功能造成嚴重破壞。畢竟,縮小(看更多)是整個點......但選擇應該在數英里之外的東西,只是將相機移動幾英尺,因爲實際座標不會縮放到所看到的距離。我希望這是有道理的?... – RogueDeus

+0

@Eilistraee通常是更好地將您的Z標度設置爲1(不變)。將Z縮放到0會在各種情況下導致問題。 –

0

我似乎已經找到了如何讓座標規模...

我是假設當前的鼠標狀態將反映世界矩陣的點擊,但顯然它從來沒有真正做到這一點。它始終與視圖矩陣相關聯。 (屏幕本身),並且該值需要與世界矩陣一起縮放(在變換中)。

因此,作爲轉換是通過放大在Matrix.CreateScale影響(新的Vector3(放大,縮小,0)),所以也沒有mouseState X & Y座標需要通過它可以擴展到幾乎鏡中世界矩陣。

//Offsets any cam location by a zoom scaled window bounds 
    Vector2 CamCenterOffset 
    { 
     get { return new Vector2((game.Window.ClientBounds.Height/Zoom) 
      * 0.5f, (game.Window.ClientBounds.Width/Zoom) * 0.5f); 
     } 
    } 

    //Scales the mouse.X and mouse.Y by the same Zoom as everything. 
    Vector2 MouseCursorInWorld 
    { 
     get 
     { 
      currMouseState = Mouse.GetState(); 
      return cameraPosition + new Vector2(currMouseState.X/Zoom, 
       currMouseState.Y/Zoom); 
     } 
    }