Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CGの基礎理論を学べる!「テクニカルアーティストスタートキット」本を詳しく紹介 / CGWCC...

OLM Digital R&D
November 08, 2021

CGの基礎理論を学べる!「テクニカルアーティストスタートキット」本を詳しく紹介 / CGWCC2021-TA2021

[CG World クリエイティブカンファレンス2021] スライド
テクニカルアーティストを目指すクリエイターに不足がちだと思われる知識や、すぐに身に付く分野を厳選し解説した書籍「テクニカルアーティストスタートキット 改訂版」の著者が本書の読みどころをご紹介します。
この本は2012年に初版が出版されましたが、2021年の改訂版でいろいろと加筆しました。講演では、加筆部分を中心に本書のいくつかの章をピックアップして、わかりやすく説明いたします。
書籍紹介: https://www.borndigital.co.jp/book/23543.html

OLM Digital R&D

November 08, 2021
Tweet

More Decks by OLM Digital R&D

Other Decks in Design

Transcript

  1. はじめに • 著者紹介 • アジェンダ – 初版から改訂版へ – あらためてテクニカルアーティストとは? +

    この本のねらいは? – 新しく加えた部分をMaya Bifrostを使って紹介します! © OLM Digital, Inc. 2
  2. こんなことを書きました 1. カメラと座標系 2. プロシージャ 3. カラーモデル 4. ライティング、シェーディングとシャドウ 5.

    テクスチャ 6. パーティクル 7. NURBSとサブディビジョン 8. イメージ/ムービーフォーマット
  3. こんな感じのポジションです • 狙った画作り • カッコいいエフェクト • 無駄のないノード構成 • サクサク動くリグ •

    効率的なパイプライン • 量産体制の構築 • これらを実現させることができます
  4. 今日の内容 • 本の内容の一部の紹介 – 第2章 プロシジャー – 第6章 パーティクル •

    Bifrostで具体的な例 – 数式の実装 – Compound – Instance – Autoloop © OLM Digital, Inc. 24
  5. 概要 • Bifrostについて • TA本の例の紹介 – バウンドするボール • 数学、物理 ‐

    本に参考してください • スクリプト ‐ 勉強してください • パイプラインの重要性 • Autoloop, Instance – らせん • 数学 ‐ 本に参考してください • Compound、Autoloop、Instance • まとめ © OLM Digital, Inc. 25
  6. Bifrostとは • Bifrostの歴史 – 2009年、 Exotic Matter がNaiadを発表 • Avatarなどに使用

    – 2011年Autodeskが買収 – 2015年BOSS • Bifrost Ocean Simulation System – 2019年Bifrost Graph • Bifrostの特徴 – 流体シミュレーション – パーティクル、メッシュ・・・ – ノードベース – JIT • Fabricを覚えている人? © OLM Digital, Inc. 26
  7. なぜBifrost? • JIT⇒早い • ArnoldとMayaとの相性 – データのやり取り – レンダリングアトリビュート –

    GPUプレビュー • ノードエディターのUIが優秀 – ノードアトリビュートを最小限・追加とリネームしやすい – タイプの自動変換、Autoloop – Compound、Backdropで整理 • OpenVDB 、Alembic, PDC, Field3D, のサポート – そろそろUSDも(Bifrost v2.3.2.0 beta 以降) © OLM Digital, Inc. 27
  8. なぜBifrost? • インスタンスが強い • ノードが多い – 数式の実装 (add, multiply, sin,

    cos…) – メッシュ (sample_mesh_Uvs, get_closets_point…) – ボリューム (mesh_to_level_set, openvdb…) – シミュレーション (simulate_mpm, simulate_aero…) • Compoundライブラリー – 再利用しやすい – 勉強しやすい – Rebel Pack https://area.autodesk.com/downloads/rebel-pack-041/ – MJCG https://mjcg.gumroad.com/l/mjcg_compounds_2_0_0 – Autodesk Area https://area.autodesk.com/downloads/ © OLM Digital, Inc. 28
  9. プロシジャー、シミュレーション、キャッシュ • プロシジャー – 状態を持たない – 入力から出力 – 時間も入力 •

    前のフレームの計算しなくても計算ができる ⇒ タイムスライダーを動かしてプレビュー • シミュレーション – 状態を持つ – 入力が パラメーター + 前のフレーム ⇒最小から再生しないとプレビューができない © OLM Digital, Inc. 29 • キャッシュ – 状態を持つ • メモリ • ファイル – 計算をデータで避ける ⇒タイムスライダーを動かしてプレビュー ⇒パラメーターを変えるとキャッシュを吐き出す必 要
  10. バウンドするボール • 本の練習問題 – 手づけアニメーション – バウンドボールのASS連番を配布 – Autoloop、インスタンス •

    今日は動きをプロシジャーで – ある程度物理的 • 群衆シーンなどに応用可能 – プロシジャーでバリエーション – バリエーションのASS出力 – Bifrostで配置と再生 © OLM Digital, Inc. 30
  11. 自由落下の実装 • 数式(本参照) – Ԧ 𝐹 = 𝑚 Ԧ 𝑎

    = 𝑚 Ԧ 𝑔、 Ԧ 𝑎 = 𝑔 𝑚 – 𝑃 = 𝑃0 + 𝑣0 𝑡 + 1 2 Ԧ 𝑔𝑡2 • Ԧ 𝑔 = (0, −9.8,0) • 𝑣0 = 0, 9.8, 0 – Ԧ 𝑣 = 𝑣0 𝑡, – t = 1 → Ԧ 𝑣 = 0, 0, 0 © OLM Digital, Inc. 32 pSphere1.translateY = pSphere1.initVelocityY * $t -9.8*0.5* $t*$t; float $velocityY = pSphere1.initVelocityY -9.8* $t;
  12. 時間 • Mayaフレームから – 圧迫時間 – シミュレーション時間 © OLM Digital,

    Inc. 33 frame 1 … 6 … 25 … 45 … 50 t <0 … 0 … 1 … 2 … >2 float $animationTime =50; float $bounceTime =6; float $updownTime = ($animationTime - 2*$bounceTime)/2; float $t = (frame-1-$bounceTime)/$updownTime;
  13. バウンドの実装 • 球体のスケールのプロシジャーアニメーション – スケールが変わる球体が楕円体 – https://ja.wikipedia.org/wiki/楕円体 • 数式 –

    𝑉 = 4 3 𝜋𝑎𝑏𝑐 = 4 3 𝜋𝑟𝑆𝑥 𝑟𝑆𝑦 𝑟𝑆𝑧 = 4 3 𝜋𝑟3𝑆𝑥 𝑆𝑦 𝑆𝑧 = 4 3 𝜋𝑟3𝑆𝑝 2𝑠𝑦 – 𝑉 𝑠 = 4 3 𝜋𝑟3 – 𝑉 = 𝑉 𝑠 – 4 3 𝜋𝑟3 = 4 3 𝜋𝑟3𝑆𝑝 2𝑠𝑦 – 𝑆𝑝 = 1 𝑆𝑦 © OLM Digital, Inc. 34 float $volumeSphere = 4.0/3.0*3.14159; float $scaleXZ = sqrt(1.0/pSphere1.scaleY); pSphere1.scaleX = $scaleXZ; pSphere1.scaleZ = $scaleXZ;
  14. デモ © OLM Digital, Inc. 35 float $animationTime =50; float

    $bounceTime =6; float $updownTime = ($animationTime - 2*$bounceTime)/2; float $t = (frame-1-$bounceTime)/$updownTime; if ($t<0){ pSphere1.translateY=0; pSphere1.scaleY = 1 - 0.5*($bounceTime- frame)/($bounceTime-1); }else{ if ($t>=0 && $t<=2){ pSphere1.translateY = pSphere1.initVelocityY * $t -9.8*0.5* $t*$t; float $velocityY = pSphere1.initVelocityY -9.8* $t; pSphere1.velocity = $velocityY; pSphere1.simulationTime =$t; float $magV = abs($velocityY); pSphere1.scaleY = 2 - $magV/pSphere1.initVelocityY; }else{ pSphere1.translateY=0; pSphere1.scaleY = 1 - 0.5*(frame- ($animationTime - $bounceTime +1))/($bounceTime-1); } } float $volumeSphere = 4.0/3.0*3.14159; float $scaleXZ = sqrt(1.0/pSphere1.scaleY); pSphere1.scaleX = $scaleXZ; pSphere1.scaleZ = $scaleXZ;
  15. インスタンス化の二択 • ASS出力 – プレビュー・レンダリングが早い • オブジェクト出力 – 1フレームが1つのインスタンス –

    BifrostでGPUプレビューができるように – ルックデブ • 決まり次第でASS切り替え – スクリプトで • 各フレームのオブジェクトのコピー • オブジェクトのリストをBifrostへのインポート © OLM Digital, Inc. 36
  16. MayaとBifrostのAPIのスクリプトインスタンス化 • https://help.autodesk.com/cloudhelp/ENU/Bifrost-Tech- Docs/CommandsPython/index.html – ノード・アトリビュートの追加 – 接続 © OLM

    Digital, Inc. 37 def addObjectsAsInputToBifrostGraph(objs): cmds.vnnCompound(“|bifrostGraph1|bifrostGraphShape1”, “/”, addNode=“BifrostGraph,Core::Array,build_array”) objsL = cmds.ls(objs, long=True) for o in objsL: longN = cmds.listRelatives(o, shapes=True, fullPath=True)[0] shortN = cmds.ls(longN, shortNames=True)[0] print(shortN) cmds.vnnCompound( “|bifrostGraph1|bifrostGraphShape1”, “/”, addIONode=True) cmds.vnnCompound(“|bifrostGraph1|bifrostGraphShape1”, “/”, renameNode=[“input1”, shortN]); cmds.vnnNode(“|bifrostGraph1|bifrostGraphShape1", "/"+shortN, createOutputPort=[shortN, "Amino::Object"], portOptions="pathinfo={path="+longN+";setOperation=+;active=true}") cmds.vnnNode("|bifrostGraph1|bifrostGraphShape1", "/build_array", createInputPort=[shortN, "Amino::Object"]) cmds.vnnConnect("|bifrostGraph1|bifrostGraphShape1", "/"+shortN+"."+shortN, "/build_array."+ shortN) import maya.cmds as cmds def frameByFrame(obj, start, end): for frame in range(start,end+1): cmds.currentTime(frame) cmds.duplicate(obj) frameByFrame("pSphere1", 1,50) アニメーションの出力 Bifrostへインポート
  17. らせんの運動 • 本の練習問題 – 数式の活用 – Compoundの使用 • FXに活用 –

    プロシジャーでアニメーション – GPUプレビュー © OLM Digital, Inc. 39
  18. R*cos(a) 円の上の動き • R=円の半径 • t=時間 • s=速度 • P

    – xp=R*cos(s*t) – yp=R*sin(s*t) © OLM Digital, Inc. 41 O x y P(xp, yp) R*sin(a) a
  19. Mayaでの円の動き • R=円の半径 • t=時間 • s=速度 • Mayaの軸 –

    Y軸に上がっていく – XとZ軸で円の動き • P – zp=R*cos(s*t) – xp=R*sin(s*t) – y=s*t © OLM Digital, Inc. 42 X Z Y 原点
  20. 多重化 • Spiral number:らせんの数 • Spiral height:らせんの球の数 • 1つの配列ですべてのパーティクルを管理 –

    Particle ID:0からSpiral number* Spiral height – 整除法でSpiral/Phase ID(商)とAge(剰余、modulo) © OLM Digital, Inc. 45 Particle ID 0,1,2.. spiral height -1 spiral height… 2*spiral height-1 … …spiral height*spiral number-1 Spiral/ Phase index 0 1 … Spiral number -1 Particle ID/spiral height Age 0,1,2.. spiral height -1 0,1,2.. spiral height -1 … 0,1,2.. spiral height -1 Particle ID%Spiral Height
  21. さらに • カーブでレンダリング • シミュレーション投げる – AgeをPropertyに追加 – Ageを条件にインスタンスまたはParticleへ –

    速度の計算があるとより厳密に • BifrostでSet Dressing – MashからBifrostへ – Particle Instancerの代わりに © OLM Digital, Inc. 47
  22. プロシジャーの先に • プロシジャーで数学と物理学の活用が大事 – 早い – いろんな問題の答え、数式など存在している • SIGGRAPHのプロダクショントークでは –

    Disney/Pixarなど – プロシジャーを使う • ベースをキャッシュしてから手動の微調整も結構ある – 新しいアイデア • Generative Coding, generative art – https://twitter.com/MacTuitui – https://twitter.com/iquilezles • MayaのBifrostではやっとそういうのできるようになりました! © OLM Digital, Inc. 48