2011-04-08 131 views
3

我正在用Java創建一個簡單的3D渲染引擎。我搞砸了,發現了做透視投影的幾種不同方式,但是我唯一做的部分工作是奇怪的拉伸效果,它遠離屏幕中心移動,看起來很不現實。基本上,我想要一個需要投影3D點的方法(無論簡單還是複雜),以及'camera'的3D點和旋轉(可能?)作爲參數,並返回屏幕上的位置這一點應該吸取。我不在乎這種方法有多長/短/簡單/複雜。我只是希望它能夠產生您在現代3D第一人稱射擊遊戲或任何其他遊戲中看到的相同視角,並且我知道我可能不得不爲此使用矩陣乘法。我真的不想使用OpenGL或任何其他庫,因爲如果可能的話,我很想將其作爲學習練習並自行推出。Java中的透視3D投影

任何幫助,將不勝感激了很多:) 感謝,再次 - 詹姆斯

更新:爲了說明我的意思被「拉伸效應」這裏有一個演示我的一些屏幕截圖我把它放在一起。在這裏,一個以座標(-20,-20,-5)爲中心的立方體(40x40x10)是用我唯一可以使用的投影方法繪製的(代碼如下)。三個屏幕在第一張屏幕截圖中顯示相機(0,0,50),然後移動到X維度以顯示其他兩個效果。我使用

Camera at (0,0,50) Camera moved a bit in the X coord Camera moved even further

投影代碼:

public static Point projectPointC(Vector3 point, Vector3 camera) { 
    Vector3 a = point; 
    Vector3 c = camera; 
    Point b = new Point(); 

    b.x = (int) Math.round((a.x * c.z - c.x * a.z)/(c.z - a.z)); 
    b.y = (int) Math.round((a.y * c.z - c.y * a.z)/(c.z - a.z)); 

    return b; 
} 

回答

1

你真的不能沒有得到堅持到數學做到這一點。網絡上有大量資源解釋矩陣乘法,齊次座標,透視投影等。這是一個很大的話題,在這裏沒有重複任何必要的計算。

這裏是你學習的一個可能的起點:

http://en.wikipedia.org/wiki/Transformation_matrix

這幾乎是不可能說有什麼錯你目前的做法 - 但基於你的解釋一種可能性,它看起來很奇怪的物體移動遠離中心的是你的視野太寬。這導致了一種魚眼鏡頭失真,其中太多的世界觀被擠壓到屏幕的邊緣。

+0

謝謝,我知道我可能不得不使用各種複雜的數學。我認爲你說的正確的是,伸展問題可能是由視野問題引起的。我嘗試了一種基於維基百科3D透視投影的文章(涉及矩陣乘法和三角函數(sin和cos))的一種不同的(並且更加複雜的)方法。我還更新了幾個屏幕截圖和代碼,如果這給你任何想法。再次感謝。 – jt78 2011-04-10 16:04:56