山獣四序図

冬眠から覚めた熊が四季の山々を歩き回る様子を絵巻物風CGで表現しました。

絵巻物モチーフということで、東洋的な詩書画の要素を入れる構成にしています。

クリックして再生
タイトル
【一】 ある山深き地にあやしき獣ありき
雪もいまだ深き 啓蟄のほど 穴より這ひいでありく
この歩みし跡には 草木芽吹きそむといふ
【二】 春煙の如く 山より山へ渡り歩み 春を告げき
【三】 大いなる身を揺るがしつつ 陽炎を纏ひたる夏草を掻き分け行きける
【四】 水の香をたどりて あてもなく歩み迷ふ
【五】 薄雲棚引く 茜空の下 空を仰ぎて座する
時折吹く風は 実りを言祝ぐ調べなり
【六】 雪の降り始めば 四時の役目を終へしごとく 洞に潜りぬ
降り続く雪足跡を覆ひ その住処を知る者なし
【七】 あたりに響く風の音は 夢路を辿る寝息なりといふ
かの獣 山守として深く敬はれたるなり
コンセプト

 Art for houdiniという講義を視聴したことがきっかけで、 動く日本画というコンセプトに興味を持ち、日本画のような表現をCGで作れないかと考えました。

日本画の要素を考える上で、今回16:9の画面サイズという制約から縦長の掛け軸のような表現より、横長の巻物の方が都合が良いと考え、絵巻物というモチーフを採用しました。

絵巻物では右から左に物語が進む形が多いことから、絵巻物の中で表現された春夏秋冬の風景の中をクマが歩いて行くという形をとりました。

単に巻物風にするだけでなく東洋的な絵画表現を随所に入れることを意識しました。トランジションで霞のような動きを入れたり、デザイン性の強い書道感のある文章や印は随所に入れたりなど、詩書画のバランスを意識しました。

マテリアル表現に関しては今作に合ったスタイライズド表現への模索に力を入れました。PBRではなく、かといってアニメのようなセルシェーディングでもない中間的なイメージで作成しました。 立体感をつぶしつつ、2次元的な情報量(霞、筆のタッチ、シワ、汚れ)をどうやって付加していくかが大事ですが、そこにおいてシェーダの試行錯誤は必要です。 コンポジットで情報量をコントロールするのではなく、シェーダの段階でなるべく完成形に持っていけるよう意識しました。

重視したキーワード:「巻物」「書道」「山」「熊」「霧、霞」「草花」「水」「夕日」「風」「雪」「洞窟」

使用ツール・制作期間
使用ツール
キャラクターモデルはZBrushで作成し、Houdiniで後処理を入れたのち、KineFXを使ってリギングとセットアップを行いアニメーションを作成しました。 また、シェーダのカスタマイズを独自に行いたかったため、Unityでレンダリングを行いました。せっかくなので直近リリースしたUnity6を使用しました。
モデリング(クマ)ZBrush + Maya
モデリング(地形・草・石)Houdini
アニメーション・リギングHoudini
テクスチャリングSubstance Designer
レイアウトUnity6
ライティングUnity6(独自シェーダー)
レンダリングUnity6(独自シェーダー)
コンポジットAfterEffects
文字表現Photoshop + AfterEffects
制作期間
10/6~2/25の約5か月間です。平日は1日30分程度、休日は1日平均4時間程度の作業時間、冬期休暇を挟んでいることを考慮すると合計制作時間としては250時間程だと思います。
期間内容
10/06 - 10/12フォトグラメトリー実験・ZBrushを触る
10/13 - 10/19Unity6を触る
10/20 - 10/26コンセプト決定・リファレンス収集
10/27 - 11/09Unity6シェーダ検証
11/10 - 11/16リファレンス収集・コンセプトアート作成
11/17 - 11/23日本画の情報収集
11/24 - 11/30コンセプトアート作成・クマのモデル作成
12/01 - 12/07クマのモデル作成
12/08 - 12/14クマのモデル作成・セットアップ・Unity6カメラ調整
12/15 - 12/28ストーリーボード制作
12/29 - 01/11アニメーション制作・シェーダ制作・ライティング設計
01/11 - 01/25アセット制作・シェーダ制作・ライティング調整・レイアウト
01/26 - 02/01コンポジット・文字制作
02/02 - 02/08シェーダ調整・ライティング調整
02/09 - 02/15アニメーション制作・レイアウト・カメラワーク
02/16 - 02/25特殊表現・文字制作・各種調整・オーディオ設定
制作過程
事前検証

 制作にあたりマテリアルはPBRではなくスタイライスド表現になること、そしてその表現の試行錯誤に時間がかかることが予想されていたので、 リアルタイムレンダリングを初めから検討していました。リアルタイムレンダリングだとUnrealEngineとUnityが選択肢に上がりましたが、 高品質なPBRを使う必要がないこと、シェーダコードレベルでのカスタマイズが比較的容易そうなことからUnityを採用しました。 理想を言えばプリレンダのトゥーンシェーダも検討比較をしたかったのですが時間はありませんでした。

