ClassicThunder的答案是正确的,但我想提供一个示例来实现所需效果的替代/简单方法。这是用于快速原型制作,您无法访问功能齐全的库或无法访问GPU(例如在嵌入式系统中)的情况的简单解决方案。
要执行上述映射,可以使用以下函数(假设它在static class中定义Helper
):
static float Map(float value, float fromLow, float fromHigh, float toLow, float toHigh)
{
return ((value - fromLow) / (fromHigh - fromLow) * (toHigh - toLow)) + toLow;
}
(您没有指定语言,但是我看到您对C#有所了解,所以我的示例在C#中。)
然后,您可以像下面这样使用此功能:
float mouseXInWorld = Helper.Map(Mouse.X, 0, Screen.Width - 1, camera.Bounds.X, camera.Bounds.X + camera.Bounds.Width - 1);
float mouseYInWorld = Helper.Map(Mouse.Y, 0, Screen.Height - 1, camera.Bounds.Y, camera.Bounds.Y + camera.Bounds.Height - 1);
哪里camera.Bounds
是矩形,代表相机可以看到的世界区域(即投影到屏幕上的区域)。
如果有Vector
或Point
类,则可以通过创建等效于map函数的2D来进一步简化此过程,如下所示:
static Vector Map(Vector value, Rectangle fromArea, Rectangle toArea)
{
Vector result = new Vector();
result.X = Map(value.X, fromArea.X, fromArea.X + fromArea.Width - 1, toArea.X, toArea.X + toArea.Width - 1);
result.Y = Map(value.Y, fromArea.Y, fromArea.Y + fromArea.Height - 1, toArea.Y, toArea.Y + toArea.Height - 1);
return result;
}
这将使您的映射代码变得简单:
Vector mousePosInWorld = Map(Mouse.Pos, Screen.Bounds, camera.Bounds);