Monday, November 12, 2018

Amazon Lumberyard学習メモ:アナログスティックの向きを取得する

前回から引き続き、以前作ったキャラクターの改良です。今回からは
・移動方向に合わせてモーションを変える
です。

現状ではどちらの方向に動いても前進モーションが再生されてしまっています。これを、右/左並行移動時と後方移動時にはそれぞれ専用のモーションを再生する様にします。
ですが、それだけでは不十分です。斜め方向に移動した時はそれぞれのモーションをブレンドしなければいけません。その際、角度に応じてブレンドの量を変化させる必要もあります。

重要な作業は以下の二つです。
1)モーションブレンドの量として使う為に、アナログスティックの向きの角度を取得する
2)Anim Graphでモーションブレンドのシステムを作成する
今回は1)の説明です。

検証の為に別のレベルでスクリプトを作成してみました。
こちらはInputBindingsです。


こちらがスクリプトです。

スクリプトの上半分ではアナログスティックのXとYの入力量を変数に入れています。下側では以下の処理を行っています。
1)まず変数に入れたXとYの入力量をArcTan2ノードに渡して角度(ラジアン)を取得します。ArcTan2ノードでは全周(2πラジアン)の範囲で角度が取得出来ますが、範囲は「0〜全周」ではなく、「マイナス半周〜0〜プラス半周」となります。
2)次に、取得した角度を0.0〜1.0の範囲の値に変換します。普通に考えれば2πで割り算して0.5を足せば良いのですが、定数πみたいなのは見つからなかったので、Radians to Degreesノードで度数法に変換してから360で割り算して0.5を足しています。

0.0〜1.0に変換したのは、Anim Graphのモーションブレンドで0.0〜1.0のウェイト値を使うからです。
次回はAnim Graphでモーションブレンドのシステムを作成します。

Thursday, November 1, 2018

Amazon Lumberyard学習メモ : アナログスティックの入力量の検証

今回から、以前作ったキャラクターの改良を行っていきたいと思います。
直したい所は色々あります。
・まっすぐ移動する時より斜め方向に移動する時の方が速いのでは…
・移動方向に合わせてモーションを変える
・移動速度に合わせてモーションの速度を変える
・高低差がある地形の上を移動出来る様にする
・変数に初期値をセットする
・移動を始める時に再生中のモーションをキャンセルする
全部出来るか分かりませんが、やれるだけやってみましょう。

今回は最初の項目です。
・まっすぐ移動する時より斜め方向に移動する時の方が速いのでは…

以前作成したスクリプトでは、ゲームパッドのアナログスティックのX入力量とY入力量をそれぞれ別に取得しました。なので、スティックを斜め方向に入れると両者を合成した値は1.0を超え、45度にすると値は最大の√2になると思われます。
実際の所どうなのでしょうか?
アナログスティックからの入力量を合成したベクトルの長さを表示するスクリプトを作って実験してみました。

こちらがスクリプトです。X入力量の2乗+Y入力量の2乗の平方根を表示します。


インプットはゲームパッドのアナログスティックです。


スティックを斜め45度方向いっぱいに傾けて値を表示してみました。
こちらが結果です。

…意外な事に1.0になりました。

他の方向に傾けてもおおむね1.0になります。


こちらはゲームパッドの代わりにキーボードからのキー入力をインプットに使ってみた結果です。予想通り√2になりました。


これはどういう事でしょうか。単純にアナログスティックの可動範囲が円形だから入力量が制限されているのか?
何にしろ、アナログスティックを使っている限り現状で問題なしという事でこの件は終了です。良かった良かった。

Friday, October 19, 2018

Amazon Lumberyard学習メモ:テクスチャーとライティング

今回はオブジェクトにPBR用テクスチャーをアサインし、ライティングする手順を紹介します。
使用するLumberyardのバージョンは1.15.0.0です。

参考資料:
Amazon Game TechのYoutubeチャンネル、Lumberyardユーザーガイド

まずはオブジェクトを用意します。今回はテスト用にこの様なキューブ状のオブジェクトを作成しました。これをFBXでエクスポートしておきます。


このオブジェクトの為のマテリアルを作成します。
今回は3D-Coatを使っています。


同様に床用のプレーンオブジェクトも用意します。


床用のプレーンオブジェクトから作成したPBR用のテクスチャーです。今回はPNGで作りました。
(2019/01/04追記:後から気づいたのですが、テクスチャーに追加したアルファチャンネルがPNGでセーブした時にロストしてました…画像フォーマットには詳しくないので良く分かりませんが、PNGのアルファって必ず透過として持つ仕様なんですかね?とりあえずTGAなら問題無いので、下の画像も差し替えました。)

