遊戲中會自由飄動的頭髮是怎麼做出來的?

人物的衣服、頭髮等物理效果是怎麼製作出來的?


五月三日更..

同學說這樣寫下去我之後論文答辯要被查重了怎麼辦...

五月二日更..

這個圈子實在是太小了,瞬間都被人認出來了。。

更新整個回答框架如下:

1.物理引擎中的布料 (5.1完結)

2.布料建模的一些方法

2.1 現實生活中布料的一些基本問題

2.2 常用的建模方法一覽

2.3 幾何方法

2.4 三種物理方法 (5月3日更新到這裡)

2.5 一些新的模型,包括Yarn-Based Cloth Simulation

2.6 真實不止是因為物理,還有渲染相關

3.實際遊戲中的布料

3.1 根本就是騙人的重複播放的幀動畫的假布料

3.2 看起來真的好棒的使用物理引擎的布料製作流程

4. 其他

4.1 頭髮和布料的關係

4.2 一些參考書籍

/* 請不要隨便轉載 */

// ----------------------------------------------------------------------------

Milo的愛麗絲博文中已經非常詳細地講清楚了一個簡單的頭髮物理系統是如何模擬的。

布料和頭髮在模擬過程中,早期使用的技術和物理模型基本上是類似的,都是對纖維結構的表現形式的一種抽象,某種程度上來說,布料的結構相對於稍微複雜一點。後來因為頭髮和布料各自獨有的一些特點,逐漸細化。這裡我簡單描述一下布料模擬的一些歷史和技術。

1. 物理引擎中的布料

對於現在的遊戲開發來說,使用成熟的物理引擎可以非常簡單的建立布料系統。目前被遊戲開發者使用的最多的物理引擎包括Bullet, Physx/APEX, Havok都包含了功能非常強大的布料模擬。目前Havok物理引擎中的Cloth組件仍需要商業授權,下面的圖片除Havok外來自各個SDK中Demo的截圖,這些程序Demo可以非常方便的下載和編譯得到。

1 Bullet物理引擎中的SoftBody模擬的布料效果,圖示表示5片隨風飄動的布料(Bullet 2.82
)

2 Physx物理引擎中模擬布料和斗篷的效果,圖示表示多個旗幟和一件斗篷(Physx 3.32)

3 APEX製作出的服裝效果,圖示演示了走路的人身上襯衫和褲子的變化(APEX1.3.2)

4 Havok Cloth製作出的舞女效果(圖片來源Youtube視頻)

對於普通的遊戲開發者來說,只要引入了物理引擎,就可以很方便的規避布料實現的各種細節。包括布料的數據結構,布料各項參數的建模、碰撞檢測及積分運算等等。同時,遊戲策劃和美術可以更加專註地使用商業引擎提供的工具可視化地調節需要的布料的藝術效果,滿足所需的遊戲性,對於程序員而言也顯著地降低了工作量

當然,物理引擎也有自己的局限性,當需要自定義一些特殊的布料效果時,部分物理引擎就顯得捉襟見肘了。

2. 那遊戲引擎內部是怎麼做的呢

上一節的答案肯定是不能滿足題主的。物理引擎為遊戲開發者提供了一個黑盒子,只要遊戲策劃和美術設計好遊戲角色身上布料相應的參數,丟給物理引擎,它就可以Duang的一下,加好各種特效。本節將會解釋布料本身常用的物理模型、簡單的碰撞檢測內容。

註:本節和本節之後使用的圖片都是自己照著一些論文和書籍手動畫的,應該不會有版權問題的說…不過有可能有學術錯誤,歡迎指正

2.1 現實生活中布料的複雜性

圖5 不同布料的結構和紡織界對於布料的力學模型的簡單建模

現實生活中的布料是非常複雜的,如圖5上半部分所示。自珍妮紡織機改進之後,人類對於舒適和時尚的追求也是孜孜不倦。一匹成品布看上去、摸上去不盡相同,主要有三個方面的原因:

  • 使用了不同的纖維:棉、麻、化纖……

  • 採用的不同的編織紋:平紋、斜紋、緞紋……

  • 編織時採用了不同的參數:支數、針數……

紡織學家為了對紡織布料的可控,也建立了一些力學模型,最早可以追溯到1937年Peirce的模型[1],該模型其實就是一個剖面圖。在此基礎上,後續也有許多改進。這些基本的模型也啟發了計算機圖形學對於布料模擬相應的研究。

2.2 圖形學布料模擬模型歷史

圖6 常見的幾種布料模擬的模型

