關(guān)于我們+
-
📞 聯(lián)系電話
15838372021 15981827020 -
✉ 郵件地址
qijingcg@qq.com -
💬 QQ客服
業(yè)務(wù):1815355071 動(dòng)畫:350334514 網(wǎng)絡(luò):323183556 -
📍 公司地址
高新區(qū)紐科科技園 -
🔗 網(wǎng)站地址
m.free-room.cn
RealFlow 翻譯教程之——破裂的肥皂泡(-)
肥皂泡每個(gè)人都吹過,甚至成人也會(huì)很有興趣的玩,還嘗試玩出不同花樣。除了好玩,肥皂泡還有一些非常有趣的科學(xué)背景。

圖1.一個(gè)真實(shí)的肥皂泡(圖片出自 Mila Zinkova,發(fā)布在GUN,我是在維基百科找到的)
表面張力或許是肥皂泡最重要的一個(gè)特性了。因?yàn)楸砻鎻埩Φ拇嬖冢@也是肥皂泡會(huì)在空氣中搖擺不定的原因。另一個(gè)由表面張力產(chǎn)生的效果是,肥皂泡是球形的。假如沒有外部環(huán)境(重力,空氣阻力等等),肥皂泡將是一個(gè)完美的球形。因?yàn)樗鼈兛傆行纬桑Q為極小曲面(minimal surface)的趨向。
你一開始看到肥皂泡,你可能會(huì)認(rèn)為它有很高的表面張力,其實(shí)正好相反。肥皂和洗滌劑表面張力很低,如果不是這樣肥皂泡就不會(huì)產(chǎn)生了。因?yàn)樗谋砻鎻埩芨撸试砼輹?huì)立即破裂。
另一個(gè)讓人印象深刻的是肥皂泡很漂亮。它總是有很多顏色,他們反射的顏色看起來在晃動(dòng),混合了油一樣。肥皂泡有這么的豐富顏色,因?yàn)樗谋诤鼙 .?dāng)水蒸發(fā)時(shí)(肥皂泡變薄),會(huì)有不太顯眼的顏色。當(dāng)然這個(gè)效果不能用RealFlow模擬。但可以用物理渲染引擎做到,讓它看起來五顏六色。在渲染時(shí)你可以調(diào)節(jié)材質(zhì)的不同厚度,得到不同顏色。
第一步:怎么在RealFlow里創(chuàng)建一個(gè)泡泡
第一步就是創(chuàng)建泡泡。在這個(gè)例子里,填充模型做泡泡,不是一個(gè)好方法,因?yàn)樗粋(gè)盡可能薄的空心物體。用單個(gè)粒子層可以達(dá)到這個(gè)目的。在RealFlow里有這樣幾種方法來做成這種結(jié)構(gòu):
1把.粒子均勻分布的Python腳本
2.“sphere”發(fā)射器
3.“Fill Object”發(fā)射器和“k sphere”輔助器結(jié)合
4.激活“Particle layer”設(shè)置的“Fill Object”發(fā)射器
第一個(gè)方法能給你很好的效果,因?yàn)槟隳艿玫揭粋(gè)沒有任何縫隙或孔洞的球體。但用粒子腳本是有問題的。原因是每一個(gè)粒子有一個(gè)確定的基于Resolution值的半徑。
這半徑是很重要的,因?yàn)闉橹苯佑绊懥W又g的力。如果粒子之間距離非常近,你會(huì)觀察到互相排斥的效果,流體會(huì)變得不穩(wěn)定。也可以用非常低的內(nèi)壓“Int Pressure”參數(shù)減少這排斥值,但那時(shí)就會(huì)失去流體的特性看起來像dumb粒子。 這所以是Dumb粒子,當(dāng)然就是因?yàn)榉浅5偷?rdquo;Int Pressure“值。

