先日は、
にて、UPBGEでは、ロジックエディタでシェイプキーを制御できることについて書きました。これについては、キーフレームで挙動を実装するとアクションとして追加されるので、ロジックエディタのアクチュエーターで実行できるようになります。
■ アクションを登録する
Blenderで動画を作る場合だと、挙動はドープシートで登録すると、アクションとしてと録されるので、VSEを使って動画編集をするようにクリップとしてアクションの管理ができます。この時に登録したアクションがいつ発生するのか?の指定をストリップ(この場合、アクションの塊。名称はフィルムの巻きです。)を移動して指定する事ができます。また、同じ素材を複製して配置することで、同じモーションを連続して発生させることもできます。基本的に、キーフレームを打って挙動の指定をするとアクションとして登録されるので挙動の発生タイミングはNALエディタによって動画の編集を行うように配置する事ができます。
その為、Blenderでは、キーフレームを打ったものだとそのままアクションとして管理できる仕様になっています。
■ UPBGEの場合
UPBGEはゲームエンジンですから、永続して動く物の場合、それをロジックで指定できますから、挙動の設定は二種類あります。前述のとおり、挙動には
■ オブジェクト単位
■ オブジェクトを構成する頂点
の二つがありますが、前者は、モーションで、後者はアクションで管理します。その為、動画だとキーフレームを打たないと連続して動いてくれませんが、ゲームの場合だと入力や自動処理で動きますから、オブジェクト単位だとモーションで管理できます。また、キャラクター指定をすると、ジャンプモーションの設定までできるので、ダイナミクスの設定を行うと、モーションだけでジャンプの挙動を実装できます。
これに対して、ロジックで制御することが不可能なキーフレームで制御できる物については、アクションでコントロールする事ができます。
ア クションを登録する
まず、UPBGEを開いて
のようにアニメーションのタブでアニメーションを作ります。今回は、ライトを選択して、
のように色とパワーを制御することにしました。フレームを指定して、その時間軸の状態に合わせて数値を決めてキーフレームを追加します。
この状態でUPBGEではアクションも登録されています。
ロ ジックでの制御
アクションは出来上がっているので、ロジックエディタに移動して、
のようなロジックを組みます、今回は、アクションを使うので、
を使いますが、今回は一度だけ機能する再生を選択します。
のように開始フレームと最終フレームを指定すると完成ですが、アクションが切り替わる時に滑らかに動きが切り替わるブレンディングも指定しておきました。今回はこれは関係ないので、0のままで問題がありません。
ロジックは、
のような感じで、常時変化するように設定にしています。この状態で、
のような感じになりますが、更に球体を用意して、
のように放射の指定を行い、発光の強さをキーフレームで制御することにしました。
のようにキーフレームを打って、ロジックエディタに移動します。
今回は、
のようなロジックを組んでいますが、今回も常時設定で、
のようにLoop Stopの指定をしています。これは永続してその処理が行われる設定ですから、常に登録したアクションがゲーム内で実行されます。
実際に動かした見ると、
のように時間軸で光源の状態が変わりますが、更に、
のように質感を変更します。
この状態で、ゲームとして書き出せるのですが、メニューから
のようにエクスポートを選択すると、
のように 【 Save as game runtime 】 の項目があるので、これを選択すると、指定した場所に実行形式(WINDOWSの場合.exe)とライブラリ(dill)が出力されます。
こう言うのは動画で見たほうが解り易いので、YouTubeに動画をアップしておきました。
■ 照明をロジックでコントロールする
ゲームとして書き出して動かしたものが、
■ ゲームとして実行する
になりますが、このバージョンでは、ゲーム内で任意の制御方法で光源の明るさをコントロールすることもできます。
シ ェイプキーの制御
今回は、
のようにアクションを使っていますが、UPBGEでは、シェイプキーもアクションで制御できます。シェイプキーはベースと変化の状態を指定することで登録した形に変形する事ができますが、こうした変化もアクションで挙動を登録して使用できます。今回はCUBEを使うので、
のように変形しやすいように細分化します。そして、
のように 【 + 】 キーでベースを追加して、更に、
のように追加するキーを増やして、名称を解り易いものに変更します。
そして、登録すrキーを選択後にエディットモードに入り、
のように変形さえます。この状態で、
のようにキーフレームを打って、推移を追加します。この場合、値を変更するので、フレームを指定した後に数値を変更して、
のキーフレームの挿入でキーフレームを追加します。とりあえず、
のような感じでキーフレームを打ちこんで、ロジックエディタでロジックを組みます。ロジックエディタを開くと、
のような画面になりますが、今回は、キーボードで制御することにしました。
とりあえず、
のようにロジックを組んで、キーを押した回数分だけ変数が増えるようにしておきました。この状態で実行すると、
のような感じでスペースキーを押すとシェイプキーが実行されます。そして、パフォーマンスモニターを見ると、
のようにAの数値が増えています。今回も文字だけではわかりにくいので、動画を作ってYouTubeにアップしておきました。
■ 光源+シェイプキーを動かしたもの
このようにアクションでは色々な事ができるのですが、今回は、凹凸を制御するディスプレイスメントマップについて紹介しようかなと思います。
凹 凸の指定をする
凹凸の指定には、ポリゴンを形成するちょつ円の座標で制御しますが、この場合、頂点の数とディテールの細かさが比例します。その為、基本的に、ハイポリモデルにすると、その分、細かなディテールの制御が可能になります。また、ディテールの表現にはテクスチャーも用いますが、これも高解像度になれば描き込めるディテールの量も増えるので、解像度の比例してディテールが高くなります。
凹凸については、
の中でディスプレイスメントマップとノーマルマップを使っていますが、ディスプレイスメントマップについては、
■ 作成したテクスチャーを使用する
■ プロシージャルテクスチャーを使用する
と言う二つの方法があります。とは言っても、ディスプレイスメントマップはハイトマップなので、昔の3DCGツールのバンプマップ用のグレースケールのマップをそのまま使う感じなので、基本的にグレースケールで描ける環境を用意することになります。
Blenderの場合だと、テクスチャーペイントで作成したマップを使用できますが、作成後に一旦保存して、ブラシ用のテクスチャーで読み込みます。すると、そのマップをモディファイヤーで指定したディスプレイスメントマップとして使用できます。グラフィックツールを使う場合だと、レイヤー効果を使ってハイライトとシャドウをコントロールできたりガウスなどでにじませる事もできるので、手書きよりももう少し複雑な事ができますが、こうした外部ツールを使った作業の場合は、ファイルの読み込みを
ブラシの指定を行うテクスチャーとして読み込む
とディスプレイスメントマップとして使用できます。これが、作成したテクスチャーでの処理になりますが、これとは別にプロシージャルテクスチャーを使う事もできます。これは数値の変化でテクスチャーのパターンを変更できるものになりますが、ブラシ形状として登録できるので、
■ テクスチャーペイント
■ Sculptモデリング
において、ディテールを描きこむ時に使えます。あと、ダイナミックペイントやウェイトペイントでもブラシ形状が反映されますが、形状に直接関係ありそうなのは、この2つになります。
ちなみに、テクスチャーペイントを使った場合だと、
■ テクスチャーペイント+ディスプレイス
のような感じになります。また、ディスプレイスメントマップは、手書きではなく、テクスチャーBAKEで作る事もできますが、素の場合、Sculptモデリングで形状を作って適応します。Sculptモデリングは、ブラシで直感的に頂点の座標を変化させるモデリング手法になりますが、
■ Sculptモデリング
のような感じになります。また、ディスプレイスメントマップはノードでも指定できるので、
■ シェーダーでの質感の設定
のようにシェーダーで指定する事も可能です。
今回は、後者のプロシージャルテクスチャーを使ってディスプレイスメントマップの指定を行います。
デ ィスプレイスメントマップを適応する
今回はUPBGE 0.3 Alphaを使用しますが、サイトを聴見てみると、
ように1日に最新版が出ていました。そして、Blender 2.9.0 Alphaも
のように先月末に最新版がリリースされています。2.83.0Betaは今月の1日にリリースされていますが、この二つは、最新版にアップデートされています。
今回は、ダウンロードが終わっていないので旧バージョンになりますが、UPBGE 0.3 Alphaを立ち上げると、
のような画面になりますが、今回は、このCUBEにディスプレイスメントマップを適応します。
■ ディスプレイスメントマップを適応する
ディスプレイスメントマップはノードから指定する方法と、モディファイヤーから指定する方法がありますが、今回はモディファイヤーから指定します。指定をすると、
のようになりますが、ディスプレイスメントマップはオブジェクト(ジオメトリ)を構成している頂点(バーテックス)の座標変化をハイトマップで制御しているので、頂点の数が少ないと変化が出ません。
その為、分割を行て細分化をするか、サブディビジョンで細分化することになります。Ctmul-Clark法だと画像のように丸まってしまうので、面を維持したい場合だと、エディットモードから辺を細分化して形状が変化しないようにする必要があります。この状態で、
のようになりますが、凹凸は、下にあるディスプレイスで行っています。
のように指定テクスチャーで制御しますが、このディスプレイスメントマップも数値で制御されていますから、
のようにキーフレームを打つとアクションが登録されます。つまり、このディスプレイスメントマップの凹凸の変化をロジックエディタで制御できます。
ロ ジックエディタの準備
UPBGE 0.3 Alphaではロジックエディタのタブはなく、項目すら存在しないので、新規にウインドウ構成を作る必要があります。まず、
のように新規ワークスペースを作るために、余計な分割差がされていないRenderingを選択します。新規作成は 【 + 】のアイコンでこの項目が表示できます。追加すると、
のようになります。ただし、この状態だと使いにくいので画面を分割します。
画面の左側面の端にマウスカーソルを合わせると、 【 ↔ 】 の形になるので、そこで右クリックをすると
のようなメニューが出てきます。すると、分割するラインが出てくるので任意の場所で分割します。
この状態で、画面左上のアイコンをクリックすると、
のように表示メニューの一覧が出るので、上側を3Dビューポートにします。下側も変更する必要があるので、
のようにアイコンをクリックしてメニューを出し、
のようにLOGIC EDITORを指定します。すると、
のような画面構成になります。
ロ ジックを組む
とりあえず、画面構成はできたのでロジックを組みます。
のように
■ センサー
■ コントローラー
■ アクチュエーター
を繋ぐことになりますが、今回は、
のようにしています。これは自動でアクションが実行される作りですが、
のようにアクションを見ると、先ほど追加した挙動が登録されているので、アクチュエーターでアクションを選択すると呼び出す事ができます。
挙動が実装されているので、実際にゲームとして実行してい観ると、
のようなディテールの変化をそのまま反映させることができます。
■ 実際にゲームとして動かした動画
プ ロシージャルテクスチャー
ディスプレイスメントマップの指定は、テクスチャーで行えますが、
のような質感の変化もディスプレイスのモディファイヤーで指定したテクスチャーの状態を数値でコントロールして調整しています。
このテクスチャーの指定ですが、テクスチャーのプロパティーで指定したマップを使うことになるので、その登録を粉う必要があります。画像を読み込んで使う場合も同様ですが、画像の場合だと、
の中の、画像または動画を選択します。それ以外はパラメーターの変化で結果を変更できるプロシージャルテクスチャーになります。各項目による変化ですが、
■ ブレンド
■ 変調ノイズ
■ マジック
■ マーブル
■ マスグレイブ
■ ノイズ
■ 凹凸
■ ボロノイ
■ 木材
のような状態変化が発生します。これについては、
■ ディスプレイスメントと状態変化
にて動画で紹介していますが、結構変化します。
プロシージャルテクスチャーでディスプレイスを調整した場合、
■ ディスプレイス
数値の変更でバーテックスの座標変化の度合いを変える。
(凹凸の状態が変わります)
■ プロシージャルテクスチャー
数値の設定や指定した項目でテクスチャーの状態や
サイズを変更する
(指定するパターン自体が変わります)
をコントロールできるので、形状自体をパラメーターの変更だけで調整できます。これについても、動画で見たほうが解り易いので、YouTubeに動画をアップしておきました。
■ プロシージャルテクスチャーでの形状変化
キ ャラクターにアクションを使用する
オブジェクトには物体とキャラクターがありますが、UPBGEではキャラクター専用のダイナミクスがあります。ダイナミクスのプロパティは、
のようにBlenderと同じ項目が並んでいますが、物理タイプについては、
のようにBlender 2.8では実装されていないものが並んでいます。と言ってもBGEではおなじみの項目ですが、ゲーム用のダイナミクスが実装されています。
キャラクターを選択すると、
のような感じになりますが、ジャンプする高さやその時の力も指定できますし、落ちる時の速度も設定できます。Max Jumpsは連続ジャンプの設定で、通常は一度のジャンプの実に対応していますが、この数値を増やすと多段ジャンプができるようになります。
今回は、
のようにしていますが、ダイナミクスを指定しているので、
のように高い位置からスタートすると、引力によって物体は落下します。その為、このオブジェクトもゲーム実行時には落下します。
ゲームとしてシーンを実行すると、
のようになりますが、ジャンプに指定したキーを押すと、
のようになります。キャラクター設定をすると、固定物のような常時の設定ができなくなるので、アクションの実行時にはキー判定などを入れる必要があります。
のようなロジックを組むと、登録したアクションがそのまま実行されるようになります、
こうした挙動は実際に見たほうが解り易いので、YouTubeに実際に動かした動画をアップしておきました。
■ 今回のロジックを動かした動画
A ppendix
今回は凹凸を表現する手法の一つとして、ディスプレイスメントマップを紹介しましたが、UPBGE内で使用できるという事は、ロジックを組めばテッセレーションの実装も可能という事になります。
ゲームにおける凹凸ですが、PBRでも使用されているノーマルマップもありますが、ゲーム自体はローポリもⅮるで構成されており、カメラオブジェクト(やキャラクターオブジェクト)との距離によってトポロジーをかけてディスプレイスメントマップを反映させてディテールを上げるテッセレーションと言う技術があります。これは、トポロジーを行う事で、ディスプレイスメントマップ用のハイトマップの適応度合いを高くするわけですが、そのトポロジーのレベルを距離の変化で判定を行い、調整をするロジックで制御されている物になります。
この真逆の処理として、距離に応じてポリゴンリダクションをかけるLoDがありますが、これは、遠くのものはディテールが低くても大丈夫なので、そう言ったリダクションをかけることで、シーン内の負荷を下げる技術になります。LoDはBGEにも実装されている技術なので、当然のようにUPBGEにも実装されていますが、ゲームの場合、リアルタイム処理なので、さまざまな負荷軽減を行う技術が実装されています。
凹凸についても、遠くのものに重たいマップを適応する必要はないですし、ハイポリにする必要性もありませんから、リダクションをかけるわけですが、FoVでどの程度見えているのか?でディテールの距離の判定を変える必要がありますが、DoFとFogを用いた場合、ディテールがはっきりしている場所が限定されるので、ディテールのコントロールが行いやすくなります。この場合、間引ける部分が多くなるので、Fogよりも近い場所で、物の見え方を確認しながら、LoDの距離を決めると、ディテールに影響が出ない状態でリダクションができます。
このディテールコントロールの一つにディスプレイスメントマップのかかり具合を変更する鉄製レーションがありますが、見えている場所の凹凸を表現数る場合、ノーマルマップとディスプレイスメントマップを使えますが、この2つですが、
■ ノーマルマップ
テクスチャーによって、立体に見えるような陰影をつけて、
変化しているように見せる技法。
テクスチャーなので軽い反面、角度が水平に近くなるほど
立体感が失われる
基本的にオブジェクトのポリゴン数は変わらないので、負
荷が過度に上昇することはない
■ ディスプレイスメントマップ
グレースケールのハイトマップによってオブジェクトの形状
事態を変化させて凹凸を表現する技法。
形状自体が変化しているので視点が変わっても凹凸の状
態は維持される
基本的にハイポリモデルでなければディテール感が見込
めないので負荷がかなり上昇する
のような特性があります。現在は、これとは別に、POMと言う技術が使用されていますが、これはテクスチャーだけで凹凸を表現する手法になります。
POMについては、マインクラフトのJAVA EDITIONで高解像度テクスチャーとPOM対応のシェーダーパックで実現できますが、このPOMと言うのは、視差オクルージョンマッピングで、視点変更に追従して凹凸が維持されるテクスチャーになります。
ノーマルマップは凹凸を陰影などで感じるような手法ですが、視点変更に追従するので、地面と水平にならない限り立体感を感じる作りにできます。このマッピングの特徴ですが、
【 平面にハイトマップで奥行き感を入れる事ができる 】
ので、板ポリゴンの地面に対してかなり広い視野角で凹凸を感じるようなマッピングを適応できます。この手法だとノーマルマップでは苦手とする逆光に強いという利点もあります。
この技術ですが、テッセレーションと同じくリアルタイムでハイトマップで凹凸を表現するバンプ技術のPallax Ocrusion Mappingになります。
バンプ技法では細分化をおこなっているので、重くなるのですが、この細分化については、リアルタイムレンダリングとプリレンダリングでは分割方法が異なります。映像制作などで使うプリレンダリングでは、四角形ポリゴンで細分化をしますが、ゲームグラフィックの場合には三角形ポリゴンで分割します。その為、仕様が異なりますが、この分割の違いにより、三角形ポリゴンで分割するテッセレーションなどでは荒くなる傾向があります。あと、複雑なディテールになると、かなり細分化をしないとダメですから、ハイトマッピングで表現できる凹凸の表現はかなり自由度が高い物の、そのシーンの総ポリゴン数はかなり増大してしまいます。また、ハイトマップはグレースケールでの上下方向の表現をする手法ですから、トンネルのように盛り上がった中に穴をあけるようなことはできません。ただし、ベクターディスプレイスメントと言う技術があり、カラーを用いたディスプレイスメントマップを使用することにより従来のディスプレイスメントマップとは異なる処理を大なうことができる王になっています。
POMについては、先日紹介したように、Blenderでもノードが配布されていますから、ハイトマップで凹凸の調整をして立体感のある板ポリゴンを作る事ができるのですが、ゲーム内で使用する場合だと、テッセレーションとPOMを組み合わせて使用することになります。
今 回の作業環境
■ Core i5 650
■ H55M-Pro
■ DDR 1333 2GBx2+1GBx2(DUAL CH)
■ Quadro K620(PCI Express x16 【GEN2動作】)
■ SATA HDD
■ WINDOWS 10 x64 (1909)
■ Blender 2.82a (x64)
■ UPBGE 0.3 Alpha & 0.2.5
■ Gimp 2.10.18 (x64)