常見的布料模擬模型包括幾何模型彈簧質點模型彈力模型粒子模型。接下來我來簡要解釋一下各個模型的基本思想和適用場合,其中由於彈簧質點模型為現在遊戲中的主流解決方案,我將會仔細地介紹其步驟和各項細節。

2.3 幾何模型

1986年Weil在當年的Siggraph上發表了關於幾何模型構建布料的方法[2]。這個方法將布料描述為由3D點陣構成的2D網格。整個演算法步驟也簡單,就不詳細的講了。大致的意思可以這樣形象的理解(基本上是自己腦洞出來的理解,這樣就可以一點都不涉及公式了,所以不見得準確

"╮( ̄▽ ̄"")╭"):

7 兩個釘子懸掛繩子

在牆上釘兩個釘子,一根很長的繩子搭在兩個釘子上,從兩頭開始分別放鬆這個繩子。我們可以把中間這一段想像成一塊布料的側視圖(比如在學校操場的雙杠上曬被子,如圖8,把被子跨過兩個雙杠,然後從雙杠兩邊把被子往中間放鬆)。這樣的幾何形狀看起來就像一塊自然舒展的布料,將這個模型放在三維空間中,假設有很多符合條件的釘子,我們將這些線段進行放鬆,然後讓計算機通過一系列數學公式的迭代,就可以得到一塊類似懸掛的布料的幾何形狀。

8 雙杠曬被子(圖片來自網路),側視圖看起來如圖7一樣。

總的來說,這個方法不算是很精確,而且只能提供一個靜態的懸掛形狀。不過這是非常有用的,比如建模一塊靜態的布料,或者畫畫的時候畫出一個具有動感的衣服、桌布的圖片,這會是一個讓人看起來感覺真實的思路。

2.4 物理模型

所謂物理模型,就是在模擬布料的時候,用到了基本的物理定律。主流的物理模型有圖6中所示的另外三種:

  • 彈力模型

  • 粒子模型

  • 質點彈簧模型

2.4.1 彈力模型

彈力模型的想法非常簡單,它是在1986年由Feynman提出的[3]。我們先可以想一想,為什麼上面的幾何模型最後的結果看起來像一塊布或者繩子呢,這裡面一定是物理規律在起著作用。高中時候學過化學的話就知道,在不違背泡利原理的情況下,核外電子總是盡量排布在能量最低的軌道上,電子也相應地處於穩定狀態。我們身邊的萬事萬物都想維持自己的穩定,讓自己處於「極小能量」的狀態,每個物體具有勢能,當它的勢能極低的時候,它的狀態是穩定的。維穩總是神秘又讓人著迷的話題:比如爹媽想喊你回家當公務員,這就產生了一定的飯碗勢能,如果沒有額外的能量輸入,就只能往回滾了。又比如身邊的同學都有女朋友,家裡親戚隔壁左右的小孩都結了婚,這就產生了一定的結婚勢能……呃,扯遠了。

作為一塊願望非常淳樸的布料,它的基本修養也是這個樣子:無論是被穿在身上還是鋪在桌上,它都想維護自己的穩定。那麼布料里的勢能該如何描述呢?彈力模型藉助了經典牛頓力學裡面的彈力理論,將布料的勢能描述為包含一系列能量函數,包含布料的拉伸、彎曲、重力等等。將得到的公式進行求解,就可以得到布料在哪種狀態下能量極低,這個解這就是這塊布料看起來十分自然的樣子時候的姿勢。

2.4.2 粒子模型

= =先佔坑碼代碼去了,回來再寫。

(你們快點評論一下,有疑惑我就順便改(? ??_??)? )

參考文獻

[1] Peirce F T. The
geometry of cloth structure[J]. J. Text. Inst., 1937, 28: T45.

[2] Weil, Jerry. "The
synthesis of cloth objects." ACM Siggraph Computer Graphics 20.4 (1986):
49-54.

[3] Feynman, Carl Richard.
Modeling the appearance of cloth. Diss. Massachusetts Institute of Technology,
1986.


不知道是哪裡看到的冷知識

GTA V裡面主角衣服的皺褶不是用物理引擎即時運算的動態凹凸紋理,而是兩張交錯的凹凸紋理,一張表示向左一張表示向右。隨著主角軀幹的轉動,改變兩邊的透明度,軀幹向左的時候把向右的紋理透明度變高,向左的變低,反之亦然。這樣就用簡簡單單兩個透明度參數體現了非常複雜的計算才能實現的視覺效果。

例圖是軀幹前部,但是原理一樣。

PS3、360版在這麼破的硬體上跑出這樣的視覺效果,必須靠這種黑科技(耍賴開掛)的方式實現。