圖2:分布規(guī)則的球體
你可以降低“Resolution”值,但不容易找到正確的值。如果太高,很難與粒子交互;太低,流體粒子就會(huì)亂飛。
第二個(gè)方法是使用“Sphere”發(fā)射器。用這個(gè)方法也可以創(chuàng)建一個(gè)很薄的粒子層。你僅僅需要把"speed"值設(shè)成很低,例如 0.1 。然后第一幀后停止發(fā)射。這樣可以管理表達(dá)式或動(dòng)畫關(guān)鍵幀。
可能最好的方法就是基于"Fill Object"發(fā)射器。這發(fā)個(gè)發(fā)射器提供了兩種模式:第一個(gè)模式是填充模型。填充好后你可以把“k volume”輔助器放在模型里面(“Inverse=Yes”),刪除多余的粒子。當(dāng)然輔助器半徑可以做些調(diào)整,根據(jù)空心的模型來調(diào)。結(jié)果還不錯(cuò),但你可以在下面的圖片看到,看起來像有花紋的圖案。這方法可以輕松控制厚度并能根據(jù)需要,用大量粒子。

圖3.用"Fill Object"發(fā)射器填充的空心球粒子,輔助使用"K Sphere"輔助器
然后,用“Fill Object”第二種模式:“Particle layer”(粒子層)。當(dāng)這個(gè)設(shè)置為“Yes”,RealFlow會(huì)覆蓋滿球體表面,但不會(huì)出現(xiàn)幾何體交接線。優(yōu)點(diǎn)是流體是靜止的,因?yàn)檫@是RealFlow自動(dòng)計(jì)算正確粒子半徑,你可以增加“Resolution”到非常高的值,而不會(huì)出錯(cuò)。它也能減少粒子間縫隙,你只是需要一個(gè)很高分辨率的球體/泡泡做基礎(chǔ)。
用 RF_toolfactory’s “RF Toolbox Scripts”(最后一個(gè)教程會(huì)介紹這個(gè)工具)你可以重新創(chuàng)建很高分辨率的模型。
你可以在下面圖片看到結(jié)果。請(qǐng)注意這是較低resolution值版本,忽略相鄰邊線。

這個(gè)方法另一個(gè)優(yōu)點(diǎn)是:你不需要任何初始狀態(tài),因?yàn)榱W訉邮荝ealflow直接創(chuàng)建的,存儲(chǔ)或改變時(shí)只要“Reset”一下就可以。
第二步:腳本
做這個(gè)效果的腳本是很短的,也很容易理解。在寫腳本之前,很重要的一件事就是你要知道我們要做成什么效果。我想在粒子層上開一個(gè)漸漸擴(kuò)大的洞。在這個(gè)過程中,流體其它部分必須不受影響,保持原樣。
所以第一步就需要凍結(jié)所有粒子,然后把他們速度設(shè)置成0.0。再然后就開始定義,到底在泡泡哪個(gè)地方破裂。函數(shù)要允許我們把擴(kuò)散的種子(seed)放在整個(gè)表面,或完美的限制他們?cè)谝粋(gè)特定區(qū)域。這部分要在模擬前執(zhí)行,盡管它是"Simulation Events"腳本:
Layout>Simulation Events
初始化場(chǎng)景
窗口彈出時(shí),你會(huì)看到兩個(gè)部分。上面部分是模擬事件分支,下面部分是Python 代碼部分。腳本預(yù)設(shè)必須添加在”SimulationPre“:
SimulationPre > Right-click > Add script...(RF5版本后,Layout-->Simulation Events<Ctrl+F2> 打開下圖3窗口)
此操作會(huì)打開另一個(gè)窗口,你可以輸入腳本:
# Get the emitter, loop through its particles and freeze them
emitter = scene.getEmitter("Fill_Object01")
particleList = emitter.getParticles()
for particle in particleList:
particle.freeze()
# Determine four seed particles which are relatively close together
idList = []
maxId = len(particleList)/50
for i in range(0,4):
curId = random.randint(0, maxId)
idList.append(curId)
scene.setGlobalVariableValue("oldRadius", 0.005)
scene.setGlobalVariableValue("idList", idList)
第一個(gè)代碼片段只是簡(jiǎn)單的調(diào)用發(fā)射器和粒子。通過循環(huán)全所有粒子凍結(jié)用freeze()函數(shù)。這個(gè)函數(shù)功能是使粒子保持當(dāng)前所有狀態(tài),例如,velocity和position.直接粒子不再鎖定時(shí)。

