為什麼計算機圖形不用四面體做基本圖元?

三角形是二維圖形的基本圖元,用來表示三維圖形的邊界的。

四面體是三維圖形的基本圖元,用來表示三維圖形的體積信息的。

四面體可以直接轉換成三角形

即表示體信息,有表示邊界信息。這樣既是雕刻又是3D繪畫(體素也是3D繪畫)

用來雕刻和建模好像都比三角形方便


一般渲染只考慮表面而不是體積,但如果考慮到內部的散射,甚至不均勻密度,就需要體積信息。事實上是有四面體網格(tetrahedral mesh)這種體積表示方式。

把多邊形(polygon)剖分成三角形網格稱為三角化(triangulation),類似地把多面體(polyhedron)剖分成四面體網格稱為四面體化(tetrahedralization)。


隨便搜一下,用四面體的圖形學項目都有一大堆。其中有一些還比較經典。

比如模擬流體,Liquid simulation on lattice-based tetrahedral meshes,http://graphics.berkeley.edu/papers/Chentanez-LSL-2007-08/

尤其是模擬小尺度的液體時候用四面體可以很好的計算表面張力,Simulating liquids and solid-liquid interactions with lagrangian meshes,http://graphics.berkeley.edu/papers/Clausen-SLS-2013-04/

模擬彈塑性的固體,http://graphics.berkeley.edu/papers/Wicke-DLR-2010-07/

聲音合成、3D列印,Computational Design of Metallophone Contact Sounds,http://people.seas.harvard.edu/~gaurav/papers/cdmcs_sa_2015/

順著裡面的引用找過去還有很多很多。然後你挖的比較深的話會碰到很多機械和土木工程的文獻,那就更多了。

所以這個問題可以換一個方法來問,就是為什麼四面體在圖形學業界不如其他表示方法(點雲/均勻格子)更流行。

四面體的好處是有網格,可以很準確地追蹤介面在哪裡,這個對於要塑造表面細節的效果(比如表面張壓是,常數*表面曲率)很重要。但是在之前,業界更注重大尺度上的效果,因此需求並不是很強烈。

缺陷也不少,用四面體每一步都要做重網格化,這個第一寫出高效快速的代碼很難,第二是當出現很細很窄的四面體的時候,在這個上面解PDE是ill-conditioned,所以還要做特殊處理,考慮各種corner case。第三就是在網格比較粗糙的情況下,重網格化造成的拓撲改變會帶來時間上的不連續性,表現就是有閃來閃去的視覺缺陷。最後就是四面體可視化起來不夠直觀,很多美工不適應。

當然這些問題在逐漸的被解決,所以在人們越來越注重細節準確性的時代,四面體也會越來越流行。畢竟自從有限元方法被發明的六十多年來,四面體網格已經是傳統工程上模擬的標準了。


以前有過你說的這樣的東西,而且比你說的更加強大,叫Constructive Solid Geometry(CSG)。根據論文Practical Ray Tracing裡面提到的,這種方法不夠流行的原因可能是很多基於CSG系統的實現,效率都不怎麼樣。但作者也說了,如果正確的進行設計,性能也能夠很好


因為當初的渲染方式都不需要體積信息,只是需要表面的「皮」而已。


建模跟渲染是兩回事。渲染的時候,大部分情況下都不需要看不見的那部分,那麼很多四面體的存在就是浪費,最後被需要的還是四面體那部分看見了的三角形。

而且,一個模型可以有多種存儲方法,不需要用一個數據結構打遍天下。你需要四面體來干別的事情,那就再加點內存好了,不需要去修改渲染的部分。


這個是看需要的,比如說我畫了一個立方體,實際上我並不是畫了一整個立方體,實際上只有六個表面。渲染也只渲染這六個表面,然後代碼里設定這個表面不可穿越,這樣感覺起來這個立方體就是實心的了。

