原文地址::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:正考慮把三角形貼圖函數運用到以前寫的一個小程式中,試試是否能夠提高程式運行速度。