具有任意变焦中心的 XNA 2d 相机

blo*_*oop 5 c# xna camera 2d zooming

我在 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      
Run Code Online (Sandbox Code Playgroud)

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

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

sco*_*kel 3

实际上,您不会围绕光标进行缩放。您将缩放在先前缩放中心和光标之间的线上定义的点。当您放大得越来越远时,该点将接近光标位置。此外,如果缩放增量更大,它应该更快地移动到光标。您zoom_center应该被定义为类似这样的内容(注意:我引入了新变量并添加了一行,您可以在其中将 pos 重新分配给zoom_center)。

zoom_center = pos = cursor + (scale_prior_to_zoom/scale) * (pos - cursor);
Run Code Online (Sandbox Code Playgroud)

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

光标 = (1,1)

位置 = (5,5)

放大 位置应更靠近光标

缩放 = 2 缩放之前的缩放 = 1

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

posX = 1 + 0.5 * 4

posX = 1 + 2

位置 X = 3

缩小 位置应该离光标更远

缩放 = 1 缩放之前的缩放 = 2

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

posX = 1 + 2 * 4

posX = 1 + 8

位置 X = 9