圖3:初始化"Simulation Evets"窗口腳本 .
腳本第二部分是很有趣的,因?yàn)闀?huì)定義種子(seed)。在這個(gè)例子,種子(seed)是產(chǎn)生隨機(jī)。為此,腳本從“particleList”函數(shù)指定粒子的總數(shù)。要控制種子(seed)影響更多或更少區(qū)域,整個(gè)粒子數(shù)除以50.如果想靠近一點(diǎn),可以除以100,或500,如除以1則遍布整個(gè)表面。接下來循環(huán)
for i in range(0,4):
用來創(chuàng)建4個(gè)種子粒子。如果你想要增多種子,只要簡(jiǎn)單的改變括號(hào)里第二個(gè)數(shù)字,例如(0,2)或(0,8)。結(jié)果是一個(gè)隨機(jī)數(shù),可以用來尋找一定的粒子,通過利用粒子的ID數(shù)。ID被存儲(chǔ)起來供進(jìn)一步使用。
最后,所有相關(guān)數(shù)據(jù)必須存儲(chǔ)在被為全局變量的里面。這個(gè)變量是一種,當(dāng)你想共享不同腳本(類型)下的值/變量(例如Batch -> SimulationPre, FramesPre -> StepsPost 等等)和當(dāng)變量要永久存儲(chǔ)(值固定)。全局變量是“oldRadius”和“idList”。這“idList”是,當(dāng)然需要種子粒子ID。“oldRadius”變量決定種子粒子周圍破裂的大小。它值要很小獲得連續(xù)效果。它甚至可以是0.
模擬
第二部分是腳本控制模擬,在"FramesPre"下,在simulation events tree (模擬事件分支)。這里腳本輸出和用粒子ID,和初始半徑。另外,循環(huán)需要遍歷整個(gè)粒子。當(dāng)一個(gè)ID存在于“idList”,腳本就繼續(xù)擴(kuò)散到相關(guān)連粒子。
import random
# Prepare the variable, get the emitter and its particles
oldRadius = scene.getGlobalVariableValue("oldRadius")
idList = scene.getGlobalVariableValue("idList")
emitter = scene.getEmitter("Fill_Object01")
particleList = emitter.getParticles()
initialRadiiList = [0.005,0.009,0.015,0.012]
counter = 0
# Loop through all particles, get Ids
for particle in particleList:
theId = particle.getId()
# Check if the current Id is in already stored in the idList.
# If yes, calculate the radius around the seed particles.
if theId in idList:
newRadius = oldRadius + initialRadiiList[counter]
neighbors = particle.getNeighbors(newRadius)
counter += 1
# Replace the old radius with the new radius to simulate a grwoing area
scene.setGlobalVariableValue("oldRadius", newRadius)
# Loop through the particles around the seed and unfreeze its neighbours
for neighbor in neighbors:
if (neighbor.getId() in idList):
particle.setVelocity(Vector.new(0,0,0))
else:
neighbor.unfreeze()
腳本思路是,收集種子(seed)粒子周圍一定半徑內(nèi)相鄰粒子。一旦種子(seed)識(shí)別出周圍粒子,它就會(huì)解鎖,然后(再次)受到輔助器和力影響。為了使破裂變得更有豐富,每個(gè)種子粒子有不一樣的初始半徑。這些半徑存儲(chǔ)在擴(kuò)散列表:“initialradiiList”里。
要獲得種子粒子周圍漸漸增長(zhǎng)區(qū)域,老的半徑值(oldRadius)必須要被“newRadius”取代。這只能通過全局變量,因?yàn)檫@種類型,不會(huì)被清空,在模擬步驟執(zhí)行后。
在此腳本計(jì)數(shù)器是必要的,從“initialRadiiList”不同的半徑值分配到每個(gè)種子粒子:在腳本第一部分四個(gè)種子粒子已經(jīng)設(shè)置了。所以必須要除以這四個(gè)半徑值。如果ID找到,腳本會(huì)從這個(gè)列表中給出適當(dāng)半徑值,例如,半徑值3的種子(seed)粒子:
initialRadiiList = [0.005,0.009,0.015,0.012]
[ ... ]
if theId in idList:
newRadius = oldRadius + initialRadiiList[2] # (= 0.015)
neighbors = particle.getNeighbors(oldRadius + 0.015)
counter += 1 # Incement the counter to get the next radius value
請(qǐng)注意,Python列表總是從0開始,第三個(gè)位置在"initialradiList"數(shù)字是"2":0,1,2,3。
在這個(gè)階段的腳本已經(jīng)標(biāo)出相關(guān)種子粒子和相鄰粒子。現(xiàn)在完成遍歷,相鄰粒子,接受"unfreeze()"函數(shù)。但這是特別的。這里涉及到種子粒子,因?yàn)樗麄円3纸咏麄兊某跏紶顟B(tài)。想像一個(gè)種子粒子,受“Noise field”場(chǎng)影響,在泡泡表面。在這個(gè)例子里,腳本找不到相鄰粒子就不會(huì)繼續(xù)破裂,那會(huì)停止在某個(gè)點(diǎn)。為避免這個(gè),每個(gè)種子粒子速度將要放緩:
if (neighbor.getId() in idList):
particle.setVelocity(Vector.new(0,0,0))
發(fā)射器設(shè)置
設(shè)置發(fā)射器實(shí)際上只是簡(jiǎn)單的幾個(gè)步驟。但在你開始往下做時(shí),必須要在Global Links面板移除“sphere”結(jié)點(diǎn),因?yàn)樗苡绊懥W印?/p>
為了在表面得到足夠多粒子,很高的resolution是必要的。在這個(gè)場(chǎng)景"Resolution"值是 1000.0 對(duì) 2*2*2球體,有 5120個(gè)面。仍然會(huì)在粒子間看到一些邊線,但做成mesh就看不到了。如果你要?jiǎng)?chuàng)建更多粒子,可以自由的改變這些值。你會(huì)看到模擬,仍然是很快的,盡管因?yàn)镻ython腳本,都是用單核模擬的。
為了要凸起的流體界線,“Ext pressure”要設(shè)置到5.這將有助于保持粒子靠近一起,避免粒子逃逸。
最后,“Surface tension”。代替發(fā)射器值,你可以用Surface tension輔助器(同名),激活“Balanced”設(shè)置,但這不是必須的。必要的是在“Surface tension”上key幀,讓模擬結(jié)果更真實(shí)一點(diǎn)。在介紹真實(shí)的肥皂泡時(shí),你知道真正的肥皂泡表面張力是很小的,但那只是自然界中,這是模擬。在RealFlow我們可以用各種方法模擬,達(dá)到想要的效果。因此設(shè)置時(shí)數(shù)值是否符合自然界中,是不重要的。要達(dá)到所需要的外觀和形態(tài)時(shí)就要很高的“Surface tension”值,如果這值很低,泡泡就會(huì)毀掉。這是“Surface tension”動(dòng)畫曲線:

