ClassicThunder의 답변은 정확하지만 원하는 효과를 얻는 대안 / 간단한 수단의 예를 제공하고자합니다. 빠른 프로토 타이핑, 완전한 기능을 갖춘 라이브러리에 액세스 할 수없는 경우 또는 GPU에 액세스 할 수없는 경우 (예 : 임베디드 시스템)에 대한 간단한 솔루션입니다.
위의 매핑을 수행하려면 다음 함수를 사용할 수 있습니다 (정적 클래스에 정의되어 있다고 가정 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
클래스 가있는 경우 다음 과 같이 맵 함수와 동등한 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);