戰(zhàn):從參數(shù)調(diào)優(yōu)到性能優(yōu)化全解析)
1. 項(xiàng)目概述從靜態(tài)到動(dòng)態(tài)的跨越上次我們聊了Blender里剛體和軟體的基礎(chǔ)玩法算是給物理世界開了個(gè)頭。今天咱們深入一步來啃兩塊硬骨頭布料和碰撞。這倆玩意兒可以說是讓3D場景從“雕塑館”走進(jìn)“活的世界”的關(guān)鍵一步。你想想一個(gè)角色身上的披風(fēng)如果像鐵板一樣硬邦邦地掛著或者一個(gè)球掉進(jìn)一堆箱子里卻直接穿模而過那沉浸感瞬間就碎了一地。布料模擬負(fù)責(zé)的就是這種柔軟、飄逸、有垂感的動(dòng)態(tài)而碰撞檢測則是確保物體之間“知道彼此存在”、能發(fā)生合理交互的物理基石。在Blender里搞布料和碰撞遠(yuǎn)不止是點(diǎn)開一個(gè)按鈕那么簡單。它涉及到一堆參數(shù)的微妙平衡布料的重量、彈性、阻尼怎么設(shè)才自然碰撞體是應(yīng)該用精確網(wǎng)格還是簡化的凸包自碰撞布料自己和自己打架開了會(huì)不會(huì)算到天荒地老這些問題官方文檔往往一筆帶過但卻是實(shí)操中決定成敗的細(xì)節(jié)。我見過太多新手做出來的布料要么像浸了水的抹布一樣耷拉著要么像充了氣的塑料袋一樣亂飄碰撞要么漏成篩子要么剛得像堵墻。所以這篇東西不打算復(fù)述手冊而是把我這些年踩過的坑、試出來的參數(shù)、以及一些“邪道”優(yōu)化技巧掰開揉碎了跟你講清楚。目標(biāo)就一個(gè)讓你手里的虛擬布料動(dòng)起來像真的物體撞起來有實(shí)感。2. 核心思路理解模擬的“輸入”與“約束”在動(dòng)手調(diào)任何參數(shù)之前得先想明白Blender的物理模擬是怎么“思考”的。你可以把它想象成一個(gè)非常盡職但有點(diǎn)死板的計(jì)算員。我們作為導(dǎo)演需要給它兩份“任務(wù)書”第一份任務(wù)書定義物體的“物理身份”。也就是給物體添加物理屬性。一個(gè)網(wǎng)格物體在物理模擬的世界里它可以是剛體上次講了、軟體、布料、流體或者碰撞體。關(guān)鍵點(diǎn)在于一個(gè)物體可以同時(shí)擁有多種物理屬性嗎答案是通常不建議但某些組合是允許且有用的。例如一個(gè)物體可以既是布料同時(shí)又是一個(gè)碰撞體用于和其他布料或軟體交互。但你不能讓它既是剛體又是布料這會(huì)讓模擬器精神分裂。我們的首要任務(wù)就是通過物理屬性面板清晰地告訴Blender“這個(gè)是布那幾個(gè)是撞上去的墻和桌子?!钡诙萑蝿?wù)書定義模擬的“規(guī)則與邊界”。這就是參數(shù)面板里密密麻麻的那些數(shù)字。對于布料規(guī)則就是它的“材質(zhì)特性”它有多重密度多容易拉伸拉伸剛度多容易彎曲彎曲剛度恢復(fù)原狀的能力多強(qiáng)阻尼對于碰撞規(guī)則就是“交互的硬度”物體能陷入彼此多深距離反彈多厲害彈性表面有多粗糙摩擦Blender的模擬器會(huì)嚴(yán)格按照這兩份任務(wù)書一幀一幀地計(jì)算每個(gè)頂點(diǎn)的位置。我們的調(diào)參工作本質(zhì)上就是在用參數(shù)語言向這位計(jì)算員精確描述我們想要的視覺效果。思路錯(cuò)了參數(shù)調(diào)得再細(xì)也是南轅北轍。3. 布料系統(tǒng)深度解析從參數(shù)到視覺給一個(gè)平面或者一個(gè)簡單的衣服模型添加“布料”物理屬性你就打開了新世界的大門。默認(rèn)參數(shù)下播放動(dòng)畫它可能會(huì)像一片羽毛一樣飄落這離我們想要的布料還差得遠(yuǎn)。下面我們來拆解每一個(gè)核心參數(shù)組背后的含義。3.1 物理材質(zhì)屬性定義布料的“基因”這個(gè)部分決定了布料的基本性格。質(zhì)量 這是布料重量感的來源。質(zhì)量有兩種設(shè)置方式總質(zhì)量和面密度。對于一件衣服用“總質(zhì)量”更直觀比如你可以設(shè)成0.3千克一件T恤的大致重量。而“面密度”千克/平方米更適合大片面積的布料如旗幟、桌布。一個(gè)常見誤區(qū)是質(zhì)量設(shè)得太小導(dǎo)致布料輕飄飄的沒有垂墜感。對于大多數(shù)衣物0.2到1千克的總質(zhì)量是個(gè)不錯(cuò)的起點(diǎn)??諝鈩?dòng)力學(xué) 這是讓布料“飄”起來的關(guān)鍵。它包含了阻力和升力。阻力 可以理解為空氣的粘稠度。值越大布料在空中運(yùn)動(dòng)受到的阻礙越大運(yùn)動(dòng)會(huì)更快停止。做室內(nèi)靜止的桌布阻力可以調(diào)高比如1.5做戶外飄揚(yáng)的披風(fēng)阻力要調(diào)低比如0.1-0.5。升力 這個(gè)參數(shù)很有趣它模擬了氣流掠過曲面時(shí)產(chǎn)生的上升力類似飛機(jī)機(jī)翼的原理。這是實(shí)現(xiàn)布料“飄動(dòng)”效果的核心參數(shù)之一。適當(dāng)調(diào)高升力比如0.1-0.3再結(jié)合一點(diǎn)風(fēng)力布料就會(huì)有非常自然的起伏和飄蕩感而不是死板地下垂。很多新手會(huì)忽略這個(gè)參數(shù)。拉伸與彎曲 定義布料抵抗形變的能力。拉伸剛度 布料抵抗被拉長的能力。棉質(zhì)T恤這個(gè)值較低氨綸或橡膠材質(zhì)則極高。技巧要模擬柔軟的布料這個(gè)值不宜過高否則會(huì)像帆布一樣硬。但也不能太低否則輕輕一拉就變形得不成樣子。通常200-1000是個(gè)安全范圍。彎曲剛度 布料抵抗彎曲的能力。紙很硬高彎曲剛度絲綢很軟低彎曲剛度。降低這個(gè)值布料褶皺會(huì)更豐富、更柔軟。拉伸阻尼 布料拉伸后恢復(fù)原狀時(shí)的“粘滯感”。高阻尼會(huì)讓布料拉伸后緩慢收回像沾了糖漿低阻尼則會(huì)讓它快速彈回。適當(dāng)增加阻尼比如0.2-0.5可以消除布料那種令人討厭的高頻“抖動(dòng)”讓運(yùn)動(dòng)更平滑。剪切與體積 高級控制項(xiàng)。剪切剛度 抵抗菱形變形的能力。對于大多數(shù)編織物這個(gè)值可以保持默認(rèn)或略低于拉伸剛度。體積 這是一個(gè)極其重要但常被誤解的參數(shù)。它不是指布料的厚度而是指布料在受到擠壓時(shí)傾向于保持其原始體積的程度。想象一下一個(gè)充了氣的氣球高體積保持和一塊海綿低體積保持。對于單層布料如襯衫這個(gè)值應(yīng)該設(shè)得很低接近0否則布料會(huì)表現(xiàn)得像內(nèi)部有空氣撐起來一樣顯得臃腫。對于填充物如枕頭、沙發(fā)則需要調(diào)高這個(gè)值。實(shí)操心得 不要一上來就狂調(diào)參數(shù)。我的習(xí)慣是先設(shè)定一個(gè)合理的質(zhì)量如0.5然后把拉伸和彎曲剛度調(diào)到中間值如500和50空氣動(dòng)力學(xué)的升力給個(gè)0.15。播放模擬觀察基礎(chǔ)動(dòng)態(tài)。如果布料下墜得太快太死就減小質(zhì)量或增加升力如果抖動(dòng)得太厲害就增加拉伸/彎曲阻尼。記住參數(shù)之間是聯(lián)動(dòng)的要像調(diào)音一樣綜合調(diào)整。3.2 碰撞與力場讓布料與環(huán)境互動(dòng)布料自己動(dòng)起來只是第一步讓它和場景中的其他物體正確互動(dòng)才是模擬真實(shí)的難點(diǎn)。自碰撞 勾選這個(gè)布料會(huì)計(jì)算自己與自己之間的碰撞防止穿模。這是做出復(fù)雜褶皺如袖子堆疊、布料堆積在地面的必備選項(xiàng)。但是它也是性能殺手。開啟后計(jì)算量呈指數(shù)級增長。技巧1 在布料碰撞標(biāo)簽頁下調(diào)整自碰撞距離。這個(gè)值定義了布料頂點(diǎn)之間保持的最小距離。值太小如默認(rèn)的0.001米計(jì)算極其精確但也極其緩慢值稍微調(diào)大如0.005米能大幅提升速度且對視覺影響微乎其微除非是極薄如絲綢的布料。技巧2 使用質(zhì)量頂點(diǎn)組功能。你可以創(chuàng)建一個(gè)頂點(diǎn)組只把容易發(fā)生自碰撞的區(qū)域如腋下、褲襠的頂點(diǎn)加進(jìn)去然后只在“自碰撞”設(shè)置中應(yīng)用這個(gè)頂點(diǎn)組。這樣其他部分不計(jì)算自碰撞能節(jié)省大量資源。外部碰撞 這是布料與場景中其他物體的碰撞。在布料的碰撞標(biāo)簽頁你可以設(shè)置布料的碰撞距離和摩擦。同時(shí)別忘了給希望與布料碰撞的物體如角色身體、桌子添加碰撞體物理屬性。力場 風(fēng)、渦流、磁力等力場是讓布料動(dòng)畫生動(dòng)的靈魂。在場景中添加一個(gè)“力場”物體如風(fēng)力然后在布料的力場權(quán)重標(biāo)簽頁中調(diào)整布料受各種力場影響的強(qiáng)度。一個(gè)高級技巧使用紋理來驅(qū)動(dòng)力場權(quán)重。例如你可以用一張?jiān)氩y理來控制布料不同部位受風(fēng)力的強(qiáng)度這樣就能做出風(fēng)掠過布料表面時(shí)那種不均勻的、波動(dòng)的效果比均勻的風(fēng)力真實(shí)得多。3.3 形變與約束給布料“穿骨架”很多時(shí)候我們并不希望布料完全自由模擬。比如一件襯衫我們希望它的領(lǐng)口和袖口牢牢地“縫”在角色身體上。這就需要用到約束。固定頂點(diǎn)組 最常用的約束。在編輯模式下選中你希望完全固定不動(dòng)的頂點(diǎn)如襯衫肩膀處的頂點(diǎn)將其指定給一個(gè)頂點(diǎn)組。然后在布料的形變固定里選擇這個(gè)頂點(diǎn)組。這樣這些頂點(diǎn)就會(huì)像被釘住一樣布料模擬會(huì)從這些固定點(diǎn)開始計(jì)算下垂和飄動(dòng)。釘固約束 比固定更靈活。它允許你將布料頂點(diǎn)“釘”到另一個(gè)物體甚至是空物體上。你可以通過關(guān)鍵幀動(dòng)畫來控制這個(gè)“釘”的強(qiáng)度從0到1從而實(shí)現(xiàn)布料被逐漸撕下或掛起的效果??p紉 用于將兩塊獨(dú)立的布料物理模擬“縫合”在一起。你需要先在兩塊布料的邊緣分別創(chuàng)建頂點(diǎn)組然后在物理屬性中啟用“縫紉”并指定對應(yīng)的頂點(diǎn)組。這對于制作復(fù)雜的、由多片布料拼接而成的服裝至關(guān)重要。4. 碰撞系統(tǒng)全攻略不僅僅是“別穿過去”碰撞系統(tǒng)是物理世界的交通規(guī)則。Blender提供了多種碰撞體類型適用于不同場景。4.1 碰撞體類型與選擇策略給一個(gè)物體添加“碰撞”物理屬性后你首先面臨的就是類型選擇網(wǎng)格 使用物體原始的網(wǎng)格形狀進(jìn)行最精確的碰撞計(jì)算。精度最高但性能消耗也最大。僅推薦給形狀簡單、面數(shù)極少的碰撞體或者最終渲染前的高精度模擬。凸包最常用、最推薦的選項(xiàng)。Blender會(huì)計(jì)算物體的凸包外殼想象成用保鮮膜緊緊包裹物體形成的最外層凸面體并用這個(gè)簡化形狀進(jìn)行碰撞計(jì)算。對于大多數(shù)物體如盒子、球、角色身體凸包都能很好地近似且速度比網(wǎng)格快幾個(gè)數(shù)量級。技巧 對于凹形物體如碗、房間凸包會(huì)失效因?yàn)橥拱鼰o法表現(xiàn)凹陷。這時(shí)有兩個(gè)選擇1使用“網(wǎng)格”類型但確保該物體面數(shù)足夠低2使用多個(gè)凸包形狀的物體來拼湊出一個(gè)凹形空間。例如用一個(gè)倒扣的“凸包”盒子加一個(gè)“凸包”底板來模擬房間這是游戲開發(fā)中標(biāo)準(zhǔn)的優(yōu)化手段。球體、盒子、膠囊體、圓柱體、圓錐 這些是圖元形狀。當(dāng)你的物體恰好是或近似這些形狀時(shí)選擇對應(yīng)的圖元能得到最佳性能和最穩(wěn)定的碰撞效果。例如給一個(gè)柱狀欄桿直接用“圓柱”碰撞體。避坑指南 永遠(yuǎn)不要用高面數(shù)的網(wǎng)格物體直接做碰撞體一個(gè)數(shù)萬面的復(fù)雜雕像如果設(shè)為“網(wǎng)格”碰撞體你的模擬速度會(huì)慢如蝸牛。正確做法是復(fù)制這個(gè)雕像在編輯模式下進(jìn)行劇烈的減面使用“溶解”或“精簡”修改器減到幾十或幾百個(gè)面然后把這個(gè)低模隱藏不渲染并設(shè)置為“凸包”碰撞體。高模負(fù)責(zé)渲染低模負(fù)責(zé)碰撞這是行業(yè)通用做法。4.2 碰撞參數(shù)精講距離 這個(gè)參數(shù)定義了碰撞體表面向外“擴(kuò)張”的一個(gè)隱形緩沖區(qū)。當(dāng)其他物體進(jìn)入這個(gè)緩沖區(qū)范圍內(nèi)碰撞力就開始生效。適當(dāng)增加距離如0.01米可以非常有效地防止高速運(yùn)動(dòng)的小物體如小球從兩個(gè)碰撞體的縫隙中穿過這是解決“漏碰撞”的利器。彈性 碰撞后的反彈程度。1.0像超級彈力球0.0像一塊泥巴砸墻上。對于布料與身體的碰撞通常設(shè)為0.0-0.3模擬能量被吸收的感覺。摩擦 分為靜摩擦物體從靜止到運(yùn)動(dòng)所需克服的力和動(dòng)摩擦運(yùn)動(dòng)過程中持續(xù)的阻力。對于布料在粗糙木頭桌面滑動(dòng)可以增加摩擦對于絲綢在玻璃上則減小摩擦。阻尼 碰撞過程中能量損失的速度。高阻尼會(huì)讓碰撞后的運(yùn)動(dòng)迅速停止。4.3 高級碰撞技巧粒子與軟體碰撞布料和碰撞體的設(shè)置是基礎(chǔ)但真實(shí)世界往往更復(fù)雜。布料與布料碰撞 兩塊布料之間要能互相碰撞除了各自都要開啟碰撞還需要在場景屬性剛體世界是的布料碰撞也歸它管中確保對應(yīng)的碰撞分組是相互啟用的。有時(shí)候模擬奇怪就是因?yàn)檫@里沒勾選。與粒子系統(tǒng)交互 這是做出灰塵落在布料上、雨水打濕衣衫等效果的關(guān)鍵。你需要將粒子系統(tǒng)的“物理”類型設(shè)置為“牛頓”然后在“力場”設(shè)置中將布料的碰撞物體添加到粒子的“碰撞”列表中。同時(shí)可以在布料的碰撞標(biāo)簽頁下調(diào)整對粒子的阻尼和摩擦來控制粒子是彈開還是附著在布料表面。優(yōu)化策略 當(dāng)場景中有大量碰撞體時(shí)比如一堆散落的積木性能會(huì)成為問題。除了使用凸包/圖元還可以分層模擬 先模擬靜止物體的碰撞比如掉落到地面堆好的箱子烘焙緩存它們的動(dòng)畫。然后再在這些靜止的碰撞體上模擬布料這樣可以避免每一幀都重新計(jì)算所有碰撞。調(diào)整剛體世界精度 在場景屬性的剛體世界標(biāo)簽下有“步長”參數(shù)。降低主步長如從0.01降到0.02能大幅提速但會(huì)降低模擬精度。通??梢耘浜显黾印白硬健睌?shù)量來彌補(bǔ)這是一種用計(jì)算量換精度/速度的權(quán)衡。5. 完整工作流實(shí)戰(zhàn)制作一個(gè)飄落的桌布我們通過一個(gè)經(jīng)典案例把上面的知識點(diǎn)串起來一塊桌布從空中飄落蓋住一張方桌和桌上的幾個(gè)物體一個(gè)球體、一個(gè)杯子。步驟1場景準(zhǔn)備創(chuàng)建一張方桌立方體幾個(gè)簡單的擺設(shè)球體、環(huán)狀體做杯子。創(chuàng)建一個(gè)比桌面大的平面作為桌布。關(guān)鍵 為獲得更好的模擬效果將平面細(xì)分多次至少30x30格或者在布料屬性下開啟“高質(zhì)量”求解器更吃性能。步驟2物理屬性設(shè)置桌布 添加“布料”物理屬性。物理材質(zhì) 質(zhì)量設(shè)為0.8稍重拉伸剛度400彎曲剛度10柔軟阻尼0.3升力0.12。碰撞 開啟自碰撞距離調(diào)至0.004。在“碰撞”標(biāo)簽頁確?!芭c碰撞體”是開啟的。形變 暫時(shí)不固定任何點(diǎn)讓它完全自由下落。桌子、球、杯子 全部添加“碰撞”物理屬性。類型 桌子用“盒子”球用“球體”杯子用“網(wǎng)格”因?yàn)榄h(huán)狀體凹形凸包不準(zhǔn)但面數(shù)低可用網(wǎng)格。參數(shù) 統(tǒng)一將“距離”增加到0.015防止桌布邊緣快速掠過時(shí)穿透。步驟3初始狀態(tài)與模擬將桌布平面移動(dòng)到桌子正上方一段距離。將時(shí)間軸長度設(shè)為約150幀5秒。在布料屬性的“緩存”標(biāo)簽頁點(diǎn)擊“烘焙”按鈕。Blender會(huì)開始計(jì)算每一幀的布料形態(tài)。烘焙完成后播放動(dòng)畫桌布應(yīng)自然下落并覆蓋桌面物體。步驟4問題排查與優(yōu)化問題A桌布穿過了桌面。檢查桌子的碰撞體類型是否為“盒子”并確認(rèn)“距離”參數(shù)是否足夠。確保在剛體世界設(shè)置中布料和桌子的碰撞層是相互作用的。問題B桌布在桌子邊緣或杯子上抖動(dòng)劇烈。增加布料的“阻尼”值。或者在布料的“力場權(quán)重”中將“碰撞”的阻尼因子調(diào)高。問題C模擬速度太慢。嘗試關(guān)閉“自碰撞”看是否改善。如果必須開自碰撞嘗試將布料的網(wǎng)格簡化在模擬前加一個(gè)“精簡”修改器并應(yīng)用在布料修改器之上或者降低“質(zhì)量”下的“采樣”數(shù)會(huì)降低精度。問題D桌布形態(tài)不自然像塑料布。降低“彎曲剛度”增加“質(zhì)量”。微調(diào)“升力”值給一點(diǎn)空氣感。步驟5添加細(xì)節(jié)風(fēng)場 在場景中添加一個(gè)“風(fēng)力”力場強(qiáng)度設(shè)為2-3稍微旋轉(zhuǎn)一個(gè)角度。在桌布的“力場權(quán)重”中調(diào)整風(fēng)力的影響系數(shù)。你可以看到桌布飄落時(shí)有了更動(dòng)態(tài)的起伏。固定點(diǎn) 如果你希望桌布像桌旗一樣只有一部分垂下可以在編輯模式下選擇靠近桌子一側(cè)邊緣的頂點(diǎn)創(chuàng)建頂點(diǎn)組并固定。6. 常見疑難雜癥與解決方案實(shí)錄即使理解了原理實(shí)操中還是會(huì)遇到各種妖魔鬼怪。這里記錄幾個(gè)最讓人頭疼的問題和我的解決思路。問題1布料模擬時(shí)出現(xiàn)劇烈的、不規(guī)則的爆炸或撕裂。原因 幾乎可以肯定是初始狀態(tài)穿插。在模擬開始的第一幀布料的某個(gè)頂點(diǎn)已經(jīng)嵌入了碰撞體內(nèi)部。解決逐幀檢查第一幀切換到線框模式仔細(xì)觀察布料網(wǎng)格與碰撞體之間是否有交叉。確保布料初始位置與所有碰撞體保持安全距離。大幅增加碰撞體的“距離”參數(shù)提供一個(gè)更大的安全緩沖。在布料的“形變”中使用“起始動(dòng)畫”功能讓前若干幀如10幀布料緩慢地從初始位置“過渡”到模擬狀態(tài)而不是瞬間開始受力。問題2布料變得異常僵硬或者局部像被凍住一樣不動(dòng)。原因 可能是過度約束或頂點(diǎn)權(quán)重問題。如果你使用了頂點(diǎn)組來固定或調(diào)節(jié)參數(shù)檢查這些頂點(diǎn)組的權(quán)重繪畫是否過渡不自然出現(xiàn)了非黑即白0或1以外的奇怪值如0.5。模擬器對這些中間值的處理有時(shí)會(huì)出錯(cuò)。解決檢查所有用于布料屬性的頂點(diǎn)組在權(quán)重繪制模式下使用“模糊”工具讓權(quán)重過渡更平滑。暫時(shí)取消所有頂點(diǎn)組約束看布料是否恢復(fù)正常。如果恢復(fù)了再逐一添加約束并檢查。檢查布料的“硬度”參數(shù)是否被意外調(diào)得極高。問題3烘焙好的模擬緩存再次打開文件后播放效果不一樣或出錯(cuò)。原因 Blender的物理緩存是絕對路徑引用且依賴于精確的Blender版本和物理引擎設(shè)置。解決規(guī)范操作 在烘焙緩存前先保存文件。烘焙完成后立即再次保存文件。這樣緩存路徑就被記錄在.blend文件中了。使用相對路徑 在Blender文件設(shè)置中啟用“相對路徑”。緩存管理 物理緩存文件通常存在tmp文件夾巨大。進(jìn)行版本管理或傳輸文件時(shí)要么一起打包緩存要么就做好重新烘焙的準(zhǔn)備。對于重要項(xiàng)目在最終確認(rèn)后可以將緩存打包到.blend文件內(nèi)部緩存面板有相應(yīng)選項(xiàng)這樣文件會(huì)變大但絕不會(huì)丟失緩存。問題4如何讓布料模擬得更快終極心法在滿足視覺要求的前提下使用盡可能低精度的模型進(jìn)行模擬。模型優(yōu)化 模擬用的布料網(wǎng)格面數(shù)夠用就行。一個(gè)100x100的平面和40x40的平面在中等距離渲染下觀感差異不大但計(jì)算量差好幾倍。為模擬專門做一個(gè)低模版本。碰撞體優(yōu)化 重申碰撞體務(wù)必用簡化模型、凸包或圖元。參數(shù)調(diào)整 降低“質(zhì)量”中的“采樣”值增加“自碰撞距離”在剛體世界降低“步長”。分層烘焙 如前所述將靜態(tài)碰撞體的動(dòng)畫先烘焙再在其上模擬動(dòng)態(tài)元素。布料和碰撞是Blender物理模擬中最具表現(xiàn)力也最耗心力的部分。它沒有一成不變的“完美參數(shù)”因?yàn)槊恳环N布料、每一個(gè)場景都是獨(dú)特的。最好的學(xué)習(xí)方法就是像上面做桌布一樣從一個(gè)簡單場景開始有目的地調(diào)整某一個(gè)參數(shù)觀察其帶來的變化并記下你的心得。當(dāng)你對“質(zhì)量”、“剛度”、“阻尼”、“升力”這些詞有了肌肉記憶般的理解時(shí)你就能讓任何虛擬布料按照你心中的樣子舞動(dòng)起來了。