一些更為複雜的建模,比如說我需要做一個人的模型,實際上我也只需要這個人的外殼而不是內部。不管這個曲面多複雜,它都是一個二維曲面。

在這種情況下,當然是用三角形最方便。

但是吧,如果說要一些軟的東西建模。比如你要表現出擊打在一大塊海綿上海綿的形變什麼的,你就必須計算它內部的結構是怎麼變化的。這時候就不能只是一張皮了,這種情況下也經常用四面體來表達這個帶有內部結構信息模型。(當然實際上也經常用一層皮包著一大堆小球來做)


3d模型分兩個流派,suface modelingsolid modeling (近幾年的siggraph出現過用粒子堆砌模型的論文,不過不算主流)

suface modeling是以面為邊界定義模型,solid以實體方式方式定義模型,工業上兩者都是由nurbs曲面承載幾何體,有了nurbs模型,轉成三角面polygon 或 轉四面體polygon模型只需要一段程序就可實現,所以nurbs純數學函數描述的3d模型或許才算基礎模型,三角面或四面體polygon模型只是採樣過的近似模型,這一點類似於數字信號之於模擬信號。

很久之前CG行業流行過nurbs建模(貌似ILM很看重這點),不過現在基於視覺的3dcg項目百分之九十九都是直接上polygon mesh,既然是視覺項目就沒有必要把資源浪費在看不見的地方,而且很多模型需要透明材質,如果模型如題主所建議的那樣用四面體填充,透明物體渲染出來會很華麗,而且要多花很多時間多交很多電費,(推論一,用四面體建模的cg公司都已經交不起電費倒閉了)

四面體填充的透明材質模型,打開raytrace 和 caustics渲染出來可能和下面這張圖有點象

(圖片來自網路,侵刪)

工業模擬領域需要用"體"來解算的項目,更多是用粒子,因為粒子填充解算速度比四面體窮舉填充快很多,綜上所述,實際項目中用到polygon四面體描述3d模型的幾率不大,或許只有樓上Raymond提到的那些很窄的應用領域,所以 四面體建模沒法流行起來。


四面體在圖形學裡主要用來做物理模擬,例如在柔體的動力學解算器中,所謂的有限元分析。


從頭梳理一下

計算機圖形里的網格(mesh)可以根據功能不同被分為好幾類,其中rendering mesh就是所謂的顯示/渲染網格,這種就是經常美工做的3d modeling,只考慮外表並不考慮內部空間,所以本質上只需要用三角或者多邊形把最外圍的空間結構描述出來就可以了,最多內部加上骨骼。現在遊戲和實時交互軟體里絕大部分都是這種網格。所以這種網格只需要3d物體的2d表面屬性,所以並不需要四面體這種3d封閉primitive 。(但是——圖形學裡有一個分支是4D object rendering,那麼如果需要勾勒思維物體的三維表面,tetrahedron也許就派上用場了,具體這方面我就不是很懂了——但如果考慮到4dmapping到2d的話,顯示的主體應該可能還是2d邊界吧)

而Physics Mesh是所謂的物理網格/結構,這種是為了進行物理模擬而製作的網格(註:這個物理模擬網格和collision mesh,也就是碰撞網格,不是一個概念,有時間可以說一下碰撞網格)。想要進行一個3d物體(solid rigid/soft body)的自變形(deformation)的模擬的話,物理網格就需要考慮3d物體的內部結構了——其實也就是對3d物體內部進行建模而已。

Physics Mesh modeling目前主要也就分為幾種:

一種是目前最常見最普遍也是最早出現的(大約在上世紀80年代),Particle Spring system,這種就是基於胡克定律用質點和阻尼系統構建的體系,內部空間用隨機或者有序分布的質點(particle)填充,particle之間的互動和影響是基於spring完成的,這是一個比較簡單的ode系統,但是其中的time integration也比較麻煩因為一個不小心整個system就容易boom(over-elastic)。

