読者です 読者をやめる 読者になる 読者になる

当たったらどうすんだよ

当たらなければどうということはない

ZBとBlenderでUE4用のキャラを作る #8:Blenderでリグ組み

第8回目はリグ組みをしますよ!

初回で書いたように、ゲーム用キャラはボーン数などにまだまだ制限があります。もちろんPC用ハイエンド環境のことだけ考えたら、そこまで神経質になる必要はなくなってきているのですが、骨が増えれば処理が増え、重たくなるのは必然です。なので、できるだけシンプルな仕組みで必要にして十分な「動き」ができるリグ組みを目指します。

ぼく自身はけっこうRigify好きで、Blenderだけで映像を作成するなら迷わず使っています。もちろん、多少の工夫は加えるわけですが…じっくりレンダリングすれば良いCG映像であるなら容赦なく仕組みを増やしたくなりますねw

というわけで標準ボーン(アーマチュア)から骨を組み始めます。特に特殊なことは一切ありません。ただし、大前提としてキャラクタメッシュのトランスフォームをフリーズしておくことは以前も書きましたが、ついでに「原点を調整しておく」ことも大事な工程になります。

原点の調整

  1. ボディ
  2. 髪の毛

今回のモデルでは上記4つのパーツをひとつのスケルタルメッシュとしてUE4にインポートします。ここでボディの原点はジオメトリの中心かワールドの0位置にあれば問題ないでしょう。

f:id:kanianthi:20160610200221j:plain

しかし、頭と髪の毛、それに目のパーツは原点を統一しておくとなにかと便利です。
頭部パーツが親になって他のパーツに追随して欲しい時などは、shift+sで頭部の原点に3Dカーソルをスナップしてから、髪や目のパーツの「原点を設定」メニューで3Dカーソルを指定すれば同一の原点を利用できるようになります。

原点の統一はその他の作業でもたびたび行うことですので癖にしておきましょう。

今回のリグの仕様

ワサビミドリさんのリグは以下の仕様で構築します。

  • リバースペルビス(反転した骨盤)
  • 背骨の大回転用コントロールボーンとコンストレイン
  • 足はIKで動かし、腕はFKで動かす
  • 大腿部とお尻の変形補完用ボーンとコンストレイン
  • 脇の下にも補完用ボーン
  • おっぱいボーン(揺らす用ではなく形状用)
  • 前髪とおさげの揺らしボーン(設定はUE4で行う)

と、後で思いついてなにか足す可能性はありますが、計画ではこんな感じです。

リバースペルビス

f:id:kanianthi:20160610202118j:plain

リバースペルビスについてはdskjalさんのブログ記事に詳しいので参照してください。

骨盤のボーン配置―Blender リグ

画像は背骨からボーンを引っ張り出している(e押し出し)ところです。この骨をCTR_pelvisと名前変更し、pelvisの親にして「変形」をオフにします。

f:id:kanianthi:20160610203844j:plain

続いて脚のボーンを普通に作成します。
↑の画像にあるように「必ず関節位置でボーンをオフセットさせる」ことは激しすぎるくらい重要です。

ボーン作成時は片側だけで作成し、名前も「thigh」とか「shin」のように「.L」などの左右修飾子を付けずに作成すると、あとでミラーボーンしたときに自動で名前変更までしてくれるのでとても楽です。

IKターゲットやポールターゲット用のボーンはさっさとペアレンツを解除し、変形を外しておきましょう。なお、thigh(太もも)ボーンはCTR_pelvisの子に設定してあります。

ここまで来たらボーンロールの自動計算もつま先ボーンを基準に行っておきましょう。

続いてポーズモードで脚のIKを普通に設定します。

膝の変形補正リグ(インフルエンス)

f:id:kanianthi:20160610230724j:plain

脚を曲げたときに膝がうまくとんがるように補正するためのリグです。
編集モードでthighボーンのジョイントから押し出しYでボーンを作成し、alt+Pでペアレンツを解除しておきます。

このボーンには「knee」と命名します。↑の画像を頼りにコンストレインツの「チャイルド」で位置だけ脛のボーン(shin)に追随するようにし、トランスフォーム変換コンストレインツを使い、膝を曲げたときだけkneeボーンのサイズが拡大されるようなインフルエンスを組みます。

f:id:kanianthi:20160610231326j:plain

これ実はBlenderMarketで販売しているRigStarアドオンとだいたい同じ仕組みです。

単純に膝小僧ボーンをインフルエンスとして配置するだけでも効果はありますが、せっかくですのでコンストレインツで拡大させてみます。同じことをドライバで記述することもできますが、このほうがシンプルだと思います。

f:id:kanianthi:20160610231748j:plain

↑さらに!股関節が変形するのも補正しますよ!同じ仕組みを3つ配置してそれぞれ「helperThigh_F」おなじく「M」「B」としました。

当初、IKで駆動するthighボーンに反応してくれない?と一瞬パニくりましたがwwなんのことはない値の範囲を間違えて捉えていただけで、IK範囲制限を加えつつ数値を冷静に観察したらイケました。

後で同じ仕組みを肘にも仕込みます。

それでは今回はここまで!

次回は一通りすべての仕組みを作成します。
サンプルファイルはこちら!

onedrive.live.com

ZBとBlenderでUE4用のキャラを作る #7:ZBでラフネステクスチャ?

というわけで第7回。
本当は前回でこの内容も押さえておきたかったのですがwついつい周辺知識のことなども書いていたらボリュームが大きくなってしまったので記事を分けました。

