この記事はHoudiniAdventCalender2018 12月17日の記事です
皆様こんにちは
今年もAdventCalenderに参加できて光栄です。
蒸留水さんありがとうございます。
僕のネタは流体表現!!
ちょっとしたクリスマスプレゼント?になればうれしいです。
まず...
VFX流体の基礎として最低限抑えておきたい箇所を共有します(free)
https://drive.google.com/open?id=1zmmr_yaVmU2pRnpmsyvr4Txhbs5fPCho
Animationの基礎が分かっている前提で作成しています。
気になる部分があったら各自で調べるのをお勧めします。
ChristmasGift(HipFIle) はこちら
https://drive.google.com/open?id=15Zd1bI3qAyF9E5E5UngpqGSdp4S9hfag
さて...
Animationを考えた時に流体の動きのコントロールは何処でプログラム(管理)されているのか
掴んでおきましょう。
基本的なAnimation(lagrange)
Pos = currentPosiotn + velocity
int main
{
for (int i; iterate>= i; i++;)
{
vector Pos = currentPos;
vector v = (velocity*TimeInterval)*i;
//i = dt
@P = Pos +v;
}
}
pointPostionに直接変化量を待たせて、更新する。
基本的なAnimation(Euler)
Pos = currentPosiotn + velocity
int main
{
for (int i; iterate>= i; i++;)
{
vector Pos = currentPos;
vector v = (voxel_Velocity * TimeInterval)*i;
//voxel_Velocity = Sampling current_VelocityData
//i = dt
@P = Pos +v;
}
}
voxelに変化量を待たせて、それらを参照し更新する。
HoudiniのFluid_Dynamics_System
にも同様に当てはめることが出来ます。
voxelAnimation
とParticleANimation
の求め方の違いを握っておきましょう。
次にVolumeDisplacement
についてです
以下を参照してください。
https://drive.google.com/open?id=13r1GNWwifSjvVBrFq513QF84Egr0-ZWP
int main
{
vector idxPos = dnesityPosition;
vector directiornalVector = normalize(gradient(density))*(amount*lengthnormalize(gradient(density)));
vector pushUp = idxPos + directiornalVector
float density = voxelTrace_density(pushUp);
return density;
}
SurfaceDisplacementとVolumeDisplacementの違いをしっかりと復習しておきましょう
WaveletTurbulence & GridRessAdvection
Technical Paper
Wavelet Turbulence
https://www.cs.cornell.edu/~tedkim/WTURB/wavelet_turbulence.pdf
Gridress Advection
https://www.aps.org/units/dfd/meetings/upload/dfd2010-tessendorf.pdf
Other
https://people.cs.clemson.edu/~jtessen/papers_files/RIV.pdf
さっぱりな方は
これを...
https://drive.google.com/open?id=1x6lbRMJAqoUk2XbOTkiuPW7os21J4KdE
それでも分からない方は...
がんばってください
int main
{
vector Pos = dnesityPosition;
vector advectvelocity = cross(getvoxelvelocity,CameraSpace_Turbulence) *(1/FPS)*Timestep;
vector PositionSample_A = advectvelocity+ Pos;
vector PositionSample_B =(getvoxelvelocity(PositionSample_A) *(1/FPS)*Timestep;
Pos += PositionSample_B;
density = voxelTrace_density(Pos);
return density;
}
Hipfileを見ながら、AdventCalenderネタを閲覧していただけるといいと思います。
これらの式や考え方をhoudiniに落とし込んでいき
実際のプロジェクトにラスタライズしていき
最終的にtoolとしてリリースします。
質問や意見などありましたら
気軽に聞いてください。
いいね!と思ったらGoodボタン...
じゃなくて
ソーシャルに拡散していただけるとうれしいです。
ぼくにも皆さんの気持ち(クリスマスプレゼント)頂けるとうれしいなぁー
PATREON
https://www.patreon.com/Nerv_lol
では
皆様
お元気で~~~~~~~~~
PS: 告知忘れましたがHoudiniHive2018 Tokyoでプレゼンしたので良かったら見てやってください。
https://vimeo.com/305069852