關于我們 +
聯系電話
☎ 15838372021
☎ 15981827020郵件地址
✉ qijingcg@qq.com-
QQ客服
業務:1815355071
動畫:350334514
網絡:323183556
公司地址
高新區紐科科技園網站地址
http://www.akshbw.cn
RealFlow 翻譯教程之——破裂的肥皂泡(-)
肥皂泡每個人都吹過,甚至成人也會很有興趣的玩,還嘗試玩出不同花樣。除了好玩,肥皂泡還有一些非常有趣的科學背景。
圖1.一個真實的肥皂泡(圖片出自 Mila Zinkova,發布在GUN,我是在維基百科找到的)
表面張力或許是肥皂泡最重要的一個特性了。因為表面張力的存在,這也是肥皂泡會在空氣中搖擺不定的原因。另一個由表面張力產生的效果是,肥皂泡是球形的。假如沒有外部環境(重力,空氣阻力等等),肥皂泡將是一個完美的球形。因為它們總有形成,稱為極小曲面(minimal surface)的趨向。
你一開始看到肥皂泡,你可能會認為它有很高的表面張力,其實正好相反。肥皂和洗滌劑表面張力很低,如果不是這樣肥皂泡就不會產生了。因為水的表面張力很高,肥皂泡會立即破裂。
另一個讓人印象深刻的是肥皂泡很漂亮。它總是有很多顏色,他們反射的顏色看起來在晃動,混合了油一樣。肥皂泡有這么的豐富顏色,因為它的壁很薄。當水蒸發時(肥皂泡變。,會有不太顯眼的顏色。當然這個效果不能用RealFlow模擬。但可以用物理渲染引擎做到,讓它看起來五顏六色。在渲染時你可以調節材質的不同厚度,得到不同顏色。
第一步:怎么在RealFlow里創建一個泡泡
第一步就是創建泡泡。在這個例子里,填充模型做泡泡,不是一個好方法,因為它要一個盡可能薄的空心物體。用單個粒子層可以達到這個目的。在RealFlow里有這樣幾種方法來做成這種結構:
1把.粒子均勻分布的Python腳本
2.“sphere”發射器
3.“Fill Object”發射器和“k sphere”輔助器結合
4.激活“Particle layer”設置的“Fill Object”發射器
第一個方法能給你很好的效果,因為你能得到一個沒有任何縫隙或孔洞的球體。但用粒子腳本是有問題的。原因是每一個粒子有一個確定的基于Resolution值的半徑。
這半徑是很重要的,因為為直接影響粒子之間的力。如果粒子之間距離非常近,你會觀察到互相排斥的效果,流體會變得不穩定。也可以用非常低的內壓“Int Pressure”參數減少這排斥值,但那時就會失去流體的特性看起來像dumb粒子。 這所以是Dumb粒子,當然就是因為非常低的”Int Pressure“值。
圖2:分布規則的球體
你可以降低“Resolution”值,但不容易找到正確的值。如果太高,很難與粒子交互;太低,流體粒子就會亂飛。
第二個方法是使用“Sphere”發射器。用這個方法也可以創建一個很薄的粒子層。你僅僅需要把"speed"值設成很低,例如 0.1 。然后第一幀后停止發射。這樣可以管理表達式或動畫關鍵幀。
可能最好的方法就是基于"Fill Object"發射器。這發個發射器提供了兩種模式:第一個模式是填充模型。填充好后你可以把“k volume”輔助器放在模型里面(“Inverse=Yes”),刪除多余的粒子。當然輔助器半徑可以做些調整,根據空心的模型來調。結果還不錯,但你可以在下面的圖片看到,看起來像有花紋的圖案。這方法可以輕松控制厚度并能根據需要,用大量粒子。

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

這個方法另一個優點是:你不需要任何初始狀態,因為粒子層是Realflow直接創建的,存儲或改變時只要“Reset”一下就可以。
第二步:腳本
做這個效果的腳本是很短的,也很容易理解。在寫腳本之前,很重要的一件事就是你要知道我們要做成什么效果。我想在粒子層上開一個漸漸擴大的洞。在這個過程中,流體其它部分必須不受影響,保持原樣。
所以第一步就需要凍結所有粒子,然后把他們速度設置成0.0。再然后就開始定義,到底在泡泡哪個地方破裂。函數要允許我們把擴散的種子(seed)放在整個表面,或完美的限制他們在一個特定區域。這部分要在模擬前執行,盡管它是"Simulation Events"腳本:
Layout>Simulation Events
初始化場景
窗口彈出時,你會看到兩個部分。上面部分是模擬事件分支,下面部分是Python 代碼部分。腳本預設必須添加在”SimulationPre“:
SimulationPre > Right-click > Add script...(RF5版本后,Layout-->Simulation Events<Ctrl+F2> 打開下圖3窗口)
此操作會打開另一個窗口,你可以輸入腳本:
# 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)
第一個代碼片段只是簡單的調用發射器和粒子。通過循環全所有粒子凍結用freeze()函數。這個函數功能是使粒子保持當前所有狀態,例如,velocity和position.直接粒子不再鎖定時。

圖3:初始化"Simulation Evets"窗口腳本 .
腳本第二部分是很有趣的,因為會定義種子(seed)。在這個例子,種子(seed)是產生隨機。為此,腳本從“particleList”函數指定粒子的總數。要控制種子(seed)影響更多或更少區域,整個粒子數除以50.如果想靠近一點,可以除以100,或500,如除以1則遍布整個表面。接下來循環
for i in range(0,4):
用來創建4個種子粒子。如果你想要增多種子,只要簡單的改變括號里第二個數字,例如(0,2)或(0,8)。結果是一個隨機數,可以用來尋找一定的粒子,通過利用粒子的ID數。ID被存儲起來供進一步使用。
最后,所有相關數據必須存儲在被為全局變量的里面。這個變量是一種,當你想共享不同腳本(類型)下的值/變量(例如Batch -> SimulationPre, FramesPre -> StepsPost 等等)和當變量要永久存儲(值固定)。全局變量是“oldRadius”和“idList”。這“idList”是,當然需要種子粒子ID。“oldRadius”變量決定種子粒子周圍破裂的大小。它值要很小獲得連續效果。它甚至可以是0.
模擬
第二部分是腳本控制模擬,在"FramesPre"下,在simulation events tree (模擬事件分支)。這里腳本輸出和用粒子ID,和初始半徑。另外,循環需要遍歷整個粒子。當一個ID存在于“idList”,腳本就繼續擴散到相關連粒子。
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)粒子周圍一定半徑內相鄰粒子。一旦種子(seed)識別出周圍粒子,它就會解鎖,然后(再次)受到輔助器和力影響。為了使破裂變得更有豐富,每個種子粒子有不一樣的初始半徑。這些半徑存儲在擴散列表:“initialradiiList”里。
要獲得種子粒子周圍漸漸增長區域,老的半徑值(oldRadius)必須要被“newRadius”取代。這只能通過全局變量,因為這種類型,不會被清空,在模擬步驟執行后。
在此腳本計數器是必要的,從“initialRadiiList”不同的半徑值分配到每個種子粒子:在腳本第一部分四個種子粒子已經設置了。所以必須要除以這四個半徑值。如果ID找到,腳本會從這個列表中給出適當半徑值,例如,半徑值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
請注意,Python列表總是從0開始,第三個位置在"initialradiList"數字是"2":0,1,2,3。
在這個階段的腳本已經標出相關種子粒子和相鄰粒子,F在完成遍歷,相鄰粒子,接受"unfreeze()"函數。但這是特別的。這里涉及到種子粒子,因為他們要保持接近他們的初始狀態。想像一個種子粒子,受“Noise field”場影響,在泡泡表面。在這個例子里,腳本找不到相鄰粒子就不會繼續破裂,那會停止在某個點。為避免這個,每個種子粒子速度將要放緩:
if (neighbor.getId() in idList):
particle.setVelocity(Vector.new(0,0,0))
發射器設置
設置發射器實際上只是簡單的幾個步驟。但在你開始往下做時,必須要在Global Links面板移除“sphere”結點,因為它很影響粒子。
為了在表面得到足夠多粒子,很高的resolution是必要的。在這個場景"Resolution"值是 1000.0 對 2*2*2球體,有 5120個面。仍然會在粒子間看到一些邊線,但做成mesh就看不到了。如果你要創建更多粒子,可以自由的改變這些值。你會看到模擬,仍然是很快的,盡管因為Python腳本,都是用單核模擬的。
為了要凸起的流體界線,“Ext pressure”要設置到5.這將有助于保持粒子靠近一起,避免粒子逃逸。
最后,“Surface tension”。代替發射器值,你可以用Surface tension輔助器(同名),激活“Balanced”設置,但這不是必須的。必要的是在“Surface tension”上key幀,讓模擬結果更真實一點。在介紹真實的肥皂泡時,你知道真正的肥皂泡表面張力是很小的,但那只是自然界中,這是模擬。在RealFlow我們可以用各種方法模擬,達到想要的效果。因此設置時數值是否符合自然界中,是不重要的。要達到所需要的外觀和形態時就要很高的“Surface tension”值,如果這值很低,泡泡就會毀掉。這是“Surface tension”動畫曲線:

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