動(dòng)畫區(qū)間在0到120幀間從 200降到50.曲線是“Bezier”類型,創(chuàng)建第一幀的過程中,泡泡幾乎完好無損。
當(dāng)你點(diǎn)擊“Simulate”,現(xiàn)在你能在種子粒子周圍區(qū)域看到逃逸的粒子,或不想要的效果。要避免這個(gè),我建議你用更高的MIN substeps值,在25到50之間。它能保持一些加速的粒子。要保持速度穩(wěn)定,就添加輔助器。
輔助器
要除去非常快的粒子和保持流體穩(wěn)定,在場(chǎng)景里要用到三個(gè)輔助器:
1."k Isolated",這個(gè)輔助器除去孤立的粒子在 0.1秒后
2."K Speed"作用:粒子速度超過2.0就會(huì)被除去
3.”Drag force“這個(gè)輔助器把”Drag strength“調(diào)到5.0,有助于有一個(gè)合理的模擬環(huán)境和看起來更自然。
基于發(fā)射器設(shè)置,你可以調(diào)節(jié)輔助器參數(shù),但要有一個(gè)好的起始點(diǎn)。
要使模擬更豐富,和得到漩渦,添加"Noise field"場(chǎng)。通常使用值 0.2,來模擬,但“Space scale”3.0獲得的漩渦在更小的區(qū)域。最后輔助器是“Attractor”,要使排斥變得很小,"Internal force"值設(shè)為-0.1,來分散一點(diǎn)粒子。
你現(xiàn)在得到近似圖片上的效果了嗎:

