用GDI繪製旋轉的長方體

來源:互聯網
上載者:User

原文地址::http://simplesource.blog.163.com/blog/static/10341406200911269325863/

 

 

 如果要繪製一個具有3D透視效果的長方體完全不需要動用OpenGL、D3D這樣的大型3D工具,因為長方體的各個面的遮掩效果比較簡單,不需要用到高度矩陣,只需要簡單的計算就可以實現。

  我們可以借用3D渲染引擎的法線思想來決定那個面需要繪製。在OpenGL、D3D所描述的3D世界中,每個面都有一個法線,法線決定了這個面的陰影著色和是否需要繪製。D3D可以設定參數只繪製那些“正面”朝向使用者的平面。如果用這個方法來繪製長方體的各個平面,則可以簡單的解決各個面的遮掩關係。我們只需要繪製那些法線的Z座標小於0的平面,來實現繪製長方體。

  以的陰影平面為例,它的法線向量(F)就是向量0->4(A)和向量0->3(B)的叉積(F=A×B),我們不關注這個向量的X和Y座標的值,只需要Z座標的值,因為我們只要決定法線是否向著使用者就可以了。計演算法線Z座標的公式:

  Fz=Ax*By-Ay*Bx

  實現3D透視效果方法則更簡單了,3D透視效果說白了就是遠大近小,為什麼會造成這樣一個效果呢?這是因為光線是直線傳播的,如果以使用者的眼睛為原點,那麼我們所看到的世界就是一個圓錐體,

  我們要計算的是立體物體的AB點在銀幕中的映射A'B',這個可以利用相似三角形的性質來解決。計算公式如下: 

A'x=Ax*f/(f+Az) 

A'y=Ay*f/(f+Az)

程式:

  第一個立方體用了前一篇部落格中提到的三角形貼圖函數,第二個立方體則只是簡單的使用了GDI的多邊形繪製工具Polygon函數。

程式和原始碼下載

RotateBox.rar

PS:三角形貼圖函數直接用到3D繪製中會引起失真,這是因為3D世界中單個三角形平面還是具有3D透視效果的緣故,而我的貼圖函數則沒有考慮這個問題。

PPS:正考慮把三角形貼圖函數運用到以前寫的一個小程式中,試試是否能夠提高程式運行速度。

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.