圖4.粒子表達破裂的肥皂泡
在這圖片你能清楚的看到不同的速度,但你的模擬可能只會顯示一個統一的藍色外觀。要有不一樣外觀,到發射器”Display“面板,用下面的設置
Node Params > Display > Automatic range > No
Node Params > Display > Max range > 0.4
Mesh (網絡)
所有的部分就是為了創建一個好的mesh。因為肥皂泡是非常易碎的,mesh要盡可能的薄。當然,mesh有一個確定的厚度,你不能創建一個單面的模型,或mesh僅是由一個面幾何體構成。最終設置,是基于粒子數量和場景大小。

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

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

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

重要提示
在 2011.10.5號之前的PDF教程“Bursting Soap Bubble”,有一個錯誤。第二個腳本不能放在“StepsPre”,應放在“FramesPre”。非常感謝來自 孟買/印度(Mumbai/India)的朋友 Sukumar Senthil Raj,告訴我們這個錯誤。正確的教程已經放到下載欄了。
此免費教程教你怎樣創建一個,在慢鏡頭中慢慢破裂肥皂泡的漂亮效果。用一點Python腳本就可以幫助你能,確定肥皂泡的不同表面區域破裂。一旦表達破開,效果就會波及整個泡泡。
雖然此效果可以不需要腳本,但為了更好的控制還是使用的好。
1.效果速度傳播
2.可以輕松定義表面到底哪個區域破裂
3.當破裂產生就定義新的點
4.此效果不只限于肥皂泡,可用于任意開關
最后,創建這流體特殊效果要做的一些設置,僅僅是非常高的表面張力值(tension)。輔助器和力也很重要。當然要進行Mesh操作,另一個是原因是,因為我們想輸出一個肥皂泡,最好也是用Mesh。你能在右邊看到兩個視頻,第一個是在RealFlow里Mesh過的樣子,第二個是輸出渲染過的版本。
總之這個慢慢破裂的肥皂泡效果是非?晌说模憧梢约由掀渌O置,應用在不同場合,例如用kill輔助器做成,等離子球或融化效果。
展示出你的作品
當然一個教程只能是一種解決問題的方法,我們希望你多調調參數,力和動畫曲線,并展示出你的實現方法。我們對你作的教程很感興趣,你可以在網站上發靜幀或給我們視頻鏈接。