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
クラスがある場合、次のように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;
}
これにより、マッピングコードは単純な1つのライナーになります。
Vector mousePosInWorld = Map(Mouse.Pos, Screen.Bounds, camera.Bounds);