この質問の文脈は 2d/3d ゲームの作成に関するものですが、私が抱えている問題は数学に要約されます。2.5D の世界ですが、この質問ではちょうど 2D のふりをしましょう。
// xa: x-accent, the x coordinate of the projection
// mapP: a coordinate on a map which need to be projected
// _Dist_ values are constants for the projection, choosing them correctly will result in i.e. an isometric projection
xa = mapP.x * xDistX + mapP.y * xDistY;
ya = mapP.x * yDistX + mapP.y * yDistY;
xDistX と yDistX は x 軸の角度を決定し、xDistY と yDistY は投影の y 軸の角度を決定します (グリッドのサイズも決定しますが、簡単にするために 1 ピクセルと仮定します)。
x-axis-angle = atan(yDistX/xDistX)
y-axis-angle = atan(yDistY/yDistY)
このような「通常の」座標系
--------------- x
|
|
|
|
|
y
has values like this:
xDistX = 1;
yDistX = 0;
xDistY = 0;
YDistY = 1;
したがって、x 方向のすべてのステップは、右端から 0 ピクセル下への 1 ピクセルへの投影になります。投影の y 方向の各ステップは、右に 0 ステップ、下に 1 ピクセルになります。正しい xDistX、yDistX、xDistY、yDistY を選択すると、任意の三量体または二量体システムを投影できます (これが私がこれを選択した理由です)。
ここまでは順調ですが、これを描くとすべてがうまくいきます。「自分のシステム」と考え方が明確になったら、視点に移りましょう。このグリッドにパースペクティブを追加したかったので、次のようなエクストラを追加しました。
camera = new MapPoint(60, 60);
dx = mapP.x - camera.x; // delta x
dy = mapP.y - camera.y; // delta y
dist = Math.sqrt(dx * dx + dy * dy); // dist is the distance to the camera, Pythagoras etc.. all objects must be in front of the camera
fac = 1 - dist / 100; // this formula determines the amount of perspective
xa = fac * (mapP.x * xDistX + mapP.y * xDistY) ;
ya = fac * (mapP.x * yDistX + mapP.y * yDistY );
ここで、本当に難しい部分です...投影で (xa,ya) 点を取得し、元の点 (x,y) を計算したい場合はどうでしょう。最初のケース(遠近法なし)では、逆関数を見つけましたが、遠近法を使用した式に対してこれを行うにはどうすればよいですか。数学のスキルは、これを解決するための課題に完全に対応していない可能性があります.
(漠然と覚えていますが、ずっと前から mathematica はいくつかの特殊なケースに対して逆関数を作成できました...この問題を解決できますか?誰かが試してもらえますか?)