本文源地址: http://blog.csdn.net/xiaominghimi/archive/2010/12/07/6059650.aspx
Himi 原創, 轉載請注明! 謝謝。
為什么要先構造一個立方體的例子,其實 在論證概念時,立方體是一種極好的示例,當然它并不是復雜的 3D 設計的里程碑。
首先介紹構造一個3D立方體需要的步驟:(大概步驟哦)
第一:構造一個立方體的空間頂點
第二:構造一個立方體的各個面這里會用到三角形帶 ,詳細三角形帶的解釋看 @備注1
第三:構造一個攝像機
第四:綁定畫筆
第五:渲染.
那么下面先上代碼,都有注釋的,相信都能看懂!一些備注 下文有解釋!
模擬器截圖:
備注1 : 這里要詳細講解下三角形帶,下面引用一張圖a,大家根據圖示來看這個頂點數組就應該明白了!
大家看我們一開始定義的以三角帶形式的頂點數組
VERTEX_POSITIONS = {-1, -1, 1, 1, -1, 1, -1,1, 1, 1, 1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, 1, 1, -1 };
我們以立方體的中心為{0, 0,0},那么如果 頂點 0 坐標就是( -1, -1, 1 ) 那么頂點2是不是 {-1,1,1}了,肯定是!
這里坐標的三個點其實就是代表就是X軸 Y軸 Z軸
也就是說兩個頂點0和頂點2這兩個頂點都有共同的-1, 1 ,而三角形帶形式就是這種重復利用重復點的形式來標識了所有的立方體的頂點!
備注2:這里咱們定義了一個偏差數組float pc[] = { 0, 0, 1 }; 為什么要以數組形式呢?其實你換種形式看看,其實是一個坐標點,
畢竟這是3D世界了 娃哈哈,其實意思就是 X軸+=0,Y軸+=0,Z軸+=1,當我們把這個偏差點傳入setPositions()這個方法里以后,
也就是代表將這個立方體中心點從{0,0,0}變成了{0,0,1}這一點,如果你運行此項目當按下左右按鍵對其立方體進行旋轉的時候,
發現立方體旋轉不是圍繞中心點進行的旋轉了,而是以{0,0,1}這一點做的旋轉;所以setPositions()其實也是對中心點的一個偏差處理。
有些同學該說為什么中心點就是{0,0,0}這一點呢,其實沒人規定而是咱們一開始定義立方體數組頂點的時候就自己在心里定下了一個規定,
以{0,0,0}為中心點了。如果你一開始定義VERTEX_POSITIONS 的時候不以{0,0,0}為中心點,而是以頂點0 坐標為中心點的話,
那么頂點2這時候的頂點坐標就成了{0,2,0} ,頂點3就成了{0,2,2}那么也能寫成一個三角形帶形式,但是要注意你后面的顏色數組和
定義三角形帶數組的時候也要以為頂點0為中心點來寫噢,這點別忘了,要一一對應!
備注3:camera.setPerspective(30, (float) this.getWidth()/ (float) this.getHeight(), 1, 1000);
第一個參數指的是透視的角度!不是高度!第二個指的是屏幕寬高比例,第三個是可視范圍min和max
其實這里常用還有一個方法是:camera.setParallel() 這兩個方法以及備注5在后續文章
《深度緩沖與投影》 的時候再向大家講解。
備注4:Transform transform = new Transform(); 這里咱們定義了一個變換對象,其實咱們一開始定義的成員變量里也有一個
private Transform tf;但是這里要注意,transform 是為了設置攝像機的時候同時設定了相機的位置而定義的,而tf則是對渲染立方體的
候做反轉、縮放、平移等操作定義的一個變化對象,等后續文章會對渲染時這個變化對象加以說明。一定要注意這兩個Transform 區別!
備注5:備注3已經說明了 ,等后續文章學習 《深度緩沖與投影》 的時候再向大家講解。
備注6:這里就是為了強調與備注4的Transform兩個對象的區別!
備注7:這里 調用 releaseTarget() 意思是終止渲染,大家會發現g3d.releaseTarget();這一句被寫在了try catch塊里,其實原因是因為
許多 Graphics3D 的方法都會拋出不可控異常,但絕大多數錯誤都是不可恢復的, 所以不管是否出現異常都要保證能終止渲染!
備注8:這里是對按鍵的操作,按鍵處理和對立方體操作(縮放、平移、旋轉)會在后續學習文章中詳細解釋的。
最后給大家放出源碼,希望大家一起相互交流。所有文章都是原創,很多地方可能存在錯誤希望大家多多指點。謝謝!
源碼下載地址:http://download.csdn.net/source/2887681
希望大家支持下,雖然源碼需要一資源分,我相信大家不會吝嗇吧,大半夜的給大家分享 ,娃哈哈~
(推薦大家訂閱本博客,因為咱的更新速度可是很快的~娃哈哈)
2010/12/7 02:30
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