早期是用簡單幾何+貼圖硬做的,可以看到很明顯的折角和不自然的光照(請大家自己看紅圈內的部分)

後來,AMD做了TressFX,代碼都有:http://developer.amd.com/wordpress/media/2013/11/TressFX11_v2.0.zip

神奇的是,這個技術在同級別的NV卡上跑得更快。

NV做了HairWorks NVIDIA HairWorks

用於那個遊戲不用說了吧,通過圖大家就能自己看出來。

來,歡樂一下


愛麗絲的髮絲──《愛麗絲驚魂記:瘋狂再臨》製作點滴

@Milo Yip 大大倒也是謙虛,只是關注了該問題:)


遊戲開發的小透明斗膽回答一發:

我為虛幻4引擎寫了一個海飛絲插件,參考了TressFX的論文。

開發日誌在此:Unreal Engine 4 —— HairStrandPlugin開發日誌


其實很多種做法,那些落後的做法其實有時候也能做到讓人看不出來,高大上的做法在某些情況下也很不好用(比如顯卡廠出的頭髮渲染功能,用來做不是那麼絲狀的日本動漫頭髮的時候就不一定實用了)

1是純手工k幀動畫,會比較難弄,但是簡單快速方便。

2是藉助彈簧插件的k幀動畫,如果說動畫和玩家操作反饋沒有這麼明顯關聯,就是純動畫就可以的話,這種方法的效果其實很棒了,但穿插比較難調。這事情工作流程上可以完全甩給美術。

3是遊戲內的物理系統,剛體+彈簧骨骼動畫,代碼腳本控制,一般用cpu計算,高端點還可以用上並行計算,耗費資源比較大,有時候也會各種bug,最終效果類似MMD裡面那種頭髮。Unity和虛幻都有很多插件。

4是各種顯卡廠商的技術,本質還是類似於彈簧的,只是可以用gpu去渲染,達到同時渲染很多的效果,類似於草地渲染,但是似乎處理碰撞方面依然不太好,兼容性差,經常並做不出想的效果。目前比較完整的工具鏈很少,配置起來也很麻煩,學習成本太在高,技術也一直變,不夠成熟。很多時候其實也沒太大的必要,一般都是有不少沉澱的大公司,人力時間充足,才有精力去弄。達到錦上添花的效果。

如果是想做遊戲,項目角度考慮,個人覺得暫時用到3號方案目前就足夠90%場合了。 4號方案雖然美好,但是一研究一個月沒了,可能會比較蛋疼,學生黨學技術的話,最好先把前面的應用情況了解了,然後再去看4號方案搞科研。一般用到4號方案的遊戲,1,2,3號方案一般也都同時在使用的。比如巫師裡面的小辮子應該是3號方案,然後怪物的毛髮是4號方案。


您問的根根動的那種,是遊戲cg級別的頭髮。一般實際遊戲場景中的頭髮只不過是帶透明通道的貼圖附在一張面片上。


我不知道遊戲里具體是怎麼做的

不過我可以貼最近我在看的三篇paper, 希望能有幫助

一個是實時的頭髮模擬, 基於少量guide hair的模擬, 再用hair skinning model插出頭髮, 最後修正碰撞獲得細節

Chai, M., Zheng, C., Zhou, K. (2014). A reduced model for interactive hairs. ACM Transactions on Graphics, 33(4), 1–11. doi:10.1145/2601097.2601211

一個是off-line的full simulation, 上面那篇文章simulate guide hair用到了這個技術

Selle, A., Lentine, M., Fedkiw, R. (2008). A mass spring model for hair simulation. SIGGRAPH "08: SIGGRAPH 2008 Papers. doi:10.1145/1399504.1360663

還有一篇也是mass-spring model, 但我還沒有仔細看...

Liu, T., Bargteil, A. W., O"Brien, J. F., Kavan, L. (2013). Fast simulation of mass-spring systems. ACM Transactions on Graphics, 32(6), 1–7. doi:10.1145/2508363.2508406


大家說的都很好,不過我提一點,像大部分網遊來說肯定不是用這種方法,不過是動作出發的循環動畫。


本來是找答案的,看到這個了就先答一個

背景就是 在ue4渲染一段預覽用的動畫,要求是弄一些特效 還有 衣服要模擬 還能不能有重大穿插,還得能調節運動方向。

這也是換了新公司後給出的第一個工作,所以就是絕對不能掉鏈子

時間緊迫 大概想了下思路

1.肯定得用布料模擬,決定用 Physx物理引擎中模擬布料,開始時候遇到一個問題就是 從maya導出的APEX文件怎麼也不能導入ue4里,浪費我一天時間。後來又下載了一個老版本的Physx插件,搞定