今回のお題ですが「Zbrushで作れないはずのマップを作る」のがテーマです。
まずは、前々回でディティールを入れたミドリさんのボディを複製します。

f:id:kanianthi:20160610160519j:plain

↑はい。
あとはポリグループごとに白黒でポリペイントしてテクスチャとして書き出すだけです!おしまい!

ええええ?

簡単すぎるって?ww

仕方ないなぁ…さらにひと手間加えますかw

f:id:kanianthi:20160610161709j:plain

↑こんな感じにラフネスをペイントしました。

  1. Mask By CavityやMask PeakAndValleysなどで凹凸に応じたマスクを生成
  2. Shift+Ctrlでポリグループ単位で表示させつつSprayモードで自然なランダムさを与えつつモノクロだけでポリペイントする
  3. テクスチャマップとして出力

以上です。
何度か説明したようにラフネスマップでは「黒いほど鏡面仕上げ」になることを念頭に描けば、それほど難しいことはないでしょう。(と言ってるそばから靴のペイントがこれじゃ反対だ!と気付いて修正w)

こうして出力したテクスチャをさらにフォトショでハイトマップと合成したりすれば、さらに詳細なラフネス用テクスチャが作成できます。

f:id:kanianthi:20160610163116p:plain

フォトショップでハイトマップを反転させてハードライト合成したテクスチャ

このように、必要なテクスチャの性質が分かっていれば、原理的にはどんな3Dペイントソフトを使っても必要なマップを作成することができます。

またフォトショップの2D描画だけでも、UV配置を画像としてエクスポートし、そこに白と黒でペイントすれば、マテリアル用のマスク(ブレンドマスク)を描くこともできてしまいますので「ぼくの持ってるソフトはスペキュラとか出せないんだよなー」などと嘆く必要はありません。

f:id:kanianthi:20160610164030p:plain

↑Cyclesでレンダリングした例

最後に、SubstancePainterなどのマテリアル用テクスチャ専門ペイントソフトを使うと、曲率マップやシックネスマップなどという、よりマテリアルの性質に応じたテクスチャを作成するだとか、ハイポリから転写するスタイルのポリペイント(頂点ペイント)テクスチャとは違い、最初からUVに対してテクスチャリングをしていくスタイルのペイントができますので、特にローポリゴンのテクスチャリングには威力を発揮します。

UE4などのゲームエンジンでは、サブディビや変位マップ(ディスプレイスメント)がそのままでは使えませんし、使えたとしても大幅なパフォーマンスの悪化が見込まれるので、ハイエンド環境ですら難しいのが現状です。

ですので、昔ながらにUV配置を吐き出して2Dでテクスチャリングを行うことも、ゲーム系キャラを自作するのであれば押さえておきたい重要なポイントになります。

それでは次回からは、いよいよゲーム向けのリグ付けについて解説しますね!

 

ZBとBlenderでUE4用のキャラを作る #6:各種テクスチャマップの作成

UE4用人物キャラ作成の第6回です。
今回は、当初SubstancePaiter (SP)とSubstanceDesigner (SD)を使って、ZBで作成したテクスチャからさらに凝ったテクスチャを作成する記事を書こうと思っていました。しかし、前回作成したZBのテクスチャをベースに、仮マテリアルをBlenderで作成してワサビミドリのモデルに割り当て、Cyclesでレンダリングしていたところ、次のように考えました。

  • 重要なのはラフネス(粗さ)とハイト(高さ)マップだよね?(あるいはスペキュラー)
  • マテリアルのMixを行うために「混ぜ具合」を指定するマスク用テクスチャも説明したいよね?
  • Substance系は持っていないひとも多いだろうし、別の機会でいいんじゃないかな?
  • というか、基礎が分かっていないでいきなりSP使っても意味が分からないんじゃないかな?

そして、実を言うとこれらのマップ(テクスチャ)はフォトショップの2D画像編集機能だけでも作成できます。ただ、ZBやSPなどのような3D空間に直接ペイントできるソフトのほうが便利なのです。また、フォトショップも今では3Dペイント機能を備えています。

そこで、今回はあくまで基礎編として、Zbrushフォトショップだけで、本来はZBだけではサポートしていない種類のテクスチャを作成してしまう「応用的な手法」を紹介してみることにしました。

ノーマルマップで基礎の座学

f:id:kanianthi:20160610112203p:plain

↑の図はRGBの値を0~1の数値として利用し、白であれば1,1,1という3つの数値を指定できることを示したものです。3D CGでは昔からこうしたパラメータをテクスチャとしてマッピングし、様々な数値を画像で指定する方法が使われてきました。

その代表的なものがバンプマップとスペキュラーマップで、白黒の255段階のグラデーションを使い、50%グレー(標準グレー)を0値と捉え、それより暗ければ値を低く、それより明るければ値を高くマテリアルに渡すものでした。

白黒のマップは明度(輝度)の情報しか持っていませんので、1次元の値しかひとつのピクセルに持たせることができません。しかしRGBの3色を使えば、三次元の座標が指定できるはず…という発想で作られたのがノーマルマップ(法線マップ)です。

f:id:kanianthi:20160610114012j:plain

↑はBlenderの立方体を編集モードで表示したものです。

選択している頂点はXYZ順に(1,-1,1)の座標にあります。Z軸を挟んで反対側の頂点はXの値が-1になります。当たり前の話ですが、それぞれの頂点の座標は軸を挟んで反転します。

