Houdini中快速對克隆物體(abc文件)動(dòng)畫進(jìn)行隨機(jī)時(shí)間偏移
之前突然想研究一下houdini怎么給克隆的abc動(dòng)畫進(jìn)行隨機(jī)時(shí)間偏移,然后看到entagma的那個(gè)花瓣無限生長教程的時(shí)候來了靈感。
這里有一段C4D里面隨手k的一段動(dòng)畫:

導(dǎo)出abc文件后導(dǎo)入houdini進(jìn)行了用scatter撒點(diǎn)的克?。?/p>
現(xiàn)在每個(gè)克隆物體的動(dòng)畫一致,首先需要在copytopoint節(jié)點(diǎn)克隆目標(biāo)參考點(diǎn)的一側(cè)(右側(cè))添加一個(gè)attribute wrangle節(jié)點(diǎn),模式改成point,輸入vex代碼:
float randFrame = rand(ch('seed'));? ???//創(chuàng)建randFrame變量賦予隨機(jī)種子
addpointattrib(0,"randFrame",randFrame);? ? //把randFrame作為屬性創(chuàng)建給每個(gè)點(diǎn)

觀察geometry spreadsheet面板可以看到我們通過vex給scatter的每個(gè)點(diǎn)創(chuàng)建了自定義的randFrame屬性,但是現(xiàn)在每個(gè)點(diǎn)的隨機(jī)數(shù)都相同:

現(xiàn)在不想寫代碼了(主要對vex不是很熟),這時(shí)候可以用一個(gè)attribute randomize節(jié)點(diǎn)進(jìn)行隨機(jī)化,但這里我就直接用一個(gè)attribute adjust float節(jié)點(diǎn)了,Pattern Type改成random:

這時(shí)候看geometry spreadsheet面板上就顯示出每個(gè)點(diǎn)都有不同的隨機(jī)數(shù)了,但是這時(shí)候我們的隨機(jī)數(shù)還是0-1的數(shù)值,所以需要手動(dòng)映射一下。我們可以用vex寫fit01,但我這里就直接用一個(gè)attribute remap節(jié)點(diǎn)來映射(主要是可以手動(dòng)拉ramp來限定映射的區(qū)間):

在attribute remap節(jié)點(diǎn)上我設(shè)置的輸出最小最大值分別為-50和50,所以它會(huì)給我每個(gè)點(diǎn)都映射出-50到50的隨機(jī)數(shù)(后續(xù)作為隨機(jī)偏移幀)。接下來我們要對每個(gè)克隆物體的動(dòng)畫進(jìn)行隨機(jī)偏移,需要用到foreach節(jié)點(diǎn)進(jìn)行循環(huán)計(jì)算,在這之前先給abc文件添加一個(gè)timeshift節(jié)點(diǎn):

然后添加一個(gè)foreach point節(jié)點(diǎn)組,把copytopoint節(jié)點(diǎn)接到這兩個(gè)(begin和end)中間,attribute remap接到foreach begin節(jié)點(diǎn):

接下來我們對timeshift節(jié)點(diǎn)的frame寫一個(gè)表達(dá)式來進(jìn)行幀數(shù)的隨機(jī)偏移:
$F + int(point(-1,0,'randFrame',0))
// $F:當(dāng)前幀
????point(對象路徑名,點(diǎn)序號,屬性,索引)
????int:數(shù)據(jù)類型轉(zhuǎn)成整型

上面的point函數(shù)第一個(gè)值我寫了-1,所以需要手動(dòng)指定一個(gè)對象的地址,點(diǎn)擊add spare input創(chuàng)建一個(gè)地址欄,把foreach的begin拖進(jìn)去:

這樣通過對每個(gè)點(diǎn)進(jìn)行循環(huán)實(shí)現(xiàn)了對每個(gè)點(diǎn)上的克隆物體動(dòng)畫進(jìn)行隨機(jī)幀數(shù)偏移的計(jì)算:

但是這個(gè)方法好像有個(gè)bug,就是視圖在smooth shaded模式下有些abc文件物體的顯示會(huì)出問題,但是測試渲染的時(shí)候又沒問題,暫時(shí)不知道原因,先不管了。