圖4.粒子表達(dá)破裂的肥皂泡
在這圖片你能清楚的看到不同的速度,但你的模擬可能只會(huì)顯示一個(gè)統(tǒng)一的藍(lán)色外觀。要有不一樣外觀,到發(fā)射器”Display“面板,用下面的設(shè)置
Node Params > Display > Automatic range > No
Node Params > Display > Max range > 0.4
Mesh (網(wǎng)絡(luò))
所有的部分就是為了創(chuàng)建一個(gè)好的mesh。因?yàn)榉试砼菔欠浅R姿榈模琺esh要盡可能的薄。當(dāng)然,mesh有一個(gè)確定的厚度,你不能創(chuàng)建一個(gè)單面的模型,或mesh僅是由一個(gè)面幾何體構(gòu)成。最終設(shè)置,是基于粒子數(shù)量和場(chǎng)景大小。

在左邊圖片上泡泡有接近 92000個(gè)粒子。要圓滑幾何體邊線縫隙,“Smooth”值要被用到,除了減小filter值。用很低的"Polygon size"值可提供更多的細(xì)節(jié),調(diào)高就會(huì)損失細(xì)節(jié)。
要得到很薄的表面,mesh的“field”設(shè)置必須調(diào)節(jié)。這里你可以看到“Radius”值。這參數(shù)決定了球體的半徑(是指每個(gè)創(chuàng)建的粒子)。如果模擬不足,粒子值很小時(shí),你就會(huì)看到縫隙和孔洞。因?yàn)榍蝮w上粒子不能互相接觸到。當(dāng)你粒子數(shù)量很小時(shí),就要降低“Radius”,和減小mesh厚度。所以你如果想要一個(gè)非常薄的泡泡,就大大提高發(fā)射器的"Resolution"和減小mesh的“Radius”

圖5.Field設(shè)置
接下來的圖片,就是剛設(shè)的mesh結(jié)果,縫隙和孔洞,已經(jīng)看不到了。粒子呈一串串,和一絲絲狀,是由于很高的“surface tension”引起的。