それでは、どの頂点でも良いので、ノーマル方向に動かしてみると座標はどう変化するでしょうか。どういう風に動かしても、それぞれの原点に近づけば値は減少し、離れれば増加します。しかし…Xの値だけは値の「向き」がY軸を挟んで逆さまです。

実はこれが「ノーマルマップは片側UVでは使えない」理由になります。

つまりノーマルマップというのは、ベースのメッシュに対して「頂点がどれだけノーマル方向に動いたか」を記録しているものなので、左右で(実は3軸において)ベクトルが反転することになり、ノーマルマップを観察するとYZ平面を境に色が反転していることが分かります。

これはキャラクタモデルのように「左右対称モデル」であれば顕著に出てくる問題です。
※CGを専門的に学んでいるはずの学生さんが、案外ノーマルマップの説明ができないというのはなぜだろう?とよく思います。カリキュラムの問題でしょうか。

テクスチャマップを作成する

これで色情報を使って数値や座標やベクトルを指定できることが分かりました。ついでにノーマルマップが左右で反転することも「なんとなく」理解できたと思います。あとは実践して経験すれば、理屈が知識になり技術になってくれます。

それでは具体的な作業の解説です。

通常、Zbrushではポリペイントをベースにしたカラーテクスチャのほかに、ノーマルマップとディスプレイスメントマップ(ハイトマップ)を作成することができます。また、標準プラグインであるMulti Map Exporterを使えば、アンビエントオクルージョンマップなども作成することができます。

しかし、Zbrushで作成するカラーテクスチャは、あくまで「塗り絵」した色だけをマッピングしたものであり、陰影の入った写真的なテクスチャにはなりません。そこで、フォトショップを使って、ひと手間加えたテクスチャを作成してみます。

f:id:kanianthi:20160610123402j:plain

↑はZBで作成した髪の毛のテクスチャをフォトショップで表示したものです。色は塗られていますが陰影が一切ないので平面的なショボいテクスチャです。

f:id:kanianthi:20160610124746j:plain

そこで、ZBで作成したディスプレイスメントマップを重ねます。描画モードはオーバーレイにしています。ソフトライトかハードライトで合成しても良いでしょう。

たったこれだけの手間を加えることで、テクスチャマップの表現力が跳ね上がったことが分かると思います。

ラフネスとスペキュラーのおさらい

3D CGのマテリアルというのは、結局のところ「シェーダーモデル」のことです。Blenderであれば、Cyclesのマテリアルノードに表面材質ノードひとつだけ、というシンプルなマテリアルもあるでしょうし、画面をスクロールしないと収まらないような複雑なノードも作成できます。

とはいえ、いわゆるPBR(物理ベースレンダラ)やリアル系を指向するなら、重要なのはカラーテクスチャとノーマルマップ(バンプマップ)と光沢/反射マップです。

ここでラフネスというのは表面(サーフェース)の鏡面的な性質を指します。

最近のPBRでは、ラフネスとメタリックでおおよそのシェーディングを決定しています。ラフネスは0で完全な鏡面になり、1で鏡面反射を行わなくなる、と覚えておけばだいたい大丈夫ですw

この逆に、スペキュラ(光沢)マップでは、1で強く反射し、0で反射を行わなくなります。ただしスペキュラのふるまいは各レンダリングエンジン(あるいはカスタムマテリアル)でかなり違いがあり、うまい具合のスペキュラマップを作成するのはとても難しいことでした。というのは、スペキュラひとつでフレネル(光線の入射角による反射の度合い)を制御していたり、それぞれ別々のパラメータを使っていたり、いまいち統一性がないのです。

f:id:kanianthi:20160610131119j:plain

なにはともあれ、BlenderのCyclesで仮マテリアルを構築しました。今回作成したすべてのパーツは、基本的に同じ作りのシェーダーノードを使います。

ここでラフネスに使用しているテクスチャはディスプレイスメントマップをフォトショで階調反転させたものです。記事の最後にレンダリング結果を貼りますが、とりあえず狙った感じに機能してくれているようです。

複合マテリアルをマスクでMixする

UE4でマテリアル作成するときには、二つ以上のマテリアルを指定してしまっても良いのですが、ここで「ひとつのマテリアルで二つ以上の材質をはっきり分離させるテク」も紹介しておきます。

やることは実に単純です。

f:id:kanianthi:20160610132910j:plain

↑のように平面を作成し「UVを生成」にチェックを入れます。新規マテリアルも割り当てておきます。

次に、ディフューズBSDFノードを追加して、Mixノードで接続します。同じノードを複製するときはshift+DでDupeできます。

f:id:kanianthi:20160610133307j:plain

↑青と赤が50%でMixされたので紫色のマテリアルになった!

それでは続いてフォトショップでこんな画像を作成しました。

f:id:kanianthi:20160610133451p:plain

↑名付けてMixMaskです。これをMixノードの「係数」に接続します。

f:id:kanianthi:20160610133850j:plain

結果は↑の通り。見事!

このようにマスク画像を使えば複数の材質をひとつのマテリアルで表現することができます。ワサビミドリのモデルでは、ボディのメッシュひとつで「服」と「肌」を大きく分けると表現したいですし、さらに細かく「靴」や「ソックス」もその気になれば分割することが可能です。

