2010-08-08 44 views

回答

4

我會去Swing和Java2D或OpenGL(JOGL)。

我幾次使用OpenGL,使用JOGL的擴展(TextRenderer)很容易繪製文本。

如果您選擇Swing,那麼硬件部分將會執行3D轉換。你必須寫一些粒子系統。粒子必須駐留在3D球體上。你本人將負責做任何3D轉換,但使用正交投影將是微不足道的。所以這是一個很好的練習 - 你需要的是這裏:Wiki's spherical coord sys和這裏3d to 2d projection

完成所有轉換後,只剩下繪圖。 Java2D和Swing爲此提供了非常方便的API。它會歸結爲選擇字體大小,並在給定的座標繪製文本。自定義JPanel與覆蓋paintComponent方法將足以開始和結束。

至於第二選擇,最難的部分是OpenGL API本身。它是程序化的,所以如果你主要熟悉Java你會很難使用非OO的東西。它可以習慣,老實說,可以是相當有益的,因爲你可以做很多事情。如果您選擇OpenGL,那麼您可以免費獲得所有3D轉換,但您仍然必須自行從球座標系轉換爲笛卡爾(第一篇wiki文章仍然有用)。之後,它只是使用一些文本繪圖類的問題,如JOGL分發附帶的TextRenderer

因此,OpenGL可以幫助您進行視圖投影計算並進行硬件加速。 Java2D將需要更多的數學用途,但在我看來,這種方法似乎更容易一些。哦,順便說一句 - Java2D嘗試在內部使用任何圖形加速(OpenGL或DirectDraw)。所以你被屏蔽了某些低級別的問題。

對於兩個選項您還需要將鼠標座標s與球體的旋轉速度綁定。無論是Java2D還是OpenGL,代碼看起來都很相似。只需將與面板中心相關的鼠標座標映射到某個速度矢量即可。在繪圖時您可以使用矢量來相應地旋轉球體。

還有一件事:如果您想嘗試OpenGL,我建議:在MIT上創建的Processing language尤其適用於豐富的圖形小程序。他們的3D API,並非如此巧合,幾乎與OpenGL一樣,但沒有太多的東西。所以如果你想要最快的原型這是最好的選擇。實際示例請參閱this discussion thread。注意:處理是用Java編寫的。

+0

感謝您提供詳細且有用的答案!對不起,我沒有足夠的投票信譽:( Java2D解決方案將適合,但我需要的文字是可點擊的 請問,請問,JOGL提供了一些機制,允許聽取點擊呈現文字?所以 - 我將開始旅程...... – xolmc 2010-08-08 10:17:57

+0

是的,有一個特殊的設施 - OpenGL採摘(請參閱http://www.lighthouse3d.com/opengl/picking/)。它的工作原理是您設置了一個名稱對象,然後使用特殊的渲染模式來識別它,它會變得非常混亂,因爲它的級別很低,但是我做了幾次,所以如果需要的話可以提供幫助 – Rekin 2010-08-08 10:26:11

1

爲什麼不只是download的源代碼,並看看?即使你不能編寫PHP,也應該可以讀取它並找出算法的工作原理。

+0

我會這樣做,如果沒有更少的痛苦的方式:)像Java源碼。 順便說一下,你可以提出什麼樣的渲染技術 - JPanel/JLabel或者可能是OpenGL或者smth。其他? – xolmc 2010-08-08 07:33:26

+0

這是一部Flash影片,源代碼位於ActionScript中 - 不是PHP。 – Rekin 2010-08-08 09:11:01

+1

或者,'svn co http:// svn.wp-plugins.org/wp-cumulus/trunk'。 – trashgod 2010-08-08 09:50:23

3

這不是真的3D。在某些3D形狀(如球體)上沒有透視變換或映射文本。你有什麼是一串字符串,其中每個字符串都有一個關聯的深度(或Z順序)。與你「接近」的字符串被繪成更強的灰色陰影和更大的字體大小。

當您移動鼠標時,每個字符串的運動實際上是一個3D形狀,看起來像一個固定中心周圍的傾斜圓 - 傾斜取決於鼠標光標的位置。這很簡單 - 如果你計算出一個字符串,你就可以計算出來。然後最後一部分是分散琴絃,使它們不會重疊太多,並根據它們的頻率爲每個琴絃賦予初始重量。

這就是most of the code正在做的事情。所以你需要做數學運算,或者把ActionScript翻譯成Java2D。不,不需要JOGL。

+1

+1在數學上你的答案似乎有一個堅實的基礎。會試試看,謝謝。 – Favonius 2011-02-25 18:10:17