LumberyardのPBRはスペキュラーワークフローなので、Diffuse・Specular・Glossiness・Normalの4種類を使います。この内Glossinessは、こちらのドキュメントに従いNormalのアルファチャンネルに格納します。なのでLumberyardで使用するテクスチャーファイルは3つという事になります。
各テクスチャーファイルにはこちらのドキュメント通りにサフィックスを付けます。

NormalのRGBは下図の様にします。

3D-Coatを使う場合、出力した画像のGreenチャンネルを反転させるとこの様になります。

全てのオブジェクトとテクスチャーが用意出来たらC:/Amazon/Lumberyard/1.15.0.0/dev/StarterGame/の下に適当なフォルダを作り移動させます。今回は以前キャラクターを作った際に用意した場所を再利用する事にし、以下の様にしました。

オブジェクトの移動先
C:/Amazon/Lumberyard/1.15.0.0/dev/StarterGame/Items_LowPolyMan/objects/

テクスチャーの移動先
C:/Amazon/Lumberyard/1.15.0.0/dev/StarterGame/Items_LowPolyMan/textures/

では、Lumberyard Editorでの作業に入ります。
まずFile - Newで新規レベルを作成して下さい。


次はオブジェクトの用意です。
Entity Outlinerでマウス右クリック → Create Entityを実行し、新規Entityを作成します。


作成したEntityを選択した状態でEntity InspectorでAdd Componentを実行します。


ComponentのリストからMeshを選びます。


追加されたMeshコンポーネントのMesh assetのブラウズアイコンをクリックしてファイルブラウザを出し、用意しておいたオブジェクトをロードします。


Perspectiveビューにオブジェクトが表示されました。


かなり遠いのでカメラを寄せてみます。Entity Outlinerでオブジェクトのエンティティを選び、マウス右クリック → Goto Entities in Viewportを実行します。


近くに表示されました。


マテリアルをアサインします。
まずTools - Material Editorを実行してマテリアルエディタを表示します。


マテリアルエディタ左カラムにあるファイルブラウザから、先ほどのオブジェクトを選択します。右カラムに球と「Default」と名前が付いたエリアが表示されます。


Defaultエリアをクリックします。


下に詳細が表示されます。


各テクスチャーのスロットにファイルをロードします。


(2018/11/30追記) Diffuse Color(Tint)、Specular Color、Smoothnessそれぞれの値を上限の255にします。


Perspectiveビューのオブジェクトにテクスチャーがアサインされました。


確認し易い様に視点を斜め位置にしました。視点はマウス各ボタンドラッグで動かします。


オブジェクトはMoveツールで移動させられます。


同じ手順で床のオブジェクトも配置しました。


タイリングはDiffuseのAdvancedの中にあるTilingで設定します。


太陽の方向を調整してみます。
Tools - Other - Sun Trajectory Toolを実行します。


Sun Trajectory ToolのTime of Dayスライダーで時刻を朝に変更します。


背景が朝になりました。

ですがオブジェクトを良く見ると、なんとなく明るい感じがします。環境光が更新されていないからです。

環境光を更新してみます。
Entity OutlinerでDefaultLevelSetupを選択します。


Entity Inspectorを見て下さい。DefaultLevelSetupエンティティの中にEnvironment Probeというコンポーネントがあります。その中にあるCubemap generationのCubemap - Resetボタンをクリックします。


キューブマップがリセットされ、環境光が真っ暗になりました。


次にCubemap - Generateをクリックします。


しばらく待つとキューブマップが生成され、オブジェクトが環境光で照らされました。


環境光の影響を調整してみましょう。
General SettingsのDiffuse multiplierとSpecular multiplierの値を変更してみます。


コントラストが強めになりました。


ちなみに、局所用にEnvironment Probeを追加する事が出来ます。
作り方は、新規にエンティティを作成しAdd ComponentでEnvironment Probeコンポーネントを追加するだけです。
下図では、左右に赤色と青色のEnvironment Probeを配置しています。キューブがエリアに入るとその色で照らされるのが分かります。






調整に戻ります。
キューブオブジェクトの影のエッジが甘いのでシャープにしてみます。
キューブオブジェクトのEntityを選択して下さい。


Add ComponentでHigh Quality Shadowを選択します。


影のエッジがシャープになりました。


ライトを作ってみます。
まず新規Entityを作成します。


Add Componentでライトのコンポーネントを追加します。今回はPoint Lightにします。


作ったライトで正面から照らしてみました。


ライトのOptionsのCast shadow specをNever以外にします。ライトの影が落ちる様になりました。


今回は以上です。