Unityを採用するにあたり、まずシェーダのカスタマイズがどの程度可能そうかを検証しました。 下記の記事で作成したモデルをUnity上で読み込んで、そこに自作のシェーダを割り当てて検証を行いました。

こちらはシェードを潰して輪郭線表現を入れたシェーダをクマと竹のモデルに割り当てた状態です。

フォトグラメトリーモデルに自作シェーダを割り当てUnity上でレンダリング

背景を和紙風にするために、RenderFeatureを追加して、背景をテクスチャで塗りつぶす処理を入れてみました。

背景に和紙風のテクスチャを割り当てる

スタイライズド表現とPBR表現が時間で切り替わるとどういう印象になるかも検証しました。UnityのLitシェーダを改造してマテリアルアニメーションで切り替えられるようにしています。

シェーディング変化の切り替え検証
地形もシェーディング変化させる

UnityのバージョンはUnity6を採用しました。丁度使い始めたタイミングと正式リリースが重なったので、新しく始めるなら新しいバージョンでという理由でした。 ただ、Unity6でレンダリング周りの仕様が大きく変わっていたり、ネット上の情報もUnity2023以前のものが多かったりと仕様把握には苦労しました。 結局一番参考になったのはGithubに上がっているUnityのシェーダコードを直接見るでした。

クマのモデリング
ガイドの作成
フォトグラメトリで作成したモデルはトポロジが複雑すぎて骨入れには適していません。 そのため、このモデルを元に3面図を作成し、改めてMayaできれいなトポロジのモデルを作成します。 一度Mayaでフォトグラメトリモデルを読み込んで表示したものを画像で出力してPhotoshopで調整して3面図に起こします。
Maya上でガイドをシーンに貼る
こちらの記事を参考にImagePlaneを使用してMayaのプレビュー画面に作成した三面図を貼ります。
Maya上でガイドをもとにざっくりモデリング
ディティールはZBrushで作成するのでおおまかなシルエットのみモデリングします。 ZBrushでDynaMeshに変換するので、Maya上ではぶっ刺しなども気にせずモデリングしていきます、ある程度できたらCombineしてFBXで出力してZBrushに渡します。
ZBrushでの形状調整
ZBrushで細かな形状を調整していきます。まず、DynaMeshに変換して編集していきます。 DynaMeshは600くらい上げています。シルエットはDynaMeshで整えて、最後にScluptrisProに細かい調整を加えて、DecimationMasterで適切なポリゴンで出力します。 ScluptrisProで編集を加えた後、再度DynaMeshをかけてしまうとScluptrisProで加えた細かいディティールが消えてしまうので注意します。 ここで作ったモデルはHoudiniで読み込んでセットアップするため、再度fbxで出力します。
クマのアニメーション作成
KineFxでのセットアップ
HoudiniにZBrushで作成したモデルを読み込んでKineFxでまずボーンを入れていきます。 ボーンのRootはキャラクターの重心に入れるのが良いとのことで、立ち上がることを考慮して後ろ足の中心にRootを置きました。 ボーンは片側だけ入れていき、入れ終わったらSkeletonMirrorで片側に入れたスケルトンを反転コピーします。
適当なジョイントを右クリックしてDisplayJointAxisにチェックを入れてジョイントの向きを表示できます。 このとき向きがバラバラだと制御しずらいので揃えていきます。ジョイントを選択してPキーでRotateに入っている値に0を入れていきます。
最終的にはBoneCaptureBiharmonicノードでジオメトリとボーンがバインドされ、ウェイトが自動で割り振られます。 ここでは、自動で割り振られたWeightに対して、眼など独立して動かしたいものなどは特定のボーンの影響のみ受けるような補正をAttributeWrangleを使って記述しています。 手動でウェイトを塗ることもできますが、モデルの更新のたびに修正するのは大変なので、Houdiniを使うメリットを生かすためにもなるべくプロシージャルなアプローチでウェイトの補正をした方がよさそうです。
歩くアニメーションを作る
制作したリグシーンをHDAとして保存し、必要なコントローラーのパラメータを外からセットできるようにします。 アニメーションシーンを別途作成し、そこでHDAを読み込んでアニメーションを作成し、「ROP FBX Animation Output」ノードを接続してアニメーションデータを出力します。
HoudiniからアニメーションエクスポートしてUnityで再生する
Houdiniからの出力方法とUnityでの読み込み方法はこちらの動画が参考になります。 Unityで再生するにはボーンとスキンウェイトの情報が入ったfbxとアニメーション情報が入ったfbxの2種類のファイルが必要です。 前者はリグシーンの最終出力を「ROP FBX Charactor Output」ノードに接続し、そこからfbxを出力します。 「ROP FBX Charactor Output」ノードに接続するものはJointDeformノードと同じです。Input FBX Fileは不要です。
Unityで読み込む際、fbxのRigの項目の「Avatar Definition」はCreate From This Modelにします。
アニメーション情報の入ったfbxに関しては「ROP FBX Animation Output」ノードに対してAnimatePoseに相当するものを接続して出力します。 同じくInput FBX Fileは不要です。
Unityで読み込む際はfbxのRigの項目の「Avatar Definition」はCopy From Other Avatarにして先ほど作成したAvatarを指定します。これでアニメーションの再生が可能です。 正しく設定されていればAnimationのタブにあるプレビューでアニメーションが流れている様子を確認できます。
ストーリーボードの作成

 制作にあたり絵コンテに相当するストーリーボードを作成しました。予めストーリーボードを作成することで、カット総数や用意するべきアセット数の目安が分かりスケジュールを立てるのに役立ちます。 逆に制作スケジュールが厳しくなった時にどのカットを省くかの判断にも有用で、制作後半になればなるほど作ってよかったと思えるものでした。
