2011-08-17 140 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); 
     } 
    }