雖然這個問題的背景是關於製作2D/3D遊戲,但我已經歸結爲一些數學問題。 雖然它是一個2.5D的世界,但我們假裝它只是2d的這個問題。我已經完成了我的2D/3D轉換工作,如何做透視
// 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方向上的每一個步驟將導致在投影到1個像素到右端0像素下來。投影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)。 對於第一種情況(沒有透視圖),我確實找到了反函數,但是如何用這個透視圖來完成公式。 5月的數學技能並不完全可以解決這個問題。
(我依稀從很久以前記得數學可以創造一些特殊情況下的反函數......可以把它解決這個問題?可能有人也許嘗試?)
fac是什麼?什麼是「視角量」? 100與什麼有什麼關係? fac是爲了實現由於視角而明顯縮小的物體。這使距離爲100的物體的大小爲零,所以這沒有意義? – sigfpe 2010-05-21 18:52:30
fac代表因子,就像一個透視因子,可以調整大視角或小視角。使用這個函數繪製網格給了一些看起來不錯的東西。對象應始終放置在攝像機前的「柵格」上。這意味着一個物體的距離不會超過sqrt(60^2 + 60^2)85.我選擇100的原因是因爲它大於85,並且給了我所需要的外觀。 我的功能是不正確的,但視覺效果看起來不錯,雖然「透視」有點過頭...... http://img188.imageshack.us/img188/5154/gridpu.png – jdv145 2010-05-22 10:13:55