また、カメラワークやレイアウトを考える際の最初の一手にもなります。 自分の画力の問題ですが、だんだんクマの形が取れるようになって後半のカットの方が上手く書けたので、ストーリーボード制作を2周できると理想だと思いました。

クリックして再生

巻物が左におかれ、一定の範囲に広げられてそれが解かれていく、そのため右から左に話が進んでいくという特徴的な展開のため、 その流れが把握できるよう動画形式で作成しました。スクロールスピードの検討にも使えました。

マテリアル・ライティング設計
空・地形表現
大域的な表現はライトとフォグとブルームで構成されています。太陽はテクスチャで描いています。
クマの表現
クマはスタイライズ感を出すために、輪郭線表現を入れています。通常のライトだけでは下腹部が暗くなりCG感が強かったため、下からもライトを当ててキャラクターとして目立たせています。
草の表現
草は場所ごとの色のばらつきを出すために頂点カラーに仕込んだ乱数をもとに色を変えるような処理を入れています。 また、地面となじませるために、地形との接地部付近は地面色を入れられるようにしています。
ライト
モデルに当てるライトはディレクショナルライト、スカイライト、エッジライトのシンプルな構成になっています。 情報量を落とすためにスペキュラは計算せずディフューズのみです。
輪郭線表現
クマや草や山など厚みのあるポリゴンは1パス目で表示面を反転して法線方向にジオメトリを少し伸ばして描画し、2パス目で通常描画をするというアプローチをとっています。 クマの輪郭線の太さをコントロールしたかったので頂点カラーにジオメトリを伸ばす倍率の情報を埋め込むようにしています。
黒く塗った部分のジオメトリの伸びを抑えることで輪郭線の太さをコントロールをする
HoudiniでZBrushで塗ったカラーを頂点アルファに変換
地面は元はハイトフィールドの1枚板なので上記の方法だと輪郭線が出にくいという課題があります。 そこで、1パス目は通常描画を行い、2パス目はピクセルシェーダ内でデブスバッファを参照し、周囲8ピクセルのデプスと差分の絶対値を求め、 一定値以上の閾値があるピクセルのみ色を書き込むというアプローチをとっています。
地形の輪郭線ON/OFF
カスタムフォグ
フォグはスカイフォグとノイズZフォグとノイズYフォグの3段構成です。 スカイフォグはデプスバッファを使って、遠くほどスカイカラーになじませるような処理をしています。 ノイズフォグはデプスバッファとノイズテクスチャを使って、フォグのムラを出しつつ、遠くほどフォグを強めるような表現です。 ノイズYフォグはノイズフォグと機能は同じですが、Y一定の高さまでフォグをかけるような処理ができます。
ポストエフェクト
ポストエフェクトはUnityが提供している機能をそのまま使用しました。今作ではブルーム・被写界深度・周辺減光・TemporalAntiAliasを使用しています。
特殊表現
トランジション表現

トランジション表現ではカメラテクスチャをノイズテクスチャを使用してゆがめることで、霧や墨のような動きを表現しました。

ノイズテクスチャをスクロールさせながら左から右をゆがみを強めていく
トランジション表現のテクスチャ設定
草表現

GameObject単位でクマとの位置を見て揺れを計算するもの、モデル一体で頂点カラーの情報を埋め込んで頂点シェーダで計算する2種類の草を用意しました。 前者はGameObjectとクマとの位置を方向を計算し、その情報をもとにGameObjectに対して足の設置タイミング時に風を発生させ、草を描き分けるような表現をしています。

GameObject単位の草揺れ

