【问题标题】:XNA 2d camera with arbitrary zoom center具有任意变焦中心的 XNA 2d 相机
【发布时间】:2012-02-19 11:47:16
【问题描述】:

我在 XNA 中有一台工作正常的 2D 相机,具有以下功能:

ms = Mouse.GetState();
msv = new Vector2(ms.X, ms.Y);  //screenspace mouse vecor
pos = new Vector2(0, 0); //camera center of view
zoom_center = cursor; //I would like to be able to define the zoom center in world coords
offset = new Vector2(scrnwidth / 2, scrnheight / 2);
transmatrix = Matrix.CreateTranslation(-pos.X, -pos.Y, 0)
    * Matrix.CreateScale(scale, scale, 1)
    * Matrix.CreateTranslation(offset.X, offset.Y, 0);
inverse = Matrix.Invert(transmatrix);
cursor = Vector2.Transform(msv, inverse);  //the mouse position in world coords      

我可以移动相机位置并更改缩放级别(为简洁起见,我没有在此处粘贴其他代码)。相机始终围绕屏幕中心进行缩放,但我希望能够围绕任意缩放点(在本例中为光标)进行缩放,例如独立游戏dyson http://www.youtube.com/watch?v=YiwjjCMqnpg&feature=player_detailpage#t=144s

我已经尝试了所有对我有意义的组合,但完全卡住了。

【问题讨论】:

    标签: c# xna camera 2d zooming


    【解决方案1】:

    我已经完成了,这是代码和解释:

    在相机空间中获取鼠标坐标:

     msx = Mouse.X - Viewport.Width/2;
     msy = Mouse.Y - Viewport.Height/2;
    

    获取相机空间中相机到鼠标的距离

     var width = CameraTranslation.X - msX;
     var height = CameraTranslaton.Y + msY;
    

    获取新缩放产生的偏移量,然后减去它到相机位置

     CameraTranslation.X -= width * (1-newZoom/_zoom);
     CameraTranslation.Y -= height * (1-newZoom/_zoom);
    
     _zoom = newZoom;
    

    【讨论】:

    • 帮助很大!但是“CameraTranslaton.Y + msY”应该有一个 + ;)另外我将 msX 和 msY 更改为一半视口大小以放大屏幕中心
    • +/- 取决于投影矩阵 .. ;)
    【解决方案2】:

    您实际上不会围绕光标进行缩放。您将在之前的缩放中心和光标之间的线上定义的点上进行缩放。随着您进一步放大,该点将接近光标位置。如果放大更大,它也应该更快地移动到光标。你的zoom_center 应该被定义为这样的东西(注意:我引入了新变量并添加了一行重新分配 pos 到 zoom_center)。

    zoom_center = pos = cursor + (scale_prior_to_zoom/scale) * (pos - cursor);
    

    希望这可行,因为我只在纸上尝试过,所以您可能需要稍微更改一下……但它至少应该让您指向正确的方向。这是我仅使用 X 维度所做的支持数学。

    光标 = (1,1)

    pos = (5,5)

    放大 位置应该更靠近光标

    scale = 2 scale_prior_to_zoom= 1

    posX = 1 + (1/2)(5 - 1)

    posX = 1 + 0.5 * 4

    posX = 1 + 2

    posX = 3

    缩小 位置应该离光标更远

    scale = 1 scale_prior_to_zoom = 2

    posX = 1 + (2/1)(5 - 1)

    posX = 1 + 2 * 4

    posX = 1 + 8

    posX = 9

    【讨论】:

    • 我只是想知道这是否是一个有效的解决方案。我目前有一个中心缩放实现,中心是视口中心。我正在处理鼠标光标缩放。
    • 在上面提到的代码示例中,您将在哪里定义 zoom_center? zoom_center 在哪里使用?我假设在 spriteBatch.Begin 中使用了 transmatrix?
    • 嗯,我完全忘记了。我认为 zoom_center 不需要/使用,因为它与 pos.. 的值完全相同
    • Vector2 pos 代表什么值?我有一个中心缩放,但我只能让它使用以下内容: transmatrix = Matrix.CreateTranslation(-offset.X, -offset.Y, 0) * Matrix.CreateScale(scale, scale, 1) * Matrix.CreateTranslation (offset.X, offset.Y, 0);
    • 我相信 pos 是当前的相机位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    相关资源
    最近更新 更多