このマスクテクスチャによる材質分けのメリットは、ポリゴン毎にマテリアルを割り当てる方法だと難しい「フリーハンドなエリア分けで材質を分離することができる」ことにあります。というか上記の作例では「ポリゴンがひとつ」しかないのに関わらず、複数のディフューズBSDFを表示していますね。

それでは長くなりましたので、今回の記事はここまでにして、続きをすぐに書こうと思います。

ZBとBlenderでUE4用のキャラを作る #5:Zbrushでディティール入れ

人物キャラをUE4用に作成!の第5回です。
今回はZbrushを使ってBlenderでジオメトリを編集し、UV展開したキャラクタメッシュにディティール入れと仮のテクスチャリングを行います。

Zbrushでの結果

f:id:kanianthi:20160609174317j:plain

ディティールをスカルプトし、テクスチャをつけるとポリゴンモデルは化けます。今回のキャラクタである「ワサビミドリ」のコンセプトは、

  1. ワサビをイメージしたキャラであること。和風で古風でもある。
  2. 性格はおしとやかで粗暴。言動は丁寧で非道。運動神経が高く武道に通じているがブドウ(葡萄)は苦手。
  3. 実は人間ですらないので児童ポルノ法に抵触する年齢問題はクリア。

というような設定が「しっかりと(謎)」なされていますので、公開用キャラとしてシンプルにウォームアップスーツというか自転車スーツ的なモノをデザインしました。

最初にやること

GoBでBlenderからZbrushにメッシュを戻して最初にやることは、ポリグループ設定のやりなおしです。まずはAutoGroups with UVでUVアイランドごとのポリグループにしてから、Shift+Ctrlクリックで表示/非表示を切り替え、パーツ単位でスカルプトや色塗りがやりやすいようにポリグループを作成します。袖口などの円周状ポリゴンは独立グループにしておき、Group Creaseでエッジ出しをするようにしておくと後の作業が楽になります。

これらの作業が終わったらUV Mapメニューから各UVというかテクスチャサイズも設定しておくと良いでしょう。

すべての下準備が終わったら、サブツールごとにMorph Targetに登録しておきます。本エントリはZbrush入門ガイドの主旨はないため、詳細はすっ飛ばして進めますがモーフターゲットというより、もともとのベースメッシュに対して、ハイポリにスカルプトされた「頂点位置の変位」がノーマルマップやディスプレイスメントマップとして書き出される仕組みですから、モーフターゲットとしてベースメッシュを登録しておくことはZbrushでのディティール入れの「キモ」と言えます。

開いていた口を閉じる

f:id:kanianthi:20160609180120j:plain

連載第1回で提示した素体モデルの口はきゅっと閉じていました。しかしDynameshをZremesherで自動リトポしつつ、口の内部の形状を保ったままにするのは至難の技です。ですので、口の開閉を行うキャラをZremesherする際には、一度形状を均してしまうか、最初から口を開けた状態でモデリングしておけば、ポリゴン化しても口の内側がメッシュとして整っていますので楽です。

とはいえ、そのまま口を開けた顔で作業を進めるとすさまじく間抜けなキャラが出来上がってしまいますので、この段階で口を閉じてしまい、そちらをベースメッシュとして保存します。

このとき、SDivレベルをいきなり上げないでください。

確かに、既存のキャラクタのモーフターゲット(シェイプキー)をZBで作成するケースでは、すでにSdivレベルがあるのですからそれを利用することもあります。しかしSDivレベルを追加する=サブディビジンサーフェースを利用すると「痩せる」という問題が発生します。

今やっている作業は「ベースメッシュの確定」ですので、Sdivレベルのない状態でMoveブラシやZbrushマイスターである榊馨さん謹製の「MoveF」ブラシなどを使って閉じた唇形状を作成します。こうしたモーフ作業を行う際には、唇なら唇を構成する頂点だけではなく、その周囲の頂点も適切な形状に整えることを心掛けてください。

ディティール入れます

f:id:kanianthi:20160609193133j:plain

いきなり前髪完成しましたww
このスカルプティングのキモは「先っちょが片側2つだから髪の毛の房も二つ!」という安直かつ明快な発想を脱却することにあります(おおげさ)

というよりも…スカルプティングとして特殊な技術は一切使っていません。前述した榊さんが配布されているSM CreaseブラシとSM Slashブラシだけで仕上げています。先に溝を掘って次に角を立てているだけです。

大前提として、

  1. これからUE4にキャラを導入するためのディティール入れを行っている。
  2. 最終的に出力するものはメッシュデータではなくテクスチャである。

以上の2点を強く意識しましょう。

極端にローポリゴン化を目指すわけではありませんが、それなりのポリ数までは意識して減らしていますので、ポリゴンリソースを食うディティールはそもそも入れられません。なので「法線マップやディスプレイスメントマップ(ハイトマップ)による疑似表現で」やれる範囲のことをスカルプトすれば良いのです。

具体的には、Moveブラシやトランスポーズツールなどによる大きな形状変化はマップに反映できないので考えません。もしもそれらが必要であるなら、モデリング過程をやりなおす必要があります。この辺の感覚はどうしても経験に委ねられますので、定量的にこうしましょうああしましょうという話はしづらいですが、トライ&エラーを重ねてみましょう。

f:id:kanianthi:20160609195003j:plain

髪の毛スカルプティング最終段階…って画像見て気付きましたが「おさげ」をまとめる筒?的なのに加工するの忘れてますねw追加作業しておきます。

f:id:kanianthi:20160609195327j:plain