草のモデルにはHoudiniで頂点カラーに以下の情報を入れています。
R:揺れの重み(下ほど小さい) G:房ごとのseed値 B:草の束の高さ A:草の束ごとの乱数値
この情報があることで、頂点シェーダに風の強さと方向の渡すだけで高速に草の揺れを計算できます。クマの位置を見る必要がないケースではこの方法で揺らしています。

頂点単位の草揺れ

草が成長するような表現はカメラ位置に応じて草モデルの頂点シェーダでY座標を動かして実現しています。カメラが常に左に動いている前提での実装です。

草の成長表現
雪表現
頂点シェーダで雪部分のマスクテクスチャをハイトマップとして扱い、その部分だけ高さを盛り上げて表現しています。 時間とともにハイトマップにスケールをかけることで雪解けを表現していますが、雪部分と地面部分のグラデーション幅のコントロールは課題でした。 幅が狭すぎるとパッキリ分かれる印象が出て、逆に幅が広いと地面なのか雪なのかわからない謎のマテリアルの領域が広がります。 step関数を使ってパッキリ境界を出す方が違和感は少なかったです。
雪解け表現
クマに付着する雪はモデル法線を見て、Y軸正方向の成分が強いピクセルのみ抽出し、シェーダで合成しています。 こちらも雪が付着している部分とそうでない部分のグラデーション幅は極力狭めるようにしています。
クマに雪をかぶせる表現
足跡はクマの移動に合わせて足跡が置かれる位置をバッファに格納、その配列をシェーダに送り雪のハイトマップ計算時に参照して足跡部分だけ高さを下げることで表現しています。 高さだけでは凹みが見ずらいのでカラーを少し落としてもいます。一定時間たったら足跡が消えていくような表現も入れています。
足跡表現
Timelineによるアニメーション・カメラ・ライティングコントロール
マテリアルやライティングのアニメーションを時間で細かく制御したかったため、Timelineを使用してGlobalVolumeや各GameObjectのマテリアルをコントロールするようにしました。 調整のイテレーションが良く、この整備に時間をかけたことで終盤の作業スピードがとても上がりました。
カメラも専用のMonoBehaviorを作ってTimelineでカメラ位置をコントロールできるようにしています。
草のプロシージャル配置
草の配置はHoudiniでプロシージャルに行いました。まずベースとなる地形のHeightFieldの傾きが平たんな箇所を抽出してマスクを作成します。
カメラに映る範囲のBoxを定義して、マスク範囲をさらに絞ります。
Boxの外との境界がパッキリしているので、ブラーをかけて境界をなじませます。
マスク情報を別のGeometry内でObjectMerge経由で読み込み、maskをDensityとして扱い、その情報をもとにscatterで配置点をばらまきます。
配置点にスケールや回転情報を持たせます。配置ごとに一体範囲内でランダムになるようにAttributeWrangleで記述します。
予め作っておいた草のGeometryをCopyToPointで配置していきます。Unityのシェーダで参照するために各ポイントの頂点カラーに配置乱数情報を格納しておきます。
ベース地形と一緒にfbxで出力します。
Unityに読み込んでマテリアルをアサインして完成です。
配置データのマスクテクスチャは草が生えている部分の地形の色を変えるためのマスクテクスチャにも利用しました。
プロシージャルモデリングによる洞窟制作
最終カットの洞窟モデルもHoudiniでプロシージャルなアプローチで制作しました。 まず、洞窟の元となるキューブを用意して、X:150 Y:150 Z:400 と細かく分割しておきます。
そのキューブをくりぬいて、Mountainでノイズを加え、Remeshしてポリゴンを整えます。 一部のポリゴンが反転している個所も出てしまいましたが、カットに映らない範囲だったのでよしとしました。
このモデルに対して先ほどの同じアプローチで草を配置していきます。
同じように小石も配置してみました。これで完成です。
文字のアニメーション
 東洋的な要素を入れるため、各カットごとにその情景を記した詩を作成しました。 まず古文風な文章を考えて、漢文への変換はChatGPTに任せています。 仮名にする手もありましたが、崩し仮名を書くのが難しく断念しました。 漢字ごとにPhotoshopの墨ブラシ(Megapack→Ink→sumi3)で文字を作成し、AfterEffectsでパスを引いて 文字が順番に描かれていく表現を作りました。 なお、この詩はクマという動物を知らない人が山に住んでいる不思議な獣を記したという体で作成したので、文章には熊という単語は敢えて出していません。
Photoshopで作成した文字
AfterEffectsを使った特殊効果
雪表現はAfterEffectsの標準エフェクトCC Snowfallを使いました。こちらの記事を参考にしました。
陽炎表現もAfterEffectsでタービュレントノイズを使用しました。こちらの記事を参考にしました。
本内容はデジタルハリウッドスクール CG/VFX専攻 の課題で作成したものです

Prev
Last Updated. 2025/03/09