Particle Spring System目前主要的應用就是cloth simulation(衣料模擬),還有很多手術模擬的人類組織也是用這個模型,這個模型缺點就是沒法capture 3d物體的空間屬性,因為particle是無限小的,particle和particle之間沒有任何填充,只靠Spring來承擔互動,所以PSS大量應用都是衣料這種沒有厚度只有長寬的偽3d物體(想像一張有3個維度自由的2d紙張)。目前各種遊戲里大量的衣料模擬基本底層都是particle Spring system,只不過參數和Spring的構建不一樣罷了。

Particle Spring System之後(大概2002年左右,不太記得了)出現了PBD, Position-Based Dynamics。PBD本質上來說和PSS也差不多,也是用particle來填充空間,但是用constraint代替了Spring並且iteration方法也變化了。好處就是直接跳過了解ode和time integration變成了如何satisfy 所有constraint。PBD對3d物體的空間屬性描述得就比較好了,但本質上還是只模擬了物體的彈性變形(elastic deformation)而對plastic deformation基本沒有太多貢獻(這個觀點我自己持保留意見)。

前面啰嗦了一堆突然感覺沒什麼用(大概只是說明為什麼這些沒有用四面體),那麼下面終於有一個用到四面體的了,前面我看到有個同學也提到了,那就是有限元分析法,Finite Element Method (FEM)。

FEM其實在工程和結構上已經應用了不知道多少年(憑藉記憶大概起源於上世紀50年代?)但是被應用到計算機圖形里也是最近十幾年的事情,沒有別的,就是因為運算量太大了。不是ode而是pde了(而且我一見到tensor這個東西就頭大)。FEM本質上就是物體stress-strain的受力分析,應力和壓力的關係,目前FEM可以說是最精確的方法(不然不會應用在實際工程里),但是在圖形學裡的應用比較窄,很多可能用在視覺特效上,所謂的offline simulation。這種模擬就是大片里的視覺特效,大概多台電腦運算幾個小時甚至幾天才畫出一幀的那種效率……對目前以實時渲染(real-time rendering)為主體的訴求貢獻不是很大,但是很多被簡化過的FEM也有曾經被應用在遊戲場景里的,但都是很小部分的物體(某星球大戰主題的遊戲里就出現過)。

FEM的建模基礎就是tetrahedron(四面體)了,因為要全面分析stress-strain,所以內部細分的基本元必須在空間上有實際接觸,這也是為什麼要引入tensor(頭大)。

以上是從Solid Object Physics Simulation角度回答了一下這個問題……答案就是FEM是用把一個完整物體離散成一堆四面體做為基本元的,但是這個方法在實時模擬中暫時還不是大範圍模擬的主流,主要受限於複雜的計算和分析。

以後想起來再補?


三個點確定一個平面


三個點能幹得了的事為啥要4個?


為了性價比,gpu技能樹點的是三角形。早期有曲面NURBS,以及Mataball等,都無法很好的硬體加速或很好的性價比實現,無法進入大眾。但建模軟體還是都有這些工具集的,只是到消費層,都轉為gpu優化的tri-mesh了,然後渲染。


因為大多數時間我們需要渲染的還只是面,而不是體,所以三角形更加簡潔、便利……


在需要體積信息時,就需要四面體網格了,在不需要體積信息時,就不需要四面體網格只需要反應表面信息的三角形網格了。


推薦閱讀:

如何學習計算機圖形學?
如何看待電影《爵跡》於3月28日曝光的渲染序列及其技術水平?
計算機中的圖片為什麼都是矩形的?顯示圓形也只能周圍透明?
在 Cg 的逐像素著色的最後,每一個顏色值相加和每一個顏色相乘從數學角度有什麼差別?
是什麼限制了遊戲或實時圖形, 以至於遠景如山脈, 天空都是紙片貼圖?

TAG:CG | 計算機圖形學 |