一句話總結(jié):
當(dāng)當(dāng)哐!Fill Object ,Prticle layer建泡泡
嚓咔咔!模擬事件腳本是關(guān)鍵,初始化場(chǎng)景,控制模擬進(jìn)程
嘰嘰咕!發(fā)射器,輔助器,也要來幫忙
咂叭叭! mesh,mesh去渲染。
(不太押韻,有時(shí)間再修改,大家有好建議可以評(píng)論告訴我)
版權(quán)注意事項(xiàng)
所有在這文章中圖片,文字,和素材都屬于RF_toolfactory.你可以復(fù)制和分享這PDF,但不允許直接提供PDF下載。無論是在論壇,還是文件共享站,種子站或其它地方。但你可直接鏈接“simple Vortex”,進(jìn)行交流的目的,是可以的。
所有已經(jīng)給出的材料都做過最大的努力,但錯(cuò)誤不能完全排除。RF_toolfactory不為計(jì)算機(jī)或軟件崩潰和/或數(shù)據(jù)丟失負(fù)責(zé)。需要您自己承擔(dān)使用本材料腳本,和文件在你硬盤上的風(fēng)險(xiǎn)。
不允許轉(zhuǎn)賣PDF和素材。不允許刪除版權(quán)信息。如果你用這PDF圖片或文字到有其它目的,要標(biāo)明出處。
“Simple Vortex” by RF_toolfactory (http://www.rf-toolfactory.com)
謝謝。
RealFlow 翻譯教程之——破裂的肥皂泡(-)
2011-11-25 01:02:47| 分類: RealFlow探索 | 標(biāo)簽:realflow 肥皂泡 免費(fèi)教程 翻譯 豆芽兵 |字號(hào)大中小 訂閱
具體原因解釋請(qǐng)看問題總結(jié)日志:
內(nèi)容簡(jiǎn)介:

重要提示
在 2011.10.5號(hào)之前的PDF教程“Bursting Soap Bubble”,有一個(gè)錯(cuò)誤。第二個(gè)腳本不能放在“StepsPre”,應(yīng)放在“FramesPre”。非常感謝來自 孟買/印度(Mumbai/India)的朋友 Sukumar Senthil Raj,告訴我們這個(gè)錯(cuò)誤。正確的教程已經(jīng)放到下載欄了。
此免費(fèi)教程教你怎樣創(chuàng)建一個(gè),在慢鏡頭中慢慢破裂肥皂泡的漂亮效果。用一點(diǎn)Python腳本就可以幫助你能,確定肥皂泡的不同表面區(qū)域破裂。一旦表達(dá)破開,效果就會(huì)波及整個(gè)泡泡。
雖然此效果可以不需要腳本,但為了更好的控制還是使用的好。
1.效果速度傳播
2.可以輕松定義表面到底哪個(gè)區(qū)域破裂
3.當(dāng)破裂產(chǎn)生就定義新的點(diǎn)
4.此效果不只限于肥皂泡,可用于任意開關(guān)
最后,創(chuàng)建這流體特殊效果要做的一些設(shè)置,僅僅是非常高的表面張力值(tension)。輔助器和力也很重要。當(dāng)然要進(jìn)行Mesh操作,另一個(gè)是原因是,因?yàn)槲覀兿胼敵鲆粋(gè)肥皂泡,最好也是用Mesh。你能在右邊看到兩個(gè)視頻,第一個(gè)是在RealFlow里Mesh過的樣子,第二個(gè)是輸出渲染過的版本。
總之這個(gè)慢慢破裂的肥皂泡效果是非常可吸引人的,你可以加上其它設(shè)置,應(yīng)用在不同場(chǎng)合,例如用kill輔助器做成,等離子球或融化效果。
展示出你的作品
當(dāng)然一個(gè)教程只能是一種解決問題的方法,我們希望你多調(diào)調(diào)參數(shù),力和動(dòng)畫曲線,并展示出你的實(shí)現(xiàn)方法。我們對(duì)你作的教程很感興趣,你可以在網(wǎng)站上發(fā)靜幀或給我們視頻鏈接。
—— 鄭州奇境視覺動(dòng)畫公司 收集整理 【中原專業(yè)視覺圖像服務(wù)商-專注于建筑漫游動(dòng)畫,施工演示動(dòng)畫,產(chǎn)品展示動(dòng)畫】