2.布料的整體運動方向得可以調節,不能有穿插,所以就只好加骨骼,用骨骼去控制大的運動方向。本來想著用nhair模擬骨骼運動 ,但是需要控制的骨骼太多,各種掛飾 絲帶(角色是倆個古裝男女),沒有時間重新設置骨骼,所以只好考慮別的辦法。先在maya用 Physx模擬布料運動,然後用布料控制骨骼運動,烘焙骨骼運動,再調節關鍵幀,修改運動方向和穿插,然後再把布料綁定在烘焙好運動的骨骼上,一起導入ue4,ue4有一個屬性可以調節布料模擬和骨骼權重的比例的屬性,這樣就又有了布料模擬又有了可控骨骼。後來把上面這些步驟全寫在mel里,只要手動調節穿插和整體運動方像。上面所有工作用了一周,角色動畫是動捕的,接下來的兩天,倆個動畫組的人修改動畫 導入導出 我又做了兩個特效,一起在UE4渲染了1分鐘。

接下來 我的問題來了。

上面說的只是預覽用的動畫,現在正試的動畫要明年開始,現在在敲定布料這塊兒到底怎麼弄,這次不用在UE4渲染了,直接maya Vray渲染,所有布料和頭髮都是模擬,要求還是上面那樣,既可以看起來是很真實的布料(頭髮)然後大的運動方向可以手動調節,還有衣服上皺紋的控制。有沒有可以介紹一個現在主流的方案,或者有什麼好的資料可以參考下。我大概想了下,還是nHair雙向控制骨骼,然後再通過這個骨骼控制布料,有沒有人這麼做的啊?

環境原因,身邊也沒一個可探討的大神,日本人比較老套,不喜歡研究新方法,迫切希望在知乎交到這方面的朋友啊


NV有個中間件,hairworks,巫師3里用到的


我覺得還是分級別的吧,遊戲cg中就想前面大家說的,會有布料運算啊,物理引擎啊之類的方法,平常網遊啊手游啊,為了省資源基本都是一個面片加上透明貼圖,之後動畫師會給這個飄帶之類的東西加上骨骼蒙皮啊,後面是手K還是用插件運算就看這個動畫師意願了(我一般都是在MAX里用插件算,因為手K實在太煩(ノ?益?)ノ彡┻━┻


特殊骨骼+優化演算法+強大的運算吧……


我是做動畫的,不是遊戲行業 不過我想也差不多

應該是有緩存的吧 先做模型 賦予動力學布料 計算好了會有緩存 這樣不用每次都重新計算 玩起來就不卡了

另外那種實時渲染的應該是顯卡支持遊戲的平台演算法吧 顯卡gpu什麼的


現在是學動畫,不知道說的對不對。貌似是在做模型時候綁定骨骼一起做的,不管是頭髮還是衣服啊,披風啊一起在外殼綁定的,很麻煩,做的很噁心


英偉達現在不是出了臭名昭著的毛髮系統,巫師三。。。lz可以去試試


k幀,如果不用物理引擎的話


利用3dmax軟體製作。人物模型穿的衣服,也屬於模型,首先給模型的衣服進行模擬布料設置,有很多插件。然後動起來是用軟體裡面的力學綁定。


簡單來說都是用物理碰撞引擎做出來的,有些是運算後渲染(生成畫面),有些是邊運算邊渲染。

軟體計算方法是把一根頭髮或者一部分頭髮分成若干段,輸入他們的彈性牽引力摩擦等係數,計算他們互相拉扯碰撞的結果(你可以想像成鏈條)。

還有些遊戲是用的動畫參數,就是你看到的並不是現場演算的畫面,而是你前期已經輸入的動畫數據,優點是節約資源。


我記得瘋狂愛麗絲的工作人員曾經寫過關於頭髮的文章

瘋狂愛麗絲中的頭髮做的真的是非常nice

原文就不轉過來了

貼出鏈接:愛麗絲的髮絲──《愛麗絲驚魂記:瘋狂再臨》製作點滴


頭髮的模型會綁定多個骨骼,物理引擎會根據虛擬體碰撞自己運算


推薦閱讀:

計算機專業的不會處理電腦的系統問題和基礎的硬體問題是不是很 low?
化學等實驗科學的科研需要耗費的時間多嗎?
這個配置有啥升級方案?主要以辦公商務為主?
printf()等系統庫函數是如何實現的?
4G內存,安裝win7 32位流暢,還是安裝win7 64位好?

TAG:遊戲開發 | 計算機 |