靴はこんな感じです。フィットネス系のダンスシューズ的なイメージです。サイドにはワサビロゴ。あとソールはリーボックのオールテレインをイメージしたものですw

SDiv6で出来る範囲のディティールなのでこんなものです。マスクしてDeformationでInflateしてCrayかCrayBuildUpで細部を描く感じです。

f:id:kanianthi:20160609195828j:plain

↑ボディ全体のスカルプティングとポリペイント。

サイドのラインもワサビをイメージしていますw服の皺入れも最低限にとどめました。

f:id:kanianthi:20160609200203j:plain

↑顔です。

鼻のポリゴンを多めにとっておいたのはこれをやるためです。アニメ調のとんがり鼻が大嫌いなのでしっかり鼻の穴も小鼻もあります。眼窩をポリグループ分けしてCreaseしてしまったせいで、ハイポリだとエッジが立った分眼球の収まりが悪くなっていますが、ローポリで表示する分には問題ありません。

顔のメイクはZBのポリペイントベースでもけっこうイイところまで表現できるので丁寧に作業します。眉毛やまつ毛の描画以外はカラースプレーモードで描画色以外の色が混ざり込むように彩色しています。

テクスチャ出し

そんなこんなですべてのサブツールにディティールが入り、ポリペイントもできたらテクスチャの出力です。ここでMulti Map Exporterを使えば自動ですべてのサブツールのテクスチャを一括出力できるのですが…なぜかUE4はTiffに対応していないので結局フォトショかなにかで変換作業が必要になります。

場合によっては、SubstanceDesignerでノーマルマップを作成(ベイク)したほうが良い結果につながることも多いので、ZBでは仮テクスチャを出すつもりで作業します。

  1. カラーマップ(ディフューズマップ):png
  2. ノーマルマップ(DirectXターゲットならFlipGで:png
  3. ディスプレイスメントマップ(ハイトマップ):16bit tiff

UE4だとディスプレイスメントそのものは使えませんが、マップはハイトマップとして生かしたり、これをベースにスペキュラーかラフネスマップを作成することができます。スペキュラであれば白(ハイライト)がそのまま光沢になりますが、ラフネスでは値0が鏡面ですのでマップの明度を反転させればラフネスマップ(のベース)として使えます。

ほかにもZBでAO(アンビエントオクルージョン)なども出力できますが、これも必要と思えばSubstanceで出すことにして、ハイポリをDecimateし、ベイク用にobjで出力しておきます。

なお今回のztlデータを公開します。

onedrive.live.com

次回は出力したテクスチャマップをフォトショで編集/加工したり、Substanceのベイク作業などを紹介します。

UE4のテンプレートに自分で作ったキャラを入れて動かしたい そのキュー:ランダム待機モーション

BlenderとZBで作った人物キャラの記事の途中ですが、とにかくUE4にキャラを入れて動かしたい!系のネタもひとつ投下しておきます。

タイトルの通り「待機モーション(アイドルモーション)をランダムに切り替えたい」のです!切に!痛切に!はしたないほどに!

実は以前に、まったく同じことを考えいろいろ調べて自分なりの方法を編み出し、コンテンツに実装したことがあります。その方法とは、歩き~走りのモーションをスピード変数などによってブレンドしてくれる「ブレンドスペース1D」を利用して、用意した待機モーションをすべて登録し、X軸を「Idle Variation」という名前の「整数の変数」にする、という仕組みでした。

しかし僅か一年ほどの時の流れの中で、もう少しマシな方法が見つかりましたので紹介したいと思います。いや、実はやってることはまったく同じなんだけどwブループリントの使い方とかが違うって感じです、はいw

必要な要素をブロック図にして考える

f:id:kanianthi:20160608230607p:plain

プログラム初心者は特にですが、こんな風にイラストレーターで手間をかける必要はありませんので、手書きのメモでも土に枝で描くでも構いませんのでブロック図を書いてやりたいことの概念を整理するクセをつけましょう。

というか、プログラマーでーすとかSEでーすなんて言ってるくせに、こうしたブロックダイアグラムが一切書けないだとか、書いてもらっても意味が分からないというひともけっこういます。残念ですがそれではコミュニケーションが成り立ちません。不思議な話ですが現実です。

少しそれました。

話を戻すと、

  1. 用意した待機アニメーションを切り替える仕組み→いいノードがあった
  2. 用意したアイドリングアニメの数→そのまま変数にする
  3. 一回のアニメーションを再生する時間(秒)→これも変数にする
  4. 経過時間を測る→Delta Timeという仕組みからうまいことやる

というような要素を組み合わせれば、ランダムに待機アニメを再生させることができそうです。流れとしては、

  1. アニメーションの切り替え(選択)
  2. 再生時間を管理して、既定の時間でリセットする
  3. 時間がリセットされたら、再びランダムにアニメーションを切り替える

という感じでいけそうですね。

実際にUE4でノードを組んでみる

ランダム待機アニメーションを実現するために改良しなければならないのはどのブループリントでしょうか?アニメーションを管理しているのは?

…そうアニメーションブループリントですね!(そのまんまや!)

というわけで早速開いてみます。
※サンプルプロジェクトでは「Statue AnimBP2」と複製リネームしています。

f:id:kanianthi:20160608232623j:plain

↑アニムグラフを修正して「IdleVariation」というステートを追加しました。画像ではまだ変更していませんが「Idle/Run」も「Walk/Run」に変更することにします。

このIdleVariationが待機アニメをランダム再生するためのステートです。このステートはキャラが停止しているとき、つまりSpeedがゼロのときに再生されれば良いのですが、実験してみたところ「スピードが2」を区切りに未満と超過で遷移させるといい案配でした。

それではステートの中身を見てみましょう。

f:id:kanianthi:20160608233205j:plain

↑が中身です。

中央にある大きなノードが「整数値でのブレンドポーズ」というノードです。なにやら難しそうですがやっていることはごく単純で、BlendPose0~と並んでいるそれぞれのソケットに接続されたアニメーションを、一番上にあるActive Child Indexという整数の値で選んで次のノードに渡すだけのものです。

このActive Child Indexを指定するための変数として「Idle Num」という整数値の変数を作りました。

またBlendTimeというのは、それぞれのアニメーションを別のアニメーションとブレンド(トランジジョン)させる時間指定をしているものです。

なおUE4でもそうですが、プログラムの世界では整数をinteger(インテジャー!)と呼び、浮動小数点数をfloat(フロート)と呼びます。はい、英語そのまんまですね。

というわけで、上記のノードはすたちゅーさん用に用意した4つの待機アニメーションを「整数値によるブレンドポーズ」に突っ込み「Idle Num」という変数で呼び出すというそれだけのモノです。特に複雑なことはなにもありません。

面倒くさいのはイベントグラフ

f:id:kanianthi:20160608235132j:plain

同じくアニメーションBPのイベントグラフにも改良を施さなければいけません。

まず経過時間を測るための変数として「Cureent Delta Time」を作成しました。変数の作成は「マイブループリント」タブの下にある緑色のボタン「+新規追加」などで行えます。

デルタタイムというのは前フレーム(ここでは処理)からの時間経過を秒で示しています。アニメーションBPでの処理とは「アニメーションを更新すること」ですから、走っていたキャラが停止すれば「walk/Run」から「IdleVariation」にアニメーションが遷移し「処理が走った」ことになり、デルタタイムが0にリセットされ、増えていくはずです(たぶん)。

なのでイベントグラフの先頭になる「イベントBlueprint Update Animation」ノードのすぐ後にセットで「Current Delta Time」を配置したのです。ここでいうセットはノードをセットすることではなくw変数に値を突っ込むことを指します。
※反対にゲットは変数から値を取り出すことです。

さらに、IsInAir?とSpeed値を取得する既存のノードに行く手前で「シーケンス」というノードを使って処理を分岐させました。

ランダムに整数値を取り出す処理

f:id:kanianthi:20160609001203j:plain

↑これがRandom Idle Animation Variablesです!かっけぇ!

  1. 変数Speedがゼロ(キャラが静止しているとき)か?というブランチ(条件分岐)→偽(false)ならなにもしない
  2. Speed=0ブランチが真(true)のとき→変数IdleTimeから変数CurrentDeltaTimeを引き算して0未満ならブランチに繋げる
  3. ブランチがtrueならIdleTime(待機モーション再生秒数)をリセット(6秒)し、Random Integer in Rangeノードを使って0~3の数値を選びIdle Numにセットする
  4. ブランチがfalseならゲットしたIdleTimeからCurrentDeltaTimeを減算した値をIdleTimeにセットする

以上が仕組みのすべてです。
なんかガイジンさんが海外フォーラムで同じことを遥かに難しいノードでやっていましたが、これくらいシンプルなノードできちんと動いています。
※IdleTimeを引き算ではなく足し算で算出しているので面倒なことになっていた。

さて、今回もサンプルプロジェクトへのリンクを貼っておきます。
内容は前回までと同じものですが、改良した「BlogStatueAnimBP2」を収録し、キャラクタBPで指定しています。

onedrive.live.com

 

 

 

 

ZBとBlenderでUE4用のキャラを作る #4:BlenderでUV展開

早いものでこちらの記事も第4回。

今回はBlenderでUV展開を行います。

テクスチャ/マテリアル計画

UV展開を行う前に、テクスチャとマテリアルの計画を立てておく必要があります。

  1. 髪、顔、目、服(靴含む)、肌の5マテリアルにする。
  2. テクスチャは服と肌マテリアルで共通にする(=パーツ単位で共有する)
  3. 目のテクスチャは左右共通(重複UV)とし、512×512pxにする。他は1024×1024にする。(フルHDまでの画面ならある程度のアップにも耐えられる)

以上です。

1024pixテクスチャ(1Kテクスチャ)というのは、モバイルには少し重いし、PCには微妙という立ち位置の解像度ですねwしかしローエンドグラボでも回しやすいサイズではあります。

近年のハイエンドゲームキャラクタでは、2Kテクスチャ(2048×2048pix)かそれ以上が平気で使われていたりするのですが、1Kテクスチャでも表現力としては十分だろうと思います。

f:id:kanianthi:20160608151106j:plain

↑は髪の毛のUVです。

UVをうまく開くコツとは…「シームをうまく引く!」に限ります。

  • 裏表になっている形状→中心エッジにシーム
  • 円筒状の形状→側面一直線
  • 穴が開いていたり押し出し形状→開口部の外周にシーム。必要なら「蓋」と「筒形状」にもシーム→指など

では逆に「うまくいかないコツ」とは

  • ミラーモディファイヤをつけっぱなしで片側だけ開いて終わり
  • トランスフォームに「スケール/回転」が入ったまま展開

この二つが最たるものでしょうか。

ミラーモディファイヤうんぬん、というより「片面だけUV展開」を行うと、モディファイヤを適用して重なっている「半身」のUVは、当然の結果としてノーマルが反転した状態です。ですので特にノーマルマップを使用するモデルでは左右で凹凸が反転してしまうという取り返しのつかない事態に陥ります。

また、トランスフォーム値が入ったままフリーズしないでUV展開を行うと、適切なUVスケールがとれなくなったり、平面投影するための軸がズレたりしてまともなUV展開ができなくなるのでこれも注意が必要です。

というより「なにかおかしいな?」とCG制作で思ったときには、なんらかの値がトランスフォームに入ってしまっていないか、を疑ってみるのがトラブル解決の基本となります。

なおZBrushのUVマスターもサクサクUVを開けて便利ではありますが…使い物にならないゆがみが発生するので何か特別な理由(なんでもいいからUVがあれば良い)でもない限りは使いません。
※ZBのテクスチャ回りのツールはどれをとっても精度が低く、ローポリゴンになればなるほど使い物になりません。

それともうひとつ、ZBでポリグループ編集したメッシュには「頂点グループ」としてmaskとなにやら数値の並んだ頂点グループ情報が入っています。不要なので削除しておきましょう。

f:id:kanianthi:20160608153602j:plain

続いて顔のUVです。

特に説明するほどのことはありませんがw髪の毛で隠れてしまう部分は万が一UVの継ぎ目が出来ても見えませんのでシームを引くには良い場所です。このシームが耳の裏と表を分けるシームとつながるようにすると、UVを展開したときに分かりやすいマップが作成できます。

ポリゴン編集作業のあらゆる場面で「/」キーでソロ表示、さらに編集モードでは「h」キーと修飾キーの組み合わせで選択面を隠したり表示反転させたりできることを利用しましょう。頂点グループを作成するときにも激しく有効です。

f:id:kanianthi:20160608160933j:plain

↑指にUVシームを引くときの代表的なパターンです。

付け根から第3関節あたりまでを円筒とイメージし、指先をキャップとイメージしますが、平行投影するとゆがみが出るので切れ目になるよう指の先端までシームを延長しています。世界地図で良くあるメルカトール法みたいなものです。

それと画像赤丸チェックで示した部分でクリッピングを調整しないと、指先などの頂点に近寄った際(ズームしたとき)、表示が欠けたり透明になったりして操作しづらくなることがありますので調整しましょう。

f:id:kanianthi:20160608162526j:plain

↑最後にボディ部分のUVです。

Blenderも他の3D CGソフトと同様、ポリゴン選択→uキーのUV展開の後は自動で島をUVスペースに配置(アンパッキング)してくれますが、画像で示した部分でマージン調整を行えます。

このボディのようにUVアイランド(島)の数が多いと案外綺麗に並べてくれますが、顔のようにパーツ点数が少ないと「非常にセレブ」な感じに隙間たっぷりな贅沢配置をしてくれるので見習いましょう(いかん)。
※正しくは限られたUVスペースを有効に活用できるよう、なるべく隙間を潰し、なおかつ後で「塗り絵」がやりやすいように、島と島をくっつけすぎないようにUV配置を行いましょう。

それではすべてのUVが用意できたので、次回は再びZBにメッシュを送ってディティール入れとポリペイントによるテクスチャリングなどを行います。

 

ZBとBlenderでUE4用のキャラを作る #3:Blenderでジオメトリ編集

それでは第3回です。

f:id:kanianthi:20160608094414j:plain

前回までにZbrushですべてのサブツールをZremesherしましたので、GoZ→GoBアドオンを使ってポリゴンデータをBlenderにエクスポート/インポートします。

ここで注意することは、

  1. 単位を「メートル法」にしておく
  2. 各オブジェクトの寸法を把握しておく
  3. 頂点数と面の数も確認。(メインメニューに並びます)
  4. ついでに「Vismaya Tools」があるとフリーズ化作業などに便利ですよ

以上です。

スケール合わせや骨入れは後の工程で

以前の記事でも書いたように、Blenderは「メートル単位」であるのに対して、UE4はセンチメートル単位です。この単位は相対的なものですのでBlender内で1.7メートルと表示されたものは、UE4では1.7センチの指先より小さいキャラになってしまいます。

この後の作業もBlender内だけで完結させる場合はすぐにスケール合わせを行っても良いのですが、Zbrush併用でテクスチャリングやディティール入れを行いたいので、現時点ではスケールを確認するだけに留めます。

なぜなら…Zbrushはブラシの大きさや強度がスケールに依存するため、およそ数十倍にスケール合わせを行ったメッシュにディティールを入れるのが「かなり大変」になるからです。出来ないわけではありませんが、スムーズではなくなるのでストレスが溜まります。

以後、ZbrushSubstanceなどで行いたい作業は「テクスチャの書き出し」です。テクスチャデータはメッシュを均等に拡大すればそのまま使えますので、作業がやりにくくなるのであれば、UE4へのスケール合わせはテクスチャリングが終わってからで十分です。

ジオメトリの修正

ジオメトリの修正はこんなテクニックを組み合わせて行います。

f:id:kanianthi:20160608101938j:plain

ループエッジを追加して袖やスパッツなどの縁を作ります。

  1. 元のポリゴン
  2. エッジを追加(ベベルエッジかctrl Rなど)
  3. 片方のエッジをsでスケール
  4. もう一方のエッジを(画面では)上移動して重ねる
  5. 全体の形状を整える

押し出しを使うと無用の面やエッジが増えてしまうので、上記の方法がポリゴンモデラでのディティール入れでは定番の手法です。作例では垂直に立った円柱で作業していますが、腕や足などは軸平面に対して真っすぐにはなっていませんので、移動マニピュレータを「ノーマル」モードで使用すれば、エッジのノーマル方向に対して作用するようになるので便利です。

f:id:kanianthi:20160608102917j:plain

髪の毛オブジェクトは後頭部の「絶対見えない部分」を面で削除しておきます。また、ジオメトリの修正を行いながら、どのようにUVシームを入れればゆがみのないUVが楽に展開できるか考えながら作業を行い、明らかに必要なシームはどんどん入れていきます。

f:id:kanianthi:20160608103622j:plain

円周状のエッジを閉じる。

  1. 円周エッジをaltクリックで選択
  2. eで押し出しsで均等スケールする
  3. 2を繰り返したあと「頂点」に切り替えaltMで中心に結合

f:id:kanianthi:20160608105049j:plain

面を円形に整形

  1. ベースポリゴンを程よく分割しておく
  2. 面をインセット(i)する
  3. アドオン「LoopTools」の「円」を使う

※今回はサブディビジョンモデルを使わないのでこのまま押し出したりしても構いませんが、円周状に整えたポリゴンをもう一度インセットしておくとカトマルクラークがスムーズになります。↓が作例。

f:id:kanianthi:20160608105949j:plain

三角面の意識的な使用

f:id:kanianthi:20160608110411j:plain

今時ですと意地でも四角ポリゴン!という信仰じみたテーゼが定着しつつありますが、実際に四角ポリゴンだけでモデリングするのは難しい話で、デメリットもたくさんあります。そもそも「四角ポリだけで作る」というのはサブディビジョン・サーフェースが四角面じゃないとうまくスムーズ分割できないことから出てきた話であり、サブディビが使えない前提であれば、四角面にこだわる必要はありません。

ポリゴン編集をするうえで、四角ポリゴンを使わないとエッジループが使えないという問題もありますから、広い領域ではもちろん四角面を使いますが、髪の毛の先端などでは遠慮なく三角ポリゴンを併用して「レンダリングエンジンにエッジを指定する」作業を行いましょう。

f:id:kanianthi:20160608111203j:plain

Zremesherの相変わらずの欠点として、ポリゴン数が少ない指定だと「あり得ない頂点接続」をしてきたりしますが、それでも手動リトポするより便利な面も多いです。

↑のお尻もZremesherそのままだと使い物にならないメッシュでしたが、ちょっとエッジを追加して頂点接続を考え直せばなんとかなります。四角面だけで構成しようとすると汚いシェーディングになってしまうので、効果的に三角ポリを併用して整えます。

f:id:kanianthi:20160608112348j:plain

ボディのジオメトリ編集がほぼ終わりました。

  1. トップス(ウエア上)の袖口をエッジ追加とスライドで作成シーム入れ
  2. トップスとボトムスの継ぎ目?を同じく追加してシーム
  3. 手にもハーフグローブをはめている感じにするため縁を追加
  4. シューズのポリゴンをリダクションしてシームを追加
  5. 手から指が生えている部分が激しく汚かったので修正

眼球を作成

f:id:kanianthi:20160608113841j:plain

  1. 原点でプリミティブのポリゴン球を作成します。セグメント数16、リングを10で作成しました。
  2. 球体をr→xなどでX軸90度回転させ、軸が前方を向くようにします。
  3. エンプティを作成し、球→エンプティの順に選択してctrl+Pで親子付け(ペアレント)します。

f:id:kanianthi:20160608114837j:plain

  1. 眼球がどこを向いているか分かるように、右ペインのオブジェクトタブの「表示」メニューでワイヤーフレームを指定しておきます。
  2. エンプティを移動し、ローカルでYサイズをスケールして平べったく変形し、眼窩(がんか)にうまくはまるよう修正します。親であるエンプティを変形(トランスフォーム)すれば、眼球オブジェクトも変形します。回転もスケールもローカルで行えば軸ズレを起こすことなく編集できるので便利です。

なぜこのような手間をするのか?というと、扁平した眼球そのものをトランスフォームすると「目の回転リグ」が組めなくなるからです。この方法であれば、変形のトランスフォーム値が入るのは親のEmptyだけで、眼球のデータは「球体のまま」なので、回転させても眼窩からはみ出してしまうことがありません。

これは「トゥーン顔」で一般的なテクニックで、扁平した平べったい眼球をはみ出さないで回転させるための基本になります。

今回のようなゲーム用の非ハイエンド設定なキャラでは、眼球リグまでは仕込まないことが多いですから、目の扁平具合と位置決め、スケーリングなどを行ったあとに、眼球自体を回転させて適切な「初期位置」で瞳孔の向きを決めるために行いました。
※ついでに、映像用キャラであれば目のリグも必要になりますので、Tipsの意味もかねて。

このキャラの場合、ハイエンドを狙うわけではなく、PCなら軽く表示できてモバイルデバイスでもなんとか動かせる(それなりのスペックは要求されるでしょうが)ところを狙っていますので、いい感じに眼球が配置できたらペアレントを解除してトランスフォームを適用(alt+P→トランスフォームを維持してクリア)し、裏側のポリゴンは削除してしまいます。

以上ですべてのパーツのジオメトリ編集が終わりました。

次回はUVを展開し、テクスチャリングとディティール入れを行います。