UE4の勉強記録

UE4の勉強の記録です。個人用です。

先週の続き

先週ファイル利用量が超過して掲載出来なかった分です。

6.Gaeaの勉強

今週もAndrea Cantelli氏のGaea Tutorial for Beginnersを勉強します。今週はGaea Tutorial for Beginners #5 | Creating the shape of our first terrain [14]を勉強します。

6.1 Blogを見直して前に勉強した内容を復習する

見直すと2022-11-202022-11-28のBlogで勉強しています。

それぞれのBlogの内容を読み直してみます。

2022-11-20

文句が沢山書かれていました。その理由ですが、

  • あまりに退屈
  • Versionが古いので無駄な勉強が多い
  • 正解が無い事に対して勉強している

まあこれを勉強したらどうなるのかの先が見えないと退屈になります。

それは兎も角、無駄な勉強が多いと、正解が無い事に対して勉強している。という2つの結論に関しては今から見ると間違っていますね。

Nodeの作成に関して言えば新しいVersionもそんなに差はないです。更に言うとこのTutorialを勉強した後から自分で、Gaeaを使ってそれなりのTerrainを作成出来るようになりました。

つまり凄い効果が有ったTutorialだったんです。

TerrainをNodeを使って作成する方法に正解は無いというのは一見正しい意見です。

しかし条件をつければ(例えば写真そっくりなTerrainを作成するとか、UEで使用するためのTerrainを作成するとか)いくらでも正解は有ります。

後、この時はまだ気が付いていませんが、それぞれのNodeはある機能を体現しています。その機能のTypeから機能を群に分割する事が出来ます。そしてGaeaでTerrainを作成する時は、ここではこの群から選択しないといけない位の緩い制約は常にあってそういう意味でもTerrainをNodeを使って作成する方法にはある程度の正解はあります。

まあ、でも不満を述べるという事は、それだけ真剣に勉強しているという事でもあるのでそれはそれで良いでしょう。

それぞれの章に対しての勉強した内容や感想がまとめられていました。

以下にそれを更に簡潔にまとめます。

<<Intro>>

本当かよ。

これは要確認です。

<<Primitives>>

そうだったけ?

それより、NodeでTerrainを作成する時は、必ずPrimitiveから始める必要がある事について一言も書いていません。

<<Edges>>

Apertureノードについてまとめてありました。

Apertureノードそのものの勉強も大切ですが、ここはEdgesとしての章です。Primitive型のNodeを使用した後で、Edge型のNodeを使用するのが一般的なNodeの使用方法なのかが知りたいです。

それについてはここでは何も書かれていませんでした。今回の勉強でそれは確認します。

<<Erosion>>

Primitive -> Edge -> Erosionの順番で作成するのが一般的なやり方なのかの解説が無いです。

しかもErosionを使用するまでにWarpノードやSwirlノードを使用したりしていて何を目的にNodeを組んでいるのかとか、どんな順序でNodeを組むべきなのかとかが全部無茶苦茶になっています。

この部分だけを見ると、

  • 正解が無い事に対して勉強している

という2022-11-20のBlogの批判もそれなりに的を得ています。

この辺は私が自分でTutorialを作成する時に改善すべき課題として認識する事にします。

ここまでで終わっていて残りは次の週に勉強しているみたいです。

感想としては、文句ばっかり書いたけどそれなりにGaeaの理解が進んだ。とまとめていました。

2022-11-28

<<Changing Parameters>>

ここでParameterの調整を行っています。

この期に及んでParameterの調整をするのか?と最初から怒っています。

それはそれで納得できる不満ではあります。

しかしParameterについても勉強する必要があり、何処かで教える必要はあります。それでこのTutorialはここにブッコんだんでしょう。

それも仕方のない事ではあります。

後重要な事でLookDev群の使用方法についての説明がまとめられていました。

私、今思いついたんですが、以下のような手順で作成すべきかもしれません。

  1. Primitive-> Edge -> Surfaceで簡単なTerrainを作成する
  2. 噴火や隕石の落下のような大災害が起きた。(SwirlノードやWarpノードを使用してTerrainを半壊させる)
  3. 時間が経って新たな地層が追加される。(ErosionなどでTerrainをMildにする。必要ならParameterの調整もここで行う)
  4. Terrainの表面の見た目を良くする(LookDevなどを使用)
  5. 川や湖などの追加

これは自分のTutorialを作成する時のIdeaとして保存しておきます。

<<Adding Breakers>>

Breakerノードについて説明しています。

そもそもBreakerノード自体を既に忘れてしまっています。何をするNodeなんでしょう。

Terrainに亀裂を追加するNodeでした。

<<Other Changes>>

Parameterの調整とかです。

<<Adding a Primitive>>

この期に及んでPrimitiveを追加するのかと思いますが追加しています。

山の周りの平なTerrainの部分に凸凹を追加するための行っているようです。

ここでBypass Nodeと言う機能を初めて学んだので、それについてまとめていました。

この後にある以下の章はSkipされています。

  • Creating the Mountain Ridges
  • Combining Notes
  • Adding Turrets
  • Bypass fits

これらの章は今回しっかり勉強する事にします。

<<Micro Erosion>>

この間にもいろいろな短い章があるんですが、全部無視して最後のMicro Erosionだけまとめられています。

Micro ErosionというNodeがあり、そのNodeを使用した結果が載っているだけでした。

以上でした。

2022-11-202022-11-28のBlogの感想>

GaeaのNodeの作成方法にある秩序を見出す事が出来るTutorialとしてGaea Tutorial for Beginners #5 | Creating the shape of our first terrain [14]は貴重なTutorialである事が分かりました。

しかしGaeaのNodeを作成するための順序を完璧に整理しているとは全然言えない状態でもあります。

このTutorialを勉強した後で、このTutorialの骨子を整理し、それを改良して自分でTerrainを作成するための順序を作成する必要があります。

6.2 Gaea Tutorial for Beginners #5 | Creating the shape of our first terrain [14]を勉強します

前回どんな事を勉強したのかは大体理解しました。それを踏まえてもう一回、このTutorialを勉強します。

<Intro>

IntroのLightの設定の勉強は特にする必要はない。と前回の勉強でまとめていましたが、今回も同じ感想でした。

Lightの設定を弄る事で何が変わるのかがよく分かりません。弄っても弄らなくても同じに見えます。

<Primitives>

NodeでTerrainを作成する時に、最初にセットするNodeです。

Primitiveに属するNodeでも簡単に使用できるNodeとある程度Gaeaの仕組みを理解しないと使用出来ないNodeがあるそうです。

これは納得の説明で、更にPrimitiveには最後の方で平なTerrainを凸凹にするために使用するのもあります。

このPrimitiveの中でダントツし簡単に使用出来るNodeがMountainです。

このTutorialはこのMountainノードを使用してTerrainを作成します。

PrimitiveのどのNodeは簡単に使用出来て、どのNodeはある程度Gaeaを理解しないと使用出来ないのか、とか後で地面の平を調整するために必要なNodeとかを一寸だけ分類したいと思います。

Gaeaを起動して検証します。

まずPrimitivesに分類されているNodeは全部ある程度理解してから使用するNodeです。

次にGeo Primitivesを見てみます。

<<簡単に使用できるNode>>

Canyon、Fault、Hill、Mountainの4つしかありませんでした。

<<簡単には使用出来ないNode>>

Island、Shiny Wavesです。

<<後で平な地面に凸凹を追加する時に使用するNode>>

Badlands、Crater、Dunes、Igneous、Plates、Range、Ridge、Rocky、Sand、Slump、そしてWorse landsです。

<<感想>>

こうやって分類するとそれぞれのNodeの特徴が理解し易いです。

初心者が最初に使用出来るNodeはたったの4つしかない事も判明しました。

この4つのNodeから選択すると成るとMountainしかChoiceが無いです。

だからGaeaのTutorialはどれもMountainノードを使用しているのか。というかなりメタ的な事情も理解出来ます。

この分類はやっていて面白いだけでなく役にも立ちます。

PrimitiveのNodeも分類してみます。

<<簡単に使用できるNode>>

なし。

正し以下のNodeは条件を追加する事で簡単に使用出来る可能性がある。

Gradient、Slop Noise、Voronoi、Voronoi+

<<簡単には使用出来ないNode>>

Constant、Cracks、Files、Gabor、Line Noise、Mask、Resource、Tile Input。

ConstantやMaskの様に単独では使用出来ないNodeや、FilesやResourceの様にどうやって使用したら良いのか全く見当がつかないNodeがあります。

<<後で平な地面に凸凹を追加する時に使用するNode>>

Drift Noise、Multi-Functional、Perline、Rock Noise。

これらのNodeは地面に凹凸を作成するのにかなり役に立ちそうです。

<<感想>>

地面の凹凸の作成には使用出来そうなNodeがそれなりにありました。

Tutorialの続きに戻ります。

Mountainノードを追加した後、Displaceノードを繋げています。

このDisplaceノードは

Warp群に配置されています。がどんな機能なのか不明です。

調べます。

公式のQuadspinnerのDisplace [14]に以下の説明がありました。

これはつまり表面を加工するためのNodeですね。

TutorialではこのNodeのParameterの使用方法についての詳しい説明がされていました。公式のQuadspinnerのDisplace [14]にはこのNodeのParameterに関する更に詳しい解説が載っていました。

今回の勉強ではDisplaceノードがTerrainの表面を加工するNodeだと理解出来ただけで十分です。

もうGaeaの勉強に使える時間が無くなってしまったので今週のGaeaの勉強はここまでにします。

以下に示した残りの章は来週以降に勉強します。

<Edges>

<Erosion>

<Changing Parameters>

<Adding Breakers>

<Other Changes>

<Adding a Primitive>

<Creating the Mountain Ridges>

<Combining Notes>

<Adding Turrets>

<Bypass fits>

<Micro Erosion>

7.Houdiniの勉強

今週もFOUNDATIONS | OVERVIEW [12]の続きを勉強していきます。先週はView Toolsの3D Cameraの使い方を勉強して終わりました。その続きから始めます。

7.1 先週の復習

3D Cameraの部分を復習します。

Space Barを押して左Clickを押す事でCragを固定してTumbleします。

すると3D Cameraを見る事が出来ました。

No CamからCam1を選択して以下の様に3D Cameraから見た画面に戻りました。

今度はLockをして

Tumbleします。

今度は3D Camera毎、動きました。

7.2 View Toolsの続きを勉強する

左上にある小さなBoxを利用する事でPanやZoomなどが出来るようになります。

やってみます。

そんなの私のProjectには無いです。

Tutorialを見直したら分かりました。

まず左端にあるScene ViewのTool Barから以下のCameraのIconを選びます。

するとScene Viewの上部に以下のTool Barが表示されます。

そこから以下のIconを選択します。

すると

が現れました。

やってみます。

お、現れました。

これでzoomとかPanが出来るようになると言っていますが、どんな操作でZoomやPanが出来るようになるのかまでは述べていません。

まあ左ClickでPan、真ん中のWheelを回転させてZoomでしょう。

試してみます。

Wheelを回してみました。

Zoomしています。

左ClickしながらMouseを動かしてみました。

Panしました。

なんと真ん中のWheelを押した状態でMouseを動かしても同じようにPan出来ました。

となると気になるのは右Clickした状態でMouseを動かしたらどうなるのかです。

試しました。

なんとZoomしました。

ほお。

Ctrl + Clickをすると元の位置に戻るそうです。

やってみます。

戻りません。

あ、分かりました。

この小さい画面内にCursorがある時だと、Ctrl + 右Clickで画面が元に戻ります。

今度はScene Viewの以下のIconについてです。

これを選択するとWASDで操作出来るそうです。

試します。

出来ました。

出来ましたが動きが遅いです。

UEの様に速度の調整は出来ないんでしょうか?

はい。その隣のIconをClickすると以下のBoxが表示され、

このMovement Speedの値を調節する事で速度の調整が出来るそうです。

試してみます。

以下の様に変更しました。

まだ遅いです。

左右の移動は速すぎですが、前後は遅すぎです。あんまりBalanceは良くないです。

あ、分かりました。前後の時は同時にWheelを回すんです。

そうするとCameraの動きが格段に速くなります。

はい。理解しました。

この後、Network Paneの操作も簡単に説明していました。

これはScene Viewの操作と大体同じで、Middle Buttonを押してMouseを動かすとPan、Middle ButtonのWheelを回転させるとZoomでした。

左Clickは四角が現れるだけで画面の操作は出来ませんでした。

右ClickをしたままMouseを動かすとZoomになりました。

これでView Toolは終わりです。

7.3 Network Pathを勉強する

次のTutorialです。

Soccer ballを表示しています。

同じ様に表示しますか。

うーん。ないです。

仕方ないです。

以下のRubber Toyで代用します。

以下に示したUIをNを押す事で表示します。

そしてDownを選択する事で、一つしたの階層であるGeometryに移動します。

やってみます。

Geometry Levelに移動しました。

でもこのObjectは一個のNodeしかないです。

TutorialのSoccer Ballは以下に示したような4つのNodeで構成されています。

もう一回Downすると似たようなNodeが並んでします。

一寸Tutorialを確認し直します。

ここを見ると私の場合は3つの層が表示されています。

しかしTutorialでは

2つの層しか表示されていません。

つまり違うって事です。

仕方ないです。

今回は話を聞くのがMainになります。

Object層まで戻って今度はLOPsに移動しました。

同じ事をやってみます。

何もないです。

Tutorialだとこんなのが表示されています。

Scene Viewの左端のTool BarにあるGeometry Selected ModeのIconを選択する事でも

Geometry層に移行するそうです。

試してみます。

Geometry Selected Modeを選択してObjectのMeshの一部を選択しました。

Network Paneを選択するとGeometry層に移動しています。

今度はNetwork PaneにあるObjをClickして

以下のBoxを開いて

Geometry層に戻れることを説明しています。

試してみます。

うん。全然内容が違いますね。

でも私の方が新しい感じがします。

Contentsを選択します。

Contentsを選択すると同じように過去に見た層が現れました。

Tree Viewの話が出て来ました。

これは前にも勉強しました。

Tutorialによるとここの層をClickする事でNetwork Paneに表示される層もその層に変更されるそうです。

試してみます。

されません。

以下のGeometryをClickしていますが、

Network PaneはObjを示したままです。

TutorialではNetwork Paneの画面は別な層に変更されています。

うーん。

分かりました。

こいつです。

こいつがEnableされているとNetwork Paneの画面は移動しません。

しっかりとその機能にNot Following Selectionと表示されています。

これをDisableしたら、Network Paneの画面も移動するようになりました。

Tree Viewで以下の階層を選んだ時

以下のような表示に変更しました。

ShopnetにはShader層がありました。

Network Paneには以下のようなNodeが表示されています。

ふーん。

こういうのもあるんですね。

この下の層には行けないんでしょうか?

Tree Viewからは無理でした。

NからのDownで試してみます。

VEX CodeってC++で書かれたCodeの事?

VOPがNodeで作成されたCodeでVEXがC++か何かの言語で書かれたCodeという事でしょう。UEで言うところのBPとC++の関係と同じでしょうね。

今度はScene ViewのPinの話です。

いやこのPinについては今自分で勉強したし。

言っている内容は今、自分で勉強して判明させた事と同じ事です。

ただしScene Viewでそれを実践しています。

一応、確認のために同じ事をしておきます。

Geometry Viewで以下の画面の時にPinで止めます。

そしてObject層に戻りました。

Scene Viewの画面は元のままです。

この機能はGeometry Levelの変更をしてObject Levelではどんな変化が出るのかを確認する時に使用するそうです。

GaeaのPinと機能的には似ています。

次の機能がカッコいいです。

Network Paneの以下の部分の

赤丸で囲ったIconをDragして

以下に示したScene Viewの

矢印の部分にDropします。

するとScene Viewの画面がNetwork Paneの層と同じになります。

これはPinで止めていても変化します。

逆も試してみました。

Scene Viewの層をDragしてNetwork Paneの層にDropしました。

Network Paneの層の表示がScene Viewの画面の表示と同じになりました。

今度はQuick Markについてです。

これはBookmarkと一緒でしょう。

Tutorialの説明を聞きましたが一緒でした。

Network Paneでセットします。

Ctrl + Numberでセットしてその層に戻るときはNumを押せば良いみたいです。

試してみます。

ToyShaderの層を開いてCtrl + 1を押しました。

Obj層に戻りました。

1を押します。

ToyShader層に戻りました。

これ、一端設定した番号は上書き出来るんでしょうか?

試してみます。

Geometry層でCtrl+1を押しました。

Obj層に戻ります。

1を押します。

ToyShader層ではなくてGeometry層に移動しました。

上書きも出来ますね。

これでNetwork Pathはお終いでした。

まだ一寸だけHoudiniを勉強する時間があるので次のTutorialも出来る所までやる事にします。

7.4 Working with Nodeを勉強する

いきなり以下のような状態で始まっています。

これどうやって作成するの?

真似して以下の所までは作成しました。

これ以上は分からん。

そういえばTorusの所で色の付け方を勉強したはず。

2023-01-15のBlogを見直します。

Attribrandomize1ノードを追加して色を追加しているみたいです。

出来ませんした。

付けたらBoxが消えてしまいました。

うーん。なんかイラつく。

さっきのSuccor Ballと言いなんで敢えてProjectに入ってない機能を使用するんでしょうか?

仕方ないです。

これも見るだけにします。

その前にObjectに色を追加する方法だけは調べる事にします。

まずはChat GPUです。

これを試してみます。

色を追加したいObjectを選択しろと言っています。

取りあえずSphereを選択しました。

Context Menu内からObjectを右ClickしてAssign New Materialを選択します。

Context Menuがどれだか分かりません。

Network PaneのObjectの事かと思ってSphere Objectを右Clickしたんですが以下のBoxが表示され

Assign New Materialは表示されません。

はい。

今度はGoogleで検索します。

Color SOP | Node Reference [15]を見ました。

以下のやり方で作成していました。

まずNetwork PaneでGeoというNodeを追加します。

そのNodeの中に入ります。

これはGeometry層に入ったという事です。

Colorノードを追加しました。

Error表示がされています。

これはGeometryのNodeが無いからだそうです。

Pigheadを追加します。

Screen Viewportに豚の頭が表示されました。

話は変わりますがこの豚の頭、かなりRealで結構怖いです。

色はついていません。

ここでColorノードを選択して以下に示したColor をClickします。

すると以下に示したBoxが表示されます。

このBoxで赤を選択すると

豚の頭の色が赤くなりました。

はい。

これを試してみます。

まずNetwork PaneからGeoノードを生成します。

Geoと言うNodeはないですね。多分Geometryノードの事でしょう。Geometryノードを代わりに選択します。

以下のNodeが追加されました。

やっぱりGeoって表示されています。

Scene Viewには何も表示されていません。

Geo1のGeometry層に移動します。

何もないです。

Colorノードを追加します。

Tutorialと同じようにErrorが表示されています。

Geometryを追加します。

当然Sphereを追加しました。

Colorノードを選択してColorの色を赤に変更しました。

Sphereの色が赤くなりました。

ここで時間が無くなってしまいました。

今週のHoudiniの勉強はここまでにします。

8.Volumetric Cloudの勉強

8.1 Tutorialを作成するに当たって

前にも書いたと思いますが、この章はTutorialを作成するのが目的です。まずTutorialをここで完成させて最終的にはYouTubeにまとめます。

その目的のために先週は、先生の立場からVolumetric Cloudについて解説しました。

ところが文を書いている途中で、自分が知らない内容が出て来る訳です。となるとそこから調べて勉強してとなります。更にその部分の文章を書いている時は、生徒の立場に立って書くので、立ち位置がおかしくなって文体がちぐはぐになってしまいました。

そこで基本としては先生の立場として文をまとめますが、自分が知らない分野に遭遇した時は、ここは知らないので調べます。と明言する事でこの部分では生徒として勉強している事をはっきりさせる事で立ち位置がおかしくならないように努める事にしました。

これで文体のちぐはぐ感が無くなるはずです。

次にこれは必ずまとめないといけない事なのでここでまとめますが、TutorialをYouTubeで発表するに当たって以下のRuleを徹底させます。

  • お互いを必ず先生で呼ぶ事

約10年間、アメリカで生活した自分はネットも英語と日本語を半々で読むのが普通になっています。そこで感じるのは日本のネットは喧嘩をしたり相手を叩き潰したり、更にはマウントを取ったりするのが最終目的になっているという事です。

これら自体は別に悪い事ではありませんが、私のTutorialはそういうのが目的ではないです。

自分の作りたいGameがあって、UEを使ってそのGameを完成させたい。という立派な目標がある人達の助けになるような情報を届けるのが目的です。

私が20時間勉強して得た知識や方法(特に英語圏のUEに関する情報)を、10分間程度の(日本語の)Tutorialにまとめる訳です。私のTutorialを見た人は20時間分の勉強を10分で済ませられる訳です。これはUEを使用して本気でGameを作成したいと思っている人にとっては大きな助けに必ずなります。

ただしUEに関して言えば、その勉強する内容が膨大であるため何年勉強しようが全てを完璧にする事は不可能です。

つまり誰でも間違った情報や最適でない情報を発信してしまう可能性がある訳です。

なのでUEの情報を語るためには間違った情報や最適でない情報に対してきちんと批判出来たり、指摘出来たりする環境が必要になります。

しかし何故か日本でそれをやると、

間違いを指摘した方は

  • 礼儀がなっていない
  • 恥をかかせた。

とか批判されます。

それだけじゃなくて間違いを指摘された方も

  • 教える実力がない。
  • この程度しか知らないのに金取って教えているのは詐欺

とかの批判を浴びる事になります。

これが英語圏、特にアメリカだと、どっちが間違いかをトコトン追及して、何が正しいのか判明するとそれでお終いです。

間違った事を言っていた人が批判される事もないですし、間違いを指摘した人が礼儀がなってないとか恥をかかせたとか言われて批判される事もないです。

これは、白人男性の間だけなら正しいけど、男性の間違いを女性が指摘した場合や、白人の間違いを有色人種が指摘した場合は違う。と言う意見があるのは承知しています。しかしその事に今、踏み込むと議論したい内容とは別の話になってしまうのでその意見はあえて無視します。

UEの勉強というか、Programmingの勉強全般に関して言うと、間違いを気楽に指摘出来き、気楽に間違いを直せる環境は絶対に必要です。更に言うと間違いだと思って指摘したらその指摘が間違いだったという時もあります。

こういうのをいちいち恥ずかしいとか、後で文句言われるかもとか恐れながらやっていたら誰も間違いを指摘出来なくなります。

人間なので全部最初から完璧にするのは無理です。

必ず間違えます。

そして間違える事を最初から織り込んで、誰でも気楽に間違いを指摘出来るようにしておく必要があるんです。

だから私は何年間も、何故、日本語だと不本意ながら間違った情報や最適でない情報を発信してしまった時に、それを指摘したら、指摘した方も指摘された方も辛らつな批判にさらされなくてはいけないのかを考えていました。

そしてその原因をとうとう発見したんです。

日本では一端先生になってしまうと、その人が明らかに間違った事をしても間違っているって言えなくなってしまうんです。

これが原因だったんです。

先生に対して間違っていると指摘するなんで何て失礼な輩だ。となります。そしてもうその先生が言っている事が間違っているかどうかなんてどうでもよくなってしまいます。

更に言うと先生とはそういう権力を持っているため、なるだけ先生にはならせないようにしなければならない。という思考も社会全体が持っています。

これが「そんな事も知らないのに、金取って教えるのは詐欺!」とかの批判が起きる原因にもなります。

原因が分かれば対策も可能になります。そしてこの問題を解決するには2つの方法があります。

一つ目は、先生になる事を絶対に禁止する事です。

これは、福沢諭吉がやった方法です。

絶対に先生を名乗らせない。

ので周りの人も間違いを指摘する事が可能ですし、絶対に先生にはならない人を、辛らつに叩く必要もなくなり、間違えても訂正すればそれで終わりになります。

しかしこれには問題があります。

世の中に存在しているモノには上下があります。

満員電車で英語の専門書を読んでいると、すぐに席を譲ってもらえます。

ところが満員電車で少年ジャンプなんかを読んでいると、なかなか席を譲ってもらえません。偶然前の席が空いたので座っても、周りの人の批判的な視線を感じつつ座る羽目になります。

世の中にはこういう上下があるんです。

そして残念ながらGameを制作するという行為は、今の日本社会では下に見られているんです。

これがDeep Learningを使用したAIを制作しています。とかDirectX 12を使用して立体的な地図を表示出来る3d Viewerを作成しています。とかだったら直ぐに上に見られます。

こういう事をやっている人たちは、先生と呼ばれなくても周りの人は先生として扱ってくれるんです。

しかしGame制作は絶対にそうならないです。

Game制作のProgrammingの大変さはProgrammingの専門家なら誰でも知っていますが、世間一般から見たらGameで遊んでいる人と同じと見なされています。

だからGame制作者は逆に、先生と自称する必要があるんです。

そして周りの人にも先生と呼ばせる必要があります。

こうしないとGameを制作する人達がGameで遊ぶ人達と同レベルに見られてしまいます。

もし先生と呼ぶ事を強制しないで間違いだけを指摘できる環境にしたら、世間一般のGame制作を知らない人達は、あ、この人はバカなんだ。だからこんな簡単な事も間違ってしまうんだ。と認識します。

絶対にこう認識します。

だから先生と呼ばせることは絶対に必要なのです。

でもそうすると、最初の問題、つまり間違いを指摘出来ない環境が発生すると言う最初の問題が復活してしまうんです。

この2つの問題を同時に解決するのが、お互いに先生と呼ぶ事を強制するというRuleなんです。

お互いに先生だったら間違いを指摘しても、

  • 礼儀が鳴っていない
  • 恥をかかせた。

とか批判される心配はなくなります。だって指摘する方も先生なんですから。

偉いんです。

それだけじゃなくて間違いを指摘された方も

  • 教える実力がない。
  • この程度しか知らないのに金取って教えているのは詐欺

と批判される事もなくなります。先生が先生に指摘した事なので、一般市民がどうこう言えるようなLevelの低い話ではない。と言う事が伝わっているからです。

更に、世間一般からもGame制作なんかして遊んでいる。と見られる事もなくなります。

なんかえらい先生が難しい話をしている。Gameのような庶民的な物でも作成する人は凄い勉強しないといけないのか。となります。

つまり全部の問題が一遍に解決するんです。

まずこれを私のChannelに書き込む人達には徹底させます。これを守れない人は誰であれ即Blockします。

これがRuleです。

Commentを書き込んだ人に対しては、例えUEを3日しか勉強していない人でも先生として扱う事にします。

勿論、これを実施してみて上手くいかなかった時は、このRuleは変更します。

目的はみんなが間違いを指摘したり、もっと効率の良いやり方の情報を共有したりする事ですので。

8.2 m_SimpleVolumetricCloudの改良の続き

先週作成した雲はそれなりには見られる形状になりましたが、まだ改良の余地があります。

それは使用したTextureの作成方法が適当な事です。

これを再現性のある手順で作成したTextureに交換出来たら更によくなります。

以下のような雲を作成出来るTextureの作成方法を示します。

まずxy方面のTextureをGIMPで作成します。

のImageを作成します。

そして以下の所からDifference Cloudsを選択します。

今回はこれを選びましたがNoiseだったらどれでもいいです。

そのImageに対してSeamlessを掛けます。

PngとしてExportします。

今回はこんなNoiseのImageをExportしました。

次はCloudのZ方面の形状を決定するTextureです。

以下のような円形のGradientを使用します。(Medi Bangで作成したTextureを以下に示しました。)

GIMPでも作成出来るのかもしれませんが、やり方が分からなかったのでMedi Bangで作成しました。

Textureの代わりにRadial Gradient Exponentialノードで代用しても良いです。

この実装で以下のImageが作成出来ます。

大体同じです。

そしてこのTexture SampleノードとMultiplyノードの間に以下の実装を挟みます。

これで計算結果にContrastを加えることが出来るようになります。

このContrastでNoiseのTextureの調整が出来るようになりました。

この条件で空を見ると以下の様な雲が形成されています。

まずは先程追加したParameterであるCloudZ_Powerの値を弄ります。

試しにDefault値である2から1に変更しました。

これでも十分良い感じです。

ここからVolumetric CloudのParameterである

を調整します。

まず雲の底の高さが5㎞にあるは高すぎます。先週のまとめでは一番低い層にある雲の底は地表から1㎞位です。のでLayer Bottom Altitudeは1にしました。

Layer Heightは雲の厚さに当たるので、1~2kmぐらいが適当です。今回は2㎞だと少し雲が薄く見えるので少し2㎞より厚くしました。

結果です。

こんな雲が出来ました。

空を見上げましたが雲の亀裂は見当たりません。

上から見た場合です。

こんな雲がTilingされています。

以下に色々なNoiseで作成した雲を示します。

雲の形状です。

Noiseと雲です。

こんな感じで色々な形状の雲が作成出来ます。

8.3 層積雲を作成してみる

層積雲を作成してみます。

以下にGoogleで層積雲で検索した結果を示します。

以下の様に作成しました。

この検索で表示されるThumbnail(サムネ)のイラスト、検索で表示されている限りは著作権の対象外になるって知っていました?

私は先日AIが作成したIllustrationの著作権について調査していてその時に初めて知りました。

巻き積雲の方が近いかもしれません。

以下にGoogle検索で表示された巻き積雲を示します。

使用したTextureはこれです。

このTextureのContrastをもっと上げたら層積雲も作れそうです。

やってみました。

どうでしょうか?

層積雲っぽくなって来たでしょうか?

以下のImageを使用しました。

もう少し時間を掛けたらほぼ同じ形状の雲が作成出来そうです。

更に言うと10種類の雲も全部作成出来そうです。

8.4 Z方面の雲の形状をどうやって作成するのか解説する

先週、これを説明しようとして難しすぎて諦めました。

一週間考えて、この説明方法なら理解出来るのではないのかと一つの案が浮かびました。

まずVolume Renderingとは何かという事をまず説明します。

次にそのVolume Renderingの方法に基づいてZ方面の雲がどうやって作成されるのかを説明します。

これでやってみます。

と言う訳で今週はそのVolume Renderingについての説明をやってみます。

まずRenderingそのものの意味について説明します。

Renderingとは、あるObjectをPCの画面で表現するために分解してRGBAの3つの値に変換する事を指します。

Rは赤、Gは緑、Bは青です。そして最後のAはAlphaで透明度を表します。

これらは0から255の値で表現される事もあれば、0~1の間で表現される事もあります。

因みにこのある範囲の値を0~1の間に落とし込んで表現する事を専門用語で正規化(Normalization)と言います。これは関係ない話なので忘れても問題ないです。

MonitorはそれぞれのPixelで赤の値は幾つ、青の値は幾つという指令をPCから常時、受け取って画面に表示する映像を表します。

普通のRenderingは以下の様に3d Modelがあって

その表面にMaterialを貼ります。

これで終わりです。

後はUEとGPUが勝手に計算してそれぞれのPixelのRGBAの値を算出してくれます。

Volumetric Renderingは全く違う方法でRenderingします。

それは以下に示した様に空間をBoxで分割して

それぞれのBoxに色を付ける事でObjectを表現します。

この絵ではBoxは3 x 3 x 3で作成されていますが、本物はもっと沢山のBoxでObjectを表現します。

上の図で示した様に透明度も指定出来るので後ろのBoxが透けて見えるようにする事も出来ます。

なんでこんな面倒くさい方法でRenderingをするのかと言うと、この方法でRenderingを行うと、境界のないObject(例えば炎とか雲)を本物ソックリにRenderingする事が出来るからです。

例えば、さっき作成した雲ですが、以下にもう一回示しますが、

本物の雲と全く同じに見えます。

つまりVolumetric RenderingでObjectを表現すると雲や炎のような境界の曖昧なObjectを本物そっくりに表現出来るので、UE5では雲を作成する時、敢えてこんな面倒な方法でRenderingするんです。

そしてここからが本題です。

Volumetric RenderingでObjectを表現する時は、このそれぞれのBoxの色とそのBoxの透明度を全部自分で指定する必要があります。

はい。

今週はここまでです。

Volumetric Renderingを非常に簡単にですが、説明しました。

とても簡単な説明ですが、Volumetric RenderingのRenderingの仕方は理解出来たと思います。

この知識をもって、来週は何故先程のZ方面の雲の形状を決定するTexture(以下に示したTexture)が

Z方面の雲の形状を決定するのかを説明します。

9.DirectXの勉強

9.1 C++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [5]のAdding Our Icon Fileを勉強する

IconをWindowに表示させるみたいです。

まずはこの章全体を軽く見ます。

正直IconをWindowに追加するのは、初めての事でここで紹介されている方法がたと比較してどうなのか。全然分かりません。

章の最後でIconが表示されているWindowを示していました。

以下にこの章の内容をまとめます。

まず以下に示した様にBlankProject内に新しいFolder、Contentを追加します。

TutorialによるとこのFolderはContentと呼ばれたりAssetと呼ばれたりするそうです。

そういえばUEのProjectを見ると

む、これはBP用なのでVSのProjectが無いですね。

以下のUEC++のProjectの場合だとSource FolderとContent Folderが同じFolder内に配置されています。

おお。

同じです。

OlympusMonsTutorialsはかなり質の高いTutorialなのか。

このTutorialの作者はもしかしたらGame Engineの作成が本業なのかもしれません。

更にContent Folder内にIcons Folderを作成しました。

そういえば、UEのProjectの場合以下に示した様にConfigと言うのがあって

この中には以下に示したような.ini Fileがあり

このProjectの設定をここで指定しているみたいなんです。しかしこれの解説をしているTutorialを未だに一個も見た事ないです。

このTutorialでConfig Folder作ってくれないかな。そしたらこの部分の仕組みが理解出来るんですが。

話が逸れました。

このFolder内に前に作成したIconを移動します。

私はIconを作成していないので、Downloadした時について来たIconをそのまま使用します。

今度はVisual Studioに戻ってきて先程追加したIconをResource Fileに追加します。

Resourceで追加するそうです。

Existing Itemじゃないのね。

すると以下のBoxが表示されるそうです。

成程。去年、初めてこのTutorialを見た時、このBoxを見て、驚愕しましたが、ここで使用していたんですね。

当然ですがIconを選択してImportを押します。

先程Iconを保存したFolderに行ってIconを選択しOpenを押します。

OKとかImportじゃなくて何故、Openと表示されているの? 

そしたらVSが以下のような画面に変わりました。

あ、IconがOpenしたのか。

でもこれでIconがResource FileにImportされたんでしょうか?

TutorialではここでIconを追加した事によって追加で新たなFileが生成されている。と報告しています。

ここでPublic Folder内に作成されたResource.h FileがIconとProgramをどうやって結合するのかを指定している事を説明していました。

ふーん。と思いましたが、それよりも画面にでっかく表示されているIconの方を先に説明して欲しいです。気になってしょうがないです。

PublicにあるResource. hをResources Folderに移します。

更にResource FolerにIcon folderを作成してそこにResource.hを移動します。

Resource.hを開きます。

以下に示したFileが開きます。

IDI_ICON1をIDI_MAINICONに変更します。

Tutorialの説明ではGame Engineを作成する時は色々な違うTypeのGameを一つの同じPlatformで示す必要があります。

そのためにMainのIconは全てのGameに使用出来るようにしするそうです。

うーん。分かったような分からないような。

今度はBlankProject.rcを選択して

以下に示したView Codeを選択します。

こうする事でBlankProject.rcをCodeとして見る事が出来るそうです。

以下に表示されたCodeを示します。

うーん。

今週のIconの追加は、本当に初めてやる内容なんで、なんというかCommentが無いです。

このFileにIconの名前が記載さえている所があります。

この名前が前の古い名前のままなので、新しい名前に変更します。

ここからのTutorialの説明が正直分かりにくいです。

これでResource File内ではこれが使用出来るようになりましたが、Project全体ではまだ使用出来るようになっていないと言っています。

まずこれが何を指しているのかがよく分かりません。Iconそのものの事なのか、それとも先程変更したIconの名前の事なのか?

そしてAvailable (使用出来る)とは具体的に何を指しているのか?

続きを見て確認する事にします。

分かりました。

TutorialはPch.hを開いてResource.hをIncludeする必要がある事を言っていたんです。

../について解説しています。

一個前のFolderに戻るやつです。

私はこの書き方いつも忘れてしまいます。

二度と忘れないようにキチンと記録に残しておきます。

追加しました。

今はErrorになっていますがすぐにError表示は消えました。

最後にIconをProgramに追加するそうです。

うーん。

今までして来た事がIconをProgramに追加する事じゃなかったの?

WinMain.cppを開いて

HICON型のGlobalな変数であるhIconを宣言します。

あ、成程。

このWinMain.cpp内に実際にIconを読み込むCodeを書く事をこれからする訳か。TutorialはこれをIconをProgramに追加すると言っていたんですね。

そして以下の様に初期化します。

何の説明もなくいきなりこのCodeを追加したんですが。

LoadIcon()関数がIconをLoadするための関数という事は分かりますが、そのParameterが何をしているのか全く分かりません。

HInstance()何でしたっけ。

実際のCodeを見て確認します。

となっていました。

ああ、思い出しました。要はHInstanceを返しているだけです。

HInstanceはこのCodeを実行した時に生成されるInstanceなので、そこにIconをパスするのは当然の事です。となると2番目のParameterがIconの住所を示しているんでしょうか?

Make Int Resourceって読めますね。ResourceをIntにするってどういう事でしょう?

一寸Tutorialの先を見ます。

ここでLoadIcon()関数について解説していました。

Make Int Resourceに関しては以下の番号を指しているみたいですね。

IDI_MAINICONの番号は101ですね。

そして以下の部分のCodeをhIconに変更しました。

最初の.hIconはIconそのものの指定のためだそうです。その下の.hIconSmはWindowを開いた時に左上に表示されるIconを指定するためのものだそうです。

以上でした。

それでは実装します。

9.2 C++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [5]のAdding Our Icon Fileを実装する

まずContent Folderを作成します。

その中にIcon Folderを作成し

その中にOlympusMons.icoを移しました。

Tutorialの以下のWindowってWindow10の標準のWindowじゃないですよね。

これってどうやって表示しているんでしょう?

Visual Studioに戻ってResource FolderにこのIconを追加します。

Resourceを選択しました。

おお、以下に示したBoxが表示されました。

Iconを選択してImportを押します。

Tutorialと全く同じ画面が表示されます。

Icon folderに入ったら何も表示されないでExtentをIcoに変えたらIconが表示されたのも全く同じでした。

更にImportしたら以下のImageがVisual Studioの画面いっぱいに表示されたのも同じでした。

追加されたFileもTutorialの説明と全く同じでした。

PublicにあったResoruce.hをResources Folderに移します。

更にIcon Folderを作成しそこにResource.hを移します。

Resource.hを開きます。

これってだだClickして開けばよかったんでしたけ。

試してみます。

何か色々聞いてきましたが、全部Yesにしたら開けました。

OlympusMonsTutorialsではh fileの事をエイチFileではなくヘイチFileって言っているです。

これってイギリス訛りなんでしょうか?

いきなり聞いたら何を言っているのか全然分かりませんね。

私のは以下に示したようなResource ViewというBoxが勝手に開きました。

TutorialはこんなBoxは表示されていませんね。

うーん。

何か間違えたかも。

取りあえずこのまま続行します。

Iconの名前をIDI_MAINICONに変更しました。

今度はBlanckProject.rcを開きます。

以下に示したView Codeを選択します。

おお。普通に開けました。

私のはJapanese (Japan) resourceと書かれています。

OlympusMonsTutorialsではUnited Kingdomになっていますね。

ICONの場所も見つけました。

MainIconに書き換えました。

今度はPch.h fileのCodeを変更します。

Includeを追加しました。

私のはError表示とかは出ませんでした。

最後にWinMain.cppのCodeを変更します。

HICON型のGlobal変数であるhIconを宣言しました。

そしてhIconの初期化も行いました。

そして最後に以下の部分の設定をhIconに変更しました。

これで完成です。

テストしてみます。

今回は一発で出来ました。

Iconを表示すると言う作業自体が初めてだったのでその点で一寸だけ戸惑いましたが、内容としてはかなり簡単でした。

まだDirectX 12の勉強には入っていませんが、こういうのを一個ずつClearして勉強した方が結局は一番の近道だったというのはよくある話です。ので焦らないでゆっくり勉強する事にします。

9.3 Direct3D 12 ゲームグラフィック実践ガイドを勉強する

先週はこれを最後に勉強したのでWindowの作成の実装まで終わらなかったんです。

今週はこれを最初にやります。

そしてWindowの作成を今週中に終わらせます。

<先週の復習>

GetModuleHandle()関数について勉強していました。

あれ?

全然覚えていなかった。

InitWnd()関数の実装の途中までやっていました。

<続きを実装する>

ClassNameがErrorになります。

本ではこの変数を生成している実装が無いですね。

Sample Codeを見ます。

ありました。

これはそのままCopyして使用します。

Errorが消えました。

WindowClassEXの初期化方法は他の本で散々勉強したのと同じですね。

次の実装を追加します。

WindowClassEXをRegisterしました。

こういうCodeを書くのは有りなのか?

これだとWindowClassEXをRegisterするのと、そのRegisterが出来たのかどうかをCheckするCodeを一緒に書いています。

私はあんまり好きではないですね。この書き方。

今度はInstance Handleを初期化します。

あれ、これもErrorになっています。

あ、

App,hで宣言した時にTypoしていました。

直します。

これだけWindow生成のためのCodeを色々な本のやり方で書いていると何となくどこが間違っているのか分かるようになりますね。

今度はWindowのサイズを設定し調整するための実装を追加します。

ここはあんまり覚えていません。

でもそんなに重要じゃないので先に行きます。

CreateWindow()関数を使用してWindowを生成します。

CreateWindowEx()関数でした。

ClassNameとか、Instance Handleとか色々、検証したり前のBlogに書いた事を復習したい部分は有るんですが、そこまでWindowの生成に時間をかける必要も感じないのと、今週中にWindowの生成まで終わらせる必要があるので、ここはPassして次の実装に進みます。

Windowが生成されたのかをCheckします。

こっちの方が断然分かりやすい。

Windowを表示、更新しさらにFocusを設定します。

この辺も覚えていないけど他の本の実装と同じでしょう。

最後にTrueを返します。

この後、本はWindow Class EXのStructの構造についてずっと解説しています。

こんなのは後でAPIを見れば良いです。Skipします。

あら、この後でClassNameの初期化のための実装が書かれていました。

これは気が付かなかった。

この部分はもう実装してしまったので先に行きます。

ずっと先にいったら今度はWindow Procedure()関数の実装が出て来ました。

一応Sample Codeで確認しますが、以下に示したWindow Classの初期化に使用するための関数です。

これも散々勉強したやつなのでここでは実装だけ済ませて終わりにします。

以下の様に実装しました。

うーん。

ここは復習した方が良い気かしますが。

最後まで終わらせてから時間があったら復習する事にします。

MainLoopです。

これでWindowが勝手に閉じるのを止めているんでしたっけ。

覚えてない。

復習は後でする事にしたので、とにかく実装を終わらせてから調べます。

TemApp関数の実装を追加します。

TermWnd()を読んでいるだけです。

当然、次はTermWnd()関数の実装です。

これInstance Handleであるm_hInstをUnregisterClass()で処理した後で、nullptrをセットしていますね。

Window Classであるm_hWndもnullptrをセットしています。

ここは一寸勉強すべき内容がありそうです。

でも後でやります。

これでApp Classの実装が終わりました。

かなり大急ぎで終わらせてしまいました。

細かい点はまた後で勉強する事にして次のMain.cppの実装をやります。

しました。

こんだけ?

あれMainLoop()関数ってどこかで呼び出されてる?

一寸確認します。

Run()関数で呼び出されていました。

ではこれで全部実装出来たようなのでTestします。

出来ました。

右上のxを押してWindowが閉じるのかの確認もします。

閉じました。

Window Procedure()関数もしっかり作動しているようです。

かなり強引でしたが一応、Windowの作成まで実装する事が出来ました。

ただし時間的な余裕は無くなってしまいました。「DirectX 12の魔導書」と「HLSLシェーダーの魔導書」の勉強は中止にします。

今週のDirectX 12の勉強はここまでとします。

10.まとめと感想

流石に最後の方は気力が萎えてしまいました。Windowの作成に関しては来週復習してまとめる直す事にします。

Volumetric Cloudの勉強は文を書いている時はかなり苦労しました。書いている時は文章がかなりおかしくなっている気がしていたんですが、読み直したらそれなりにはまとまっていました。

これから推敲してもっと読みやすくしていきます。

Houdiniの勉強はそんなに難しくは無くなって来ました。かなりHoudiniの仕組みを理解して来た気がします。ただこれも使いこなせるようになるには一年位は掛かりそうですね。

Gaeaは既にかなり理解して、自分なりのTerrainの作成手順を構成する事が出来そうです。

Gaeaの問題はFree版でExportしたTerrainをUEでImportしても綺麗には綺麗ですが絶対的に優れているかと言うとそうでもないです。

有料版を買うか、それともHoudiniに完全に移行すべきか、この辺を考える必要があります。

「戦闘システムの続きを作成する」でも「LandscapeのみのGameを作成する」でもPackagingはちょくちょくしておかないと後で痛い目に合う事が分かりました。

製品化するのが目的な場合は、新しい機能を追加したら必ずPackagingをする習慣をつける事にしました。

Niagaraは久しぶりにCGHOW氏のTutorialを勉強しました。楽しかったです。

Materialの勉強はまだTextureの準備段階です。Ben Cloward先生のAdvanced Material Seriesは既に13まで出ています。まあこれもじっくり勉強する以外にないです。焦らずやっていきます。

以上です。

11.参照(Reference)

[1] Ben Cloward. (2022, October 6). Sparkling Snow Shader - Advanced Materials - Episode 2 [Video]. YouTube. https://www.youtube.com/watch?v=TCz-fKJS3wI

[2] Ben Cloward. (2022b, October 13). Rock Shader - Advanced Materials - Episode 3 [Video]. YouTube. https://www.youtube.com/watch?v=Q2XI8cuSBMk

[3] Andrea Cantelli. (2020c, May 26). Gaea Tutorial for Beginners #3 | Layer Based Workflow. YouTube. https://www.youtube.com/watch?v=XxfSOvpTA90

[4] Magee, R. (n.d.). Foundations | Overview | SideFX. https://www.sidefx.com/tutorials/foundations-overview/

[5] OlympusMonsTutorials. (2021, March 3). C++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [Video]. YouTube. https://www.youtube.com/watch?v=rWylZKi8QbM

[6] Yepkoo. (2022, November 27). #UE5 - Unified Interactive Water System (UIWS) - Plugin testing #1 [Video]. YouTube. https://www.youtube.com/watch?v=jLSkboBRwlg

[7] Ue5 world partition: how to make an actor always visible. (2022, April 15). Epic Developer Community Forums. https://forums.unrealengine.com/t/ue5-world-partition-how-to-make-an-actor-alway-visible/529348

[8] renderBucket. (2022b, September 12). Unreal Engine 5 Tutorial - Niagara Fluids & Characters/Skeletal Mesh Collisions [Video]. YouTube. https://www.youtube.com/watch?v=oAYkob_ciqc

[9] Help Please Error Packaging Project. (2022b, November 19). Epic Developer Community Forums. https://forums.unrealengine.com/t/help-please-error-packaging-project/693911/7

[10] CGHOW. (2022, December 11). Dripping in Unreal Engine 5.1 Niagara Tutorial | Download Files [Video]. YouTube. https://www.youtube.com/watch?v=5rgn7T4FAFI

[11] Research Guides: All About Images: Home. (n.d.). https://guides.lib.umich.edu/c.php?g=282942

[12] UMG Drag Drop Not Working - 4.20 (Packaged / Standalone). (2018, August 15). Epic Developer Community Forums. https://forums.unrealengine.com/t/umg-drag-drop-not-working-4-20-packaged-standalone/431658

[13] Creating Drag and Drop UI. (n.d.). https://docs.unrealengine.com/5.1/en-US/creating-drag-and-drop-ui-in-unreal-engine/

[14] Displace - Gaea Documentation - QuadSpinner. (n.d.). QuadSpinner Gaea Documentation. https://docs.quadspinner.com/Reference/Warps/Displace.html

[15] Houdini. (2020, April 13). Color SOP | Node Reference. YouTube. https://www.youtube.com/watch?v=5KK06YTZgzo

 

UE5の勉強 -LandscapeのみのGameを作成する-

今月はファイル利用量が少ししか残っていないので、Upload出来ない部分は来月上げます。

1. 今週の予定

以下の内容を勉強する予定です。

<LandscapeのみのGameを作成する>

以下の2つを行います。

  • Water Systemを含むMapをPackagingしてみる。
  • Water Systemの水際のオカシイ所を直す。

Niagaraの勉強>

今週は久しぶりにCGHOW氏のTutorialを勉強します。

<Materialの勉強>

以下の2つのTutorialで使用されているTextureをGIMPを使用して作成します。

<戦闘システムの続きを作成する>

先週見つけたBugを直します。

<Gaeaの勉強>

Andrea Cantelli氏のGaea Tutorial for Beginners #3 | Layer Based Workflow [3]のToolboxの最後の三本線のIconとSettingを勉強します。

<Houdiniの勉強>

今週も公式のTutorialであるFOUNDATIONS | OVERVIEW [4]のView Toolsの続きを勉強します。

<Volumetric Cloudの勉強>

先週見つけたGIMPで作成した2枚のTextureを使用してPhotorealisticな雲を作成する方法をまとめる。

DirectXの勉強>

Olympus Mons Tutorials氏のC++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [5]のAdding Our Icon Fileを勉強します。

2.LandscapeのみのGameを作成する

2.1 Water Systemを追加したMapをPackagingしてみる

2023-01-08のBlogの「5. 戦闘システムの続きを作成する」でPackagingをしています。このやり方を参考にしてPackagingしてみます。

まず、使用しているLevelを把握します。

これです。

Game ModeとかGame InstanceはDefaultのままです。

次にBuild All Levelをしたら

HLODがどうたらこうたらと言うBoxが現れました。

よく分からないのでBuild HLODsを押しました。

次にProject Settingsを開いてMap&Modeの以下の部分の設定を変更します。

次はPackagingの設定を変更します。

Advanced Settingで以下の設定を変更します。

Support Platformの以下の設定を変更します。

Platform-> Windows -> Packaging Projectを選択します。

Packagingが始まりました。

また20分位かかると思うので気長に待ちます。

終わりました。

特にErrorとかは表示されていませんね。

出来てるっぽいです。

Exeを開いてみます。

Third Person Playerの生成される位置を指定していなかったので空から落っこちてしましました。

Landscapeの何も確認出来ませんでした。

Player StartをLevel上に配置しました。

もう一回Packagingします。

出来ました。

Exe.fileを開いてみます。

普通に歩けます。

海もありました。

川は無いです。

湖もありました。

ないのは川だけです。

Googleでこの問題の解決方法を探しましたが出て来ませんでした。

Chat GPTで質問もしてみました。

うーん。

まあここで述べられている事が原因である可能性もZeroではないかもしれません。

Sundar Pichai氏が「AIの発明は人類にとって火の発明と同じ位のImpactを与えるようになる。火は賢い人達には恩恵を与えたが、そうでない人には災害を与えた。AIも同じ結果をもたらす。」と言っていたのを思い出しました。

まだChat GPTをどうやって使用したら恩恵を得られるのかが分かりません。

火を起こす方法を発見した初期の人類だって、凄く賢い人と凄く愚かな人の間に位置する普通の人たちは、火を起こしてキャッキャ言って終わっていたはずです。

今の私と一緒です。凄く賢い人が有効な利用方法を発見したら、それを真似て使用する事にします。

Chat GPTはこれからじっくり研究してどう使用するのか決める事にします。

Water Body RiverそのものがPackaging出来ないのか、このWater Body Riverの設定の何かが問題でこのWater Body RiverだけがPackaging出来ないのかを知りたいです。

以下のようなDefaultのWater Body Riverを追加しました。

これでPackagingしてみます。

後、Packagingした後で、Gameを止めやすくするために以下の実装をLevel BPに追加しました。

これでPackagingしてTestします。

やっぱりWater Body RiverそのものがPackagingされないみたいです。

Pを押したらGameが終了しました。

Quit GameはExe.fileでも正常に作用しています。

しかし、先週3D酔いしながら作成した川がPackagingしたFileでは全く反映されないとは。

頑張って作成した努力が無に帰る様を、また体験してしまいました。

ただ被害を最小にとどめる事が出来たので、今週、Testして本当に良かったです。

うーん。

でもFortniteだと以下に示した様に普通に川があるみたいですね。

どうやらPackageした場合でもWater Body Riverを表示する方法はあるみたいですね。

Water Body RiverをPackagingした後でも表示する方法はこれからの情報待ちですね。

それまでWater Body River の使用はPendingします。

こっちを使用しようかな?

別なMapを作成してこっちも試してみます。

2.2 UIWS-Unified Interactive Water Systemで川を作成してPackagingしてみる

以下に示した様に新しいMapを作成し

ここにUIWS-Unified Interactive Water Systemで川を作成します。

と言ってもUIWSの使い方はもう忘れてしまいました。

調べます。

2021-03-28のBlogで勉強していました。

このBlogを読むとYouTubeにあるTutorialで勉強した。とだけ書いてあり具体的なTutorialの名前は書いていませんでした。

YouTubeで検索してみました。

うーん。

一個を除いて全部2年以上前に作成されたものです。

流石に公式からWater Systemが提供された後で、あえて別の方法で水を作成する酔狂な人はいないって事でしょうね。

でも逆に言うと誰もPackagingまで試していない。とも言えます。

ExperimentalなPluginを製品にまでつぎ込むのは躊躇しますし、UIWSは今でももう少し注目されても良い気がします。

一か月前に作成された#UE5 - Unified Interactive Water System (UIWS) - Plugin testing #1 [6]を見てみます。

淡々と説明していますが、この通りやったら出来そうです。

UIWS water bodyを追加しています。

しました。

Tutorialを見たら50倍にしていました。

50倍だとLandscape全体をCover出来るので以下の様にLandscape全体に配置しました。

Tutorialの説明通り水に入る事は出来ません。

UIWS water bodyを開いて以下の設定を変更しました。

水の中に入れる様になりました。

この後、UIWS Water Managerを追加するんですが、その目的があんまりはっきりしません。

多分ですが、このCharacterが水に入った時に水しぶきを上げる機能を追加するためだと思うんですが、その辺は不明です。

兎に角、Tutorial通りにやってみます。

Water Managerを作成して

Level上に配置しました。

そしてThird Person Character BPを開き

ComponentにUIWS Interactorを追加します。

今度はMeshを選択して以下の部分の設定を変更しました。

結果です。

あ、分かりました。

水紋が発生しています。

UIWS Water Managerを追加して上記の設定を行う事で水紋が発生するようになりました。

この後はActorを水とInteractさせるために色々やっていますがそれはまた後で勉強します。

今度は川を追加します。

しました。

川の設定はまた後でするとして、このLevelのPackagingを試してみます。

Build Lighting OnlyとBuild Everythingを行い、Packagingの設定でMy Landscape 3の所をMy Landscape 4に変更しました。

Packagingしました。

Packagingしている間、World PartitionでUnloadされているActorをLoadする方法でも調べます。

分かりました。

と言うか前と同じやり方で出来ました。

以下に示した様にWorld Partitionを選択してLoadしたいActorをBoxで囲みます。

Load Region From Selectionを選択します。

すると以下に示した様に今まで表示されていなかったUIWS Riverが

表示されるようになりました。

公式のForumのUe5 world partition: how to make an actor always visible [7]には違うやり方が書かれていますね。

まあ、目的によって使い分ければ良いでしょう。

Packagingが出来ました。

Exe fileを開きます。

川は普通にありました。

水面も普通に出来ています。

うーん。

出来ました。

だたしUIWSのWater BodyはUnrealのWater Systemと比較するとかなりしょぼいです。

うーん。どうしましょう。

2.3 UIWS-Unified Interactive Water Systemで川を作成して海と湖はUnreal 付属のWater Systemで作成してPackagingしてみる

折衷案でこれで行きます。

まず新しいMapを作成して

LandscapeをImportしました。

ここにUnrealのWater Systemから追加していきます。

Water Body Oceanを追加しました。

Water Body Lakeも追加しました。

ここで一回PackagingしてきちんとWater Body OceanとWater Body Lakeが製品版でも動いているのを確認します。

出来ていました。

ここにUIWSのRiverを追加します。

そしてPackagingします。

Exe Fileを開きました。

はい。川も追加出来るようになりました。

以下の様にScriptでLandscapeを削って川を追加します。

2時間以上かけて川を調整してやっと以下の様になりました。

それでも川が浮いていてとても実用に耐えられるLevelではないです。

ここから2つの選択肢があります。

  • コツコツとこの川の変な箇所をSculptを使用して直す。
  • 革命的な方法で一気に川のオカシイ箇所を直す

どう考えったって2番目を選択するしかないです。

Niagara Fluid Simulationを代わりに使用します。

これしかないでしょう。

2.4 Constant Emissionを勉強する

3D Liquid Constant EmissionをLandscape用のProjectにMigrateさせて

Level上に配置しました。

しかし何も起きません。

うーん。

3D Liquid Constant Emissionを開いて確認します。

Compile Errorが起きていました。

Content Examples内では普通に動いていましたが、何が問題なんでしょうか?

理由が分かりました。

Niagara FluidsのPluginをセットしていませんでした。

再起動してもう一度試してみます。

ダメですね。

このTemplateからNiagara Systemを作成して

Landscapeと干渉するのか試してみます。

LandscapeにCollideしています。

これを使用して代用します。

まずサイズを10倍にする必要があります。

確かRender Bucket氏のTutorialでサイズの変更方法を教えていたはずです。

調べます。

Unreal Engine 5 Tutorial - Niagara Fluids & Characters/Skeletal Mesh Collisions [8] でした。

ここにUser Parameterにある以下のParameterを使用してSimulationしているBoxのサイズを変更する方法が載っていました。

先程のLandscapeに配置したNSのこれらのParameterを見ると以下の様になっていました。

取りあえず倍にしてみます。

更にBoundaryも表示するようにしてWater Heightの位置も変更しました。

まだ全然小さいです。

色々工夫して以下の様にまでしました。

全然、水に見えません。

これは時間がある時に検証する事にします。

今回は川は無しにします。

来週からLandscape用のMaterialを作成します。

Help Please Error Packaging Project [9]に

と書かれていました。

これを試すのに1分もかからないので最後にこれだけ試してみます。

ダメでした。

3.Niagaraの勉強

3.1 今週勉強するTutorialを決める

RenderBucket氏のNiagara Fluid SimulationのTutorialは全部勉強してしまったので、Niagara Fluid Simulationの勉強は少しお休みします。

今週は久しぶりにCGHOW氏のTutorialの勉強をする事にしました。

見ると何個も面白そうなTutorialが並んでいました。

とか

Bakeの仕方の復習になりますね。

とか

とかです。

CGHOW氏のEffectは発光が多用されていて、暗いところでははっきり見えるけど明るい所だとどうなの?という疑問がありました。

それが最近は黒を使用するようになっています。

CGHOW氏のEffectはまだまだ進化し続けています。

これもです。

何と、前にCGHOW氏のTutorialを勉強したのは5カ月も前になっていました。

決めました。

Dripping in Unreal Engine 5.1 Niagara Tutorial | Download Files [10]を勉強します。

まず黒いからです。

黒いEffectが無い事がCGHOW氏の弱点であったと個人的には思っていたので、それを克服したって事でしょう。

非常に興味があります。

後、実装するにしてもTextureの黒って、Material内で透明とみなされる箇所が幾つもあったと思います。

その辺をどうやって克服したのかも知りたいです。

3.2 Dripping in Unreal Engine 5.1 Niagara Tutorial | Download Files [10]を勉強します

軽く全部一回見ました。

何と言うか、久しぶりなので見ていて緊張します。

いきなりDynamic Parameterを使用したりとかしていて、視聴者のLevelを6カ月前よりも高く設定しているようにも思えました。

以下に具体的な内容をまとめます。

CGHOW氏はTutorialの内容をそれぞれの章で分割しないんですね。

私が勝手に分割してまとめます。

<Intro>(0.00~)

このTutorialで作成するEffectの紹介です。

<Textureの作成>(0.45~)

地面に映す滴の画像をPhotoshopで作成しています。

以下にその手順を簡単にまとめます。

Gridを表示して中心に点を付けます。

この後の手順は別に絶対従わないといけないと言う訳ではなくて、最終的な結果が同じになれば良いはずです。

ので途中経過だけ記録しておきます。

ボカシを使用して中心のまわりにも点を作成します。

四方に大きな点を配置してその間に小さい点を配置しているのがPointですね。

その点を以下に示した様に線で囲みます。

あれ、何でしょうか?

急にこの素人っぽい絵になってしまいました。

今度はその中を白で塗りつぶします。

うーん。

幼稚園児にでも教えている感じですが、Effectを作成する人達というか、もっと大きくProgrammerって絵を描くのが非常に下手な人達が多いのでこういう解説が必要なんでしょうね。

微調整をした後でLevelを使用してImageをShapeにします。

ふぁっ!

こういうTechnologyをサクッと使用する所が油断出来ないです。

素人臭かったImageが一気にプロが作成したかのようなImageになりました。

最終的には以下のようなImageになりました。

様はこういうImageを作成すれば良いんです。

実装する時は自分のやり方で作成します。

<Materialの作成>(5.25~)

TextureをImportしてMaterialを作成します。

こんな感じです。

まずこのTextureをOpacityに繋げます。

こんな結果になります。

これって黒い部分は黒として表示されるんでしょうか?

黒い部分って透明になると思うんですが。

この辺は自分で実装する時に確認します。

今度はRadial Gradient ExponentialノードとNoiseを加算する事で

と思ったらササっと以下のような実装に変更してしまいました。

Radial Gradient ExponentialノードのOne MinusとNoiseを加算してそこからDebug Time Sineノードを使用して-1から1の間の値を引いています。

結果です。

時間によって変化しています。

あんまり滴って感じはしませんね。

次の実装です。

Debug Time Sineノードを使用していた箇所をDynamic Parameterノードに変更しました。

前のCGHOW氏のTutorialだったらこの部分をConstantで一回作成してそれを交換する事で、学習者に理解し易くしていたんですが、今回はいきなりです。

この結果と先程のTextureの結果を乗算します。

急にPreviewに表示される結果が滴のようになりました。

NoiseにTexCoord[0]を追加します。

これ結果がどう変わるのか想像つかないですね。

Niagara Systemの作成>(7.45~)

いつものFountainをTemplateに追加してNiagara Systemを作成しました。

さあここでNSの作成をするのかと思ったらなんと、Drip用のMaterialの作成を始めています。

今更章を分割するのも一貫性がなくなるのでDrip用のMaterialの作成はここにまとめる事にします。

<<Drip用のMaterialの作成>>

以下の実装を作成しました。

「<Materialの作成>(5.25~)」で作成したMaterialにColorを追加するのを忘れていたのでそれを直します。

<<9.42~>>

ここからNiagara Effectの作成が始まります。

Fountain Emitter StackのParticle Spawn SectionにあるAdd Velocity Moduleを消します。

EffectがDrippingになりました。

これはParticleに加えられていた速度が無くなったので当然です。

Render SectionのSprite Renderer Moduleを選択し、

Materialに先程作成したm_dripをセットします。

以下の様に変化しました。

これはTextureそのものが表示されているんでしょうか?

Textureの透明な部分が消えていないようです。

Particle Spawn SectionのInitialize Particleノードを選択して

Colorを黒に指定します。

これColorを黒に指定していますが、Alphaの値は1のままです。

こうやって黒を表現するのか。

納得です。

ただし結果はまだなにも変わっていません。

次はParticle Update Sectionにある

Scale Color Moduleを選択して

OpacityのScaleを10倍にします。

結果です。

ここで初めてTextureの端が消えて滴のようになりました。

これはどういう事が起きたのでしょうか?

Opacityの値を十倍にしたらTextureにあった薄い影が濃くなって黒く表示されるようになったのか、あるいはその逆で薄い影は白くなって表示されなくなったのか?

この辺は実装する時に確認します。

Particle Spawn SectionにあるSphere Location Moduleを消します。

結果です。

Particleが生成される箇所が一点に変更されたので、蛇口からたれる滴のような形状になりました。

更にRender SectionにあるSprite Renderer Moduleの

AlignmentをVelocity Alignedに変更します。

これはVelocityに向かってTextureを揃えると言う意味なはずです。

これしたらTextureが後ろや横から見られてしまうんじゃないの?

よく分からない設定ですね。

実装する時、確認します。

結果です。

滴の形状がベル型に変わっていますね。

これが欲しくてこの設定にしたんでしょうか?

またParticle Spawn SectionのInitialize Particle Moduleに戻って

Mass ModeとSprite Size MinそしてSprite Size Maxの値を以下の様に変更します。

うーん。

Mass Modeがどのような影響をEffectに与えるのか良く分かりません。

結果です。

これだけじゃ何も分からないですね。

Spriteのサイズが変更されているのかも不明です。

Emitter Update SectionのSpawn Rate Moduleの

Spawn Rate SectionのSpawn Rateの値を20に変更します。

以下のような結果になりました。

うーん。

近づいたImageを見ると

Spriteの形状が、滴の形になっています。

これを作成するための設定だったのかもしれませんね。

うーん。

速すぎる。

久しぶりにCGHOW氏のTutorialを勉強しましたが、その説明の速さにびっくりです。

よくCGHOW氏のTutorialを勉強して全く再現出来ないと文句を言う人達がいますが、そういう人達はこういう箇所をSkipしてしまうか聞き逃しているんだと思います。

CGHOW氏のTutorialを理解するためには、何度も見直して、何をしているのかを確認する必要があるんです。

この勉強方法は、一見遠回りの様に思えますが、実はそれが理解への最短距離なんです。

ここまででEffectの滴の形状の作成が終わりました。

今度は地面にCollideする所のEffectを作成します。

<<滴が地面にCollideするための実装の追加>>

Particle Update SectionにCollision Moduleを追加し

以下の箇所を0に変更しました。

このModuleは使った事が無いですね。これで地面とCollideする事になるんでしょうか?

Previewに表示される結果も

こんなのになってしまっています。

あ、分かりました。これParticleがSpawnしているのが原点なんです。

原点からSpawnして原点でCollideしています。

となると次にやる事はParticleがSpawnする位置をもっと高い位置に変更する事です。

はい。

Particle Spawn SectionのInitialize Particle Moduleを選択し

Position OffsetのZの値を200にします。

結果です。

地面と言うか原点にCollideするようになりました。

このEmitter Stackの名前をDripに変更しました。

あ、これはEventを使用する準備をしているはずです。

Eventで滴が衝突した位置を次のEmitterにPassして何かやるのでしょう。

Particle Update SectionにGenerate Collision Event Moduleを追加しました。

やっぱし。

EmitterのPropertiesを選択し

Request Persistent IDをEnableします。

そしてDrip Emitter StackをDuplicateして新しいEmitterを作成します。

名前はSplatterとしていました。

まずParticle Update Sectionにある

CollisionとGenerate Collision Event Moduleを消します。

こっちのEmitter StackはDrip Emitter Stackが発したEventの信号を受け取ってEmitterを発動する方なので、Eventを発するための上記の2つのModuleは要らない訳です。

次はRender SectionにあるSprite Renderer Moduleの

Materialの設定をSplatter_Matに変更します。

これは「<Materialの作成>(5.25~)」で作成したMaterialです。

そしてParticle Update SectionにあるGravity Force ModuleやDrag Module、そしてScale Color Moduleを消します。

Emitter Update SectionのSpawn Rate Moduleも消しました。

このEmitterがParticleを発生するタイミングはEventが支持するのでSpawn Rate Moduleは要らない訳です。

Propertiesの+Stageを押してEvent Handler Sectionを追加します。

以下の様になりました。

Event Handler SectionのEvent Handler PropertiesのSource にDripとCollision Eventを選択し

Spawn Numberに1をセットします。

Spawn Numberが何を指しているのか不明ですね。

あ、一個のParticleに対して何個のParticleを生成するのかだ。

次はParticle Update SectionにDynamic Material Parameters Moduleを追加します。

以下の値をセットしていました。

Dissolveに-1は分かりますが、Tileに1をセットするなら無くても同じ気がします。

後から値を変えるのでしょうか?

Render SectionにあるSprite Renderer Moduleの

Alignmentの値をUnalignedに変更します。

これってSpriteの面がカメラに向かってAlignしている事を管理しているんじゃないんでしょうか?

何を管理しているParameterなのか実装する時にしっかり確認します。

Particle Spawn SectionにあるInitialize Particle Moduleにある

以下のParameterの値を変更しました。

結果です。

SpriteがCameraに向かって正面を向いています。

Spriteは常に地面と平行でないといけません。

直します。

Render SectionにあるSprite Renderer Moduleの

AlignmentをCustom Alignmentに変更して

Facing ModeをCustom Facing Vectorにします。

そしてParticle Spawn SectionにAlign Sprite to Mesh Orientation Moduleを追加します。

Error表示が出ていますね。

Mesh Orientationのxの値を0にしてzの値を1にします。

そしてFix Issueを使用してErrorを直します。

結果です。

SplatterのEffectの向きが地面と平行になりました。

やっぱし、Sprite Renderer ModuleのAlignmentはSpriteの面の向きを管理していましたね。

その後の実装が複雑でよく分からない箇所がありますね。

Align Sprite to Mesh Orientation Moduleの言うMeshってどのMeshの事なんでしょうか?

そういうのが全然分かりませんね。

この辺は実装する時に確認します。

次にEvent Handler SectionのEvent Handler Propertiesにある

Dissolveの値を以下の様にFloat from Curveに変更して

Curveの値を-1~1に設定しました。

更にParticle Update SectionにScale Sprite Size Moduleを追加し

0.2の時に1になるようにセットします。

Tutorialのこれは0の時に1になっているCurveも見えるんですが、何なんでしょうこれ?

Tutorialではこの後SplatterのSpriteが消えてしまって、色々値を弄って直しています。

この辺は何をやっているのか分からないのでSkipしておきます。

その結果以下の様になりました。

Drip EmitterのSpawn Rateを1にしてSplatterのImageがDissolveしているのかを確認しています。

このDissolveが何を指しているのか今一不明瞭ですが、地面に生成されたSplatterのImageが次のSplatterが地面に当たった時には消滅している事だと解釈しました。

Particle Update SectionにあるDynamic Material Parameter Moduleの

Dissolveの値を色々弄っています。

しかしSplatterは消えません。

SplatterのMaterialをCheckしています。

0.7の時にはほとんど消えています。

もう一度Particle Update SectionにあるDynamic Material Parameter ModuleのDissolveの戻って

Dissolveの1.0の時のKey Dataを確認すると0になっていました。

成程ね。

いつもは0~1の間だから-1~0の設定が正しく見えてしまったんです。

-1~1に変えたら以下の様になりました。

SplatterのEffectが一枚だけ表示されています。

ここでTileの値をRandomizeしました。

これならTileの値をDynamic Material Parameterにした事に納得できます。

結果です。

Drip EmitterのSpawn Rateを上げたらSplatterのImageが消える前に次のSplatterが生成されていますね。

SplatterがDissolveするっていうのはSplatterのParticleが消える時にSplatterのImageも消えるって事かもしれません。

今度は色々な場所にDripするようにします。

最初、ダメな例としてBox Locationを使用する方法を紹介していますが、

この部分の記録はSkipします。

新たにFountainのTemplateを使用したEmitter Stackを追加します。

名前をSourceに変更します。

Particle Spawn SectionのAdd Velocity Moduleを消します。

Shape Location Moduleの設定を以下の様に変更します。

さらにその後でTransformにあるOffsetのZの値を200に変更しました。

Source Emitter単独の結果は以下の様になりました。

うーん。よく分からん。

この部分の機能については実装する時に調べます。

そしてParticle Update SectionにあるGravity Force Moduleを消します。

これ本当に一瞬の事で、Frameにして3しかありません。

Emitter Update SectionのSpawn Rateの

Spawn Rateを5.0に下げます。

そしてParticle Update SectionのDragとScale Color Moduleを消します。

こんな結果になります。

このParticleからDripするようにします。

Particle Spawn SectionのShape Location Moduleの

Box Sizeを200に変更して

Source Emitterの設定は終わりです。

今度はDrip Emitterです。

まずEmitter Update SectionのSpawn Rateを消します。

そしてSpawn Particle From Other Emitter Moduleを追加しました。

これってParticle Attribute Readerを実装したModuleなんでしょうか?

新しいModuleですよね。5.1から実装されたんでしょうか?

Emitter NameにSourceをセットしてFix issueを押しました。

結果です。

これってBoxを使用した時と変わってない気がしますが?

今度はDrippingのSizeを変えるそうです。

Source EmitterのParticle Spawn SectionのInitialize Particle Moduleの

Sprite AttributesのSprite Size ModeをRandom Uniformに変更して

Uniform Sprite Size MinimumとUniform Sprite Size Maximumの値を変更します。

へー。

Source EmitterのSpriteのSizeを変えるとDrippingのサイズも変わるのか。

Spawn Particle From Other Emitter Moduleは凄いですね。

と思ったら、DripのEmitterのParticle Spawn SectionのSpawn Particle From Other Emitter Moduleの

Sprite Size Samplingの設定をApply to Attributeに変更していました。

うーん。

まあ、これぐらいの設定変更は必要でしょう。

しかしこれだけだと以下に示した様に

DripのSizeは一瞬で元に戻ってしまいます。

そこで今度はParticle Update SectionにScale Sprite Size by Speed Moduleを追加します。

何故、Speedなの?

Speedは全部のParticleで一定じゃないの?

Yの値を変更しています。

確かにDripの大きさが変化しました。

これは理屈が分からない。

SpeedとScaleに相関関係があるんでしょうか?

この後、Splatter EmitterのSpriteのSizeとLifeもRandomにしています。

まあこの辺はおまけですね。

結果です。

Tutorialではこの後も微調整していますが、まとめの記録はこの辺で終わりにします。

実装は来週やる事にします。

あ、後一個だけ大切な事していました。

CollideしたDripを消すためにKill Particle ModuleをParticle Update Sectionに追加しています。

設定も以下の様に変更しています。

以下の様になりました。

更にこの後微調整をして

最終的には以下の様になりました。

これでやっと終わりです。

3.3 Dripping in Unreal Engine 5.1 Niagara Tutorial | Download Files [10]を勉強した感想

久しぶりにCGHOW氏のTutorialを勉強しましたが、兎に角、内容が濃い。

下手すると1秒間に3つ位の事をやっています。

今回の勉強も最後の方は結構力尽きてしまってかなりの内容を記録しませんでした。

このTutorialの実装は来週やる事にします。

今週のNiagaraの勉強はここまでにします。

4.Materialの勉強

4.1 Tutorialで使用されているTextureをGIMPを使用して作成します。

<Sparkling Snow Shader - Advanced Materials - Episode 2 [1]>

まずTutorialの最初を見直してどんなTextureからどんなTextureを作成したのかを確認します。

2023-01-08のBlogでこの部分を勉強していますが、今見直したらかなりAboutなまとめ方をしていて参考にはなりませんでした。

もう一回以下にまとめ直します。

まず4kのTextureをQuixel Mega ScansからDownloadしています。

私も同じTextureをDownloadしたはずです。

ありました。

Fresh_Windswept_Snow_uhpjdeynと言う名前でした。

ここで確認しておかないといけないのはT_FreshWindsweptSnow_uhpjdeyn_4K_ORDpで、このTextureには

  • R=Ambient Occlusion
  • G=Roughness
  • B =Displacement

のDataが入っています。

この中で使用するのはAmbient OcclusionとRoughnessだけです。

そして作成した新しいTextureは以下の2つです。

1024 pixelのTextureが一枚、512 pixelのTextureが一枚です。

1024 pixelのTextureには、

  • RとG = 先程の4kを1kに収縮したNormal Map
  • B = 先程の4kを1kに収縮したAmbient Occlusion
  • Alpha =先程の4kを1kに収縮したRoughness

が入っています。

そして512 pixelのTextureには

  • RとG = 先程の4kの一部で、細部を示したNormal Map

が入っています。

こちらのBとAlphaには何が入っているのかは不明です。

後、Roughnessの値を反転させたりNormal MapのGの値を反転させたりしていますが、これらはUnrealで使用する分には全くやる必要は無いです。

Roughnessの値を反転させる必要が無いのはTutorialの説明通りですのでここで再度説明する事はしません。

UnrealではTexture EditorでGreen ChannelをFlipする機能がついていて

この機能はNormal Map用のTextureに限らず全てのTextureで使用可能です。

敢えてTexture作成時にGの値を反転させてよく分からないBugが発生する可能性を高めるよりUnrealのEditor内で適切に対応して、Bugが発生する可能性を0にした方が効率が良いです。

先週、GIMPを使用する事でImageをRGBAのLayerに分割する方法と、その分割したLayerを新たなRGBAのLayerとして使用して新たなImageを作成する事を達成しました。

しかしGIMPを使用して4KのImageを1kに縮小する方法と、4KのImageの一部を切り取って512KのImageとして保存する方法は分かりませんでした。

Medi Bangを使用すれば、4KのImageを1kに縮小する方法と、4KのImageの一部を切り取って512KのImageとして保存する事は出来ます。が一応GIMPでも同じ事が出来るのか調べてみます。

まず4kのImageを1kに縮小する方法について調べました。

Chat GPTで質問した結果です。

Google検索もしました。

How to Change Image Resolution Using GIMP [11]にやり方が載っていました。

ここのやり方はImage からPrint Sizeを選択しています。

まずは、Chat GPTのやり方を試してみます。

簡単に出来ました。

もう簡単すぎてもう一方の方法を試す気が失せました。

今度は4kのImageの一部を切り取って512のImageに張り付ける方法です。

Chat GPTに質問しました。

あ、はい。

分かりました。

こっちは途中まではその通りにやったんですが、Enter keyを押しても選択した外側が消える事は無かったです。

選択した箇所をCopyして別に作成した512x512のLayerに張り付けました。

まあ出来たのでOKとしましょう。

今度は先程作成した1kのNormal Mapと1kのORDpを組み合わせて、

  • RとG = 先程の4kを1kに収縮したNormal Map
  • B = 先程の4kを1kに収縮したAmbient Occlusion
  • Alpha =先程の4kを1kに収縮したRoughness

を持つTextureを作成します。

まず1kのNormal1 Mapを分割して以下のようなRed Green Blue のLayerを作成しました。

1kのORDpも同様に分割して以下のようなRed Green Blue AlphaのLayerを作成しました。

このRedとGreenのLayerを先程の1kのNormalを分割したImageに追加します。

その前にこのLayerの名前を変えます。

出来ました。

これを合成して一枚のImageに戻します。

以下の条件で合成しました。

出来ました。

Unreal EngineにImportしました。

Normal Mapとしてでは無く普通のTextureとしてImportしました。

512Kの方はNormal MapとしてImportした方が良かったかもしれません。

開いて確認します。

まず1kから確認します。

Imageはこんな感じでした。

SRGBをDisableしました。

Flip Green ChannelをEnableしました。

後は設定で変更する必要はないと思います。

RのImageです。

GのImageです。

BのImageです。

最後にAlphaのImageです。

RoughnessのImageは完全な白になってしまいました。

これは元々のImageがほとんど白だったのでしょうがないですね。

512KのNormal Mapも見てみます。

こっちもsRGBをDisableして、Flip Green ChannelをEnableしました。

Tutorialと全く同じTextureを作成する事が出来ました。

一応、Textureの設定だけTutorialで確認しておきます。

512のNormal MapはNormal MapとしてImportされているみたいです。

やり直します。

しました。

Compression Settingsの設定がTutorialと同じNormalmap(DXT5…)になっています。

1kの方はDefaultになっています。

これもTutorialと同じです。

両方ともsRGBはDisableになっています。

これもTutorialと同じです。

Flip Green Channelは両方ともEnableになっていてこの部分はTutorialとは違う設定になっていますが、この理由は前に書いた通りです。

<Rock Shader - Advanced Materials - Episode 3 [2]>

2023-01-15のBlogでTextureについての詳しいまとめをしていました。

それによると

を行えば良いだけみたいです。

じゃあ、これを作成します。

まず元のTextureをCopyして以下のTextureをDuplicateしました。

この中からT_RockMesh_N_meとT_RockMesh_M_meをExportします。

Asset Action -> Exportです。

あれ、今回は何もしなくてもPNGでExportされています。

GIMPから開きます。

それぞれのRGBをLayerとしてDecomposeしました。

T_RockMesh_N_meの結果です。

Red、GreenにはNormal MapのImageが入っています。

Blueには

が入っています。2023-01-15のBlogではT_RockMesh_NのAlpha ChannelにRoughnessのDataが入っていると言っていますが、Blue Channelの間違いみたいですね。

Tutorialを見直したら分かりました。

Color TextureのAlphaにRoughnessを追加した。と言っています。つまりT_RockMesh_NのNormal MapのBに入っていたRoughnessのDataをColor TextureのAlphaに移したんです。

更に言うとColor Textureの色を明るくしてPBR向きに加工したとも言っていました。

2023-01-15のBlogのTextureのまとめは間違っていますね。

以下のが正しいTextureです。

  • Color Texture:RGB = 薄くしたColor Texture、Alpha = Roughness
  • Normal Texture: RGB=Normal Texture、Alpha = Ambient Occlusion
  • Macro Detail = RockをScale upした時にDetailを失わないようにするためのTexture
  • Micro Detail =近づいたときにDetailを失わないようにするためのTexture

Macro DetailとMicro Detailの説明ですが具体的な条件がよく分かりません。

以下に示したTextureをMicro Detail

以下に示したTextureをMacro Detailとして

使用しています。

これらに近いTextureを探して使用します。

Sizeに関しては何も言っていないので元々のSizeである2048 pixelのままで行います。

まず簡単なMacro Detail用とMicro Detail用のTextureを探す事から始めます。

Quixel Bridgeから似たようなTextureを探して来ました。

T_Cracked_Nordic_Coastal_Rocks_uknhaapmw_1K_Nです。

Detail用のTextureなので1kでDownloadしました。

取りあえずはこれで試す事にします。

Microの方はこっちです。

T_Lichen_Covered_Rock_ujlkbfclw_1K_Nを使用する事にしました。

これも仮決定で試してあんまり良くなかったら別なTextureを探す事にします。

次はColor用のTextureの作成を行います。

T_Rock_Basalt_DをDuplicateしたT_Rock_Basalt_D_meを使用します。

まずこれをExportしてGIMPに読み込ませ、色を薄くします。

GIMPに読み込ませたら以下のような表示になっています。

何これ?

まあ良いです。これのBrightnessを上げて色を白くします。

やり方が分かりません。Chat GPTに聞く事にします。

質問の英語の文法が一寸おかしいですね。

Tell me how to increase the whiteness of a gray image using GIMP.

が正しい英語ですね。

でも意味を理解して答えてくれています。

Chat GPT凄い!

最初の説明通りにやってみました。

が変化がGIMP上からでは分かりません。

こんなImageになっています。

仕方ないのでPNGで保存して開いて見ました。

になりました。

薄くなっていますね。

残りのRGBの操作はやり方は同じなので結果だけ示します。

最終的に以下の2つのTextureになりました。

Rock_Color_CRです。

RGBには以下に示したようなImageが入っています。

Alphaには以下のRoughnessのImageが入っています。

このImageはTutorialが使用しているRoughnessのImageと微妙に違います。

違いますがこれでまず試してそれから考えます。

Rock_Normal_NOの方です。

Textureの設定ですが、BにAmbient OcclusionがあるのでNormal MapとしてはImportしませんでした。

のでFormatはDXT1になっています。

更に以下の設定を変更しました。

RGにはNormal Mapがはいっていますが、Bには以下に示したAmbient OcclusionのDataが入っています。

これでTextureは完成しました。

来週は、Rock Shader - Advanced Materials - Episode 3 [2]の実装を行います。

5.戦闘システムの続きを作成する

先週、Animationを追加するに当たって以下のBugを発見しました。

  • 順番がオカシイ
  • セリフが足りない
  • Monsterが死んだときのAnimationがない

これらのBugを直す事にします。

しかしその前に先週追加したAnimationがPackagingした後でもきちんと作動するのかの確認を行います。

5.1 Packagingした後でもAnimationがしっかり動くのかを確認する

前にPackagingした時の設定が残っているはずです。

そのままPackagingしました。

Stage6まで戦いましたがAnimationは普通に動きました。

Packagingしても問題なくPlay出来ています。

しかしそれとは別に2つのBugが更に見つかりました。

Monsterを選択してDragしてツボの前でDropする前にDragを話すと、二度とこのMonsterをDragする事が出来なくなりました。

これは結構、重大なBugです。

これはEditorではない問題でPackagingしたExe Fileにだけ起きました。

Stage 2とStage 4がMonsterの登場するPatternが同じでした。

こっちは調べたら元々そういう設定でした。

5.2 Drag and Dropの問題を検証する

UMG Drag Drop Not Working - 4.20 (Packaged / Standalone) [12]に解答らしきものが載っていました。

これって

の実装の以下に示したCreate Drag Drop Operationノードの

PayloadにパスしているSelfをImageに変更しろ。って事でしょうか?

試しに以下の様に変えてみました。

解答だとPayloadだけ変えるみたいに書かれていましたが、Default Drag VisualがImageじゃない方が変な気がするんで、両方変えてみました。

まずEditor上でテストしてみます。

この設定だとMonsterをセットする事が出来ませんでした。

以下の四角のWidgetを調べたら

W_DropToというWidgetでした。

このWidgetの実装を見ると以下に示した様にWidgetをパスしないと先に進まないようになっていました。

公式のCreating Drag and Drop UI [13]を見ると

Payloadには何もPassしていません。

これを真似て

Payloadには何もPassしないで、

W_DropToではDrag VisualからWidgetをpassするようにしました。

これでTestしてみます。

まずはEditor上です。

問題なく動いています。

Dragを途中で止めても最初のImageからDragすればもう一回Dragする事が可能です。

今度はこれをPackagingします。

Exe Fileでテストします。

ダメでした。

Dragを途中で止めると二度とImageからDrage出来なくなります。

Stand aloneでも同様の問題が起きていました。

もう以下の実装に戻ってImageだけPassしてみます。

これだとPackagingした後のExe FileでもDragが何回も出来る事は出来ました。

うーん。ただしImageしかPass出来ないとその後が続きません。

そこで次の案を考えました。

やり直しButtonを追加して

DragしたImageを途中で落としてしまった場合、このWidgetを殺して新しく作成し直します。

以下の実装で出来るはずです。

試してみます。

取りあえずStand Aloneで試してみました。

何回でも試す事が出来ます。

この方法で直す事にします。

やり直しButtonを新たに追加するのは画面が汚くなるので以下の様に決定Buttonに追加しました。

更に決定Buttonの実装を以下の様に改造してツボにMonsterが入っていないときにWidgetを読み直す事にしました。

テストします。

まずはStand Aloneでテストします。

ここでDragに失敗します。

もうMonsterをDragする事が出来なくなりました。

決定又はやり直しButtonを押します。

するとWidgetが新しくなってまた最初からMonsterをDragする事が出来るようになりました。

今度はMonsterをセットする事が出来ました。

そのままGameを継続してPlayする事が可能になりました。

今度はPackagingで試してみます。

Stand Aloneと全く同じで出来ました。

これで解決とします。

5.3 順番がオカシイ

先週のBlogを読み直すと以下の様に書かれていました。

これを

  1. Dialogueが表示
  2. Animationが発動
  3. UIの値が変化

に直すべき。と述べています。

どこで実装されているのか調べました。

Level BPにあるPlayer Monster Attackで実装されていました。

Playerの魔法に関してですが、Dialogueの表示とUIの値を変化させるのを以下のFunctionで一括でやっているので直すが大変です。

こっちは後回しにします。

Monsterの攻撃では以下に示した様に

Dialogueの表示を①で行い、UIの値の変更を②で行い、Animationを③で行っています。

のでこの②の部分を③の後に移動して後はDelayの時間を調整すれば順番が正しくなると思います。

試してみます。

以下の様に実装を変更しました。

Dialogueの表示を①の部分で行うのは同じです。

Animationを②で行います。

最後にUIの値を③で行います。

これでTestしてみます。

UIが変化するのがAnimationが終わるよりかなり先です。

あれ、Monsterが攻撃するAnimationが一番最後になってしまいました。

ああ、UIの値を変化させているだけと思っていたMonster Attack()関数の中にAttack Animation()関数が入っていました。

出来ました。

以下に変更した点をまとめます。

Monster Attack()関数内にあったAttack Animation()関数は外しました。

まずDialogueを表示します。

1秒待ちます。

PlayerのMonsterの攻撃Animationを表示します。

1秒待ちます。

対戦相手のMonsterのDamageのAnimationを表示します。

又1秒待ちます。

PlayerのMonsterのAnimationをIdle時のAnimationに戻します。

対戦相手のMonsterのAnimationをIdle時のAnimationに戻します。

1秒待ちます。

UIを変更します。

これで

  1. Dialogueが表示
  2. Animationが発動
  3. UIの値が変化

の順番になりました。

それでここからが問題なのですが、これは左翼に配置されているMonsterで、これと全く同じ事を中央に配置されているMonsterと右翼に配置されているMonsterの実装に対して行う必要があります。

更に対戦相手のMonsterに対しても同様にやる必要があります。

つまりこれから同じ事を後5回繰り返す必要があります。

そんなのはこの部分を関数化したら良いだけだと思ったらDelayを使用した場合は関数化出来ません。

今週はこの実装を整理するのが目的ではないのこの同じ実装が後5回繰り返されている箇所をそれぞれ同じ様に直しますが、後でもっと効率的な、少なくとも可読性が高くなるような実装を考えます。

一時間位掛けて直しました。

確認します。

出来ていました。

ここでAnimationで見せられないのが残念です。

  1. Dialogueが表示
  2. Animationが発動
  3. UIの値が変化

の順番でMonsterが攻撃しています。

魔術師の順番は来週直す事にしました。

流石にこれはもう飽きました。

5.4 セリフが足りない

短いので先週のCommentをそのまま載せてしまいますが、

だそうです。

以下の様に直しました。

まず結果から示します。

回復魔法を使用した場合です。

強化魔法を使用した場合です。

交換魔法を使用した場合です。

実装部分です。

Combat Level BP内のPlayer Monster Attack Event内に以下に示したDialogue After Magic()関数を

追加しました。

Dialogue After Magic()関数の実装です。

今週の戦闘システムの勉強はここまでにします。

残りのBugは来週直す事にします。

6.Gaeaの勉強

今週もAndrea Cantelli氏のGaea Tutorial for Beginnersを勉強します。今週はGaea Tutorial for Beginners #5 | Creating the shape of our first terrain [14]を勉強します。

6.1 Blogを見直して前に勉強した内容を復習する

見直すと2022-11-202022-11-28のBlogで勉強しています。

それぞれのBlogの内容を読み直してみます。

2022-11-20

文句が沢山書かれていました。その理由ですが、

  • あまりに退屈
  • Versionが古いので無駄な勉強が多い
  • 正解が無い事に対して勉強している

まあこれを勉強したらどうなるのかの先が見えないと退屈になります。

それは兎も角、無駄な勉強が多いと、正解が無い事に対して勉強している。という2つの結論に関しては今から見ると間違っていますね。

Nodeの作成に関して言えば新しいVersionもそんなに差はないです。更に言うとこのTutorialを勉強した後から自分で、Gaeaを使ってそれなりのTerrainを作成出来るようになりました。

つまり凄い効果が有ったTutorialだったんです。

TerrainをNodeを使って作成する方法に正解は無いというのは一見正しい意見です。

しかし条件をつければ(例えば写真そっくりなTerrainを作成するとか、UEで使用するためのTerrainを作成するとか)いくらでも正解は有ります。

後、この時はまだ気が付いていませんが、それぞれのNodeはある機能を体現しています。その機能のTypeから機能を群に分割する事が出来ます。そしてGaeaでTerrainを作成する時は、ここではこの群から選択しないといけない位の緩い制約は常にあってそういう意味でもTerrainをNodeを使って作成する方法にはある程度の正解はあります。

まあ、でも不満を述べるという事は、それだけ真剣に勉強しているという事でもあるのでそれはそれで良いでしょう。

それぞれの章に対しての勉強した内容や感想がまとめられていました。

以下にそれを更に簡潔にまとめます。

<<Intro>>

本当かよ。

これは要確認です。

<<Primitives>>

そうだったけ?

それより、NodeでTerrainを作成する時は、必ずPrimitiveから始める必要がある事について一言も書いていません。

<<Edges>>

Apertureノードについてまとめてありました。

Apertureノードそのものの勉強も大切ですが、ここはEdgesとしての章です。Primitive型のNodeを使用した後で、Edge型のNodeを使用するのが一般的なNodeの使用方法なのかが知りたいです。

それについてはここでは何も書かれていませんでした。今回の勉強でそれは確認します。

<<Erosion>>

Primitive -> Edge -> Erosionの順番で作成するのが一般的なやり方なのかの解説が無いです。

しかもErosionを使用するまでにWarpノードやSwirlノードを使用したりしていて何を目的にNodeを組んでいるのかとか、どんな順序でNodeを組むべきなのかとかが全部無茶苦茶になっています。

この部分だけを見ると、

  • 正解が無い事に対して勉強している

という2022-11-20のBlogの批判もそれなりに的を得ています。

この辺は私が自分でTutorialを作成する時に改善すべき課題として認識する事にします。

ここまでで終わっていて残りは次の週に勉強しているみたいです。

感想としては、文句ばっかり書いたけどそれなりにGaeaの理解が進んだ。とまとめていました。

2022-11-28

<<Changing Parameters>>

ここでParameterの調整を行っています。

この期に及んでParameterの調整をするのか?と最初から怒っています。

それはそれで納得できる不満ではあります。

しかしParameterについても勉強する必要があり、何処かで教える必要はあります。それでこのTutorialはここにブッコんだんでしょう。

それも仕方のない事ではあります。

後重要な事でLookDev群の使用方法についての説明がまとめられていました。

私、今思いついたんですが、以下のような手順で作成すべきかもしれません。

  1. Primitive-> Edge -> Surfaceで簡単なTerrainを作成する
  2. 噴火や隕石の落下のような大災害が起きた。(SwirlノードやWarpノードを使用してTerrainを半壊させる)
  3. 時間が経って新たな地層が追加される。(ErosionなどでTerrainをMildにする。必要ならParameterの調整もここで行う)
  4. Terrainの表面の見た目を良くする(LookDevなどを使用)
  5. 川や湖などの追加

これは自分のTutorialを作成する時のIdeaとして保存しておきます。

<<Adding Breakers>>

Breakerノードについて説明しています。

そもそもBreakerノード自体を既に忘れてしまっています。何をするNodeなんでしょう。

Terrainに亀裂を追加するNodeでした。

<<Other Changes>>

Parameterの調整とかです。

<<Adding a Primitive>>

この期に及んでPrimitiveを追加するのかと思いますが追加しています。

山の周りの平なTerrainの部分に凸凹を追加するための行っているようです。

ここでBypass Nodeと言う機能を初めて学んだので、それについてまとめていました。

この後にある以下の章はSkipされています。

  • Creating the Mountain Ridges
  • Combining Notes
  • Adding Turrets
  • Bypass fits

これらの章は今回しっかり勉強する事にします。

<<Micro Erosion>>

この間にもいろいろな短い章があるんですが、全部無視して最後のMicro Erosionだけまとめられています。

Micro ErosionというNodeがあり、そのNodeを使用した結果が載っているだけでした。

以上でした。

2022-11-202022-11-28のBlogの感想>

GaeaのNodeの作成方法にある秩序を見出す事が出来るTutorialとしてGaea Tutorial for Beginners #5 | Creating the shape of our first terrain [14]は貴重なTutorialである事が分かりました。

しかしGaeaのNodeを作成するための順序を完璧に整理しているとは全然言えない状態でもあります。

このTutorialを勉強した後で、このTutorialの骨子を整理し、それを改良して自分でTerrainを作成するための順序を作成する必要があります。

6.2 Gaea Tutorial for Beginners #5 | Creating the shape of our first terrain [14]を勉強します

前回どんな事を勉強したのかは大体理解しました。それを踏まえてもう一回、このTutorialを勉強します。

<Intro>

IntroのLightの設定の勉強は特にする必要はない。と前回の勉強でまとめていましたが、今回も同じ感想でした。

Lightの設定を弄る事で何が変わるのかがよく分かりません。弄っても弄らなくても同じに見えます。

<Primitives>

NodeでTerrainを作成する時に、最初にセットするNodeです。

Primitiveに属するNodeでも簡単に使用できるNodeとある程度Gaeaの仕組みを理解しないと使用出来ないNodeがあるそうです。

これは納得の説明で、更にPrimitiveには最後の方で平なTerrainを凸凹にするために使用するのもあります。

このPrimitiveの中でダントツし簡単に使用出来るNodeがMountainです。

このTutorialはこのMountainノードを使用してTerrainを作成します。

PrimitiveのどのNodeは簡単に使用出来て、どのNodeはある程度Gaeaを理解しないと使用出来ないのか、とか後で地面の平を調整するために必要なNodeとかを一寸だけ分類したいと思います。

Gaeaを起動して検証します。

まずPrimitivesに分類されているNodeは全部ある程度理解してから使用するNodeです。

次にGeo Primitivesを見てみます。

<<簡単に使用できるNode>>

Canyon、Fault、Hill、Mountainの4つしかありませんでした。

<<簡単には使用出来ないNode>>

Island、Shiny Wavesです。

<<後で平な地面に凸凹を追加する時に使用するNode>>

Badlands、Crater、Dunes、Igneous、Plates、Range、Ridge、Rocky、Sand、Slump、そしてWorse landsです。

<<感想>>

こうやって分類するとそれぞれのNodeの特徴が理解し易いです。

初心者が最初に使用出来るNodeはたったの4つしかない事も判明しました。

この4つのNodeから選択すると成るとMountainしかChoiceが無いです。

だからGaeaのTutorialはどれもMountainノードを使用しているのか。というかなりメタ的な事情も理解出来ます。

この分類はやっていて面白いだけでなく役にも立ちます。

PrimitiveのNodeも分類してみます。

<<簡単に使用できるNode>>

なし。

正し以下のNodeは条件を追加する事で簡単に使用出来る可能性がある。

Gradient、Slop Noise、Voronoi、Voronoi+

<<簡単には使用出来ないNode>>

Constant、Cracks、Files、Gabor、Line Noise、Mask、Resource、Tile Input。

ConstantやMaskの様に単独では使用出来ないNodeや、FilesやResourceの様にどうやって使用したら良いのか全く見当がつかないNodeがあります。

<<後で平な地面に凸凹を追加する時に使用するNode>>

Drift Noise、Multi-Functional、Perline、Rock Noise。

これらのNodeは地面に凹凸を作成するのにかなり役に立ちそうです。

<<感想>>

地面の凹凸の作成には使用出来そうなNodeがそれなりにありました。

Tutorialの続きに戻ります。

Mountainノードを追加した後、Displaceノードを繋げています。

このDisplaceノードは

Warp群に配置されています。がどんな機能なのか不明です。

調べます。

公式のQuadspinnerのDisplace [14]に以下の説明がありました。

これはつまり表面を加工するためのNodeですね。

TutorialではこのNodeのParameterの使用方法についての詳しい説明がされていました。公式のQuadspinnerのDisplace [14]にはこのNodeのParameterに関する更に詳しい解説が載っていました。

今回の勉強ではDisplaceノードがTerrainの表面を加工するNodeだと理解出来ただけで十分です。

もうGaeaの勉強に使える時間が無くなってしまったので今週のGaeaの勉強はここまでにします。

以下に示した残りの章は来週以降に勉強します。

<Edges>

<Erosion>

<Changing Parameters>

<Adding Breakers>

<Other Changes>

<Adding a Primitive>

<Creating the Mountain Ridges>

<Combining Notes>

<Adding Turrets>

<Bypass fits>

<Micro Erosion>

ここでファイル利用量が99%になってしまいました。

残りは2月になったら掲載します。

11.参照(Reference)

[1] Ben Cloward. (2022, October 6). Sparkling Snow Shader - Advanced Materials - Episode 2 [Video]. YouTube. https://www.youtube.com/watch?v=TCz-fKJS3wI

[2] Ben Cloward. (2022b, October 13). Rock Shader - Advanced Materials - Episode 3 [Video]. YouTube. https://www.youtube.com/watch?v=Q2XI8cuSBMk

[3] Andrea Cantelli. (2020c, May 26). Gaea Tutorial for Beginners #3 | Layer Based Workflow. YouTube. https://www.youtube.com/watch?v=XxfSOvpTA90

[4] Magee, R. (n.d.). Foundations | Overview | SideFX. https://www.sidefx.com/tutorials/foundations-overview/

[5] OlympusMonsTutorials. (2021, March 3). C++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [Video]. YouTube. https://www.youtube.com/watch?v=rWylZKi8QbM

[6] Yepkoo. (2022, November 27). #UE5 - Unified Interactive Water System (UIWS) - Plugin testing #1 [Video]. YouTube. https://www.youtube.com/watch?v=jLSkboBRwlg

[7] Ue5 world partition: how to make an actor always visible. (2022, April 15). Epic Developer Community Forums. https://forums.unrealengine.com/t/ue5-world-partition-how-to-make-an-actor-alway-visible/529348

[8] renderBucket. (2022b, September 12). Unreal Engine 5 Tutorial - Niagara Fluids & Characters/Skeletal Mesh Collisions [Video]. YouTube. https://www.youtube.com/watch?v=oAYkob_ciqc

[9] Help Please Error Packaging Project. (2022b, November 19). Epic Developer Community Forums. https://forums.unrealengine.com/t/help-please-error-packaging-project/693911/7

[10] CGHOW. (2022, December 11). Dripping in Unreal Engine 5.1 Niagara Tutorial | Download Files [Video]. YouTube. https://www.youtube.com/watch?v=5rgn7T4FAFI

[11] Research Guides: All About Images: Home. (n.d.). https://guides.lib.umich.edu/c.php?g=282942

[12] UMG Drag Drop Not Working - 4.20 (Packaged / Standalone). (2018, August 15). Epic Developer Community Forums. https://forums.unrealengine.com/t/umg-drag-drop-not-working-4-20-packaged-standalone/431658

[13] Creating Drag and Drop UI. (n.d.). https://docs.unrealengine.com/5.1/en-US/creating-drag-and-drop-ui-in-unreal-engine/

[14] Displace - Gaea Documentation - QuadSpinner. (n.d.). QuadSpinner Gaea Documentation. https://docs.quadspinner.com/Reference/Warps/Displace.html

[15] Houdini. (2020, April 13). Color SOP | Node Reference. YouTube. https://www.youtube.com/watch?v=5KK06YTZgzo

UE5の勉強 -LandscapeのみのGameを作成する-

1. 今週の予定

以下の内容を勉強する予定です。

<LandscapeのみのGameを作成する>

GaeaのDataに川と湖を追加します。それをMaskとしてExportしUE5で川と湖を示します。

Niagaraの勉強>

先週勉強した Unreal Engine 5 Tutorial - Shading Niagara Fluids – Honey [1]を実装します。

<Materialの勉強>

GIMPを使用してRGB alphaのそれぞれのChannelにImageを張り付ける方法を勉強します。

<戦闘システムの続きを作成する>

MonsterのAnimationを追加します。

<Gaeaの勉強>

Andrea Cantelli氏のGaea Tutorial for Beginners #1 | Intro to the series & Analyzing the Interface [2]のToolboxの最後の三本線のIconとSettingを勉強します。

<Houdiniの勉強>

公式のTutorialであるFOUNDATIONS | OVERVIEW [3]のView Toolsの続きを勉強します。

<Volumetric Cloudの勉強内容をまとめる>

2枚のTextureのImageを変える事で雲の形状をある程度変更出来る事についてもっと深堀する。

DirectXの勉強>

OlympusMonsTutorials氏のC++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [4]のPrecompiled Headerを勉強します。

2.LandscapeのみのGameを作成する

2.1 GaeaのDataに川を追加する

先週、Gaeaで作成したTerrainの実装を見たら以下に示した様に既にRiversノードを使用していました。

RiverノードのImageを見ると

これで十分です。

これをBuildしてExportします。

Fxノードを繋げます。名前をRiverにしました。

以下にRiverノードのImageを示します。

このImageをRiverのMaskとしてExportします。

2.2 湖を追加する

Lakeノードを追加したんですが、Seaノードとほぼ同じ箇所を湖にして山の麓に湖を作成することが出来ません。

Maskを使用したら出来るのかと思ったんですが、湖が生成出来るのかその箇所が周りより低くなってないとダメみたいです。

取り敢えずこれは中止します。

結構、想像していたのと全く違う結果になります。

ここにNodeを入れたらこうなるはずだ。と思ってやったら全然違う結果になってしまいます。

これは先に川を追加した結果だけBuildしてUE5で確認した方が良いかもしれません。

後、Beachを砂場と岩場に分けたかったんですが、それも止めて取りあえず川だけ追加したHeight MapとMaskをBuildしてそれをUE5で確認する事にします。

2.3 取りあえず川だけ追加したTerrainをBuildしてUE5で確認する

Buildの設定は前回のがそのまま残っていたのでそれを使用します。

新しいHeight MapとMaskが出来ました。

まず新しいMaterialを作成しました。

単にRiverのLayerを追加しただけです。

一寸先週やったやり方を復習します。

で新しいLandscapeを作成しました。

空を追加します。

そしてSky LightのReal Time CaptureにCheckを入れます。

以下の条件でImportしました。

Height MapとMaterialが変わっている以外は先週と全く同じ条件です。

PaintのPaintを選択して

それぞれのLayerInfoを作成しました。

Cliffを選択してFill Layerを選択します。

先週はこれが抜けていたからうまく出来なかった。見たく書いていましたが、これをやらなくてもLandscapeは既にCliffの色一色になっています。あんまり重要じゃないのかもしれません。

次はManageのImportに移動して

対応するMaskを指定します。

あ、最後のLayerをSeaではなくLakeにしてありました。

これは間違いですね。

後で直します。

それぞれのLayerを一個ずつ選択して順番にImportしました。

最後のLakeだRiverのCheckを外すのを忘れてしまいました。

近づいて確認しましたが、大丈夫そうですね。

海の上に川が流れている事は無いですね。

Play画面です。

小川になっていますね。

川の上限まで登ってみました。

あんまりよく分かりません。

こっちにもっと太い川がありました。

Play画面です。

これでも小川サイズですね。

川を上ったらLandscapeの凸凹が教養出来ない範囲でひどいです。

もっと大きな川を見つけました。

これも登ってみます。

川が道標になっていろんな所を探索出来ます。

山脈の中腹にある草原にたどり着く事が出来ました。

2.4 Water Systemを勉強する

以下に示した様に一月中にWater Systemを勉強してこの島に追加する予定です。

それでWater Systemは色々問題があってうまく使用出来ないとかの噂があります。

のでこれを早く勉強して試す事にしました。

Klaus氏のUnreal Engine 5: Water System in UE5 Tutorial [5]を勉強します。

<Over View>

もう、最初からWater SimulationはまだExperimentalだから製品には使用しないように。と言っています。

でもその限界と回避の方法もここで解説する。と言っていました。

うーん。

これは勉強し甲斐があります。

<Getting the Water Ready>

当然、Water SystemはPluginなので以下に示した様にPluginのWaterを追加する必要があります。

敢えて実装と勉強を分ける必要もないでしょう。

一緒にやっていきます。

先程作成したLandscapeで試してみます。

まずWaterのPluginを追加しました。

以下に示した様にWater ExtrasというPluginも表示されています。

Water Extrasが必要なのかは不明ですが、Tutorialを見るとこっちもCheckされているので一緒にCheckしました。

UE5 EditorをRestartさせます。

以下のErrorが表示されました。

検索したらUE ForumのHelp Please Error Packaging Project [6]でほとんど同じ質問がされていました。

しかも以下の解答で解決したとあります。

成程。

理解しました。

まずはこのError表示にあるAdd entry to DefaultEngine.iniをClickします。

うんともすんとも言いません。

DefaultEngine.iniを開いて確認します。

うーん。新しいPCにはNotepad++もVisual Codeもまだ入れてなかった。

Notepadで開きます。

普通に[/Script/Engine.CollisionProfile]がありました。

多分、Add entry to DefaultEngine.iniを押したことでこれらのLinesが追加されたんでしょう。

以下の箇所からWaterのPluginが追加された事が確認できます。

確認出来ました。

この後、TutorialはEmptyのMapから空を作成する手順を示しています。

この部分は要らないのでSkipします。

<Preparing Landscape>

ここも既に知っている内容なのでSkipします。

と思ったら結構、重要な事をそこかしこで述べていました。

ので大切だと思った事は以下に記録します。

最初のLayerInfoを作成すると自動的にLandscape全体にこのMaterialが適応されます。

されない場合は、このLayerを右ClickしてFill Layerを選択するそうです。

はい。

さっきの疑問が解消されました。

LandscapeのLayerを使用するために、LandscapeのParameterにあるEnable Edit LayersのCheckを入れる必要があります。

これはDefaultで入っていました。

LandscapeのPaintのPaintにある

Edit Layersについてです。

Layer1とLayer2を追加しています。

このLayerはお絵かきソフトのLayerと全く同じ機能をLandscapeで実装したものです。

それぞれのLayerでLandscapeを追加出来ます。

もしそのLayerでLandscapeの造形をやり直したい時は以下の様にLayerを右Clickして

Clearを選択しSculptを選択します。Allを選択するとPaintとかも無くなるそうです。

ここでTutorialはWaterを追加した場合、元のLayerの形状に影響を及ぼすので別なLayerにWaterを追加しろみたいな事を言っているみたいなんですが、一寸理解出来ないです。

ここは続きを見てから何を言いたかったのか判断する事にします。

<Save the Ocean>

Water Body Occeanを追加しました。

すると以下に示した様に画面からLandscapeが消え4つの点のある四角い線が表示されるようになりました。

更に以下に示した様に3つのものが追加されました。

やってみます。

Tutorialと同じようにやったら以下に示した様に3つのものが追加されました。

画面はかなり違います。

一面海になってしまいました。

広がってみたらこんな感じです。

先程のEdit Layersに移動したらWaterが追加されていました。

さっきの説明はこれが言いたかったんでしょうか?

次にLandscapeのLocationを0,0,0にセットし直しています。

これやっぱし0,0,0が正しいんでしょうか。

ここでWater Systemの2つの問題点について語っています。

  • 小さなLandscapeにしか適用出来ない
  • 原点から離れれば離れるほどおかしくなる。

だそうです。

どうやらKlaus氏はWater Systemの問題も熟知していて更にその解決方法も既に把握しているみたいです。

これは安心しました。

LandscapeとWater Body OcceanのLocationを0,0,0にセットし直しました。

以下の様になりました。

いやTutorialの続きを見たら以下の様にしてLandscapeの中央が原点に来るようにしていました。

直しました。

TutorialによるとZの値も原点より少しだけ高い方がうまく働くそうです。

私のは以下のような結果になっています。

調べたらLandscapeの中心を原点に合わせるには以下の様に-を付ける必要がありました。

Tutorialを見直したらNegativeになっていました。

今度はWaterBodyOcceanの高さを調整します。

Tutorialでは何を基準に高さを決めているのか不明なのでLandscapeの高さと揃う感じにしてみました。

次にWaterBodyOcceanのMaterialについて説明しています。

今回はこの部分は変更しないので何もしません。

因みに私のProjectの方では以下に示した様に5つのMaterialが使用出来るようになっていました。

この後、WaterBodyOcceanのSpline Pointの説明がずっと続きます。

どこで勉強したのか覚えていませんがこれの使用方法は知っています。

一応、大切そうな所だけ以下にまとめます。

Spline Pointを選択してXY方向に移動させるとOcceanの形状が変化します。

ただしZ軸には動きません。

もしSpline Pointを追加したい場合は、追加したい所を右Clickして以下のBoxを表示させ

Add Spline Point Hereを選択します。

Spline PointをDuplicateする時は、DuplicateしたいSpline Pointを選択して以下のBoxを表示して

Duplicate Spline Pointを選択します。

Altを押しながらDragしても同じ事が出来ます。

次はSpline Pointのtypeですが、以下の様になっているそうです。

これは分かりやすい。

Constantがこうなっているのは知りませんでした。

ただしTutorialによると最後に全部を選択してCurveに変更すべきで、途中で一個だけLinearからCurveに変更すると全体の調整が難しくなって失敗してしまうそうです。

はい。

それではSpline Pointの調整をやってみます。

取りあえず以下の様にしました。

微調整は後からします。

Play画面から見た映像です。

海の中です。

海底が浅いので顔から上が海から出ています。

取りあえずはこれでOKにします。

海のMaterialの色は濃い茶色の方がいいかもしれませんね。これは後で検討します。

<Meet me at the Lake>

Water Body Lakeを追加して今度はLakeの使用方法を勉強します。

こんなの大したことないから聞くだけでいいか。と思って聞いていたらWater SystemのParameterの使用方法について解説していて、大変重要な内容でした。

仕方ないので以下に示した様にWater Body Lakeを配置して、このParameterについて勉強する事にします。

まず以下に示したWater Body Lake全体を示す矢印ですが、これはZ軸を動かす事が出来ます。

Z軸上に動かす事が出来ないのは一個一個のSpline Pointだそうです。

<<Selected Points>>

Select Spline Pointsです。

Tutorialでは一個一個の使用方法について解説していますが、以下に示した様にCursorを載せるとそれぞれの機能について簡単な説明が表示されます。

これを見ると全部理解出来るのでここにはまとめません。

以下に示した様にそれぞれのSpline Pointには2つのPointが繋がっています。

この2つのPointを調節するのが以下のArrive TangentとLeave Tangentです。

<Island, Hole and Terrain Settings>

TutorialではここからSectionが変わっています。ので同じにします。ただし内容は変わっていません。

<<Water>>

Velocityです。

これは川の時に使用するそうです。

Water Body IslandsとWater Body Exclusion Volumesです。

ここは自動で追加されるので弄る必要はないみたいです。

以下にTutorialの例を示します。

こんな感じです。

<<Terrain>>

Curve Settingです。

Channel Edge Offsetです。

0の時です。

-1000です。

湖のサイズが小さくなりました。

Channel Depthです。

湖底の深さを示しているみたいです。

500の時です。

1000の時です。

湖底が深くなりました。

Curve Ramp Widthです。

これは一番深い場所に行くまでの距離を示しています。

この条件だと20m必要です。

<Wave Theory>

Tutorialでは、ここからWave Theoryになります。

<<Wave>>

岸から波が小さくなる距離を示します。

0の時は波は全く小さくなりません。

Wave Sourceについてです。

この辺の設定はEngineにあるAssetが担当しているので弄るのは止めておきます。

と思ったらTutorialで一から作成する方法が載っていました。

せっかくなので試してみます。

中身です。

まず以下の部分は他の選択肢がないのでそのままだそうです。

Num Wavesです。

この数が多いほどRealisticな波が出来るそうです。

ただしその分計算に負担もかかります。

TutorialによるとSmartphone用のGameでは2にした方が無難と言っていました。

Wavelengthです。

当然ですが波の長さです。

Amplitudeです。

波の高さです。

Directionです。

風が吹く方向です。

Steepnessです。

波の高さの急さを示しています。

自分で作成したWater WavesをLakeに使用してみました。

波を穏やかにしてみました。

<River flows in you>

今度はRiverの話です。

取りあえずWater Body Riverを追加しました。

Splineが見えません。

G押したら出て来ました。

Spline Pointを弄って川をまっすぐにしました。

川が太すぎます。

まあ最初はTutorialの解説を見る事にします。

Tutorialによると川の流れている向きから確認するそうです。

あっています。

以下のParameterでRiverの特徴を調整出来るそうです。

取りあえずは以下の様にしました。

Riverは後で調整します。

<Blending, Translucency and LODs>

ここまで来てあれなんですが、前にWater Systemについて勉強していました。

何か、知っている事や、概念を説明される前から理解していたりとかして?だったんですが、思い出しました。

前に勉強した事ありました。

このWireframeの絵で完全に思い出しました。

この海の部分がTranslucentであるように見えますが

実際のRenderingではOpaqueだそうです。

Landscapeと海のSurfaceをBlendして表示しているので見かけ上Translucentに見えるだけだそうです。

これを証明するのにCubeにTranslucentなMaterialを張り付けて半分だけ海に沈めています。

海が本当に透明なら沈んだ部分のCubeも海から見えるはずですが、ここでは完全に消えています。

うーん。

納得。

MeshのサイズもCameraからの距離によって変わるそうです。

Naniteと同じです。

<Lonely Island?>

完成品をみせているだけです。

<Good Stuff>

Tutorialの終わりで特に何かを語っている訳ではないです。

以上でした。

2.5 RiverをもっとRealにする

これをやります。

GaeaのRiver通りに作成したら逆に変になってしました。

GaeaのTerrainは1009x1009で出力すべきサイズではないですね。これ三倍、下手したら10倍の大きさで出力すべきでした。

いきなり大問題です。

川のMeshが切れています。

これで作り直します。

川を作成していたら完全に酔ってしまいました。

3D酔いです。UEを弄っていて初めてなりました。

吐きそうです。

今週のLandscapeはここまでにします。

3.Niagaraの勉強

今週は先週勉強したUnreal Engine 5 Tutorial - Shading Niagara Fluids – Honey [7]を実装します。

3.1 Unreal Engine 5 Tutorial - Shading Niagara Fluids – Honey [7]を実装する

Grid 3D FLIP Hoseを使用してNiagara Systemを作成します。

NS_Honeyと名付けました。

FoamやSprayを形成するEmitterは要らないので消します。

次に水の高さを調整するためにSystem StackのUser Parameter SectionにあるWater Heightの値を20にします。

しました。

User Parameterがどこにあるのか分からなくて探すのが大変でした。

System StackのUser Parameter Sectionを選択して

Selectionを見ても何も表示されません。

Default画面で左下に表示されているParametersのTabの隣にUser Parametersがあります。

ここにありました。

Pressure Iterationsの値も変更します。

先週のBlogに

と書かれていました。

一寸調べてみます。

Grid3D_FLIP_FluidControl_Emitterで[USER] Pressure Iterationsが使用されている箇所を調べます。

10か所で使用されているみたいです。

Sim Sectionで使用されていました。

Parameter Writes SectionにもPressure Iterationsがありました。

ただしこっちは[EMITTER][OVERRIDE]です。

Simulation Sectionにもありました。

これを見ると[USER] Pressure Iterationsが使用されているのはSim Sectionだけです。

ここで調査が詰まってしまいました。

以下にEmitter StackのSectionを示しますが、

Simはありません。

SimはEmitter SummaryにあるSectionの一つですが、実際のEmitterにはないSectionでした。

ありました。

Emitter Spawn SectionにあるGrid 3D FLIP FLUID CONTROLS Moduleの

Simにありました。

Grid 3D FLIP FLUID CONTROLS Moduleの実装を見ると以下に示した様に、

[USER] Pressure Iterationsの値を[INPUT] Pressure Iterationsにパスして、更にその値を[EMITTER] [OVERRIDE] Pressure Iterationsにパスしています。

成程ね。

今度は[EMITTER] [OVERRIDE] Pressure Iterationsを追えば良いわけです。

次のModuleであるGrid 3D FLIP SCALABILITY SPAWNでも

Particle Per Cellに[EMITTER][OVERRIDE] Pressure Iterationsが使用されていました。

このModuleの実装も見てみましょう。

ApplyOverrideがTrueだったら[INPUT] Pressure Iterationsを使用してFalaseだったら[EMITTER][OVERRIDE] Pressure Iterationsを使用しろと言っていますが、

[INPUT] Pressure IterationsにセットされているParameterは[EMITTER][OVERRIDE] Pressure Iterationsなので結局、[EMITTER][OVERRIDE] Pressure Iterationsの値になります。

Particles Per Cellの方も全く同じ実装でした。

こっちはApplyOverrideがTrueの時は[EMITTER][OVERRIDE] Pressure Iterationsの値が[EMITTER][OVERRIDE]Particle Per Cellにセットされます。

Falseの時は、元々[EMITTER][OVERRIDE]Particle Per Cellにあった値が[EMITTER][OVERRIDE]Particles Per Cellにセットされます。

これは[USER] Pressure Iterationsの値が[EMITTER][OVERRIDE]Particle Per Cellに使用されたと仮定しても問題ないでしょう。

Particle Per CellがEmitterのどこにセットされているのか確認します。

Particle Spawn Sectionにありました。

Parameter Write Sectionにもありました。

Simulationにあるやつは前から見ていたやつでした。

Parameter Read and Writeにあって

Grid 3D FLIP Tank Spawn SectionのParticle Per Cell

にもありました。

これまで追っていったら終わらなくなってしまうので止めますが、[USER] Pressure Iterationsの値が[EMITTER][OVERRIDE]Particle Per Cellになるという事は、[USER] Pressure Iterationsの値で一個のCell内のParticleの数を指定しているという事になります。

[USER] Pressure Iterationsの機能の一つが分かりました。

この後、Module内に[EMITTER] [OVERRIDE] Pressure Iterationsが出て来る事はありませんでした。

以下のSolve Pressure SectionにあるGeneric Simulation Stage Settingsには

Num IterationsというParameterがありますが、

その値は50で[EMITTER] [OVERRIDE] Pressure Iterationsの値とは違います。

あれ?

その下にあるNum Iteration Bindingに[EMITTER] [OVERRIDE] Pressure Iterationsがセットされています。

Pressure Iterationsで検索していますが、0件と表示されています。

うーん。

検索に表示されない箇所もあるのね。

Num Iteration Bindingを追ってみます。

Solve Pressure SectionにあるModuleを開いて実装を見たら、UE5Editorが固まって動かなくなりました。

何回やってもダメでした。

これを追うのは諦めます。

まあ、ここまでの調査でも[USER] Pressure Iterationsが単純にPressureのIterationの回数を指定しているのではない事は分かりました。

以下に分かった事をまとめておきます。

  • Cell内のParticleの数を決定する
  • PressureのIterationの回数を決定するのではなくPressureのIterationのBindingの回数を決定している

これだけ調べていてもしょうがないので次に行きます。

水の出て来る口の大きさを変更します。

Particle Spawn SectionのSphere Location Moduleの

Sphere Radiusの値を25にしました。

更にOffsetのXの値を-125にしました。

結果です。

水の出る位置が後ろにさがりました。

蛇口の口径も小さくなっているはずですが、これは見ただけでは分からないです。

次はShadingの調整です。

Render SectionにあるMesh Renderer Moduleを選択します。

あれ、TutorialのMeshと違います。

と思ったらこっちでした。

うーん。

これはEngine内のContentsなのでDuplicateしてそれを加工します。

しました。

名前はM_WaterSDF_Inst_meとしました。

更にその親MaterialであるM_WaterSDFもDuplicateしました。

名前はM_WaterSDF_meとしました。

M_WaterSDF_Inst_meのParentにM_WaterSDF_meを指定しました。

NSであるNS_Honeyに戻ります。

Emitter StackのRender SectionにあるMesh Renderer Moduleの以下の箇所に

先程作成したMaterial Instanceをセットします。

これでMaterial Instanceとその親Materialを自由に加工出来るようになりました。

先週は以下の様に書いていましたが、

私が今までやっていたやり方は

  1. MaterialをDuplicate
  2. そのDuplicateしたMaterialからInstanceを作成。
  3. そのInstanceのParameterを一個ずつ、元のMaterialのInstanceからCopy。

とやっていました。

このやり方だと3をやるのにとんでもない時間がかかります。

RenderBucket氏のやり方だとほぼ一瞬で終わります。

いや勉強になりました。

ではM_WaterSDF_Inst_meのParameterを弄っていきます。

まずBase Colorをdisableにします。

Base Colorは間違えて黒にしてしまいました。

まあ大丈夫でしょう。

ScatteringもDisableにします。

そしてAbsorptionの値を0にします。

水が透明になりました。

ここまではTutorialと同じです。

Absorptionに以下の値を代入しました。

以下の様になりました。

私のは完全な緑というより青緑です。

この色を赤くするためにAbsorptionに水色を指定します。

結果です。

あれ、真っ黒になってしまいました。

Tutorialの値と比較したらTutorialではRの値が0になっていました。

Rの値を0にします。

結果です。

赤くなりました。

次はOpacityの値を1にします。

黒くなりました。

Base ColorにCheckを入れました。

Base Colorが黒だと変化が分からないので水色に戻しました。

Base Colorを白くし、Opacityを0.5に下げます。

半透明になり少しだけ赤味がついています。

太陽に向かってこのEffectを見た場合です。

ほとんど半透明です。

太陽や後ろにあるActorが透けて見えます。

今度は太陽を背に向けてこのEffectを見ています。

僅かに透けて見える部分もありますが、ほとんど不透明です。

今度はScatteringを追加します。

太陽を背にした場合です。

全く変化が見られません。

今度は太陽に向かってNSを見ています。

これも全く変化が見られないです。

色が赤いからかと思い青などでも試しましたが全く変化しません。

ScatteringのAlphaの値を1.0に変更すると

太陽に向かっていても不透明で黄色になりました。

太陽を背にした場合は以下の様になりました。

完全に不透明ですが、黄色味があります。

Tutorialの値を見直したらAlphaには1が入っていました。

Tutorialの説明を聞いたら理解しました。

Scatteringがない状態です。

半透明になっています。

以下の条件でScatteringをEnableします。

以下の様になりました。

これはScatterされた光が放出されたからです。

太陽を背にした場合です。

こっちは僅かに黄色ですが、先程ほどではないです。

これはScatterされた光の大部分が前方に進んでいるためです。

色々試したんですがイマイチ理解出来ません。

Phaseも-1と1を変えてみましたが光源の向きによって大きな変化が見られる事は無かったです。

Toleranceです。

これは分かりました。

値を大きくするほど粒の大きさが大きくなります。

Toleranceが1の時です。

Toleranceが0.001の時です。

Scatteringの見方が分かりました。

太陽に向かった場合です。

黄色いです。

今度は太陽を背にします。

青いです。

これはScatteringする光が前方に放出されるからです。

Phaseを-1にしました。

今度は逆になります。

太陽を背にしている今は黄色になりました。

太陽に向かっている時が青くなります。

今度はHoneyを作成します。

Tutorial通りの値を代入しました。

太陽を背にした場合、以下の様になります。

こっち側から見るとクレヨンみたいな色しています。

Specularを追加します。

値は0.5にしました。

こんな感じです。

今度はRefractionを追加します。

M_WaterSDF_meに以下の実装を追加しました。

結果です。

Refractionしているみたいです。

最後にRoughnessの値も追加しました。

これで完成したと思ったら疑似的にViscosityを追加するのを忘れていました。

Particle Update SectionにCollision Moduleを追加しました。

Collision ModuleをGrid 3D FLIP Integrate Particle Velocity Moduleより上に移動します。

Errorは直さずにDismiss Issueを押します。

こんな結果になっています。

Collision ModuleのKill Occluded ParticlesのCheckを外しました。

結果です。

ドロドロです。

Restitutionの値を0にしました。

結果です。

凄いドロドロになりました。

Emitter Summary SectionにあるSDF Particle Size Multの値を1.5にしました。

結果です。

粒が大きくなっているのは分かります。ハチミツらしいかと言われるとうーん。ってなります。

これで実装は完成しました。

3.2 Unreal Engine 5 Tutorial - Shading Niagara Fluids – Honey [7]を実装した感想

思っていたより分からない事が多かったです。

ただNiagara Fluid Systemを勉強し始めてまだTutorialを4つか5つしかやっていないので、まあこの位理解していたら十分かもしれません。

以下によく分からなかった事について書き残しておきます。

<太陽の向きに対してOpacityが変わるのはどのParameterなのか?>

最初はScatteringが太陽の向きに対してのOpacityを決定していると思っていたんですが、ScatteringのOpacityを0にしても太陽光を背にするとNSは不透明になります。

これParameterを一個ずつ外して確認したらどのParameterが犯人か分かるんですが、そうするとせっかく完成したHoneyの設定を壊さなければならなくなります。

なので今はやりません。

後でやります。

<Tolerance とSDF Particle Size Multの関係>

両方とも「Particleのサイズを変更する。」と紹介されていますが、それぞれの機能はどう違うんでしょうか?

<疑似的に粘性を出す方法について>

これCGHOW氏もやっていました。

2つのやり方を比較してどう違うのか検証したいです。

ここでは、

  • Collision Moduleを追加し
  • Collision ModuleのKill Occluded ParticlesのCheckを外し
  • Restitutionの値を0にし
  • 最後にEmitter Summary SectionにあるSDF Particle Size Multの値を5にしました。

これらのそれぞれの機能については先週のBlogで簡単にまとめてありますが、実際に確認した訳ではないです。

4.Materialの勉強

今週は兎に角、GIMPでRGBA Channelの使用方法を勉強して、使えるようにします。

4.1 GIMPでRGBA Channelの使用方法を勉強する

まずGIMPですが、Installしました。

が全く使い方は知りません。

何個かTutorialをみて分かったことは以下に示したChannelsを選ぶとRGBAのそれぞれのImageが別々に表示される事です。

もう一つ分かったのがColorsのComponentsからDecomposeを選択して

からRGBAを選択して

以下の様にRGBAでLayerを分割します。

T_FreshWindsweptSnow_uhpjdeyn_4K_ORDpを開きました。

以下にT_FreshWindsweptSnow_uhpjdeyn_4K_ORDp をUE5からTexture Editorで開いたImageを示します。

Rです。

RはAmbient Occlusionです。

GIMPのRedのImageです。

どうなんでしょう。

一寸薄い感じがします。

UEから見たGのImageです。

Roughnessを示しているはずです。

しかし何もない感じです。

GIMPの方のGです。

正直差があるのか分からないです。

最後のBです。

UEで見たImageです。

BにはDisplacementが入っています。

GIMPで見たBのImageです。

全く同じかどうかは不明です。

ぱっと見は同じに見えます。

これだけしか知りません。

Googleで検索しても出て来ません。

こうなったらChat GPTでも試してみるか。と思ったんですが、Chat GPT全く弄った事が無いので、さすがに躊躇しました。Chat GPTは一寸遊んだりしてから試す事にします。

Googleでひたすら検索したらStack OverflowのGIMP packing image into alpha (pasting grey scale image into alpha) [8]が見つかりました。

これを試してみます。

まずAmbient OcclusionのGray ImageをNormal MapのBに入れ、RoughnessのGray ImageをNormal MapのAlphaに入れてみます。

色々試したら出来たみたいです。

以下にやり方をまとめます。

まずGIMPを開きます。

GIMPはこんな画面をしています。

当然ですが、Normal MapとORDpのImage をここに開きます。

やり方はFileからOpenで開くFileを選択するだけです。

こんなの当たり前だと思いますが、Openだけでもこんだけあります。

念のために記録しておきます。

ImageがGIMP上で開かれると以下の様にそのImageが表示されます。

まずNormal Mapを選択します。

そしてColorsからComponentsを選択してDecompose…を選択します。

以下のBoxが表示されるのでColor ModeにRGBかRGBAを選択してOKを押します。

すると以下に示した様に新しいImage Fileが作成されます。

そのImage Fileですが、以下に示した様にNormal MapのRed Green Blue AlphaがLayerとして別々に表示されています。

当然、それぞれのLayerはGray Scaleになっています。

同様の事をORDpのImage Fileにも行います。

ORDpのRGBAが別々のLayerになったImage Fileが作成されました。

このRed ChannelにAmbient OcclusionのImage、Green ChannelにRoughnessのImageが入っています。

これをCopyして先程作成したNormal MapのRGBAがバラバラのLayerになったImage Fileに新しいLayerとしてPasteします。(毎回バラバラになったNormal Mapと呼ぶのは大変なのでNormal Map Separatedと呼ぶ事にします。)

まずNormal Map SeparatedにあるBlueとAlphaのlayerは要らないので消します。

やり方は、Layerを右Clickして以下のBoxを表示、

Delete Layerを選択します。

消えました。

今度は別のImageからLayerをCopyして新しいLayerとしてこのImageに追加します。

ORDp SeparatedのRed Layerを選択して

EditからCopyを選択します。

これでこのLayerはCopyされました。

そしてNormal Map Separatedに戻り、Editを選択、Paste AsからNew Layerを選びます。

すると以下に示した様にCopyしたLayerがRed CopyとしてこのImageに追加されました。

ここでこのLayerの名前がRed Copyのままだと後で混乱してしまうので名前の変更をします。

やり方ですが、Layerを右Clickして以下のBoxを示します。

Edit Layer Attributeを選択し、以下のBoxを表示します。

Layer Nameの所に新しい名前を書きます。

Blue ChannelにAmbient Occlusionが入るのでBlueとしました。

同様の方法でRoughnessのImageをAlphaとして追加しました。

今度はこれらのLayerをRGBA Channelに配置して一つのImageにします。

ColorsからComponentsを選択しCompose…を選択します。

すると以下のBoxにRGBAに対応するLayerを聞いてくるBoxが開くのでそれぞれのLayerを指定します。

OKを押すと以下に示した様にこれらのLayerをRGBAにまとめた新しいImageが作成されます。

今度はこのImageをPngでSaveします。

FileからExport asを選択します。

これが結構なひっかけでいくらSave Asを選択してもPngでSaveは出来ないという。初心者泣かせなUIになっています。

以下のようなBoxが表示されます。

どこでPngを選択するのかと言うと、一番下にあるSelect File Type(By Extension)をClickします。

すると以下のImageが表示されるのでPNG Imageを選択します。

Exportを押すと以下のImageが表示されます。

これの条件はよく分かりません。

Exportを押します。

これでPngとしてExportされました。

UE5からこのImageをImportします。

すると以下に示した様に、このImage、Normal MapとしてImportしたけど良いですか?と聞いてきます。

良いわけ無いです。

Revertを選択して元に戻させます。

Text Editorで開きます。

こんなImageでした。

RGBAすべてのChannelにImageが入っています。

BlueのImageです。

AlphaのImageです。

はい、出来ました。

<4kを1kに縮小する>

ImageからScale Imageを選択します。

以下のBoxが表示されるので1kのPixelを指定します。

それだけした。

<4kのImageの内一部を切り取り512 x 512の別のImage Fileとして保存>

よく考えたら全部GIMPでやる必要はなくてMedi Bangで出来る事は今まで通りMedi Bangでやればいいのでこれを調べるのは止めます。

これでBen Cloward先生のAdvanced MaterialのTutorialを勉強するために必要なTextureの作成が出来るはずです。

4.2 Rock Shader - Advanced Materials - Episode 3 [9]Sparkling Snow Shader - Advanced Materials - Episode 2 [10]のTextureを作り直す

これは来週やります。

今週は慣れないGIMPの勉強なんかしたせいで、もう疲れてしまいました。

GIMPは嘘の情報が多いですね。

Layerの名前の変更を調べていたら、最初に出てきたSiteの解答が、GIMPではそれは出来ない。でした。

僅か2分間の更なる調査で、GIMPのLayerの名前の変更方法は分かりました。

UEならこういう間違った情報が書いてあるサイトは、決してお勧めの最初には出て来ません。

こういうのが疲れを増加させるんです。

GIMPにはTextureをSeamlessで作成する方法があるみたいです。

これがどの程度のSeamlessなのか試してみたいです。時間がある時に勉強する事にします。

後、Chat GPTを使用してGIMPの勉強をしてみたいです。今度はそれをやります。

以上です。

4.3 Chat GPTで質問してみました

Chat GPTの使用方法が判明したので、試しにChat GPTで質問してみました。

凄い。

Googleの検索で2時間以上かけて調べた内容が一瞬で出て来ました。

確かに世界中で話題をさらっているだけあります。

これはGoogleの検索に対しての強力な競争相手になりそうです。

ただ個人の感想ですが、YouTubeのTutorialを駆逐出来るとは思いません。

例えば以下の解答ですが、

質問者がこの解答を正しく実行するためにはImageとDecomposeがTool BarやMenu Barのどこにあるのかを知っている必要があります。

これって結構初心者にはLevelの高い要求です。

ところが、YouTubeの動画ならそう言う名称を全く知らなくても映像を追う事で理解出来ます。

のでYouTubeの映像で理解出来るTutorialが完全に無くなる自体にはならないと思います。

5.戦闘システムの続きを作成する

今週から召喚したMonsterにAnimationを追加する作業を開始します。

5.1 SkeletonCrew(ゾンビタイプ)のMonsterのAnimationを追加する

これが一番簡単そうなのでこれからやります。

後、先週、Levelと雲を改良したProjectではなく、元からAnimationのPackが追加されているProjectであるCombat Prototypeでテストします。

今、Animationが追加されている以下のMageがどうやってAnimationが発動されているかを調べます。

なんとこれだけでした。

という事はMonsterを召喚する時に、それぞれのMonsterに合ったAnimをAnim to Playにセットすれば良いだけみたいです。

Monsterの召喚方法を確認します。

Level BPに以下の関数がありました。

中身を調べます。

以下のNodeでMonster BPを生成しています。

Monster BPを調べます。

Monster BPにはMeshがComponentとして追加されていますが、

どのMeshを追加するかを決定するための実装とかは無かったです。

もう一回、Level BPを見ます。

ありました。ここで配置するMonsterのMeshを指定しています。

つまりこの後で、MonsterのMeshに合ったAnimをAnim to Playに指定すれば良いわけです。

取りあえず以下のAnimationに変更出来るのか試してみます。

一番、最初に出て来る妖精タイプのMonsterのAnimationを追加します。

と思ったら妖精タイプのMonsterにArcherなんていなかったです。

以下のMonsterはHalberdierと書かれていました。

Halberdierって何?

と調べたら

Halberdと言う武器を持っている人と言う意味でした。

Halberdってどんな武器と調べたら以下に示したような槍に斧が合体したような武器でした。

ふーん。です。

でこいつのAnimationがありません。

装備が似ている以下のAnimationを使用する事にしました。

出来ました。

これでTestします。

MonsterのPoseが変わっています。

出来ています。

うーん。

こんなに簡単だったの。

もっと早くやっておけばよかった。

以下のような関数を作成してそれぞれのMonsterに合ったAnimationを追加します。

実装部です。

何と以下のMonsterには付属のAnimationがない事が分かりました。

これは後で変更します。

付属のAnimationがあるMonsterには全部Idleを使用しました。

テストして確認します。

亡霊族のMonsterにはAnimationが追加されていないので表示されていません。

ここで問題発覚です。

MonsterはPoseは変更されていますが、Animationは追加されていません。静止しています。

Monster BPの設定を以下の様に変えてみました。

すると以下に示した様にAnimationが発動しました。

このScreenshotではよく分かりませんが、Animationが発動しています。

Monster BPを作成する時にAnimationを指定する必要があるという事みたいです。

はい。

ではMonster BPの実装を変更します。

Monster BPにSkeletal MeshをPass出来るようにして

そのMeshをMonster BP内でセットしました。

まずはこれでMonster BPを呼び出した時にそれぞれのMonsterのSkeletal Meshで召喚されるのかを確認します。

当然、Level BPにあるMonster BPのSkeletal Meshを変更していた実装は外します。

テストします。

普通にそれぞれのMonsterが召喚されました。

ここで詰まりました。

ConstructorからAnim to Playの設定を変える方法がありません。

Event GraphからAnim to Playの設定をSet Animationノードを使用して変えると

Monsterは止まって動かなくなります。

Set AnimationじゃなくてPlay Animationにしたら直りました。

普通に動いていました。

うーん。

という事は別にMonster BPじゃなくても良かった?

全部Codeを元に戻しました。

そしてSet Anim For Monster関数の実装を

Set AnimationからPlay Animationに変更しました。

テストします。

普通に動いています。

ぬぐ。

Play AnimationノードとSet Animationノードを間違えただけでこんなに時間を浪費してしまいました。

ぬぐ。

一応、他のMonsterのAnimationも確認します。

ゾンビタイプのMonsterのAnimationも普通に動いていました。

ドラゴンも普通に動いていました。

うーん。

一応これでAnimationの追加は完成です。

5.2 亡霊族のMonsterの代わりを探す

亡霊族のMonsterに使用していたCityofBrass_EnemiesのSkeletal MeshにAnimationがない事が判明しました。

AnimationがないMeshはGameには使用出来ないのでAssetから別のMonsterを探します。

こんなのがありました。

Downloadして中身を見ました。

以下の3つは使えそうです。

この3つを代わりのMonsterにする事にします。

これ以上2つのProjectで別々な作業をしているとMergeする時に面倒になります。

新しいProjectにAssetを足して、新しいProjectで作成する事にします。

うーん。新しいProjectのAssetを足す事が出来ません。

となると先週作成したLevelと雲を古いProjectで作成し直す必要があります。

うーん。

作り直しますか。

5.3 先週やったLevelの改良をCombat Proto Typeで作成する

もう一回Levelの改造を行います。

Multi-Story Dungeonを追加します。

こんな感じにしました。

空も作り直します。

今ある空関連のActorは全部消します。

新しく以下のActorを追加しました。

こんな感じです。

取りあえずはこれでOKにします。

5.4 AnimationのないMonsterを交換する

はい。

これは

以下に示したSK_Lichと交換します。

亡霊剣士の代わりは

以下に示したSK_Skeletonにします。

最後の亡霊魔人の代わりは

SK_Ghoulにします。

なのでMonster Data Tableを書き換えます。

以下の様にMeshだけ取りあえず変更しました。

これらのMeshのAminationを追加します。

亡霊族のAnimationをLevel BPのPlay Animation Nodeにセットしました。

テストします。

向きがオカシイですし、Sizeも小さいです。

直します。

Combat Level BPのSpawn Monster()関数の以下に示した部分の値を変更しました。

結果です。

今度は前は向くようになりましたが、Sizeは小さいです。

以下の様に変更してSizeを1.5倍にしました。

結果です。

Size的にも丁度いいです。

5.5 攻撃時のAnimationを追加する

Level BPにあるMonster Attack()関数の

実装に新たに作成したAttack Animation()関数を追加しました。

Attack Animation()関数では妖精族の攻撃Animationだけ実装してTestします。

結果です。

普通に攻撃はしました。

しましたがその後のIdlingのAnimationは止まってしまいました。

直します。

以下の実装をLevel BP上に追加しました。

攻撃のAnimationの長さが2秒間位と仮定して2秒経ったらIdlingのAnimationを開始します。

結果です。

攻撃が終わった後もIdlingしています。

うーん。

出来ています。

しかし攻撃の時間を2秒間と指定してしまったのでこれが不安要素ではあります。

PCによってFrame Per Secondがどう変わるのかが不明だからです。もし設定で初めからFrame Rateを固定出来てしまえば、このやり方でも問題は無くなります。

これは後で考えます。

今週はAnimationを追加する所までやります。

Attack Animation()関数のすべてのMonsterの攻撃Animationをセットしました。

今度はLevel BPにあるすべてのMonster Attack()関数の後にDelayノードとSet Anim for Moster()関数を追加します。

出来ました。

テストします。

ドラゴン族の攻撃です。

なんか可愛い攻撃です。

Idleが効いていないMonsterがありました。

直します。

直りました。

ゾンビタイプの攻撃もきちんと動いていました。

ゾンビタイプの弓士は弓を持っていません。後で弓を追加するかMonsterを交換する必要があります。

5.6 攻撃を受けた時Animationを追加する

今度はMonsterが攻撃を受けた時のAnimationを追加します。

まずDamage Animation()関数を作成します。

全てのMonsterのDamageを受けた時のAnimationが設定されています。

攻撃のAnimationの実装と全く同じやり方で以下の様にしました。

出来ました。

テストします。

全部綺麗に動きました。

攻撃と攻撃を受けるAnimationのおかげでどのMonsterがどのMonsterと戦っているのか一目瞭然になりました。

亡霊族との対戦です。

亡霊族の攻撃を受けた時のAnimationは小さくてあんまり攻撃が効いてないように見えます。

Animationを変えるか、別なAssetを使用するか後で検討する事にします。

ゾンビ族との対戦です。

左端のゾンビの攻撃が凄すぎます。これだけ3倍位のDamageを与えても良い感じです。

ゾンビ族の攻撃を受けた時のAnimationははっきりしていて見ていて楽しいです。

ドラゴン族との対戦です。

ドラゴンはもっと大きくても良いかもしれません。

特にBugもなく全部綺麗に動きました。

5.7 魔術師のAnimationを追加する

今度は魔術師のAnimationを追加します。

出来ました。

以下の実装を追加しました。

魔術師がMonsterを召喚する時に魔法を使用する動きをします。

更に、Playerが操作する魔術師は、戦闘前に魔法を使用するたびにこの動作を行います。

Testします。

Playerが操作する魔術師がMonsterを召喚した時です。

Screenshotを取ったのが動作が終わった瞬間でした。

正常に動いているのは確認出来ました。

今度は対戦相手の魔術師がMonsterを召喚する時です。

指定した動作を行っていました。

さらに動作を終えた後はIdlingのAnimationに戻りました。

正常に作動しています。

Playerが操作する魔術師が戦闘前に魔法を使用した時です。

これもScreenshotは取れませんでしたが、正常に動いていました。

勿論、動作を終了した後なIdlingのAnimationが発動しました。

全部正常に動いています。

今週はここまでにします。

5.8 Animationを追加した感想など

久しぶりにUEのAnimationについて触ったのと、単なるMonsterのAnimationの作成なのでかなり行き当たりばったりで作成してしまいました。

せめてAnimation BPぐらいは使用すべきでした。

今年の目標は兎に角Gameを完成させる事なので、どうやってCodeを書くのかはあまり気にしない事にします。

これでもMonsterが動きます。

それが一番大切です。

5.9 これから直す事

最後にこのGameを自分でPlayしていて直すべき3つの点に気が付きました。

それをここに記録しておきます。

<順番がオカシイ>

まず

が表示され、

魔術師のAnimationが発動し、

最後に

UIが変化すべきです。

今の順番は、

  1. UIの値が変化
  2. Dialogueのセリフが表示
  3. Animationが発動

になっています。

<セリフが足りない>

以下のDialogueが表示された後、

「右翼のMonsterのHPが回復した。」

というDialogueがあるべきです。

<Monsterが死んだときのAnimationがない>

HPが0になったMonsterも普通に立っています。

死んだAnimationを追加して倒されたことが分かるようにすべきです。

これらは来週以降直す事にします。

6.Gaeaの勉強

先週の続きからやっていきます。

6.1 Gaea Tutorial for Beginners #1 | Intro to the series & Analyzing the Interface [2]と先週、自分でまとめたUIの使用方法を比較するの続きをやる

先週のBlogのGaeaの勉強の最後に以下の部分は来週勉強するとありました。

Import GraphはExportしたGraphをImportするだけのはずです。

Import SeedはImport する前にExportする必要がありその方法が分かりません。

Show Graph Toolbarは以下にしめしたIcon群の事です。

次のShow Nodes in Context MenuにCheckを入れると、Node Graph上で右Clickした時に表示されるBoxが

から

になります。

全てのNodeがここからも選べるようになるだけです。

Show Grideは以下に示した様にNode Graph内にGridを表示します。

残りのGridとItemはどんな機能なのか不明です。

今度はTutorialの説明を確認します。

これ見ると今のVersionと全く違いますね。

まず、最初のShow 2D Viewですが、これは今のVersionのこれですね。

次のShow/Hide Girdは先程見たShow Gridです。

Snap to GridとSnap to Itemは今のVersionのGridとItemと同じでしょう。

ただこれらの機能がよく分からないです。

Take Screenshot of the Viewportですが、今のVersionでは右下にあるIcon群のScreenshotを右Clickすると

以下のBoxが表示されます。

ここでSave to Screenshotsを選択するとViewportのScreenshotが取れます。

Open Screenshots Folderを開くと撮影したViewportのScreenshotが保存されているFolderが開きます。

別なFolderに保存したい場合は、Browse for Filename...を選択します。

好きなFolderに保存できます。

Node GraphのScreenshotが取りたい場合は、Graph Screenshotを選択します。

これらの機能はScreenshotを取る事に関しては、Snipping Toolの劣化互換でScreenshotを取るならSnipp Toolを使用すべきです。

以上です。

<Settings>

それではTutorialのSettingsを見ていきます。

PropertiesとBuildの説明をするのかと思ったら、何故かViewportの右上のIconの説明をしています。

左端のIconをClickすると以下のBoxが表示されます。

これは今のVersionにおけるこれです。

なんとこの太陽みたいな絵のIcon、Viewport Settingsと言うそうです。

だからこの章の名前がSettingsだったのか。

謎が解けました。

TutorialではAdvanceの機能についても紹介しています。

今のVersionにあるAdvanceの機能です。

Sun IntensityとAmbient Intensityは同じですね。

Exposureが無くなった代わりに、色々新たなParameterがありますね。

TutorialにはWater と言う項目があってWater Levelを自由に指定できます。

こんな感じです。

これは便利な機能ですね。

今のVersionにはこの機能はないですね。

次はBuild buttonについて紹介しています。

ただし、機能については後で解説すると言って終わりでした。

その次のX Buttonです。

これはGaeaが何かの計算を開始してずっとそれをやっている時にCancelするためのものだそうです。

Tutorialでは新しいNodeを繋げた場合を例にして解説していました。

新しいNodeを繋げたらGaeaがずっと計算していて結果が表示されない。もうこのNodeを使用するのは止めたい。となった時にこのButtonを押すそうです。

今のVersionでは以下に示した右下にあるIcon群の内、赤丸で囲ったやつがこれと同じ機能だったはずです。

ただし多分そうだという位です。

この機能を必要とするほどGaeaが長く計算している事態に、まだ遭遇した事がないので、試した事がないです。

Tutorialで使用しているGaeaのViewportの右上のあるIconの一番右端にあるIconです。

これはEngineの機能をSuspendするそうで、これを押すと、ViewportのImageはこの後に追加したNodeに影響されません。

このIconは今のVersionにはありません。

以下に示したPinをNodeに追加すれば同様の事が再現出来るはずです。

Tutorialでは今度は左下にあるIconについて解説しています。

このGraphを右Clickすると

GaeaをGraphで使用するのかLayerで使用するのか選択できます。

今のVersionのGaeaにはそもそもLayerによる操作が出来ないのでこの機能はありません。

これで終わりでした。

うーん。想像していた内容とは全然違った。

6.2 Gaea Tutorial for Beginners #1 | Intro to the series & Analyzing the Interface [2]のUIの説明と今のUIの自分の解説を比較した感想

自分の知らない機能の紹介がかなりありました。

その半分は今のVersionにはない機能でしたが、残り半分は今のVersionにもあるが、どういう機能だったのか知らなかったものです。

まあ、でも今のVersionのGaeaの機能については大体は説明出来るようになりました。

後はそれぞれのNodeの機能についてと、そのNodeの組み合わせの方法、そして以下に示したNodeを選択すると必ず表示される以下のButton群の使用方法について詳しくなるだけです。

6.3 Gaea Tutorial for Beginners #2 | Node Graph Workflow [11]を勉強する

それでは次のTutorialを勉強する事にします。

このTutorialは前に一回勉強しているのでそれの確認からします。

2022-11-14のBlog

以下の様に書かれていました。

マジか!

じゃあ、今の私のやりたい事にピッタリじゃないですか。

以下の様に勉強する事にしました。

  1. このBlogを読んで前回の勉強内容を把握する。
  2. Tutorialを勉強してまとめる
  3. 実装を自分でする
  4. 今のVersionにあわせたTutorialを自分で作成する

2022-11-14のBlogではGaea Tutorial for Beginners #2 | Node Graph Workflow [11]の内容を簡単にまとめてあります。

以下に、その内容を更に簡単にまとめます。

<<INTRO>>

GaeaではNodeをつないでTerrainを作成する事を説明しています。

<<Toolbox>>

以下の内容が書かれていました。

  • Node GraphでTerrainを作成するための使用出来るすべてのNodeが、ここに載っている事、
  • Nodeは種類があってその種類毎にまとめられている事、
  • Node Graph内で右Clickする事でもこれらのNodeにAccess出来る事

<<Primitive>>

Nodeの種類の内の一つです。

最初のNodeは必ずPrimitiveから選ぶ事。TutorialのVersionのGaeaにはGeo Primitiveという種類がない事、MountainノードがGeo Primitiveに配置されている事などが述べられていました。

更に、Node Graph内の操作について以下の事がまとめられていました。

<<Parameters>>

NodeのParameterの解説をしています。

以下のIconの使用方法について解説しています。

次にNodeのInputとOutputについて解説しているみたいなんですが、なんか要領を得ません。

この部分は今回、Tutorialを見直す事で勉強し直します。

NodeのResetについて解説しています。

Presetとは以下に示した様に、Propertiesの脇にある三本線をClickした時に表示されるBoxにある

これの事です。

適切なParameterの値をセットしてくれます。

Presetなんてあるのすっかり忘れていました。

というか全く知らなかったです。

昔のBlogに、自分でも知らない事が書いてあるなんてどういう事何でしょう。

<<Connecting Nodes>>

NodeをGraph上に生成する方法について解説しているそうです。

ここで説明されている内容で、特に知らない事は無いです。

<<Randomizing Nodes>>

以下に示した様に、PrimitiveのNodeは2つ以上使用する事も可能だと説明されていました。

以上でした。

更にその後、このTutorialを勉強した感想がまとめられていました。

兎に角、勉強していてつまらなかったと書いています。

今、見直すとそんなにつまらなそうなTutorialには見えませんが、この時はそうだったみたいですね。

これだけ見ると今のVersionでもそんなに差がない機能ばかり勉強したみたいに見えます。

動画を見て確認しましょう。

Gaea Tutorial for Beginners #2 | Node Graph Workflow [11]をもう一回見る>

<<Intro>>

以下のNodeを例にしてNodeによるTerrainの作成がどのように行われているのかについて説明しています。

一つ一つのNodeがFunctionであると言っていますね。

NodeによるProgrammingをまったく行った事がない人にこの仕組みを説明するのはかなり難しいです。

私も考えてみました。

私なら以下の様に説明します。

GaeaのNodeによるTerrainの作成は以下の工程で行われます。

生成して改造する。

まず、Nodeには2種類あります。生成型と改造型です。

生成型は、何も無い空間に何かを作成します。

改造型はその生成された物を改造する事をします。自分で生成する事は出来ません。

この2つのタイプのNodeを組み合わせてTerrainを作成します。

まず生成型のNodeは以下の2つです。

改造するためには元の何かが必要ですので、最初のNodeは必ず生成型であるPrimitivesかGeo Primitivesから選ぶ必要があります。

Geo PrimitivesにあるMountainをNode Graphに配置してみました。

Viewportを見ると山のTerrainが生成されました。

他の生成型のNodeも試してみます。

Mountainノードを消してHillノードを配置してみました。

Terrainが以下の様に形成されました。

これらのNodeに今度は改造型のNodeを追加する事で、このTerrainの形状を改造します。

先程のMountainノードに改造型のノードであるSwirlを追加してみます。

結果です。

何と山がねじれてしまいました。

Swirlの意味は「ねじる。」ですので、山を文字通りねじった訳です。

どうでしょうか?

この説明分かりやすいと思います。

<<Toolbox>>

Toolboxの説明です。

ToolboxにあるNodeの種類について簡単に説明しています。

これらの種類の細かい説明は私も分かりません。

公式のSiteを見てみます。

Toolboxの使用方法やCustomize化についてしか説明が無かったです。

<<Primitives>>

MountainノードのParameterについても解説していますね。

後は、今までまとめた内容以上の事は言ってないです。

<<Parameters>>

この章はParametersとしてまとまっていますが、あんまりParameterについては語って無いです。

NodeのInputとOutputの数とか、Presetについての説明が主でした。

NodeのInputとOutputの数がここで解説される必要があるのかは不明です。

Presetは今のVersionでも同じ場所にありました。

<<Connecting Nodes>>

Tutorialを見直したら、それなりに大切な事を語っています。

前回のまとめはこの章の大切なPointを見逃しています。

この章はどうやって次のNodeを繋げるのか?と言う基礎的な内容について説明しています。

PrimitivesからNodeを一つ選んでNode Graphに配置した

次はどうしたら良いのか?

に対しての解答なんです。

以下に3つのNodeの繋げ方についてまとめます。

  • Tool Barから調達する。
  • Graph内で右Click
  • NodeのOutputを引っ張って離す。

後、以下のIconの機能について解説していました。

<<Randomizing Noise>>

全部見ましたが特に大切な事は教えてなかったです。

後、次のTutorialはLayerを使用したTerrainの作成だそうなので勉強する必要ないです。

6.4 Gaea Tutorial for Beginners #2 | Node Graph Workflow [11]を勉強した感想

Node Graphの使用方法やNodeのつなぎ方、Nodeを使ったTerrainの作成方法、Node Graph関連のIconの機能の説明はかなり勉強になりました。

後、Versionの違いによる機能の違いはほとんど無かったです。

Parameterの説明はほとんど無かったです。

Parameterの説明はほしいですね。

Parameterの理解を最もしやすいのはCombineノードだと思います。

私ならCombineノードを使用してParameterを理解します。

以下のようなNodeを組みます。

MountainノードだけならTerrainは以下の様になります。

Sandノードだけだと以下の様になります。

これをCombineノードで混合すると

となります。

でもこれ混合の方法によってはこうならない可能性もありますよね。

そうお絵かきソフトでBlendするとき、どんなBlendするかで絵の見た目が変わってくるじゃないですか。それと一緒です。

ではどうやってそのBlendする方法を変更するのでしょうか?

それを決定しているのが以下に示したCombine Propertiesです。

Methodを開くと

Blend以外にもいろいろな方法でCombineしてくれます。

試しにMaxを選択すると

値が高い方が選択されます。

こういう細かい条件を決定するのがParameterの役割になります。

こんな感じの説明でどうでしょうか?

7.Houdiniの勉強

Houdiniの勉強の続きをやっていきます。

今週もFOUNDATIONS | OVERVIEW [12]の続きを勉強していきます。

先週は3のView Toolsの途中まで勉強しました。その続きから勉強します。

7.1 View Toolsの続きから勉強する

<Space Bar + H>

以下に示したButtonを押して

Construction Gridを表示します。

この状態でSpace Bar + Hを押すとConstruction GridにFocusします。

うーん。以下の状態で試してみます。

先週やったように、以下に示した3つのObjectを配置します。

こんな感じです。

ここでSpace Bar + Gを使用してTommyにCameraをFocusします。

この状態でSpace Bar + Hを押します。

お、確かにCameraがConstruction GridにFocusしました。

今度はConstruction Gridを消します。

この状態で今度はSquabにFocusします。

Squabを選択してSpace Bar + Gを押します。

この状態でSpace Bar + Hを押します。

以下の様になりました。

Space Bar+ HはConstruction Gridが表示されていない状態だと、Space Bar + Aと同じ結果になるみたいです。

Construction Gridを表示しました。

この状態でもう一回、Space Bar + Hを押してみます。

今度はConstruction GridにFocusしました。

確認のためにもう一回同じことをしましたが、同じ結果になりました。

<その他のHot Key>

Viewport内で右Clickすると以下のBoxが表示されます。

ここでその他のHot Keyを知る事が出来るそうです。

TutorialではCamera ViewではこのBoxが表示される敢えてCamera Viewが選択されている事を強調されていますが、別のViewを選択した場合は違うBoxが表示されるんでしょうか?

試してみます。

Camera Viewを外して、その下のRendering Regionを選択して右Clickしました。

確かにBox内の表示が変わりました。

2を押すと

Top Viewになります。

3,4もそれぞれ違うViewを示します。1を押すと元に戻りました。

更に5を押すと、以下に示した様に

UVを示しました。

あ、0を試すのを忘れていました。

Load Previous Viewと表示され前のViewに戻りました。

6~9はLoad Quick Viewと表示されますが何を指しているのか不明です。

<Link Ortho View>

次にVを押して以下のUIを表示させ

Viewport Layoutを選択し、

以下のUIを表示させ、ここから望みのViewportを選択する方法も紹介されていました。

こういうやつです。

これは前に勉強しました。

2023-01-08のBlogで勉強していました。

というかHoudiniの勉強って始めてまだ3回目だったのか。

何かもう一年くらい勉強した気になっています。

Scene Viewの右上にあるViewportの枠と同じ形をしたIconをClickすると以下のBoxが表示されます。

TutorialではLink Ortho ViewsにCheckを入れてすべてのOrtho ViewのCameraの動きを統一しています。

自分で確認しましたが、確かに以下に示した3つのOrtho Viewの内の一つのCameraを弄ると他の2つも同じように動きます。

Perspective Viewは全く動きませんね。

<Space Bar + B>

以下に示したようにLayoutが複数に分かれているViewを

元のViewに戻します。

今まで以下のUIのSingle Viewを選択して戻していました。

2023-01-08のBlogでそれぞれのBoxの名称を以下の様に学びましたが

Scene Viewに関しては以下に示した様に

このBoxにある一つのTabの名称だけでした。

つまりこのBox全体の名称は無いって事です。

これからは、ここに表示されているすべてのTabを含めたこのBox全体を呼ぶ時はViewportと呼ぶ事にします。

<Tumble Tool>

まず先週の復習ですが、TumbleとはCameraが撮影する対象の周りを上下左右に回転して撮影する機能の事です。

このサイト[12]に分かりやすく解説されています。

この場合大切なのはどの対象物の周りをCameraが回るのかです。

TutorialによるとTumbleをするために左Clickをした瞬間に選択したObjectが対象物になるそうです。

もしObjectのない単なる空間で左ClickしてTumbleを開始した場合は前回、選択したObjectが対象物になるそうです。

うーん。

成程。

テストして確認します。

以下の状態でSquabを左ClickしてTumbleします。

もし選択してあるObjectを中心にTumbleするならTommyを中心にTumbleするはずです。

もし原点を中心にTumbleするならばCragの周りでTumbleするはずです。

そしてもしTutorialの説明通りなら、Squabの周りでTumbleするはずです。

Squabの周りでTumbleしました。

Tutorialの説明通りの結果になりました。

今度は何もない空間で左ClickしてTumbleしてみました。

この場合はその空間の場所を中心としてTumbleするのではなく前にTumbleの対象物として選択したObjectを中心としてTumbleしました。

これもTutorialの説明通りでした。

TutorialではこのTumbleする時の対象物をPivot Pointと呼んでいるので、これからはそう呼ぶようにします。

更に以下に示したIconを選択する事で今、選択されているPivot Pointを固定したままにする事も出来るそうです。

実際に試してみましたが、その通りでした。

ただCameraの位置をTumble以外の方法で動かすと、Keep Pivot on Tumble/Rotateにセットしておいても、よく分からない動きをする時もあります。

あんまり追及するとまた3D酔いするかもしれないので、この辺で止めておきますが。

<3D Camera>

今度は3D Cameraについてです。

以下のIconをClickしてCameraを追加します。

以下に示した様にCameraの配置された場所に青い円と赤い矢印が表示されます。

更にNetwork Pane内でもCameraのNodeが表示されます。

このCameraはObjectなのでこのCameraをPivot PointとしてTumbleする事も可能だそうです。

試してみます。

うーん。出来ない。

もう一回Tutorialを見直します。

分かりました。

Space Barを押して左ClickしてTumbleしています。

後、これCameraをPivot Pointにしているのかは不明です。

まず3D Cameraを配置したら、Scene ViewのViewの設定が以下に示したCameraのIconから

以下のIconに変わります。

このIconが選ばれている限り、Objectを掴んでTumbleする事は出来ません。

所がSpace Barを押すと、押している間だけ先程のCameraのIconが選択されます。

そしてその間はTumbleする事が可能になります。

ここのTutorialの説明はよく分からないです。

CameraがCameraにCameraしてみたいな説明でどのCameraがどのCameraを指しているのか全く分かりません。

しかしTutorialがやっているようにCameraを撮影するCameraをScene Viewに表示する事は出来ました。

いや、まだよく分かってないので断言は出来ません。

この今表示されているCameraは、先程追加したCameraを写している別のCameraだと思っていますが、違うかもしれません。

兎に角、Tutorialの画面と同じ画面になりました。

先程追加したCameraのNodeを選択すると

以下のCameraが選択されます。

となるとこのCameraは先程追加した3D Cameraになるみたいです。

うーん。複雑。

やっとTutorialの言っている意味が分かりました。

この3D Cameraを追加した時、Scene Viewの画像がその3D Cameraから見たViewに変わったんです。

それが、Tumbleをした事で、そのCameraから見たViewから外れてしまったんです。

だから追加した3D Camera自体を見る事が出来るようになったんです。

そしてこの事が理解出来ると、その次にTutorialが説明している事も理解できるようになります。

No Camを選択して以下に示したBoxを表示させ

Cam1を選択すると、Cam1から見たViewに戻るんです。

これがTutorialが説明している事だったんです。

これであっているはずです。

自分で試して確認します。

はい、その通りの結果になりました。

うーん。Houdiniの勉強が難しい理由が分かりました。

これ、一寸でも間違えて理解していたり、いい加減に澄ませていたりすると次で詰みます。

逆に私みたいに、納得できない箇所があるとチクチクと納得いくまで検証するタイプにはドンピシャのSoftかもしれません。

Tutorialでは、このViewの操作方法について解説しています。

以下に示した様に赤い矢印を移動させる事で撮影しているCamera(つまり先程追加した3D Cameraの事)の向きをControlできます。

この場合はCameraの位置は固定されたままです。

以下に示したLockのIconを押す事で

Cameraの見ている位置を固定してそのまわりをCameraが移動する事も出来ます。

試してみます。

うーん。

また出来ない。

いや以下に示した様に出来たんですが、

これCameraの位置関係ないです。

あ、そうでもなかった。

以下に示した様に実際にCameraが移動していました。

分かりました。

以下に示したLockのIconを使用した場合は、

TumbleするとCameraも移動します。

このLockを外した場合は、Cameraはその位置から動かないでViewだけ変化します。

成程ね。

理解しました。

今週のHoudiniの勉強はここまでにしておきます。

もう少し勉強出来る余禄はありますが、まああんまり無理しなくても良いでしょう。

量より質を高める勉強にしたいので余裕があるうちに終了します。

8.Volumetric Cloudの勉強内容をまとめる

今週やる事は2つです。

  • Volumetric Cloud関連で使用したParameterをまとめる
  • m_SimpleVolumetricCloudで使用されている2つのTextureを変更する事で雲の形状を自由に変更する事が出来る事を紹介する

先週やった内容をもう少し詳しく正確にまとめ直します。

8.1 Volumetric Cloud関連で使用したParameterをまとめる

先週、大体はまとめたんですが、戦闘システムとVolumetric Cloudで別々にまとめてしまったのでそれをここに一括してまとめ直します。

<Volumetric Cloud>

まずVolumetric CloudそのもののParameterです。

当たり前ですがこのActorのParameterは全てがVolumetric Cloudに関係しています。

しかし最初から全部を覚えようとすると、一個も覚えられないと言うParadoxに人は陥るので、このParameterの中で最も重要と考えられている以下の4つについてのみ紹介します。

Layerにある以下の2つのParameterについてと

Cloud MaterialにあるMaterial、

そしてCloud TracingにあるUser Per Sample Atmospheric Light Transmittance

です。

<<Layer Bottom Attitude >>

原点からの雲の底の高さを指定します。

原点からの距離を㎞で表しています。つまりDefaultでは原点から5㎞の箇所に雲の底があるという事です。

標準では0~20 kmの間の値を指定出来るようになっています。

0㎞を指定しています。

20kmを指定してみました。

直接、値を打ち込めばNegativeな値や20km以上の高さを入れる事も可能ですが、

-5kmの場合、

30kmの場合、

一般的な雲の位置からは大きく外れる事になります。

以下にTenki.jpの【十種雲形】雲は全部で10種類 見分け方を形や高さから解説!~下層雲編~ [13]で紹介されていた図を示しますが、

実際の雲の位置は地上から2km位で、最も高い位置にある雲でも10kmの位置です。

雲の種類と地面の高さにもよりますが、Layer Bottom Attitudeの値は2,5,そして10位が正しい値と覚えておくと良いです。

また雲の高さは日本だけ世界と違っているという事は無いです。

以下にBritanicaのCloud types [14]に載っていた雲の図を示しますが、

同じ形状の雲は大体同じ高さに位置しています。

<<Layer Height>>

雲の厚さを指定します。

Defaultでは10㎞になっています。

このVolumetric CloudはCumlonimbus、つまり積乱雲を再現しているので、この厚さが指定されています。

試しにこの値を変えてみましょう。

雲の厚さの変化が見やすいようにLayer Bottom Altitudeの値を0にします。

こんな感じです。

Layer Heightの値を1にします。

結果です。

雲がペッちゃんこになりました。

5kmです。

雲の厚みがかなり戻っています。

10kmより雲を厚くした場合、地上から見ても変化がよく分かりません。ので雲を真横から眺めたViewを示します。

Layer Heightが10kmの場合です。

20㎞にしました。

雲の厚みが倍になっているのが確認出来ると思います。

<<Material>>

ここは雲の形状や色などを指定するMaterialを指定しています。

指定されているMaterialを開くと

実際はMaterial Instanceが使用されています。

このMaterial InstanceのParameterを弄る事で、更にVolumetric Cloudに変化をつける事が出来ますが、それについては範囲外になるので今回は述べません。

一個だけ述べると以下の示した親Materialを開くと

以下に示したような実装になっています。

この辺についても今回は範囲外ですので解説はしません。

ただ、

  • Volumetric CloudにはMaterialが使用されている事。
  • それが雲の形状や色などを指定している事

だけ理解出来れば十分です。

<<Use per Sample Atmospheric Light Transmittance>>

これに関しては私もあんまり理解していません。

簡単に私が理解した範囲で説明すると以下の様になります。

Litの計算をする時に、ある値を使用します。通常はその値はすべてのSampleで同じ値を使用します。

ところでSampleによってその値を変更したら、LitがもっとRealになると思いませんか?

それを可能にしたのがこれです。

このParameterをEnableする事で、Litの計算をするのに、Sample毎に違う値を使用します。

Litに影響するParameterなので雲の後ろから光があたる状態で観察すると違いが分かります。

というか普通の状態では差はよく分かりません。

英語圏のTutorialで紹介されているParameterなのでここでも一応紹介しました。

以下に示したような夕焼けのSceneなどではかなりの違いが生じます。

Use per Sample Atmospheric Light Transmittanceを使用しない場合です。

Use per Sample Atmospheric Light Transmittanceを使用した場合です。

Use per Sample Atmospheric Light Transmittanceを使用した場合の方が雲の影が細かくなっており、よりはっきりと雲の形状を認識する事が出来ます。

ただ雲によっては白くなりすぎている気もします。

<Directional Light>

Volumetric Cloudに影響を与えるのは雲そのものだけではありません。その雲を照らすLightの設定もVolumetric Cloudに影響を与えます。

Directional LightではLight ShaftとAtmosphere and Cloudの項にあるParameterがVolumetric Cloudに関係しています。

<<Light Shaft>>

Light ShaftはGod Rayの事です。

God Rayって何?と言う人もいるかもしれないので以下に示します。

こういうやつです。

<<<Light Shaft Occlusion>>>

これはOcclusionを追加するんですが、変化が出る時と出ない時があってそれがどんな条件の時なのかよくわかっていません。

先週試した以下の例では

凄くはっきりと違うが確認出来たんですが、今週のLevelでは、

Light Shaft Occlusionなし

Light Shaft Occlusionあり

全く違いが出ませんでした。

<<<Light Shaft Bloom>>>

God RayにBloom効果を追加します。

これが

こうなりました。

この機能はGod RayにBloomを追加する事だと思うんですが、場所によってはGod Rayそのものも追加します。

これが

こうなります。

この2つのParameterはGod Rayが欲しい時に試しに入れてみる。ぐらいの使用法が良いのかもしれません。

<<Atmosphere and Cloud>>

当然ですが、ここのParameterは全部、雲に関係します。

今回はこの中でCast Cloud Shadowsだけ説明します。

<<<Cast Cloud Shadows>>>

雲の影を投影します。

これが

こうなります。

床に雲の影が投影されるようになったので夕焼けが見えづらくなってしまいました。

雲の影はAtmosphereにも投影されます。

これが

こうなります。

空が青くなっています。

暗くなっているのか明るくなっているのかがよく分からないんですが、兎に角Atmosphereにも雲の影が投影されるようになりました。

以下のParameterを変更する事で、雲が投影する影に更に細かい設定が出来るようになります。

これらのParameterは変化が有ったり無かったりです。

色々弄って確認して下さい。

<Skylight>

Skylightで使用するのはAtmosphere and Cloud にあるCloud Ambient Occlusionだけです。

<<Atmosphere and Cloud>>

<<<Cloud Ambient Occlusion>>>

雲にAmbient Occlusionを追加します。

無い時です。

ある時です。

空全体が微妙に青くなります。

何と言うか、水色だったところが濃い青になるという感じです。

このParameterは夕焼けとかの時は変化が全く分からないです。

無い時です。

ある時です。

全く違いが分かりません。

以上です。

8.2 ここ(8.1)で紹介したParameterを使用してVolumetric Cloudを改良する

以下の状態から8.1で紹介したParameterを使用して雲をもっとRealな感じにします。

がこんなになりました。

うーん。

あんまり変っていませんね。

8.3 m_SimpleVolumetricCloudの改良

先週のTextureはかなり現実離れした形状だったので今週は、実際の雲を真似て作成してみます。

こんな雲を作成してみました。

上から見るとこんな感じです。

斜め横から見た図です。

使用したTextureです。

CouldのXYを指定するためのTextureです。

CloudのZを指定するためのTextureです。

この後、色々試したんですが、適当にやったんでは適切なTextureは作成出来ませんでした。

HoudiniのようにNodeベースでTextureが作成出来るSoftが必要です。

今週はここまでとします。

9.DirectXの勉強

今週もいつも通りに勉強していきます。

9.1 C++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [15]を勉強する

今週はC++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [15]のPrecompiled Headerを勉強します。

まず軽く見て何をしているのかを理解します。

分かりました。

Compileにかかる時間をなるだけ少なくするために、Windows.hなどの絶対にCodeが変更される事のないFileを先にCompileしておきます。

それによってCompileする時間が短くなります。

Visual StudioC++にはそれを行う機能が予め備わっており、その名前がPrecompiled Headerでした。

Precompiled Headerを使用するためには、まずそれを作成する必要があります。

まずそのためのFolderを作成します。

以下に示したSwitch Viewを押して

Folder Viewを選択します。

そして以下に示した様にSource Folderにpch.hを追加します。

C++のCodeを見てるとたまに、pch.hと言う名前のHeaderがありますが、それってこれの事だったんですね。

納得。

更にpch.cppも追加します。

又Switch viewを押してSolution画面に戻ります。

Sourceに新しいFolderを追加してpchと名付けます。

そしてそのFolderに先程作成したpch.hとpch.cppを追加します。

まずpch.cppにpch.hのHeaderを追加します。

そしてpch.hには#Pragma onceを追加します。

この2つのFileをSolutionに追加します。

Projectを右Clickして以下のBoxを開き

Propertiesを開きます。

C/C++のPrecompile Headerを選択します。

設定を以下の様に変更します。

ConfigurationがAll Configurationである事を確認し、Applyを押します。

これで、pch.hにPrecompileしたいFileを書き込む事でそのFileをPrecompileする事が出来るそうです。

Window.hをIncludeしました。

うーん。

成程。

こうやってPrecompileするんですね。

勉強になります。

最後にWinMain.cppを開きWindow.hをIncludeから消して代わりにpch.hを追加します。

更にpch.h fileに置き換えるのはHeader Fileだけじゃなくて以下に示したMacroもです。

WinMain.cppから消して、

以下に示した様にpch.hにPasteします。

以下の示した様にこのような書き方に代えてもErrorは発生しません。

Compileしてテストしています。

最初のCompileは少し時間が掛かりますが、次からは早くCompile出来るようになるそうです。

以上でした。

9.2 C++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [15]のPrecompile Headerを実装する

また一つ賢くなってしまった。

今週はPrecompile Headerについて勉強しました。

早速自分で実装してみます。

Visual StudioからOlympus Engineを開きました。

Switch Viewを押して画面を以下のものに切り替えます。

Folder Viewを選択します。

Source Folderにpch.hとpch.cppを追加します。

しました。

そしたら又Switch Viewを押して以下の画面に切り替えて

今度はOlympusEngine.slnに戻ります。

そしてSource Folderに新しいFolder、pchを追加します。

無、Filterとなっています。

今までずっとFolderと思っていたんですが、Filterだったのかな?

一応Tutorialで確認します。

TutorialでもFilterを選択していました。

Filterを追加しました。名前もpchに変更しました。

このFilterに先程作成したpch.hとpch.cppを追加します。

あれExisting ItemにWinMain.cppが無いです。

Tutorialを見るとこんな感じであります。

む。

何か忘れているのか?

Tutorialを見直します。

特に何もしてなかったです。

あ、分かりました。

Existing Itemで開かれたFolderが去年のOlympusEngine.slnのFolderでした。これをCopyして今年のFolderに移動させたんですが、VSの設定がそのままだったからなのか去年のOlympusEngine.slnのFolderを開いていました。

今のOlympusEngine.slnのFolderにAccessしたら以下に示した様にpch.hとpch.cppがありました。

追加出来ました。

pch.cppにpch.hのHeaderを追加します。

そしてpch.hには#Pragma onceを追加します。

これらのpch fileをSolutionに追加します。

SolutionのPropertiesを開いたら

全然違うBoxが出て来ました。

ProjectのPropertyでした。

以下の様に設定を変更します。

Pch.hにWindow.hをIncludeしました。

Window.hじゃなくてwindows.hでした。

今度はWinMain.cppを開きWindow.hをIncludeから消して代わりにpch.hを追加しました。

更にWinMain.cppにあるMacroをpch.hに移します。

WinMain.cppに表示されたErrorも消えました。

これで完成みたいです。

テストします。

Errorになりました。

うーん。

色々調べて、公式のサイトとかも読んだりしたんですが、原因がよく分かりません。

Precompile Headerのやり方はあっているはずです。

しかもこのErrorはCompiler Error C2857 []によるとPrecompileに指定したHeaderをIncludeしていない時に発せられるErrorとあります。

全部のSource FileでInclude しています。

あ。

File名を間違えていました。

直しました。

今度は出来ました。

はい。

今週はここまでにします。

9.3 「DirectX 12の魔導書」を勉強する

先週は、「3.2.1ウィンドウの生成」の最後まで勉強しました。

今週は「3.2.2 Direct3Dの初期化」を勉強します。

まず軽く全部読みます。

おお、遂にDirectX 3Dを使用しています。

DirectX 12を使用するために必要なHeaderやLibraryの追加と、DirectX 12を使用するために最初に初期化する必要があるID3D12Deviceの初期化の方法について解説していました。

以下に具体的な内容を簡単にまとめます。

Includeする必要があるHeaderは以下の2つだそうです。

  • D3d12.h
  • dxgi1_6.h

そしてこれらのHeaderがあるLibraryが以下の2つだそうです。

  • d3d12.lib
  • dxgi.lib

dxgiのlibraryにはVersionの番号は無いんですね。

次にID3D12Device型の変数を含む3つの変数を宣言しています。

その後でD3D12CreateDevice()関数を使用してID3D12Deviceの初期化を行っています。

大体こんな感じです。

それでは実際にやってみましょう。

まずHeaderとLibraryをIncludeしました。

使用するLibraryはPropertyからも指定出来たはずです。

まあ良いです。

今回はこれで行きます。

次にID3D12Device型の変数を宣言します。

しました。

何故かIDXGIFactory6型とIDXGISwapChain4型の変数も同時に宣言しています。

IDGISwapChain4は本ではIDGISwapchain4と記載されていました。本ではCが小文字になっていました。

ここからD3D12CreateDevice()関数の話になります。

D3D12CreateDevice()関数に使用されているParameterについて説明しています。

読んだんですがあんまり頭に入って来ません。初めて聞く概念はなかなか理解出来ないのと一緒です。

そこで公式のD3D12CreateDevice function (d3d12.h) [17]を読むことにします。

うーん。

これ読むとID3D12DeviceってDirectX 12を総括しているClassではなくて単にDisplay Adapterを再現しているClassって感じです。

Display Adapterって何だっけ?

はい。これ去年、買ったやつじゃないですか。

これをSoft上で再現するのがID3D12Deviceなのか?
それぞれのParameterについての解説です。

そもそもD3D12CreateDevice()関数のParameterは以下の様になっています。

最初のIUnknown *pAdapterですが、

と解説されていました。

うーん。

これが「DirectX 12の魔導書」だとVideo Cardを選択するためのParameterと解説されています。

うーん。

あ。

さっきのDisplay Adapterの定義に

ビデオカードなどの映像信号の出力装置ってのがありました。

こっちか。

成程。

このParameterが何をするためのParameterか理解出来ました。

2番目のParameterです。

そもそもD3D_FEATURE_LEVELが何を指定しているのかが不明です。

公式のDirect3D feature levels [18]を詠むことにします。

はい。

大体のImageが掴めました。簡単に言うとFeature Levelという基準があってそのVideo CardがどのFeature Levelまで動く事が出来るのかは決まっているって事です。

それをここで指定しているという事ですね。

DirectX 12の魔導書」だとD3D_FEATURE_LEVEL_12_1が最新と書かれていますが、

今は12_2があるみたいですね。

3番目のParameterです。

Device InterfaceつまりVideo Cardが持つ番号でその機体特有の番号が返ってくるのか、それともこっちでこのParameterにそのInterfaceだけが持つ番号を指定するのかのどっちなのかが分かりません。

更に「DirectX 12の魔導書」の説明だと、受け取りたいObjectの型を識別するためID。となっています。更に訳が分からなくなりました。

兎に角、IDが入っている事だけは分かりました。

最後のParameterです。

ここは分かります。さっき作成したID3D12Device型の変数をパスする所でしょう。

あれ?

全然違う事が書かれている。

DirectX 12の魔導書」を見直したら、ID3D12Device型の変数をPassしているのは三番目のParameterでした。このParameterは使ってなかったです。

しかもそれぞれのParameterの値を指定するのに、もうひと手間必要みたいです。

もうお腹いっぱいです。

今週はここまでにします。

9.4 HLSLシェーダーの魔導書を勉強する

ID3D12Device型の変数の宣言をどうやっているのか、とD3D12CreateDevice()関数の説明をどうしているのかを重点的に見てみます。

ぱっと見ましたが、これらの説明はなくいきなりShader言語の勉強に入っています。

これはこれで有りですが、他の本と同じPaceで進みたいのでこの本の勉強はもう少しだけPendingします。

9.5 Direct3D 12 ゲームグラフィック実践ガイドを勉強する

今週は何をするんだったけ?

と先週のBlogを読んだ思い出しました。

App Classを実装するんでした。

いきなり重いの来た。

全然やらない訳にもいかないし、出来るとこまでやりますか。

正直、今週はこっちを頑張るべきでした。そうすれば来週からDirectX 12の勉強に3つの本で同時に始められました。

まあ、仕方ない。

出来る所までやります。

まずApp.h fileとApp.cpp fileを作成します。

Sample Codeを見ると以下のFile内で作成されているので

同様にしました。

それではApp.hの実装から始めます。

まずは使用するHeaderをIncludeする所からです。

Windows.h。Sは忘れていません。まあVSでTypoする事はほとんど無いですけど。

次のcstdintはどんなHeader何でしょう。

うーん。覚えていません。調べます。

cppreference.comのcstdint [19]に以下の説明がありました。

成程。cのStandard Libraryなのね。

Constructor、Destructor、そして唯一のMember FunctionであるRun()関数を追加します。

この辺はC++のClassの作り方としては直球すぎてCommentする事は無いです。

Privateの方です。

Helper Method?

C++だとHelper member functionって言うべきなんでしょうか?

うーん。

数年ぶりにC++でCodeを書き込んでいますので、かなり忘れています。

最後のWndProc()関数は先週勉強したやつです。

一寸、本の説明をしっかり読みます。

説明が真っすぐで分かりやすい。

C++でCodeを書く人は変に捻って書く人とかもいますが、このCodeは直球で書いてくれるので分かりやすいです。説明も同じで簡潔で必要な事だけビシッと書いてあります。

ここではWindProc()関数の説明は無かったですね。

App.cppの実装です。

当然ですが、HeaderをIncludeします。

次にConstructorの実装です。

うーん。

この書き方で変数を初期化した方が何か得があったはずです。が忘れてしまいました。調べようにもこの書き方自体の名称を忘れてしまいました。

後で調べます。

---後述---

調べました。

この書き方はInitializer Listと言います。

Geeks for geeksのWhen do we use Initializer List in C++? [20]には以下のような解説がありました。

この書き方の長所は以下の変数も初期化出来る事でした。

  • non-static const data members
  • reference members
  • DefaultのConstructorを持たないmember objects
  • 親ClassのConstructor
  • constructorのparameter と同じ名前を変数の初期化も使用した場合(同じ変数とはみなされない)

そしてこの書き方の方が、早く動くそうです。

---

Destructorです。

はい。

Run()関数の実装です。

うーん。これはまだ何をやるのか分かりませんね。

それぞれのHelperの関数の実装を見ないと。

次はInitApp()関数の実装です。

InitApp()が何をしているのかは判明しました。

InitWnd()をしています。

しかしInitWnd()関数が何をしているのかまだ不明です。

軽く実装を見ました。ここでCreateWindowEx ()関数を使用しています。

ここでWindowを作成していますね。

まずGetModuleHandle()関数を使用してhInstを初期化しています。

うーん。

こんなのしたっけ。覚えていません。

他の本の実装で確認します。

DirectX 12の魔導書」では以下の様に使用していました。

直接、WNDCLASSEXのPropertyにAssignしていたから覚えていなかったみたいです。

OlympusMonsTutorialsではHInstance()関数になっていました。

HInstance()関数って何?

と思って調べたら

GetModuleHandle()関数の事でした。

これを敢えてMacroでやる意味があるんでしょうか?

覚えていません。

最後にHLSLシェーダーの魔導書です。

この本はWindowの作成方法とかについては全く語っていないので、Sample CodeにあったWindow作成の実装部分を切り取って持ってきました。

まあ、書き方は違いますがやっている事は同じです。

みんなGetModuleHandle()関数を使用していました。

しかし何でここまで書き方違うんですかね。

勉強する方はみんなが同じ事をやっているって気が付くだけでも大変です。

これはとても今週中に終わる感じではないので、App Classの作成は来週もやる事にします。

今週はここまでにします。

10.まとめと感想

今週は最初のWater Systemによる川の作成で3D酔いして気持ち悪くなってしまって、全体的になんか締まりがない勉強になってしまいまいした。

まあ、そういう週もあるでしょう。

Volumetric Cloudに関しては、後からもっと客観的な方法でPhotorealisticな雲を作成する方法を見つけました。これは来週まとめます。

以上です。

11.参照(Reference)

[1] renderBucket. (2022b, December 4). Unreal Engine 5 Tutorial - Shading Niagara Fluids - Honey [Video]. YouTube. https://www.youtube.com/watch?v=iHxNQE9n_Gw

[2] Andrea Cantelli. (2020a, May 21). Gaea Tutorial for Beginners #1 | Intro to the series & Analyzing the Interface [Video]. YouTube. https://www.youtube.com/watch?v=fX1PJNvl8c0

[3] Magee, R. (n.d.). Foundations | Overview | SideFX. https://www.sidefx.com/tutorials/foundations-overview/

[4] OlympusMonsTutorials. (2021, March 3). C++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [Video]. YouTube. https://www.youtube.com/watch?v=rWylZKi8QbM

[5] Klaus. (2022a, May 14). Unreal Engine 5: Water System in UE5 Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=MpCQc4sDMjw

[6] Help Please Error Packaging Project. (2022, November 19). Epic Developer Community Forums. https://forums.unrealengine.com/t/help-please-error-packaging-project/693911/1

[7] renderBucket. (2022b, December 4). Unreal Engine 5 Tutorial - Shading Niagara Fluids - Honey [Video]. YouTube. https://www.youtube.com/watch?v=iHxNQE9n_Gw

[8] GIMP packing image into alpha (pasting grey scale image into alpha). (2018, July 29). Stack Overflow. https://stackoverflow.com/questions/51581384/gimp-packing-image-into-alpha-pasting-grey-scale-image-into-alpha

[9] Ben Cloward. (2022b, October 13). Rock Shader - Advanced Materials - Episode 3 [Video]. YouTube. https://www.youtube.com/watch?v=Q2XI8cuSBMk

[10] Ben Cloward. (2022, October 6). Sparkling Snow Shader - Advanced Materials - Episode 2 [Video]. YouTube. https://www.youtube.com/watch?v=TCz-fKJS3wI

[11] Andrea Cantelli. (2020b, May 24). Gaea Tutorial for Beginners #2 | Node Graph Workflow. YouTube. https://www.youtube.com/watch?v=lKxw45AoRbU

[12] Alias Help. (n.d.). http://desprod.dmu.ac.uk/alias_2010/index.html?url=WS73099cc142f48755360aa6ed11a9c1effaa-69e6.htm,topicNumber=d0e7382

[13] 【十種雲形】雲は全部で10種類 見分け方を形や高さから解説!~下層雲編~. (2021, August 1). tenki.jp. https://tenki.jp/suppl/tenkijp_labo/2021/08/01/30532.html

[14] Climate - Cloud types. (2022, December 30). Encyclopedia Britannica. https://www.britannica.com/science/climate-meteorology/Cloud-types

[15] OlympusMonsTutorials. (2021, March 3). C++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [Video]. YouTube. https://www.youtube.com/watch?v=rWylZKi8QbM

[16] Compiler Error C2857. (2021, August 3). Microsoft Learn. https://learn.microsoft.com/en-us/cpp/error-messages/compiler-errors-2/compiler-error-c2857?view=msvc-170

[17] D3D12CreateDevice function (d3d12.h) - Win32 apps. (2022, July 28). Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-d3d12createdevice

[18] Direct3D feature levels - Win32 apps. (2022, August 5). Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/direct3d11/overviews-direct3d-11-devices-downlevel-intro

[19] Standard library header  (C++11) - cppreference.com. (n.d.). https://en.cppreference.com/w/cpp/header/cstdint

[20] GeeksforGeeks. (2022, April 19). When do we use Initializer List in C++? https://www.geeksforgeeks.org/when-do-we-use-initializer-list-in-c/

UE5の勉強 -LandscapeのみのGameを作成する-

1.今週の予定

今年から以下の内容を勉強します。

  • LandscapeのみのGameを作成する
  • Niagaraの勉強
  • Materialの勉強
  • 戦闘システムの続きを作成する
  • Gaeaの勉強
  • Houdiniの勉強
  • Volumetric Cloudの勉強内容をまとめる
  • DirectXの勉強

先週は、これをやってみましたが量は多すぎました。

2.LandscapeのみのGameを作成する

先週作成したHeight MapとMaskをUEにImportしてLandscapeを作成します。

2.1 Landscapeを作成する

Landscape用の仮のMaterialを事前に作成しておきます。

これ別にやらなくても後からLandscapeのMaterialのLayerとMaskを対応させる事は出来るんですが、先に作っておくと色々楽なので前もって4つのLayerを持つLandscape用のMaterialを作成しておきます。

まずProjectの作成から行います。

Versionは5.1にします。Project名はLandscape Gameとします。

新しいLevelを作成します。

一応、World Partitionが使用出来るOpen Worldを選択しました。

Env.LightMixerを開いて空の作成に必要なActorを追加します。

以下のActorが追加されました。

Landscape用のMaterialを作成しました。

取りあえずLayerが4つあれば良いので以下の実装を作成しました。

勿論後で、しっかりしたMaterialの実装を作成しますが、とりあえずはこれで十分です。

Klaus氏のTutorialを見ながらLandscapeを作成しても良いんですが、多分自分ひとりでも出来るでしょう。

何も見ないでLandscapeを作成してみます。

以下の条件でHeight MapをImportします。

ImportするHeight Mapは先週作成したやつです。

結果です。

高すぎな気がします。ZのSizeを半分の30に変更します。

うーん。

これくらいなら良い感じです。

LandscapeのPaintを選択して

なんかやり方を間違えたらしくUE editorがCrashしてしまいました。

もう一回新しいLevelを作成してHeight Mapの読み込みからやり直そうとしたら、前の設定がそのまま表示されて以下に示した様になりました。

MaterialのDirtとGrassが逆ですね。

直します。

Roughnessを上げてテカリを止めます。

この時点でかなり良い感じです。

話は戻ってLayerとMaskの指定方法なんですが、私が理解しているのは、

Paintの以下の部分にLyerInfoを作成して

ManageのImportの

Layerの部分でMaskを指定する

やり方です。

なんかこのやり方間違っているのでしょうか。

今、Layerを開いたらLandscapeってLayerが出来ているし、それぞれのLayerに指定したはずのMaskが消えています。

うーん。

分からん。

ちょっともう一回やり直します。

このProjectは消して、新しいProject、LandscapeGame2を作成してそこでもう一回最初から試してみます。

やり直しました。

これでLandscapeを確認すると

前のProjectと同じになっていました。

何でセットしたMask達が表示されないんでしょうか?

うーん。

分からん。

これはKlaus氏のやり方を復習する必要がありますね。

2.2 How To BUILD AN ISLAND In 20 mins | Unreal Engine 5 Tutorial[1]のUEへのImportのやり方を勉強する

このTutorialのCreating the Island in UnrealでGaeaで作成したHeight MapとMaskを使用してUE5でLandscapeを作成する方法を説明しています。

この部分を以下にまとめます。

以下にKlaus氏が使用するHeight MapとMaskを示します。

これ見るとMaskが5個ありますね。私のMaskはFlowが無いです。

Flowは川を追加するためのMaskですね。

まず新しいLevelの作成を行っています。

Empty Open WorldをTemplateに使用していました。

Env. Light Mixerを使用して空を作成しています。

Env. Light Mixer内にCreate Atmosphere 1があるところを見るとこのUnrealのVersionは5.0のようです。

Sky Lightを選択してReal Time CaptureにCheckを入れます。

むむ。

これってDefaultでCheckが入っていると思っていたんですが。

確認します。

無かった。

Check入れました。

このReal Time Captureの機能の確認もしておきます。

これを簡単にまとめるとSky AtmosphereやVolumetric CloudそしてSky Domeの影響を考慮して

  • Dynamic Diffuse
  • Specular Environment Lighting

の質が良くなるって書いています。

これにCheckを入れると時間によって夜になったり朝になったりするんじゃなかったけ。

うーん。なんか記憶と違う。

公式のDocumentにあるSkylight [2]にReal time Captureの詳しい解説がありました。

これ読むと、環境光が動的でSpecularになると書かれています。

うーん。

さっきの解説と一寸違う事言っていない。

あ、分かった。

最初の文はDiffuse LightとSpecular Lightが動的になるって言っているんだ。

ところが、これ光の種類にDiffuse光とSpecular光がある事を知らないと先程の私の様に、動的なDiffuseとSpecular な環境光を作成すると勘違いして読んでしまうんです。

それで2番目の文になります。

ここは環境光が動的でSpecularになるって言っています。

いや、これはもっとオカシイ。

光の種類にはDiffuse、Specularそして環境光であるAmbient の3つがあります。ここでいっているEnvironment lightingはAmbient lightingの事でしょう。

これはどこまで行っても変わらない原則です。

Specularな環境光という表現自体に、一寸、あれっと感じます。

うーん。

分かりました。ここでEnvironmentといっているのがPointなんです。

元々Skylightの機能を考えると分かりますが、

以下の様になっている影が

Skylightを使用する事で以下の様になります。

これはSkylightが、空から降り注ぐ反射光、つまり青い光が地面に当たって反射している事を考慮しているんです。

この計算を動的につまりDynamicに行うのがReal Time Captureなんです。

そこまでは分かったんですが、それ以上が分かりません。

いろんな条件で影の濃さの変化をReal Time Capture有りと無しで比較したんですが、差が出なかったです。

このReal Time CaptureでDiffuseとかSpecularとか言っているのは話半分位に聞いておいた方が良い気がします。のでこれ以上は深入りしません。

Klaus氏もこのReal Time CaptureをOnにする理由は、Real timeに動的な影を得るためです。としか言っていません。

(CaptionではSchedulesとなっていますが、ここはShadowと言っています。)

脱線しすぎました。

元に戻ります。

Landscape Modeに入ります。

ManageのNewでImport from Fileを選択します。

ここでEnable Edit LayersにCheckが入っていませんが、Klaus氏、後で忘れていたと言っているのでCheckを入れるのが正しいです。

Materialは前に作成したMaterialが指定されています。

そしてLayersにはMaterial内で作成したLayerが表示されています。

私のProjectにはLANDSCAPE VISBILITY...という訳分からんLayerが追加して現れているんですが、Klaus氏のTutorialの例ではそれはないですね。

あ、原因が分かりました。

LandscapeのManageのNewを見ると私のProjectでもLANDSCAPE VISBILITY...というLayerは表示されません。

ところが、Importを開くと以下に示した様にLANDSCAPE VISBILITY...というLayerが現れます。

Import From FileをClickしてHeightmap Fileの欄を表示させ、そこにHeightmapを指定します。

あれ、既にImport from Fileを指定していると思っていました。

まあ、この辺はどうでも良いです。

ここでScalingの設定について解説しています。

この部分は既に何回も勉強していますので、今回はSkipします。

Klaus氏は厳密な計算をして以下の数値を導き出しました。

私は、Landscapeの精度を考えるとScaleは100倍が限界と思っています。今回Klaus氏は5000mのLandscapeを1009 Pixelに落として使用していますが、これをやるなら1009 Pixel のHeightmapを何枚も作成した方が良い気がします。

Klaus氏はここでZの値、つまり高さの厳密な計算方法も解説していて、そのやり方は私は知らなかったのでその部分だけは以下にしっかり記録しておきます。

まずGaeaのBuildの設定でRowにした場合です。

これですね。

2600 meterをここに入れるそうです。

この2600 mがこのLandscapeだけに当てはまる値なのか、それとも全部のLandscapeに当てはまる値なのかは分かりません。

Buildの下の方にあるTerran DefinitionのHeightを見るとDefaultで2600がセットされています。

ので多分ですが、全部の例で2600mをセットするのが正しいんでしょう。

しかし今回のHeightmapはNormalizedでセットされています。

Normalizeの場合は、500mがMaxになるそうです。そしてUnrealではDefault値である100倍が512mになるようにセットされているそうです。

のでNormalizeでExportした場合はZの値は100倍にすれば大体合っているそうです。

ふーん。です。

因みに私は高さのScaleは気分で決めています。今回は30倍に設定しました。

以下のButtonを押してImportしました。

ManageのNewを開くと以下のようなLayerが形成されています。

ManageのNewです。

今度はPaintのPaintを開きます。

それぞれのLayerにLayerInfoを作成します。

Tutorialでは既にLayerInfoを作成しているのでそれをセットだけしています。

LayerInfoにはWeight-Blended Layer(normal)とNon Weight-Blend Layerがありますが、

私はいつもWeight-Blend Layer(normal)を選択しています。

これの違いをKlaus氏のどれかのTutorialで述べていたのを覚えていますが、その違いが何だったのかまでは覚えていません。

以下に私のProjectのPaintのPaintを示しますが、Target Editor以外の欄がありますね。

それ以外はほとんど同じですね。

ここからMaskをImportしますが、ここからのやり方が違った。

まずCliffを選択します。

右Clickし、以下のBoxを表示します。

Fill Layerを選択します。

Landscape全体がCliff Layerになります。

次にGroundAを選択して

又、右Clickして以下のBoxを表示します。

そして今度はImport From/Export To Fileを選択します。

するとManageのImportに飛びます。

ここで表示されている緑の線のMapが下に表示されているLandscapeと同じ大きさである事を確認します。

今回は同じ大きさですが、もし違っていたら以下に示した様にHeightmap FileにCheckを入れて

前にLoadしたHeightmapをもう一回選択する必要があります。

ここでLayerを開きますが、

私のProjectにあるLANDSCAPE VISIBILITYはないです。

これはあれだ。

私は以下の部分をやらなかったからだ。

なんでCliff LayerをFill Layerに選択したのか分かりませんが、それは後で調べます。

以下の様に5つのMaskを指定しました。

うーん。Cliffは何も指定してないですね。

何も指定しない箇所のLayerがCliffになっているのか。

成程。

分かったわ。

これで理解したわ。

と思ったらもうひと手間必要でした。

GroundA以外のCheckを外して

Importしました。

つまりCroundAのMaskだけImportしています。

結果です。

結果です。Grass LayerがCliffのLayerの上に被さっています。

あ。成程ね。

こうやってLayerのMaskを指定する事でGaeaで作成したTerrainと全く同じLandscapeのLayerを作成するのね。

次はFlow BottomのMaskをImportしています。

どのLayerにどのMaskを使用したのかを確認しておきます。

  • GroundA=Slope
  • FlowBottom=Flow
  • FlowTop = Erosion
  • Sand = Beach
  • Lake = Sea

でした。

残りのLayerも同じように一個ずつImportしていきます。

これで終わりでした。

<Mask作成の順番を確認する>

UnrealでLayerにMaskを指定した順番とGaeaのMaskを作成した順番は同じなはずです。

念のためこれを確認します。

最初のMaskはSlopeでした。

次のMaskはShatterですが、その元はFlowです。

その次のMaskはErosionかと思ったんですがBeachを取っています。

最後にSeaを取っています。

あれ、Erosionが無い。

ずっとFlowが先週無かったMaskだと思っていたんですが、どうやらErosionが先週無かったMaskだったみたいです。

2.3 Landscapeをもう一回作成する

これはもう一回、Landscapeを作り直す必要がありますね。

新しいLevelを作成しました。

当然、Empty Open Worldを使用しています。

ここにEnv. Light Mixerを使用して

Directional Light、Exponential Light、Sky Atmosphere、Sky LightそしてVolumetric Cloudを追加します。

Sky LightのReal Time CaptureにCheckを入れます。

Landscape用のMaterialを作成します。

今度はLayerを5個作成しました。

Flowには一応青色を付けました。これは結果を見てから考え直すかもしれません。

Landscapeを開いてManageのNewを選択しました。

設定は以下の様にしました。

当然、Enable Edit LayerにCheckを入れました。

Heightmapには先週作成したHeightmapを入れました。

Materialには先程作成したMaterialをセットしました。

Scaleの設定は先週と同じにしました。

Importしました。

以下のようなLandscapeが形成されました。

Landscape ModeのPaintのPaintを開き

それぞれのLayerにLayerInfoを作成しました。

この時点で、LandscapeはCliffの色一色になりました。

今度はCliffを選択して

Fill Layerを選択します。

Tutorialと違い、私のLandscapeは既にCliffの色一色になっているので何も変化しません。

今度はGrassを選択してImport From/Export To Fileを選択しました。

するとLandscapeのManageのImportに飛びました。

LayerにLANDSCAPE VISIBILITYがあります。

うーん。

このやり方でも出て来るという事は、このLayerは出来るのが正しいんでしょうね。

多分、5.1から標準になったんでしょう。

表示されている緑の線のMapが下に表示されているLandscapeと同じ大きさである事を確認します。

同じでした。

対応するMaskがあるLayerにMaskを指定します。

今度はGrassだけCheckを残して残りのLayerのCheckを外します。

この状態でImportします。

結果です。

山頂に草が生えている変なLandscapeになりました。

ただ全部がオカシイんじゃなくて一番高い山の周りはいい感じに草が生えています。

次はFlowにのみCheckを入れてImportしました。

結果です。

うわ。全部水色になってしまいました。

まあ良いです。

次に行きます。

次はBeachだけ選択してImportしました。

結果です。

成程ね。このやり方だと後から追加するLayerが100%上書きするんですね。

最後にSeaのLayerを追加します。

結果です。

Landscape ModeからSection Modeに変更しました。

ん、Layerの色を調整しました。

2.4 作成したLandscapeを検証する

以下にKlaus氏のやり方に忠実に従って作成したLandscapeを示します。

まず川が欲しいです。GaeaのProjectに川のNodeを追加して川を作成しましょう。

Beachは大きすぎる気がします。

実際に歩いてみます。

砂浜の端に着きました。

うーん。本物の砂浜もこの位の大きさはある気がしますね。

やっぱり1km^2というのが小さいのかもしれませんね。

この辺の凸凹は後で手直しする必要がありますね。

山を登ってみました。

流石に登り切れませんでした。

歩いた感想を以下にまとめます。

まず悪くないです。

Beachがあって荒地があって緑があって山があります。

後、欲しいのは川と湖、岩場ですね。Beachの半分ぐらいは岩場にしたいです。

以下の赤線の部分に湖と川を追加して、Beachの半分は岩場にしたらかなり良い感じになると思います。

来週はGaeaでTerrainの修正を行います。

2.5 予定の確認

2023-01-01のBlogを見ると一月のLandscapeだけのGame作成の予定表は以下の様になっていました。

ああ、Water Systemを勉強する必要があるのか。

まあ、しょうがない。来週はGaeaでTerrainの修正を行います。

3. Niagaraの勉強

3.1 Colliderに変わる設定を探す

先週、Unreal Engine 5 Tutorial - Niagara Fluids - Flamethrower [2/2] [3]を勉強しましたが、Static MeshとCollisionする設定が分かりません。

TutorialではUE5.0 でやっていてその場合は、Emitter SummaryにあるTagにColliderと指定されています。

これを対象のStatic MeshのTagにセットする事でそのStatic MeshはNiagara Fluid Simulationと衝突する事になります。

このTag自体が5.1にはありません。

これの問題を解明します。

まずはUE5.1のContent ExamplesにあるNiagara Fluid のSampleである以下のSampleを検証します。

これSmokeがStatic MeshにCollideしています。

ざっと探しましたが全く分かりません。

今度は5.0のContent Examplesの同じSampleを調べてみます。

このEmitter SummaryのCollision Data InterfacesにあるStatic Mesh Collisionsが以下の設定を行っています。

Pre Sim Velocity SectionにあるGrid 3D Compute Boundary Module内に

Use Static Mesh Collisionがあります。

うーん。

これから見ていきますか。

5.1の同じSampleのPre Sim Velocity Sectionです。

Grid 3D Compute Boundary Moduleがあります。

そしてその中にはUse Mesh Collisionsがあります。Use Static Mesh Collisionsは無いです。

うーん。これだけだと全く分かりませんね。

これは以下のSectionで何をやっているのかが判明しないと理解出来ない感じです。

うーん。決めました。Render Bucket氏のNiagara Fluid Simulationに関するTutorialはUE5.0で勉強します。

そしてその後で、どうするかまた考えます。

3.2 Unreal Engine 5 Tutorial - Shading Niagara Fluids – Honey [4]を勉強する

なんと、Render Bucket氏のNiagara Fluid SimulationのTutorialはこれが最後でした。これ以外のNiagara Fluid SimulationのTutorialはありませんでした。

うーん。

これは予想外です。

来週からどうやってNiagara Fluid Simulationの勉強をしよう。

兎に角、今週はこれを勉強します。

まず、全部見ました。

ハチミツのSimulationを作成しています。

Niagara Fluid SimulationにおけるViscosityの調整の仕方を勉強するのかと思ったら違いました。

そのほとんどが物質がどうやって光を透過したり屈曲したりしていてそのためのParameterがどうなっているのかについての勉強でした。

これはこれで非常に面白かったです。

このTutorialの最後に一寸だけ、Niagara Fluid SimulationにおけるViscosityの調整の仕方も教えていました。

以下にこのTutorialの内容をまとめます。

まずこのTutorial、5.1で作成されていました。

これは予想外です。

Grid 3D FLIP Hoseから作成します。

名前はFXS_Honeyとしました。

まずSprayやFoamを作成するEmitterは入らないので消します。

まずは水の高さを変更します。

System StackのUser Parameter SectionにあるWater Heightの値を20にします。

Pressure Iterationsの値も変更します。

これは何をするParameterなのか分からないです。

今度は水の出て来る口の大きさを変更します。

Grid 3D FLIP Fluid Control Emitter Stackの

Particle Spawn SectionにあるSphere Location Section Moduleの

Sphere Radiusの値を25にします。

更にOffsetのXの値を-125にします。

次はShadingの調整を行います。

Render SectionにあるMesh Renderer Moduleを選択します。

Override MaterialsのIndex[0]にセットされているM_WaterSDF_InstのあるFolderを開きます。

TutorialではDefaultで付いているMaterialやそのInstanceは絶対に変更するな。もし間違ってしたらUEをもう一回Installする羽目になる。と長々と言っています。

余程の初心者じゃない限りそんな事はしません。

M_WaterSDF_InstをDuplicateしてM_WaterSDF_Honeyと名付けます。

このMaterial InstanceのParameterを改造します。

しかしその前にM_WaterSDF_Honeyを開きそのParent Materialを確認します。

M_WaterSDFでした。

今度はこのMaterialがあるFolderを開きDuplicateします。

今度はM_WaterSDF_Customと名付けます。

最後にこのDuplicateしたMaterialとMaterial InstanceをHoney Folderに移します。

うーん。

こんなの逐一記録する箇所じゃなかった。

単に使用しているMaterial InstanceとそのParentであるMaterialをDuplicateしてHoneyのFolderに移動します。と一言で説明すればよかった。

後で読み直してもこんな解説が必要になる訳もないです。

もう書いてしまったので、あえて消すのも勿体ないのでそのまま残しておきます。

M_WaterSDF_Honeyを開きそのParent MaterialにM_WaterSDF_Customをセットします。

Niagara Fluid SimulationであるFXS_Honeyに戻ります。

Grid 3D FLIP Fluid Control Emitter StackのRender SectionにあるMesh Renderer ModuleのOverride MaterialのExplicit Matに

M_WaterSDF_Honeyをセットします。

はい。

これでOriginalのMaterialとMaterial Instanceを変更しないで、Honey用のMaterialとMaterial Instanceを作成する準備が出来ました。

はい。

そんだけです。

このTutorialの勉強で大切なのはこれからです。

まずM_WaterSDF_Honeyの値をResetするそうです。

まずBase ColorをDisableしました。

次にScatteringをDisableしました。

Scattering! Scatteringがあるのか。

Absorptionの値を0にします。

Absorptionもあるんですんか。

これはかなり厳密な光の計算をしているみたいですね。

水が透明になっています。

これでDefaultの値になったそうです。

ここからHoneyっぽい色を追加するそうです。

がその前にAbsorptionのParameterが何を管理しているのかを解説しています。

Absorptionに赤をセットします。

すると水の色が緑になりました。

これはどのSpectrumがAbsorbされるのかを指定しているからです。

この液体は赤をAbsorbし、残った緑色が表示されています。

なのでHoneyの色を出すためにAbsorptionに水色を指定し

液体の色を赤くします。

今度はOpacityについてです。

Opacityの値を1にすると

先程の赤い液体は黒くなります。

うーん。これ式を示してほしいです。液体の光の吸収を表す、このSimulationを作成するに当たって使用している元の式を知りたいです。

それ見ればどの値を弄ったらどんな結果になるのか一目瞭然です。その後で実際の計算結果の可視化としてこの液体の色を見たら理解が100倍深まります。

なんとこの液体が黒くなるのはBase Colorが黒くセットされているからだそうです。

Opacityの値が高くなればなるほど、このBase Colorの色に近づくそうです。

なのでBase ColorのCheckを入れると

液体の色は以下に示した様に

Base Color色に変化しました。

今度はBase Colorを白にします。

当然、液体は白くなります。

ここでOpacityの値を1から下げます。

すると以下の様にAbsorptionとBase Colorの色が混じった感じになります。

うーん。分かりやすい。

更にScatteringを追加します。

Scatteringの色になります。

Light(Directional Light)がこの液体を通過しない角度で見ている時、

ほとんどOpacityの色になります。

Absorption、Opacity (base Color)そしてScatteringの3つの値を調節してHoneyの色を再現するそうです。

これらの値をどうしたらHoneyにそっくりになるのか全く想像できません。とにかくTutorialのやり方を見てみます。

その前にPhaseについてです。

この値はScatteringがどう関わってくるのかを指定するそうです。

値が大きい時は、Forward Scatteringと言ってScatteringは光源から離れるそうです。

逆に値がNegativeな時は、Back Scatteringと言ってLightはもっと反射するようになるそうです。

うーん。

何言っているのか分からない。

調べました。

以下の図が一番分かりやすかったです。

https://www.researchgate.net/figure/A-schematic-of-light-transport-a-forward-scattering-b-forward-scattering-and-back_fig2_4169663 [5]

から引用しました。

この図の元はガチの論文で、その論文を引用元に記しておきました。

要するにLightが粒子にぶつかった時にScatteringが起きるんですが、その方向がLightと同じ方向だったらForward ScatteringでLightの向きと逆だったらBack Scatteringになる訳です。

私、化学とCSのDouble Majorだったので化学の研究室にいた時期があったんですが、その研究室ではLaserで色付きの液体を励起してScatteringを起こしてその光を分子に充てて、分子が振動する波長を調べていました。

まあ分光学の一種ですが、バリバリの量子化学の研究室ですので、光の錯乱などの計算は、大抵のCSの研究者より出来ます。

いやこれは出来ました。と言うのが正解で今はその計算方法の大半は忘れてしまっています。が勉強すればすぐに思い出せます。

うーん。この辺の勉強は一寸やりたいですね。

次はToleranceです。

TutorialだとBlobbyと言っていますが、Blobby自体初めて聞く単語です。

調べたらBubbleっぽくなる事の様です。

1の時です。

0.1の時です。

Tutorialでは数字が大きいほどBlobbyと言っていますが、このBlobbyの意味が泡泡している事なら数字の小さいほうがしている気がします。

どうなんでしょうか?

これでM_WaterSDF_HoneyのParameterについての解説はお終いだそうです。

ここからはHoneyの色合いを出すためのこれらのParameterの設定を行うそうです。

まず今まで弄ったParameterの値を0に戻します。

Absorptionの値です。

結果です。

うーん。この時点で既にハチミツっぽいです。

Absorptionの値って実際のハチミツから測定して得た値何でしょうか?

何かそういう所に興味を惹かれます。

Base Colorです。

結果です。

あんまし違いが出てないですね。

Opacityの値をいじったら変わるんでしょうか?

Opacityの値は逆に0.1に下げてしまいました。

まあ、ハチミツって透明ですからね。

結果です。

当然ですが、あんまり変化ないですね。

次はScatteringです。

Alphaの値が0.15なのでほとんどScatteringはしないという事でしょう。

一寸、緑がかって来ました。

今度はPhaseの値を変更しました。

もっとBack Scatteringを起こします。

と思ったらTutorialはいろんな値を入れて試していました。

Specularの値を追加します。

大分、ハチミツらしくなりました。

今度はRefraction(屈折)を追加します。

これはMaterialの実装にRefraction用のCodeを追加する事で実現します。

M_WaterSDF_Customの

Refractionに以下の実装を追加します。

これでRefractionが発生するのは理解できますが、この計算が正しいRefractionを発生出来るんでしょうか?

その辺の解説が欲しかったです。

Material InstanceであるM_WaterSDF_Honey

以下の値を調節して

屈曲を表現しています。

屈曲そのものは観測出来ますね。

この屈曲が正しいのかどうかは別ですが。

Roughnessの値もセットしました。

結果です。

Specularが増しました。

更に値を微調整して以下の様になりました。

これで一応完成ですが、

Simulationを見ていると、ハチミツ色をした水が流れている感じがします。

つまりViscosityが無いんです。

このParameterはNiagara Fluid Simulationには無いので疑似的に追加するしかありません。

このTutorialでは、ParticleのCollideとInteractの値を調節する事でハチミツの高Viscosityを再現するそうです。

Niagara Fluid SimulationであるFXS_Honeyを開いて

Grid 3D FLIP Fluid Control Emitterを選択します。

そしてParticle SectionにCollision Moduleを追加します。

このCollision ModuleはGrid 3D FLIP Integrate Particle Velocity Moduleより上に配置する必要があります。

そしてCollision Moduleに表示されているErrorを消すためにDismiss Issueを選択します。

これ超重要な箇所で決してFix Issueを押してはいけません。

そしてCollision ModuleのAttributeの値を調整します。

まずKill Occluded ParticlesのCheckを外します。

Restitutionの値を0にしました。

これはParticleがCollideした時にEnergyを全部失うという意味だそうです。

結果です。

最後にEmitter Summary Sectionにある

Render SectionにあるSDF Particle Size Multの値を1~1.5に上げました。

これはParticleから生成されるMeshのSizeを大きくするそうです。

その結果、以下の様にClumpy(大きな塊)になりました。

これで終わりでした。

3.3 Unreal Engine 5 Tutorial - Shading Niagara Fluids – Honey [4]を勉強して

かなり勉強になりました。

単にParameterを弄っているだけでもAbsorptionとかScatteringとかの復習になって昔、分光学で勉強した内容を一寸だけ思い出しました。

分光学で光の性質について勉強した時は、式とその式を使用した計算結果しかなくて実際のモノがどういう風に変化するのかは全くわかりませんでした。こうやって可視化するとそれぞれのParameterと実際の物質の色の関係が一目瞭然になるので、実際感動しました。

Niagara Fluid Simulationでは粘性が再現出来ないのが一寸悲しいですね。

3.4 Unreal Engine 5 Tutorial - Shading Niagara Fluids – Honey [4]を実装する

これは来週やります。

本当はこれもやりたかったんですが、これやったら先週と同じで終わらなくなります。NiagaraとMaterialの勉強は去年の半分ぐらいの量にします。

Niagaraで勉強してMaterialは実装する週と、Niagaraで実装してMaterialで勉強する週を交互に繰り返す感じにします。

そうしないと永遠にGameが完成しなくなるからです。

4. Materialの勉強

今週はBen Cloward先生のRock Shader - Advanced Materials - Episode 3 [6]を勉強します。

今週は全部やって来週から勉強する日と実装する日を分けるのか、今週から勉強だけにするのかは、やってみて決めます。時間とやる気が余っていたら最後までやりますし、どちらかが足りなくなったらその時点で終了します。

4.1 Rock Shader - Advanced Materials - Episode 3 [6]を勉強する

まず全部軽く見ます。

見ました。

先週と同じでNormalのBにRoughnessの値を入れたり、Macro Size用のNormalやMicro Size用のNormalを作成したりしています。

うーん。

これのやり方を解明する必要があるのか。

RockのShaderは以下の様になっています。

UEで提供されているRockのMaterialを見ると以下の様になっています。

Materialはかなり精密でぱっと見本物と変わりません。

しかし以下に示した様にRockを実際に使用する場合は2つ以上のサイズの違うRockと重ねて使用します。

するとMaterialに使用しているTextureのサイズが全く違うので直ぐに2つ以上のRockを混ぜて作成したと分かってしまいます。

更にSizeを大きくしたRockの方のMaterialは全体的にぼやっと見え、Resolutionが低い物体がポツンと存在しているように見えます。

以下に今回のMaterialを使用した場合の30倍に拡大したRockの結果を示します。

全くMaterialに使用しているTextureがぼやけていません。

更にMacroとMicroのNormalも追加しているので、以下の様にRockに極端に近づいても

その細部の細かさがぼやける事はありません。

うーん。

凄い。

凄いけど、一枚のTextureにNormalのDataとそれ以外のRoughnessやAmbient OcclusionのDataを持たせる方法がまだ分からないんです。

これを解明しない事には、この技術を学んでも絵に描いた餅でしか無いです。

うーん。どうしよう。

調べたらPhotoshopでやっている事はGIMPでも出来そうです。

これは後で調べる事にします。

以下にこのTutorialの手順をまとめます。

まずUEに付属で備わっているRock用のMaterialの実装を解説する所から始まっています。

これが本当にUEにあるMaterialなのか、単なるRockのMaterialの例として、このTutorialが作成したものなのかが分かりません。

一寸確認します。

調べたらUEにはM_Rockと言う名前のMaterialが確かにありました。

実装を見たら全く同じでした。

更にSM_Rockと言うTutorialで使用している岩と全く同じStatic Meshもありました。

まずTextureの話です。

以下に示した部分がM_Rockに元からあるTextureだそうです。

確認します。

まずBase Colorに使用されているT_Rock_Basalt_Dです。

開くと以下のようなImageを示しました。

Alphaを切ります。

以下のImageが現れました。

これはTutorialで紹介された左端のImageと同じです。

因みにAlphaには以下のImageが入っていました。

うーん。これはRoughnessとかでしょうか?

次は、Ambient Occlusion Maskで使用されている

T_RockMesh_Mを調べます。

以下のようなTextureでした。

Ambient Occlusionに使用されているRの値を見ると

あ、これTutorialの右から二番目のImageです。

因みにGには以下のImageが入っていました。BとAlphaには何も入ってなかったです。

Normalに使用されているT_RockMesh_NのImageです。

これはTutorialの左から2番目のImageです。

最後のDetail NormalのTextureですが、

T_Detail_Rocky_Nが使用されていました。

これは多分、Tutorialの一番右端のTextureと同じでしょう。

はい。

確かにTutorialが言っている通りでした。

そして以下に示したのが、このTutorialで改良したTextureたちです。

まずDiffuse 用のTextureですが、

  • RBR向けにLevelの調整をして少しだけ明るくした。
  • Alpha ChannelにRoughnessを追加
  • 名前をRock_CRに変更(Color, Roughness)

をしたそうです。

うーん。Roughnessは元からTextureのAlpha Channelに入っているので、RoughnessをAlpha Channelに追加したというのは多分勘違いでしょう。

となるとLevelを調整して一寸だけ明るくするだけなので、このTextureの調整は出来そうです。

次はNormal Mapですが、Normal MapのBlue ChannelにAmbient OcclusionのTextureを追加したそうです。

これもう少し具体的に言い直すと、T_RockMesh_NのBlue ChannelにT_RockMesh_MのRed ChannelのImageを追加した。という事です。

うーん。

これを正確にやるにはPhotoshopが必要ですね。GINPにも同様の機能があるみたいなんで、それを勉強してみます。

次にMacro Detail MapとMicro Detail Mapを紹介しています。

これらのNormal Mapとどこから手に入れたのかについての説明は全く無かったです。

うーん。どうしよう。

似たNormal Mapを探して使用します。

そしてTutorialではUEにImportしたこれらのTextureの簡単な解説をしています。

重要だと思ったところだけ書き出しました。

TutorialのDiffuse用のTextureに入っていたRoughnessは以下のものでした。

T_Rock_Basalt_DのAlpha Channelに元から入っているImageは以下のものです。

これは別のImageをRoughnessとして使用する必要があるかもしれませんね。

正直、UEのTextureの設定ってまだよく分かってない部分が多くてどこが大切なのか分からない所があります。

例えばTutorialでNormal MapのFormatがBC7である必要について解説していますが、

Normal MapのBlue Channelに別なImageを保存したからBC7にしないといけないという事以外は全く理解していません。

こういうものの勉強は本当に億劫です。

ここからMaterialの作成です。

4つのTextureをImportしました。

まずTextureのScaleがObjectの大きさに関係なく一定にするための実装です。

Object Scaleを掛けています。

このMaterialをRockに使用してRockのサイズをおおきくすると

TextureのサイズはそのままでTextureを繰り返してRockの表面を覆うようになります。

うーん。

成程。

こういう発想が大切なのか。

このTexCoord[0]の結果をTexture Sampleに繋ぎます。

Base ColorとRoughnessに繋ぎます。

NormalとAmbient Occlusionに繋ぎます。

Normal Mapに戻すための計算は先週もやったのでここに記録はしません。

何故かTutorialは、このTexture SampleのUVに先程のTexCoord[0]の計算結果を繋ぎません。多分後で繋ぐと思うんですが。

MacroなDetailを持つNormal Mapを追加しています。

赤線で囲った計算を敢えてする事で通常のNormalにAddする事が出来ると説明されています。

このやり方はよく分からないです。Derived Normal Zノードの前にこの値をAddするのが正しい気がします。

ここでこのMacroとMicroのNormal MapのBlue ChannelにRoughnessの値が入っている事、AlphaにはColorと混合出来るImageが入っている事が判明しました。

えー。

ですがまあ仕方ないです。続きを見ます。

BのRoughnessですが、以下に示した様にOne MinusしてRoughnessの値に足しています。

Alphaに入っていたImageの方ですが、以下に示した様にBlend Overlayノードを使用して混合しています。

Micro DetailのTextureに関してはこれと全く同じ事をしています。

当然ですが、UVに繋ぐ値だけは違います。

これで完成だそうです。

近づいた画像です。

細部まではっきりしています。

Rockを30倍にした時の画像です。

Macro Detailのおかげで30倍にしても凸凹感がぼやけていません。

しかもサイズが違う2つのRockを重ねても

境界によってTextureのサイズが全く違うという事が無いため、2つのRockを重ねたという事は分かりません。

これで終わりでした。

以下のTexture SampleのUVsには結局最後まで何も繋がなかったです。

このTexture Sampleに入っているNormal Mapを見たらその理由は明白でした。

もう時間が無くなってしまったので今週のMaterialの勉強はここまでにします。

来週がGIMPを勉強してRGBAに望みのImageを追加する方法を解明します。

そして再来週にこのMaterialを実装します。

5. 戦闘システムの続きを作成する

今週は、Mapを別なProjectにMigrateする事で必要なものだけで構成されているProjectが作成出来るのか、そしてそのProjectからPackagingをした場合本当にPackagingした後のサイズは小さくなるのか試してみます。

5.1 Packagingについての復習

調べたら2022-10-23のBlogでMapを別なProjectにMigrateする事でSizeを小さくする方法について述べていました。

Unreal Engine 5 tutorial _How to Reduce your project size [7]にこのやり方が紹介されている。とだけ書かれています。

このTutorialを見たら本当にMapをMigrateする事しかやっていません。

更にAsset Cleaner – Project Cleaning ToolというAssetを使用すると使用していないAssetが消せる事も書かれていました。

後、Projectのサイズを小さくするための方法が紹介されたサイトや動画が何個か紹介されていました。

5.2 MapをMigrateしてPackagingをする

MapをMigrateするためのProjectを作成します。

当然5.1で作成します。

TemplateはBlankを選択し

Project名はMigrate Map Testにしました。

今度はProject、Combat Prototypeを開き以下の2つのMapをMigrate Map Test にMigrateします。

まずはCombatLevelをMigrateします。

以下のAssetが一緒にMigrateすると出てきました。

のAssetを同時にMigrateしました。

この一覧にMapであるAfter Combatは含まれていないのでAfter CombatもMigrateします。

以下のAssetが同時にMigrateされます。

出来ました。

今度はMigrateMapTestでGameをPlayしてみます。

まずCombat Levelを開きました。

普通にGameをPlay出来そうです。

やってみます。

なんとGameが始まりません。

Widgetが読み込まれていないみたいです。

WidgetそのものはMigrateされているみたいですね。

あ、Game Instanceを変えるのを忘れていました。

直しました。

もう一回試してみます。

今度は普通にGameが始まりました。

何か平均以上に後攻が出ます。

Stage 2を勝つのにいつもの2倍近い時間が掛かりました。

なんと、Stage10まで勝ち上がって、とうとうStage10のMonsterも倒す事が出来ました。

うーん。

一寸感動しました。

GameのPlayそのものに関しては何の問題も無かったです。

これを、先週やった方法でPackagingしてみましょう。

まずBuild Light Onlyを行います。

次にBuild All Levelも行いました。

また配置したActorがどっかにいってしまいました。

一回このLevelを閉じて開き直したら元に戻りました。

何なんでしょう?

この現象は?

Project Settingの設定をしていきます。

先週、やったのと全く同じ設定です。

これで全部の設定は完了したはずです。

Saveして以下の箇所からPackagingを行います。

大体10分ぐらいでPackagingが終わりました。

Windows Folderのサイズですが、

でした。

前回のWindows Folderのサイズが

という事を考えると、そんなにサイズの縮小に成功したとは言えませんね。

次にExe.fileからGameをPlayしてみます。

なんとStage 2で負けてしまいました。

特にGameをPlayしていて問題は無かったです。

Mapを別なProjectにMigrateしてPackagingするのは、出来ましたが、思ったよりサイズが小さくならなかったです。

5.3 次の予定をやる

Mapを別なProjectにMigrateしてPackagingする作業は予想に反して、簡単に終わってしまいました。

簡単に終わったのは良いですが、残念な事にPackagingした後のSizeも大して小さくならなかったです。

「戦闘システムの続きを作成する」の今週の予定していた作業はすべて遂行出来ました。しかし大した量はやっていないのでもう少しだけ何かします。

以下に先週決めた予定を示します。

この三週目の作業であるLevelを作り直すためのAssetの調査をする事にします。

まずLow PolyやStylizedしたEnvironment関連で以下のAssetを持っていました。

この中で特に使えそうなのが以下に示したStylized Egyptです。

ただ使用しているCharacterがStylizedされたLow PolyであったとしてもEnvironmentまでLow Polyにする必要もないので、Photo-realisticなEnvironmentも見ておきます。

これかな。ダントツで私が想像している魔法の修行場のImageに合致しています。

Multistory DungeonsをInstallする事にしました。

このMultistoryですが、どんな意味なのか知りません。

調べたらMultistorey Buildingで、一つの階に4つ以上の部屋があって、それが何階も連なっている建物。と説明されていました。

のでMultistoryじゃなくて、Multistoreyじゃないの?と調べ直したら、Multistoryと言う言い方もあってどっちが正しいのか分かりません。ただこのContextでは、沢山の部屋がある何層にも連なったDungeonと言う意味である事は間違いないでしょう。

そんだけ分かれば十分です。

せっかくなんで今日作成したMigrateMapTestの方に追加します。

こっちのLevelをPolishしていきます。

以下の様になりました。

空が明るすぎます。

Volumetric CloudとAtmosphere FogがLevel上に無かったです。追加します。

以下の様になりました。

これぐらいにしておきます。

5.4 空の調整をする

SkylightのReal Time CaptureにCheckが出来ません。

色々試したんですが直し方が分かりません。

仕方ないので一端、Sky関連のActorを全部消しました。

もう一回以下の様にSky関連のActorを追加しました。

今度はCheck出来るようになりました。

新しく作成した空を見ても特に問題は無いです。

これでOKにします。

Exponential Height FogのZの位置を調整します。

1000の時です。

霧は全く掛かって無いです。

10000です。

非常にうっすらとですが霧が掛かっています。

1000の時と比較して初めて気が付くぐらいの霧です。

20000です。

はっきりわかる位の霧が掛かっています。

30000です。

凄い霧です。

しかしまだ対戦相手の魔導士の姿は見えます。

40000です。

対戦相手の光っている部分以外はほとんど見えない位濃い霧になりました。

50000です。

完全に何も見えなくなりました。

1000に戻しました。

Exponential Height Fogがこのように使用するために作成されたのかどうかは分かりませんが、こんな事も出来るという事を示しました。

丁度いいので先週、復習したVolumetric Cloud関連の設定をここで試してみます。

まずはVolumetric Cloudに使用されているMaterialを変えてみました。

M_VolumetricCloud_02_Profiles_PaintCloudsを使用しました。

こんな空になりました。

MI_VolumetricCloud_02_Profiles_PaintClouds_Morningも試してみました。

あれ、雲が出来ませんね。

Materialの実装を確認したら以下のTextureは使用されていませんでした。

うーん。という事はこのMaterialをそのまま使用しても何も表示されないはずです。

先週は何で、このMaterialで雲が出来たんでしょうか?

雲のMaterialはDefaultに戻しました。

今度は、Volumetric CloudのLayer Bottom Attitude とLayer Heightを試してみます。

Layer Botton Altitudeの値を0にします。

雲の底が下に落ちてきました。

Layer Heightの値を10から1にしました。

雲の厚さが10km~1kmになりました。まっ平です。

Directional LightのParameterであるLight Shaftの値を調整してみます。

この2つはGod Rayに関係するParameterなので以下の様にDirectional Lightの角度を変更しました。

Light Shaft OcclusionにCheckを入れました。

いきなり地平線が現れました。

God Rayも所々に見えます。

今度はLight Shaft OcclusionのCheckを外してLight Shaft BloomのCheckを入れました。

画面全体が金色になりました。

Light Shaft Occlusion とLight Shaft Bloomの両方にCheckを入れてみます。

これは全然違う。

この二つはそのまま残しておく事にします。

Directional LightのAtmosphere and Cloudの以下の値を変更してみます。

まずこれらの値が変更できるようにCast Cloud ShadowsにCheckを入れます。

Checkがない状態です。

ある状態です。

雲の影が闘技場に投影され、闘技場が1割位暗くなりました。

その後、以下の値を弄ってみましたが変化があんまりよく分からなかったです。

のでDefault値に戻しました。

Cast Cloud ShadowsのCheckはそのままにしておきます。

後は、SkylightのCloud Ambient Occlusionです。

これが

こうなりました。

この2つのScreenshotを見比べるだけだとあんまりよく分からないですが、On、Offを繰り返すと雲の底の影が強調されているのが分かります。

あった方が雲の厚み感が増します。

これも残しておくことにしました。

今まで勉強したVolumetric Cloud関連で調整するParameterは以上です。

後、Material InstanceのParameterの調整もありますがそれは今回はやらないです。

現時点ではLevelは以下の様になりました。

もう少し改良出来る点はあるかもしれませんが、前と比較したら及第点は取れているでしょう。

取りあえずこれでOKとします。

来週からはMonsterのAnimationの追加をやります。

6. Gaeaの勉強

先週は、Gaea Tutorial for Beginners #1 | Intro to the series & Analyzing the Interface [8]を勉強する予定でしたが、GaeaのUIについての解説を自分で作成しました。

その理由は、今のVersion 1.3.2 CommunityのUIとこのTutorialで使用しているGaeaのVersionのUIが全く違うからです。

6.1 Gaea Tutorial for Beginners #1 | Intro to the series & Analyzing the Interface[8]と先週、自分でまとめたUIの使用方法を比較する

Gaeaでは以下の3つの方法でTerrainの作成が出来る事を説明しています。

今のVersionではGraph以外で作成する事は出来なくなっているはずです。

確認します。

今のVersionのStart画面です。

Graph、LayerそしてScriptの選択はありません。

LayerやScriptが今のVersionには無い証拠です。

<Interface>

Interfaceの解説です。

<<3D Viewport>>

まずは3D Viewportの操作方法の解説です。

TutorialではMouseの左ボタンを押す事でCameraを動かせると説明していますが、今のVersionではそのやり方ではCameraは動きません。

Alt+ Mouseの左ボタンを押しながらMouseを動かす必要があります。

MouseのWheelでZoom が出来るのは今のVersionでも同じです。

Mouse のMiddle Buttonを押す事でPanningが出来るのも、今のVersionでも同じです。

後、Tutorialでは解説が無かったですが、Space Keyを押すとTerrainがDefaultの位置に戻ります。

<<Menu Bar>>

次はMenu Barの解説です。

Tutorialでは以下の機能がMenu Barに存在しています。

これらの機能についてかなり分かりやすい説明が行われていました。

しかし今のVersionのGaeaのMenu Barは以下の様になっています。

Tutorialの説明をそのまま、当てはめられるのは0.5kとSaveの横にある+ボタン位です。

ただし、New、Open、Save、Redo、そしてUndoはどこソフトでも同じ事をしているので、全体としてはこの部分の機能を理解するのは難しくは無いです。

先週の私のこの部分の説明を読み直します。

今のVersionのMenu Barの機能に沿って、Gaea、Untitled.tor、0.5k、Auto、そして+について簡単な説明がしてありました。

New、Open、Save、UndoそしてRedoについては他のSoftと同じですと書いていました。

自分で書いて自分で読み直しての感想ですが、それなりに分かりやすい説明でした。

今、読み直して付け足して説明すべき事は、

以下に示した様に

Mouseを重ねるとそのButtonの機能が表示される事、

公式のサイト(https://docs.quadspinner.com/Guide/Interface/Getting-around.html)がある事

(ただし、今見た感じだとMenu Barの説明はあんまり分かりやすくなかったです。)

についてです。

Increment ボタンつまり+ボタンですが、その機能について以下の説明を行っています。

この機能、3D ModelのDesignではよく使う機能なんでしょうか?

正直、何に使用するためのものか分かっていません。

後、Tutorialでは以下の機能についても説明されていますが、今のVersionでは、これらのボタンは別な場所に配置されているので

私の説明はこれらのボタンの機能についてはここでは解説していません。

<Toolbox>

<<Toolbox>>

Toolboxの中のNodeと違いToolboxそのものは今のVersionとTutorialのVersionでほとんど同じなので、Tutorialの説明でしっかり理解する事が出来ます。

ただしこのTutorial、Toolboxの使い方は実際にNodeを使用してTerrainを作成する時に教えるので、今ここでは解説しません。と言って終わっています。

私の説明も基本的にはTutorialと同じです。

<<Node Graph>>

TutorialではNode GraphにToolboxからNodeを何個が選択して配置して、Terranが作成出来る事だけ示しています。

私はNode GraphのMenu BarやTool Barの機能も一応、説明しました。

これは蛇足だったかもしれません。

今、これらの機能を説明されてもNodeでTerrainを作成した事が無い人にはチンプンカンプンだからです。

と思ったらTutorialでも一応、Tool Barの機能について簡単な説明をしていました。

今のVersionはこれらのButtonはDefaultでは表示されていませんが、Node GraphのMenu Barの右端にある三本線をClickして以下のBoxを開き

Show Graph Toolbarを選択すると以下のBarが表示されます。

これらの機能は簡単に説明すると以下に示した、Nodeを右Clickした時に表示されるBox内の機能と同じで

どっちか使用出来れば十分ですし、Boxの機能を理解出来ればこのTool Barの機能についても大体理解できるようになります。

TutorialでNode Graph内の操作として、

  • Mouseの中ボタンを押した状態で、Mouseを移動するとPanning
  • Mouseの左ボタンを押した状態で、Mouseを移動すると四角が表示され、その四角内のNodeを全部選択出来る

の2つの機能が紹介されていました。

この機能については紹介するのを忘れていました。

Node Graphの右下にある以下のIconの機能についての解説です。

私はここで重要なのは

これだけと言ってこの機能だけしか説明していません。

Tutorialはそれなりにしっかり説明しています。

この部分の説明を今作成する事にします。

まず分かりやすいようにTemplateから開く事にします。

Gaeaを開いたらMountainからHero Mountainを選択します。

すると以下に示した様にNode GraphにはNodeが2つ表示されています。

Mountain ノードをClickすると以下に示した様にMountainノードが僅かに光ります。

更に以下に示した様に左端のProperties Panelに、選択したNodeのPropertiesが表示されるようになります。

このPropertyを色々弄ってみます。

結果です。

なんだこれは?

最初の状態に戻したい。となったとします。

その時に、先程の3つのIconの内の真ん中のIconを押します。

これでDefaultの値戻り、

ませんね。

あれ?

あ、間違えて覚えていました。

説明を読んだら、RefreshしてRebuildするって書いていました。

これはあれです。

Nodeって常にReal Timeで計算しているんじゃなくて、何かが新しくなったら計算し直すんです。だからごくまれに前のNodeの計算結果が変更されたけどそのNodeはそれを知らなくて前の古いDataの値を使用して計算している事が起きます。その時にこのForce Refreshを使用すると、新しいDataの値を使用して計算し直してくれると言う訳です。

うーん。

多分、これで合っているはずです。

私が前のNodeを更新して後ろのNodeが更新されなかった経験がまだ一回しかないです。のでこのIconの機能を試したことないです。だからこの解釈であっているのかどうか、本当の所は分かりません。

多分、あっているでしょう。

今、新しくGaeaのTemplateを開いたんですが、以下の様になって計算してくれません。

Nodeがあるにも関わらず

Terrainは平のままです。

これはちょうどいい機会なので、Force a Refresh Iconを試してみましょう。

押しました。

はい。しばらく計算してMountainのTerrainが現れました。

この解釈であっています。

最後の右端のIconですが、

これは選択しているNodeのSeedの値をRandomに変更します。

右上のIconについてですが、

先週は、+のIconの使用方法だけ説明して、残りのIconに関しては私も知らない。と言って終わっています。

一応、この部分の説明も作成しておこうと思います。

まずは以下に示したIconです。

機能的には先週勉強した+とほぼ同じです。

左Clickすると以下のBoxが現れ

New Graphを選択すると新しいNode Graphが追加されます。

その下に今まで作成したNode Graphの名前が表示され、選択するとそのNode Graphが表示されます。

次はAt のIconです。

選択すると以下のNodeが表示され選択したNodeを追加する事が出来ます。

試しにMountainノードを追加してみます。

Mountainノードを選択した状態でAt IconをClickします。

すると以下に示した様に

Mountainが追加されました。

でそれが何なんだという話ですが、

このMountainを選択すると、Node Graphのどこ場所にいてもMountainノードの所に飛んでくれます。

例えば今、Graph(1)のTextureノードを見ていたとします。

ここでMountainノードのParameterを確認したくなったとします。

そしたらMountainノードをいちいち探す必要があります。普通なら。

それをAt IconのMountainを選択すると

以下に示した様に、一瞬でMountainノードを示してくれます。

一種のBookmarkですね。

次の炎のIconですが、Bakeする時のResolutionを決定するという事以外何もわかっていないです。

というかこのBakeがいつどこで起きているのかが、まだよく分っていません。

BakeはすべてのNodeで行われているのか?とか、SaveしたProjectを開いたときには、Bakeは新しくし直しているのか?とかが、分かっていません。

のでこれ以上は語れません。

Gaeaの勉強に費やせる時間が終わってしまったので、最後の三本線のIconとSettingについては来週やる事にします。

6.2 分からない事の記録

以下に示したように、Nodeをある部分から選択して、

その部分のNodeを別のGraphに一発で移動させる方法があったはずです。

これを忘れてしまいました。

これも来週以降調べる事にします。

7. Houdiniの勉強

先週、公式のTutorialであるFOUNDATIONS | OVERVIEW [9]の勉強をしましたが、8分のTutorialの内、2分46秒の勉強で終わってしまいました。今週は最後まで終わらせます。

7.1 先週の復習

先週、何を勉強したのか既に忘れてしまっているのでその復習をします。

FOUNDATIONS | OVERVIEW [9]の内のThe Houdini Workspaceの勉強をしていたんでした。

このThe Houdini Workspaceが8分のTutorialでそのうちの2分だけ勉強したのが先週の内容でした。

まあ、良いです。

Houdiniを起動させて先週の復習を開始します。

まずCを押して以下のUIを表示しました。

こんなのも完全に忘れていました。

流石に一週間に一回の勉強で全部覚えておくのは無理があります。

この後、4つのSub画面を見た感想が書いてありました。

その後でTorusを作成しています。

同じ方法でTorusを作成しました。

今度はTorusのWireを表示しました。

四分割の画面の表示です。

Zoomした後で、4つの画面のTorusの位置がバラバラになってしまいました。

はい。

Defaultの位置への直し方を知りたいです。

次はNetwork Pane内から以下のUIを表示しました。

TorusのGeometry Levelに移動しました。

Tab MenuからLineを追加しました。

Display Pointを使用してPointを表示しました。

ま。復習したら全部思い出しましたね。

7.2 FOUNDATIONS | OVERVIEW [9]のThe Houdini Workspaceの続きを勉強する

いきなり以下のような6つのTorusをLineのPointを使用して作成しました。

うーん。

どうやったの?

速すぎて何をしたのか全然分かりません。

コマ送りで確認します。

まずLineの位置を少しだけ上げています。

Lineの位置の値を見ると以下の様になっていました。

Display Pointを解除してTorusだけを選択しました。

ここでModifyを選択しているみたいなんですが、見えない。

試しに自分のProjectでModifyを選択してみました。

こっちがTutorialのTool Barです。

うん。Modifyを選択していますね。

そしてCopy to Pointsを選択します。

ここからがよく分かりません。

この後、Lineを選択しますが、これ単に選択しただけなのかShiftを押して選択したのかが分かりません。

そしてEnterを押しているみたいです。

以上でした。

やって確認するしかないですね。

まずLineの位置を移動しました。

ModifyのCopy to Pointsを選択しました。

こんな結果になりました。

うーん。出来ない。

何回かやったら偶然出来ました。

うーん。

Network Paneが以下の様になっています。

これGeometry Nodeですよね。

Objectに戻したらTorusしかありません。Lineノードはどっかに行ってしまいました。

Tree Viewを開いたら以下の様になっていました。

LineはTorusのObjの中に移動したみたいです。

うーん。これは初めて見るHoudiniのProgrammingです。

一寸自分の力だけで読んでみます。

まずこのCopy to PointsノードがTorusをCopyしてLineのPointにPasteしているんです。

となるとそのCopy to Pointsに繋がっているTorusが形状をLineがPointをパスしているはずです。

CopyToPoints(Torus, Line_object(line));

という関数を実行しているのと同じ事をしているんです。

はい。理解出来ました。

TutorialのはTorusのPointsが大量に表示された状態です。

これを

を選択して

を選択して

消しています。

まず以下のIconですが、名前はGeometry Select Modeと言うみたいです。

右Clickしたら以下のBoxが表示されました。

ただし私のCopyしたTorusには最初からPointが表示されてないので、Primitivesに変更しても何も変化がないです。

それより早くNetwork PaneのCodeの説明をしてくれって思っています。

お、Network Paneに移動しました。

これから今、作成されたCodeについて解説してくるみたいです。

を追加して

Torusに色付けました。

おい!

それ違うだろう。

今の時点で今まで見たことがない作成されたCodeが存在しているんだから、まずそれを解説すべきだろう。なんでそれをしないで新たなNodeを追加するの?
Black BoxにBlack Box掛けたら益々訳分からなくなるでしょう。

あー。

こういう教え方するから、みんな理解出来なくなって「Houdiniは難しい。諦めた。」ってなるのね。

他のTutorialを当たるべきかもしれませんね。

一応、出来る所までやってみて考えます。

Network Pane上でTab Menuを表示しAttributeを選択してAttribute Randomizeを選択しました。

以下の様にAttribute Randomize ノードを追加しました。

結果です。

Torusの色が変わりましたね。

これでは本当に何も分からん。

ひょっとすると、このTutorialはHoudiniはこんな事出来ます的な紹介で、この後のTutorialでしっかり教えてくれるのかもしれません。

どんどん先を見てみます。

Copy to Pointsノードを選択して

Optionを選択しGlobal Seedの値を変更します。

色が変わりました。

今度はAttribrandomizeノードを選択した状態でAlt + 左ClickしてAttribrandomizeノードを複製します。

Attributeをpscaleに変更して以下の様に繋ぎます。

更にDistributionにあるMin ValueとMax Valueを以下の様にします。

結果です。

それぞれのTorusのサイズが変わりました。

これ、AttribrandomizeノードのAttributeの名前をPscaleにすると

Torusのサイズが元に戻ってしまいます。

という事はpscaleというParameterがあってその値をこのNodeで調整しているという事になります。

今度はPointJitterというNodeを追加しました。

PointJitterノードの以下のParameterを変更しました。

以下の様になりました。

今度はRBD Bullet Solverノードを追加して

地面に衝突させています。

やってみます。

Tutorial通りにやったら一応出来ました。

これって毎回同じように落ちるんでしょうか?

そうみたいですね。

今度は以下に示した様にLightを追加して影を付けています。

やってみます。

まずSmooth Shadingをします。

次にObject Levelに戻ってTorusを選択し

RenderのDisplay AsにSubdivision Surface/Curvesを指定します。

またSmooth Shadingを選択します。

Gridを追加しました。

Enterを押すと勝手にOriginに配置してくれるそうです。

試してみます。

GridがOriginに配置されました。

うーん。

以下の所からGridのサイズを100 x 100に変更しました。

Point Lightを追加しました。

画面が真っ黒です。

LightのIntensityを100にしました。

Torusが見えるようになりましたが、影がないです。

以下のIconにCheckを入れたら

影が現れました。

dを押して以下のBoxを示します。

Lightを選択してOverride Light Map Sizeの値を4096にします。

うーん。これどっちを選択してもダメじゃないですか。

Tutorialを見たらどっちも押さないで閉じていました。

何もしなくても変更した値は保持されるみたいです。

結果です。

以上でした。

これでFOUNDATIONS | OVERVIEW [9]のThe Houdini Workspaceは終わりでした。

7.3 FOUNDATIONS | OVERVIEW [9]のThe Houdini Workspaceを勉強した感想

流石にこれは単にHoudiniはこんな感じで使用します。と言う紹介で、これからずっとこんな感じで勉強させられる事は無いと思います。

この調子で勉強させられたら、Nodeの仕組みとかは何にも理解出来ないままになってしまいます。

確認のために次のTutorialであるPanesを見てみます。

7.4 Panesを勉強する

これはたった3分の動画なので最初に軽く全部見てみます。

見ました。

Paneの設定についての解説でした。

やっぱり非常に基本的な事しか説明していません。

これはNetwork PaneのNodeについては後でしっかりしたTutorialを勉強すると思っていて間違いないでしょう。

今、Nodeの説明が全然ないと慌てる必要は全くないと思われます。

あー良かった。

一応、PaneのTutorialもやっておきます。

試しにSquabと言うNodeを探して配置してみたら

Tutorialと同じMonsterがViewportに配置されました。

以下のButtonを押してScene Viewを拡大します。

一番下にあるTimelineは消えないんですね。

Tabの話とかしています。

これらは先週、自分で勉強したのでここで説明される範囲の事は既に理解しています。

以下の三角のIconを押すとPaneに関係する機能が使用出来るBoxが表示されます。

これは先週は勉強しませんでした。

以下の3つのIconの機能を説明しています。

このIconの機能はこのTutorialの勉強をする前に散々遊びで使用していたので、既に理解していました。

Tutorialでは以下のようなWindow表示を作成して

DefaultとしてSaveしようとしています。

いやそれ真似して元の標準のWindow形式に戻れなくなったらどうしたら良いですか?

一寸この部分は自分でやるのは止めておきます。

以下のBuildで色々なWindow形式を選択できるそうです。

Technicalを選択しました。

以下の画面に変わりました。

Radio Buttonつまり以下に示したUIも違うと言っていました。

うん。

全く同じじゃね。

あ、分かりました。

これはBuildの隣にあるMainの話でした。

Mainを開くと以下に示したようなBoxが現れ

例えばOceanを選択すると以下に示したようなRadio Buttonが表示されます。

こういうUIをRadio Buttonと呼ぶのに一寸抵抗があるんですが、一般的な名称何でしょうか?

調べたら以下の様な形状しか出て来ませんでした。

以上でした。

うん。

これくらいの内容が最初のTutorialとしてはまあ無難でしょうね。

7.5 View Toolsを勉強する

流石にこれだけだと一寸短い気がするのでもう少しだけ勉強します。

次のTutorialであるView Toolsを見ます。

何を勉強するのかと思ったらViewportの操作方法についてでした。

うーん。

一番嫌いなヤツです。

まあ勉強しない訳にもいかないのでやりますか。

<Tumble、Track、Dolly>

この操作方法を表す単語は初めて聞きました。こっから調べることにします。

まずTumbleですが、回転しながら落ちる事を指すそうです。

Mouseの左Clickで出来ます。

これってObjectをLockしてカメラがそのObjectの周りをまわるやつです。

Tumbleと言う言い方がどれだけ一般的なのかは不明です。

Trackです。

MouseのMiddleボタンを押す出来ます。

これはPanningの事ですね。

画面がそのままSlideして動きます。

Dollyです。

まずDollyの意味ですが、以下に示した様に台車と言う意味がありました。

映画産業でこの台車の上にカメラを載せて撮影したのが由来で、

以下に示したようなレールの上を走るカメラで撮影したのとDollyというようになったそうです。

ふーん。勉強になりました。

Mouseの右Buttonです。

これはZoomでした。

調べていたらThe 16 Types of Camera Shots & Angles (Video Guide) [10]に色々なCameraの動かし方が載っていました。

DollyはZoomとは全然違うみたいです。

うーん。でもこのサイトに紹介されている例を見ても同じにしか見えません。

Trackの解説です。

分かりました。

カメラ自体の位置を移動しないで撮影した場合がZoomやPanで、カメラ自身が移動して撮影した場合はDollyやTrackになるんです。

これだわ。

Tumbleはこのサイトにも無いですね。

見つけました。

このサイト[11]に以下の分かりやすい図が書かれていました。

これ何のサイトなのかすらよく分からないんですが、このCameraの動きの説明はこれ以上ないくらい分かりやすいのでそのまま引用させてもらいました。

要するにCameraが対象物(原点?)に対して回転して撮影するのがTumble、前後に動いて撮影するのがDolly、上下左右に動いて撮影するのがTrackになる訳です。

完璧に理解しました。

Camera Viewを選択していない時でも

AltかSpace Barを押しながらMouseで同じ操作をするとTumble、Track、Dollyが行えます。

<Space Bar + AもしくはSpace Bar + G>

Space Bar + Gで選択しているObjectにFocusした位置にCameraが移動するそうです。

Space Bar + Aで全体を移す位置にCameraが移動するそうです。

試してみます。

以下の様にObjectを3体配置してみました。

Squabを選択した状態でSpace + Gを押してみます。

Squabだけを映すようになりました。

Space + Aを押します。

この画面に戻りました。

今度はCragを選択しました。

Space + Gを押します。

Gragだけ映すようになりました。

全然関係ないですが、Houdiniの座標はYが上です。

結構びっくりです。

Alt + Gでも同じ事が出来るか試してみました。

以下のWindowが開かれました。

出来なかったです。

これぐらいで今週のHoudiniの勉強は終わりにします。来週はView Toolsの続きを勉強する事にします。

8. Volumetric Cloudの勉強内容をまとめる

先週、今までのVolumetric Cloudの勉強内容をまとめていたら、以下にあるSample Mapを使用すると

Paint用のWidgetが正常に作動する事を発見しました。

このPaint用のWidgetを使用すると

が可能な気がします。

今週はこれを確認します。

8.1 Paint_Cloudで雲を作成

今、Paint_Cloudを開いて見たら以下の様になっていました。

Load Buttonを押したら以下の様なError Messageも出て来ました。

以下に示したのが私がUnreal Engine Volumetric Paint Clouds Tutorial [12]に載っていたやり方で作成したPaint用のMapのWidget表示です。

はい。

全く同じでした。

という事は、先週の

は間違いという事になります。

まあでも100%先週の判断が間違っていたと言うのも言い過ぎで、私が作成したPaint用のMapは最初は以下に示したようなWidgetだったので

以下に示したPaint_CloudのWidgetと比較したら

Widgetが全部正常に作動しているような気になってしまうのも仕方ない部分があります。

更に言うと以下に示したようなPaintが名前にあるMaterialしか雲を表示しませんでした。

以下に示したM_VolumetricCloud_03_MultipleProfiles…のMaterial達は雲を表示する事は無かったです。

つまりこれらのMaterialはまた別の目的のために使用するという事です。

まだVolume Cloudには謎が多いです。

8.2 Volumetric CloudのTutorialの構成について

結局、先週夢見たPaintで作成した雲をSaveして自在に使用する方法を教えるTutorialを作成する事は無理と分かりました。

ので前からの計画である以下のTutorialを作成する事にします。

8.3 Volumetric Cloudについての状況をUser目線で整理する

この章の目的は、UE5でGameを作成している人達にVolumetric Cloudの使用方法を理解してもらえるようなTutorialを作成する事にあります。

そこでUE5のUser目線でVolumetric Cloudの何が知りたいのか、何処を直したいのかなどについて検証します。

まずVolumetric Cloudそのものについて知らないUserが大半だと思うので以下のような説明をします。

<Volumetric Cloudとは>

Third Person TemplateでProjectを作成すると以下のようなLevelが表示されます。

雲が真ん中で2つに切れているやつです。

OutlinerでVolumetric Cloudを探し、

目のIconをClickして閉じると

以下に示した様に

今まで表示されていた雲が一気に消えました。

この雲がVolumetric Cloudです。

ここでUserの興味を引くために以下のような超上空からVolumetric Cloudを撮影した映像を見せるのも良いかもしれません。

<Userが知りたい事>

ここが私の興味のある所と一般にUEでGameを作成している人の違う所で、私の興味は

  • どうやってVolumetric Cloudが作成されているのか
  • 使用されているMaterialの実装
  • PaintとかPlaceなどのPluginにあるVolumetricの使用方法について

などですが、一般にUEでGameを作成している人の興味は

  • Gameに使用するにはどうしたらいいのか
  • もっと質の高い雲を表示したい。(Assetを買ってもいい)

である感じがします。

なのでTutorialを作成するなら、

  1. これよりも質の高い雲の作成方法を教える。
  2. このTutorialはVolumetric Cloudについて理解するのが目的で、Gameに使用したり、質の高い雲を作成したりするのが目的ではありません。と明言する必要があります。

のAかBを選択する必要があります。

となるとやっぱりAを目指すしかなくなります。

うーん。よし分かりました。

8.4 今までVolumetric Cloud関連で使用したParameterの調査

まずVolumetric Cloud関連のParameterについての説明からやります。

これは、今週の戦闘システムの所でも少しやりましたが、しっかりここで整理します。

まず今までのTutorialで使用したparameterを以下に示します。

<Volumetric Cloud>

  • Layer Bottom Attitude
  • Layer Height
  • Use per Sample Atmospheric Light Transmittance

<Directional Light>

  • Light Shaft Occlusion
  • Light Shaft Bloom
  • Atmosphere and Cloudの欄全部
    • Cast Cloud Shadowsとその関連
    • Cast Shadows on Clouds
    • Cast Shadows on Atmosphere

<Skylight>

  • Atmosphere and Cloudの欄全部
    • Cloud Ambient Occlusion

以上でした。

今週はこれらの機能について調べてここにまとめます。

8.5 Volumetric Cloud関連で使用したParameterの機能について

以下にParameterの機能をまとめます。

と思ったんですが、戦闘システムの所で既にやっている箇所もあります。やっていない箇所だけ調べます。

完全にまとめるのは来週にします。

<Volumetric Cloud>

まずVolumetric Cloudそのものですが、知っておくべきParameterは以下の3つです。

<<Layer Bottom Attitude >>

これは戦闘システムの所でまとめました。

<<Layer Height>>

これも戦闘システムの所でまとめました。

<<Use per Sample Atmospheric Light Transmittance>>

これです。

こんな解説がありました。

うーん。これって重要なんでしょうか?

使用しても差があんまり分からないです。

使用前です。

使用後です。

このParameterは2022-07-18のblog によるとBen Cloward先生のVolumetric Clouds - Building Worlds In Unreal - Episode 32 [13]で勉強したみたいです。

2022-07-18のblog には

こんな解説がありました。

この解説の言っていることはよく分からないんで、もう一回Volumetric Clouds - Building Worlds In Unreal - Episode 32 [13]の解説を見ます。

以下の箇所からTranscriptを表示させます。

表示したTranscriptからUse per Sample Atmospheric Light Transmittanceを探すと

18:01にありました。

Tutorialのその辺を見るとこのParameterの意味が分かりました。

まずここでSampleと言っているのは多分Objectの事でしょう。

そうすると以下のような意味になります。

まず全てのObjectがLitされるときにある値を使用します。

その値はすべてのObjectで同じ値が使用されています。

ところがこのParameterにCheckを入れると、それぞれのObject毎に違う値を使用してLitを計算するようになります。

はい。こういう意味でした。

Tutorialの例ではこのParameterにCheckを入れた場合と入れない場合は結構違っていました。

試しに太陽を雲の後ろ側に移動してみました。

無い場合です。

ある場合です。

ある場合の方が雲の端が白くなります。

ただBen Cloward先生なんかは、無い方が綺麗じゃない。と言っています。人それぞれでしょう。

<Directional Light>

Directional Light内のParameterでVolumetric Cloudに関係しているParameterは、Light Shaft Occlusion、Light Shaft BloomそしてAtmosphere and Cloudの欄にあるParameter全部です。

<<Light Shaft Occlusion>>

これは戦闘システムの所でまとめました。

<<Light Shaft Bloom>>

これは戦闘システムの所でまとめました。

<<Atmosphere and Cloudの欄全部>>

この欄の中で特に重要な以下の3つについて解説します。

<<<Cast Cloud Shadowsとその関連>>>

これは戦闘システムの所でまとめました。

<<<Cast Shadows on Clouds>>>

このParameter、DefaultでOnになっています。

のでOnのままでいいでしょう。

<<<Cast Shadows on Atmosphere>>>

このParameterもDefaultでOnになっています。

<Skylight>

Sky LightでVolumetric Cloudに関係するParameterはCloud Ambient Occlusionだけです。

<<Atmosphere and Cloudの欄全部>>

<<<Cloud Ambient Occlusion>>>

これは戦闘システムの所でまとめました。

8.6 DefaultのVolumetric CloudのMaterialに使用されているm_SimpleVolumetricCloud_Instの親Materialである m_SimpleVolumetricCloudを改良して好きな形状の雲を作成する

やっぱりUE5のUserからしたら「自分が望む雲の形状を作成したい。」と言うのが一番の望みでしょう。

その方法をここにまとめます。

まずVolumetric Cloud専用のProjectを作成します。Volumetric Cloud Testと名付けました。

このProjectを開いて新しいLevelを作成します。

以下の様になりました。

この雲の形状を変更します。

まずこの雲をはるか上空から見ると以下の様になっています。

これが平面の雲の形状です。

更に、雲を正面から見ると以下のような形状になっています。

これらは、Volumetric CloudのMaterialにセットされているm_SimpleVolumetricCloud_Instの

親Materialであるm_SimpleVolumetricCloudの

以下の部分示した実装の

Texture Sampleノードで指定されています。

この①のTexture SampleにセットされているCloudWeatherTexture

の以下に示したRのImageが

以下に示した様に雲の平面の形状を作成しています。

雲の正面のImageは以下に示したCloudWeatherTextureにセットされているGのImageと

②のTexture SampleノードにセットされているCloudGradientTextureの

以下に示したImage

で以下に示したような形状が形成されます。

こっちは少しだけ複雑です。

今回はやり方の説明じゃなくて、実際にやってみてその結果を載せる事にします。

Texture Sampleの①に以下のImageを作成しました。

Texture Sampleの②に以下のImageを作成しました。

これで雲を作成します。

以下のような雲が形成されました。

上空から見ると以下の様になっています。

Texture Sampleの①にセットしたImageのRのImageと同じ形状です。

正面から見た場合です。

キノコ上の形状になっています。

これはTexture Sampleの①のGのImageとTexture Sampleの②のImageから製造されています。

少しだけ離れた所から撮影しました。

今週は2枚のTextureのImageを変える事で雲の形状をある程度変更出来る事を示しました。

もう少し具体的な内容は来週以降詰めます。

9. DirectXの勉強

OlympusMonsTutorials氏のC++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [14]の勉強をします。

その後で「DirectX 12の魔導書」、「HLSLシェーダーの魔導書」と「Direct3D 12 ゲームグラフィック実践ガイド」を勉強します。

9.1 C++ DirectX 12 Game Engine - [S01E02] - Refining Our Window[14]を勉強する

まず前のTutorialで作成したFile一式をDuplicateしてEpisode2と名付けています。

<Episode Two Folder>

丁度いいので2023年の勉強用のFolderにDuplicateしました。

<A Windows Process>

DuplicateしたFileにあるSlnを実行します。

開かれたVisual Studioを実行します。

結果です。

普通に動いています。

このWindowを閉じようとしてxのIconを押します。一見Windowは閉じたように見えますがProgramはBackgroundで動き続けています。

Tutorialによるとその理由は以下に示したCodeに理由があるそうです。

これって去年の最後の方で日本語の3つの教科書で勉強してたやつじゃないですか。

何をやっていたのか確認します。

まずDirectX 12の魔導書ですが、2022-12-04のblogで以下の実装を作成しています。

しかしこの実装がどんな機能を持っているのかは全く分からない。ただ本にそうやって書けと言われたから書きました。とだけ書いています。

2022-12-12のBlogDirect3D 12 ゲームグラフィック実践ガイドの「2.2 アプリケーションクラスの作成」にWindows Procedure()関数の機能についての説明が書いてあったと書いてあります。

それによると

となっています。

それじゃ、以下に示した様に、WNDCLASSEX.lpfnWndProcにこの関数を実装して使用する必要があるんじゃないの?

となって C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [15]の実装を確認しています。

その結果、

しかなくて、しかもDefWindowProcが何なのか何処にも指定していない事に困惑しています。

HLSLの魔導書のSample CodeもWindow Procedure()関数を使用してないはずと確認しています。

するとHLSLの魔導書では、以下に示した様に

しっかりWindow Procedure()関数を実装していました。

成程ね。

C++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [14]でも、ここでWindow Procedure()関数を実装するんでしょうね。

その前にDirect3D 12 ゲームグラフィック実践ガイドの「2.2 アプリケーションクラスの作成」のWindow Procedure()関数についての説明を読み直しましょう。

以下の図がとても分かりやすいです。

Direct3D 12 ゲームグラフィック実践ガイドの2.2 アプリケーションクラスの作成、図2.8 ウィンドウシステムの概略より

この図に基づいて、先程のWindowに表示されているX Buttonを左Clickした場合を考えてみます。

まずX buttonを左Clickした訳ですが、この図の右端のキーボード、マウスなどからEventが発生したのと同じ事が起きたはずです。

するとWindow OSに通達が行きます。

はい。

そしてMessage Queue にWindowに表示されているX Buttonが押されたよ。と言うWindow Messageが追加されます。

その通知をWindow Procedureに通知します。

しかしC++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [14]ではまだ、Window Procedureを実装していないので、ここでProgramを終了しろ。と言う命令をWindow OSに発する事は出来ません.

のでWindowは閉じてもProgrammingはBackgroundで動き続けます。

はい。

大体こんな感じでしょう。

C++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [14]の勉強に戻ります。

まず以下の関数を追加します。

やっぱし。

と思いましたが、結構細部は違います。

まず関数の名前が、WindowProcedureではなくWindowProcessになっています。

Tutorialの解説によるとこの名前は何でも良いそうです。

まあ、ここで関数そのものを作成しているのならそうなりますね。Overrideした場合は違いますが。

この関数はLResult型を返します。

ので、以下に示したDefWindowProc()関数を返す事にしたそうです。

この部分は他のTutorialでも同じはずです。

確認します。

DirectX 12の魔導書」の場合ですが、

同じ関数を返しています。

ただParameterの名前が違うのもありますね。この辺の細かい違いは後で確認します。

「HLSLシェーダーの魔導書」の場合ですが、

こうなっていました。

後、ここで使用されているParameterですが、

WindowProcedure()関数の方で定義されていました。

あれ?

「HLSLシェーダーの魔導書」でもMsgProc()関数と言う名前の違う関数になっていますね。WindowProcedure()関数と言う言い方は一般的じゃないのかもしれません。

まあここでは、MsgProc()関数もWindowPrcess()関数もWindowProcedure()関数と呼ぶ事にします。

まあ、その辺はやっていく内に理解出来るでしょう。

もう一回、C++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [14]のWindowProcedure()関数を確認します。

はい。他のWindowProcedure()関数と全く一緒です。

次にCALLBACKについて解説しています。

CALLBACKは関数のLogicを変更する能力を持たせると言っています。

うーん。

CALLBACKが何をするのか全く覚えていません。調べます。

調べたらCALLBACKそのものの定義は沢山出てきたんですが、関数の宣言部分にCALLBACKと書く理由について解説しているSiteは見つかりませんでした。

というか関数のこの部分で宣言しているモノの一般的な名称自体忘れてしまっています。

のでこれはまた後で調べます。

それぞれのParameterについて解説しています。

最初のParameterであるHWND hWndですが、

Window HandleのCopyだそうです。

2番目のParameterですが、

Message型のParameterだそうです。

このParameterはWindow Close Message型だったり、Window Resize Message型だったりするそうです。

三番目と四番目のParameterは

このMessageのArgumentだそうです。

この値によってMessageの受け取られ方を変更する事が出来るそうです。

何!!

これって結構重要な情報です。

次に以下のCodeを追加しました。

もしmessageがWM_DESTROYだったらPostQuitMessage(0)を実行しろ。という事ですね。

これがProgrammingの実行を終了するためのEventを発生させるんでしょうか?

そして以下に示した様に.lpfnWndProcにこの関数を指定しています。

そして、もう一回Programmingを実行してWindowを開き

Windowの右端にあるX Buttonを押してWindowを閉じています。

そして今度は、Windowが閉じた時に、同時にProgrammingの実行も終了しました。

うーん。

成程、WindowProcedure()関数がどんな働きであるのかよく分かりました。

よく理解しているうちに自分のProjectの実装もやってしまいます。

まずは以下の関数の枠組みを作成しました。

次に以下の実装を追加しました。

これでWindowを閉じた時にProgramの実行も止まるためのEventが発生するはずです。

最後にwcex.lpfnWndProcにこの関数をセットします。

これで完成のはずです。

テストしてみます。

実行しました。

普通にWindowが表示されました。

それではWindowの右端にあるXのIconを押します。

Windowが閉じただけではなくProgramも終了しました。

出来てます。

ここでキリがいいので今週はここまでとします。

9.2 DirectX 12の魔導書を勉強する

去年書いたCodeから推測すると「3.2.1 ウィンドウの生成」の途中までやったようです。

今週は、Windowを表示させる所までやる事にします。

まず以下に示したShowWindow()関数を追加します。

Windowが表示されました。

この実装の解説の所には一瞬だけWindowが現れて消える。と書いてありましたが、私のはずっと残っています。

多分以下のCodeのせいだと思います。

Comment outしてしまいましょう。

う。

Comment outするためのShort Cutを忘れてしまいました。

月日の経つのは早いです。

Visual Studioを毎日のように触っていたのはもう何年も前の事になりました。

調べたらCtrl + K + Cでした。

今度はWindowは一瞬だけ表示されて消えました。

Message Loopを追加します。

結果です。

今度はWindowはずっと表示されていました。

Windowを閉じるとProgramの実行も止まりました。ただし開いたConsoleは閉じません。

まあ出来てはいます。

開いたConsoleが閉じないのは、Visual Studioの設定によるせいでしょう。

うーん。

Codeを一寸だけ読んでみます。

MsgにMessageをパスしてそれが、うーん。分からん。特にRM_REMOVEが分からん。

PeakMessage()を調べます。

公式のPeekMessageA function (winuser.h) [16]に詳しい説明がありました。

まずPM_REMOVEですが、

QueueにあったMessageは消されるそうです。

そんだけでした。

Return Value

0か0以外が返されるそうです。

C++では0以外がTrueで0がFalseだったはずです。

となるとMessageがある限り最初のIfはTrueになりますね。

TranslateMessage()関数は何をしているんでしょうか?

今度はこれを調べます。

公式のSiteのTranslateMessage function (winuser.h) [17]に解説がありました。

要するにこれでMessageが人間にも読めるようにしているんでしょう。

あ、分かった。

これ人間に読めるように変換するんじゃなくて、WindowProcedure()関数に読めるように変換しているんです。

となるとDispatchMessage()関数は翻訳したMessageをWindowProcedureに送る役割をしているはずです。

一応、確認します。

公式SiteのDispatchMessage function (winuser.h) [18]をみると

やっぱりそう書かれていました。

そしてもしmsg.messageがWM_QUITだったらLoopを中止してWindowを閉じるわけです。

うーん。

成程。

あれ?

他のTutorialはどうやってWindowを表示し続けていたんでしょう。

いやWindowを表示し続けるのは出来るかもしれませんが、

TranslateMessage()関数やDispatchMessage()関数を使用しないでどうやってMessageをWindow Procedureに送っていたんでしょうか?

確認します。

C++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [14]の場合です。

思いっきり同じ事していました。

むー。

全く覚えていなかったです。

この事をC++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [14]ではMessage Eventと呼んでいたんですね。

HLSLシェーダーの魔導書の場合も以下に示したようなほとんど同じCodeがありました。

うーん。でもこの実装だとmessageがWM_QUITじゃなくてもmessageが無くなったらLoopが終わってしまいます。

ので完全に同じではないですね。

Direct3D 12 ゲームグラフィック実践ガイドはまだここまで勉強していないはずです。

はい。

今週の「DirectX 12の魔導書」の勉強は、3.2.1ウィンドウの生成を最後まで読み、所謂Message Eventと呼ばれる機能について勉強しました。

9.3 HLSLシェーダーの魔導書を勉強する

「HLSLシェーダーの魔導書」はどこまで教科書を読んだのか忘れてしまいました。

それから調べます。

思い出しました。

「HLSLシェーダーの魔導書」はWindowの作成方法の説明が無くて、いきなりDirectXを使用して三角形を表示する所から始まっているので、他の教科書がDirectXの話をするまでPendingしていたんです。

はい。

それじゃ今週も「HLSLシェーダーの魔導書」の勉強はお休みですね。

9.4 Direct3D 12 ゲームグラフィック実践ガイドを勉強する

今週は「2.2 アプリケーションクラスの作成」を読みます。それだけやります。

まず軽く全部読みました。

Win32(Windows API?)を使用したWindowの作成方法について解説しています。

他の教科書と違うのは、App Classを作成してそこでWindowの作成を処理している所です。

つまりMain()関数からはApp Class呼び出しているだけになる実装形式を取っています。

最初、何をしているのかよく理解出来なくて混乱しました。

以下の方法で勉強する事にしました。

まずこのApp Classの構造についてまとめます。

次にこのApp Classの中でどうやってWin32 でWindowを作成するための実装が行われているのかについてまとめます。

最後に、Windowを作成するための実際のWin32の実装を他の教科書の実装と比較してどうなのかを検証します。

<App Classについて>

最初に何でApp Classを作成するのかについて説明がされていました。

簡単にその説明をまとめると、

Windows APIを用いてWindowを作成する方法はどのAppでも全く同じなので、一回クラス化してしまえば、全部のAppでそのクラスを呼び出すだけでWindowを作成出来るので後が楽。」

という事でした。

うーん。ひょっとして「HLSLシェーダーの魔導書」でWindowの作成方法についての解説が載ってないのはこのせいなの?

Windowsの作成方法を何年も前にClass化してしまってそれを呼び出しているだけだから、説明する必要も感じてないし、逆に説明しろって言われても既に細かい点は忘れてしまった。って感じなのでしょうか。

確認します。

「HLSLシェーダーの魔導書」のSample Codeを見ましたが、windowを作成するためだけのClassを作成しているという感じではなかったです。

まあ良いです。

Direct3D 12 ゲームグラフィック実践ガイドの勉強に集中します。

App Classの構造は簡単に言うと以下の様になっているみたいです。

  • 初期化
  • Messageの取得
  • そのMessageをWindow Procedureに送る

この初期化で、Window Classを作成したり、CreateWindow()関数を作成したりするんでしょうか?

Messageの取得とそのMessageをWindow Procedureに送るのは、他の教科書では、以下のような実装で一緒にやってしまっています。

敢えて分ける必要あるんでしょうか?

それともこの部分とは違う所の話なんでしょうか?

後、この中ではWindowProcedure()関数の話は出て来ませんね。

この関数は、Window Classを作成する時に使用されるので初期化の工程に含まれているんでしょうか?

続きを読みます。

<App Classの中のWindowを作成するための実装について>

App ClassのPublic なMember Functionは以下の3つだけでした。

これ実際に使用する関数はRunだけじゃない?

と思っていたら以下の様にPrivateなMember Functionがありました。

これ初めて見た時、Termって何?ってなったんですが、Terminationの略みたいで、終了時に呼び出すための関数でした。

後は、その名前から何をするための関数であるか想像つきます。

今度は実装を見てみます。

Run()関数の実装です。

MainLoop()関数の実装が分からないと何をしているのか分からないですね。

InitApp()の実装です。

InitWnd()関数を呼び出しているだけですね。

うーん。

入れ子構造過ぎないでしょうか。

まだWindowを作成するための実装が現れません。

やっとInitWnd()関数の実装が出て来ました。

Window Classを作成していますね。

Window Procedure()関数はどうでしょう。

以下に示した様にWc.lpfnWndProcにはWndProcを指定しています。

今の所、このWndProc()関数については何の解説もないです。

CreateWindow()関数もここで使用していました。

続きを読んでいたら、いきなりWndProc()関数の実装が載っていました。

WndProc()関数に関する説明が無くていきなり感がありました。

次がMainLoop()関数です。

ここではWindow ProcedureにMessageを送るためのおなじみの実装がありました。

やっぱり一体化していました。

最後にMainからApp Classを使用してWindowを作成する時の実装が載っていました。

非常にスッキリです。これならWin32を全く知らない人でも使いこなせます。

<実際のWin32の実装を他の教科書の実装と比較>

これは実装が終わってからやります。

それよりもApp Classの使用に対しての感想をまとめる事にしました。

<App Classを使用する事に対しての感想>

App Classを使用する事で、Win32を知らない人でもWindowの生成が出来るようにしたのは、凄いと思います。

しかしApp Classの実際の構成が最初の構想とかなり違う気がします。

これってそういうもんなんでしょうか?

何か納得できない気持ち悪さを感じます。

まあ、実際に実装してみてたら又感想が変わるかもしれません。

App Classの実装は来週やる事にします。

10. まとめと感想

今週は、量をSaveしながら勉強したので先週のようにやり過ぎて時間が無くなってしまったという事は無かったです。量はこれぐらいが丁度いい感じです。

後、前文を書く時間がまだないです。

前文を書く事こそが、私の楽しみなので、近い内に必ず復活させます。

11. 参照(Reference)

[1] Klaus. (2022, May 21). How To BUILD AN ISLAND In 20 mins | Unreal Engine 5 Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=Obfq-Zh3iXs

[2] Sky Light. (n.d.). Unreal Engine 4.27 Documentation. https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/LightingAndShadows/LightTypes/SkyLight/

[3] renderBucket. (2022, April 28). Unreal Engine 5 Tutorial - Niagara Fluids - Flamethrower [2/2] [Video]. YouTube. https://www.youtube.com/watch?v=28YFVQjgwbA

[4] renderBucket. (2022b, December 4). Unreal Engine 5 Tutorial - Shading Niagara Fluids - Honey [Video]. YouTube. https://www.youtube.com/watch?v=iHxNQE9n_Gw

[5] Zhang, C. & Xue, Daqing & Crawfis, Roger. (2005). Light propagation for mixed polygonal and volumetric data. CGI: Proceedings of the Computer Graphics International. 249- 256. 10.1109/CGI.2005.1500434.

[6] Ben Cloward. (2022b, October 13). Rock Shader - Advanced Materials - Episode 3 [Video]. YouTube. https://www.youtube.com/watch?v=Q2XI8cuSBMk

[7] Unreal ART - Unreal Engine tutorials. (2022, August 20). Unreal Engine 5 tutorial _How to Reduce your project size [Video]. YouTube. Retrieved October 18, 2022, from https://www.youtube.com/watch?v=h8BhgG6MEnM

[8] Andrea Cantelli. (2020a, May 21). Gaea Tutorial for Beginners #1 | Intro to the series & Analyzing the Interface [Video]. YouTube. https://www.youtube.com/watch?v=fX1PJNvl8c0

[9] Magee, R. (n.d.). Foundations | Overview | SideFX. https://www.sidefx.com/tutorials/foundations-overview/

[10] The 16 Types of Camera Shots & Angles (Video Guide) | Boords. (2023, January 11). boords.com. https://boords.com/blog/16-types-of-camera-shots-and-angles-with-gifs

[11] Alias Help. (n.d.). http://desprod.dmu.ac.uk/alias_2010/index.html?url=WS73099cc142f48755360aa6ed11a9c1effaa-69e6.htm,topicNumber=d0e7382

[12] Zero Conditional. (2021, March 2). Unreal Engine Volumetric Paint Clouds Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=SlR3eDr4jQc

[13] Ben Cloward. (2021, May 27). Volumetric Clouds - Building Worlds In Unreal - Episode 32 [Video]. YouTube. https://www.youtube.com/watch?v=dolfk2z4LDo

[14] OlympusMonsTutorials. (2021, March 3). C++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [Video]. YouTube. https://www.youtube.com/watch?v=rWylZKi8QbM

[15] OlympusMonsTutorials. (2021, February 17). C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window. YouTube. https://www.youtube.com/watch?v=2vrEIhAajhM

[16] PeekMessageA function (winuser.h) - Win32 apps. (2022, August 23). Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-peekmessagea

[17] TranslateMessage function (winuser.h) - Win32 apps. (2022, August 4). Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-translatemessage

[18] DispatchMessage function (winuser.h) - Win32 apps. (2022, July 28). Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-dispatchmessage

UE5の勉強 -LandscapeのみのGameを作成する-

1. 今週の予定

今年から以下の内容を勉強します。

  • LandscapeのみのGameを作成する
  • Niagaraの勉強
  • Materialの勉強
  • 戦闘システムの続きを作成する
  • Gaeaの勉強
  • Houdiniの勉強
  • Volumetric Cloudの勉強内容をまとめる
  • DirectXの勉強

2. LandscapeのみのGameを作成する

2.1 LandscapeのみのGameを作成する理由

RPGを一から作成していたら永遠に終わらない事に気が付きました。

なので、LandscapeだけのGameをまず作成します。これを完成させます。

これが完成したら、これに

  • 戦闘システム
  • Monsterの配置
  • NPC
  • UI
  • Save機能
  • Story

などを追加していきます。

それぞれを追加する度に、Gameを完成させます。このやり方だったらいつでも完成できます。このやり方でRPGを制作する事にします。

2.2 LandscapeのHeight MapとMaskをGaeaで作成する

Klaus氏のGaeaのTutorialならどれでも良いんですが、今回はHow To BUILD AN ISLAND In 20 mins | Unreal Engine 5 Tutorial [1]を参考にしてLandscapeを作成します。

軽く全部見ました。

TextureをApplyするところで別なGraphを作成していませんね。これKlaus氏のTutorialで最も納得した部分だったんですが、止めてしまったんでしょうか?

LandscapeのMaterialは先に作成しておいた方が良いみたいですね。これ後からLandscapeのMaterialを作成してそれぞれのLayerとMaskを対応させる事も出来るのですが、そのやり方を調べるのが面倒です。4つのLayerのあるMaterialを先に作成しておく事にします。

Water systemも使用していました。

これは一寸復習しないとどうやって使用するのか分からないかもしれません。

それでは作成します。

Islandノードをセットします。

Edit Islandを選択して

Paintします。

以下のボタンを押すとPaintした部分を消す消しゴムになります。

Terrainで表示します。

これにDistance ノードを追加します。

DistanceノードもTerrain表示に変更します。

TutorialではFalloffの値が19%になっているので同じにしました。

結果です。

表面にRoughnessを追加するためにWarpノードを追加します。

結果です。

うーん。

ざらつきが見られるくらいの変化しかないですね。

Sizeを6%にしました。

結果です。

うーん。

かなりざらつきが出てきました。

更にRoughnessの値をMaxにしました。

結果です。

この時点で本物のはげ山のようです。

ここでRidgeノードに繋げます。

この部分のやり方が全然、分からない。

これCombineノードでRidgeノードとWarpノードの結果を繋げた場合と同じなんでしょうか?

後、結果を以下に示しますが、

これです。

こんなTerrainを作成するなら途中でWarpノードを挟んでRoughnessを追加する必要ってあるんでしょうか?

これらの疑問は後で確認する事にします。

HeightをMaxにします。

その他のPropertyもTutorialの値と同じにしました。(もちろんSeedはそのままです。)

結果です。

Erosionを追加するためにWizardノードを追加しました。

水面の部分が凸凹になっています。

直します。

Minを選択します。

結果です。

平らになりました。

MinはRidgeノードとWizardノードとのMinimumの値を取るそうです。

その結果平らになりました。

もう少しひび割れを追加したいです。Crumbleノードを追加します。

結果です。

になりました。

Thermal Shaperノードを追加します。

このNodeはUEにExportした時にArtifactを減らす働きがあるそうです。

新たなErosionを追加するためにWizardノードをもう一回追加します。

ここでもMinを使用しました。

Seaノードを繋ぎます。

結果です。

これじゃ全部海になってしまいます。

後で調整します。

いくら調整しても望みのTerrainにならないので最初から作り直しました。

以下の実装で

以下の結果になりました。

単純すぎるきらいはありますが、海の部分の割合はこれぐらいが望ましいです。

海の部分をMaskします。

以下の様になりました。

Beachの部分をMaskします。

以下の様に単にSeaノードのBeachをMaskとして指定すると

海の部分も大量にMaskします。

これはBeachが海にも存在しているからだそうです。

これはBeachのMaskからSeaのMaskを引く事で修正できます。

結果です。

TutorialではここでFxを消してTextureを追加しています。

が、これはPortにして別なGraphで作成します。

結果です。

以下の実装を追加して

こんな感じにしました。

更にBeachと海を追加しました。

結果です。

ここはTutorial通りのやり方でやりました。

これでTerrainは完成しました。

OutputするHeight MapとMaskを指定します。

当然、SeaノードのOutputがHeight Mapになります。

以下の様になっています。

次はSlopeとShatterノードがMaskになります。

最後はBeachとSeaノードのSeaがMaskになります。

以下の箇所からOutputします。

Buildの設定に移動します。

以下の設定でBuildします。

設定はTutorialの設定と全く同じにしました。

Buildします。

出来ました。

うーん。

これはUEで確認しないとあれですが、あんまり良くないLandscapeになりそうです。

まあ、何回かLandscapeを作成するのもありかもしれません。

今回は、これで試してみます。

3. Niagaraの勉強

3.1 2022-12-12のBlogの復習

Niagara Fluid Simulationの勉強の一環としてUnreal Engine 5 Tutorial - Niagara Fluids - Flamethrower [1/2] [2]を勉強しています。

ここで勉強した内容で大切な事は、以下の4点です。

  • Flame Thrower自体は誰でも作成出来るがNiagara Fluid Simulationを使用して作成するのがPoint
  • 作成したFlame Throwerは原点に位置した場合のみ正しく動く。
  • すべてのNiagara Fluid Simulationが原点でしか正しく動作しないのか確認するためにTemplateにあるGrid 3D Gas Fireを作成し、いろいろな位置に配置したら、どの場所でも正しく動いた。
  • 取りあえず次のTutorialであるUnreal Engine 5 Tutorial - Niagara Fluids - Flamethrower [2/2] [3]を勉強してからこれらの問題について考察する事に決定した。

です。

今週は、Unreal Engine 5 Tutorial - Niagara Fluids - Flamethrower [2/2] [3]を取りあえずやります。やってから何をするか決定します。

3.2 Unreal Engine 5 Tutorial - Niagara Fluids - Flamethrower [2/2] [3]を勉強する

軽く全部見ました。以下の3つの事について解説しています。

  • Grid 3D Gas Controls EmitterのEmitter SummaryにあるAttributeの機能について

  • このEffectを原点以外に配置した場合、Effectそのものが消えてしまう事とその対策

  • Static MeshをFlameに挟んだ時に、Collisionするための設定について

はあ。

やっぱり原点しかEffectが表示しない事に対しての解説をここでしていましたね。

良かった。こっちのTutorialを見る前にこの問題について検証してたら多大な時間を無駄にするところでした。

3.3 Unreal Engine 5 Tutorial - Niagara Fluids - Flamethrower [2/2] [3]を実際にやる

Niagara Fluid Simulationは科学的に流体の流れを計算していますので、計算の負担が通常のNiagaraに比べて非常に大きいです。

<Grid 3D Gas Controls EmitterのEmitter Summary>

このままの状態で値の変更を行うとUE5 EditorやPCがCrashしたりします。のでPCの負担が少なくなるように設定を変更します。

Grid 3D Controls EmitterのEmitter Summaryの

AttributeのGridにあるResolution Max Axisの値を

256から80に変更します。

PreviewのFrameが

から

になりました。

明らかにRenderingの質が落ちています。

Resolution Max Axisの解説には以下の様に解説されていました。

Cellの数が減っている訳ですが、解析の精度が落ちるのは当然です。

次にVolume ContainerのSizeを小さくします。

これもGridにある以下のAttributeの値を調整する事で行います。

Local PivotのZの値を0にします。

PreviewのFlameの位置がVolume Containerの中央に移動しました。

勿論、2022-12-12のBlogでやったTest Fuel EmitterのParticle Spawn SectionにあるShape Location Moduleの

Offsetのzの値は元に戻しています。

最終的に以下の値になりました。

こんな感じです。

今度はGrid 3D Controls EmitterのEmitter SummaryのAttributeの値を調整して炎や煙の形状を調整します。

Density MultiplierとMultiplierの値を調整します。

以下の様に変更しました。

TutorialによるとDensity Multiplierの方は煙の量を調整して、Temperature Multiplierの方は炎の大きさを調整するそうです。

以下の様になりました。

Temperature Multiplierの値をTutorialと同じ250にセットするとVolume Container全体が炎に包まれる事態になったので100に下げました。

よく見たらTutorialのTemperature Multiplierの値は250ではなく25でした。

25にセットし直しました。

こんな感じになりました。

あんまり前と変わりません。

次にSplat Size Temperatureの値を変更します。

これはVoxelがどのようにProjectされるのかを指定するAttributeだそうです。

以下にSplat Size Temperatureの解説を示します。

取りあえずTutorialと同じ2に変更してみます。

炎のサイズが2倍になりました。

Splat SizeにはVelocityもあります。

Tutorialでは1に変更していましたが、私のEffectはこの値を1にすると以下の様な炎の形状になるので、

2のままにします。

次にこのEffectの見た目をArt的な立場から調整します。

Delta Time Scaleの値を調整します。

試しに0.1にセットすると

炎がスローモーション撮影でもしたみたいな形状に変化しました。

0.5にしました。

次はDissipationです。

TutorialによるとこれらのAttributeは拡散して消えるまでの時間を指定しているそうです。

Temperature Dissipationは温度が周りの環境と同じ温度になる時間を指定しているそうです。

両方の値を1にしました。

今度は炎の色や明るさを調整します。

RenderにあるRender Density GainとRender Density Albedoの値を調整します。

Render Bucket氏もこの辺のAttributeの値が何をしているのかあんまり理解していないみたいです。

説明が要領を得ません。

値を色々弄って終わりにします。

Render Temperatureです。

Curveに指定して以下の様にCurveの色を青くすると

青い炎になりました。

黒い炎も作成できるかと頑張ってみましたが出来ませんでした。

Render Temperature Rangeです。

Yに0.1を入れると

Previewの炎が強大になりました。

これは0がTemperatureの初期値で、1が環境と同じになる温度を表しているからです。0.1までしか温度が下がらなかったら炎はますます強大になるわけです。

Render Temp Color Gainです。

値を大きくすると炎の色の部分が濃くなります。

1の時です。

2の時です。

Render Temp Opacity Gainです。

この値を大きくすると煙が濃くなります。

0.5の時です。

1の時です。

最後に炎のQualityを上げるためにResolution Max Axisの値を少しだけ上げるそうです。

これを上げるとPCがCrashする可能性があるので、試す前に必ずSaveをしておきます。

200にしました。

結果です。

うーん。

全然違う。

これでGrid 3D Controls EmitterのEmitter SummaryのAttributeの調整についてが終わりました。

<Grid 3D Controls EmitterのEmitter SummaryのAttributeの調整を勉強した感想>

本来、Grid 3D Controls EmitterのEmitter SummaryのAttributeたちは流体と燃焼の複雑な計算式のParameterの値を表しているはずです。つまり「この値を上げたら炎が赤くなる。」というLinearな対比をしているParameterは存在しないって事です。

しかしGameに使用するEffectを作成するDesignerの人達にそれを説明したら「じゃFluid Simulation使えないじゃん。無駄な技術じゃん。」と言われてしまうので、無理やりGrid 3D Controls EmitterのEmitter SummaryのAttributeから炎の形状を指定しようとしたら、このTutorialの様になったって感じです。

この説明をどこまで鵜呑みにしていいのかも分かりませんし、この説明通りにやっても炎や煙の形状や色、発生する量が完全に調整出来るとは思えません。

まあ、こんな説明方法もありますよ。位に聞いておくことにします。

個人的に流体のSimulationなどをReal timeでUEで行う事が出来るようになったらGame以上にお金を稼げる分野になると思っています。

例えば、東京のLandscapeを精密に作成して、荒川が氾濫した場合はどうなるのかをSimulationします。UEでVisualizeした結果は誰でも理解できます。

UEのリアルな映像で、自分の家が水浸しになったり、崩壊して流されていったりするのを見たら、凄い衝撃受けるでしょう。

そのための最初の一歩だと思って、Niagara Simulationの勉強は継続します。

<このEffectを原点以外に配置した場合、Effectそのものが消えてしまう事とその対策>

この対策は滅茶苦茶簡単で、Test Fuel EmitterのPropertiesの

Local SpaceにCheckを入れるだけです。

結果です。

原点以外でもFlame Throwerが見えるようになりました。

うーん。

2022-06-26のBlogにまとめてありますが、私が理解しているLocal SpaceのCheckって

だけです。

これを見るとParticleが発生する位置自体もLocal Spaceで指定しているみたいですね。

これは後で確認します。

<Static MeshをFlameに挟んだ時に、Collisionするための設定>

これはColliderをStatic Meshの

に追加するだけです。

と思ったら、出来ません。

Grid3D_Gas_Controls_EmitterのEmitter Summaryに

Tutorialで説明しているCollision Data InterfaceもStatic Mesh Collisionもありません。

うーん。これは自分で調べるしかないですね。

3.4 Local Spaceの検証

まず簡単なLocal SpaceのCheckを行います。Fountain Emitterを保持したNiagara Systemを作成してLocal SpaceのCheckを外します。

これを原点以外に配置します。

うーん。普通にParticleを生成しています。

別に原点以外だとParticleを生成しないとか無いです。

うーん。

先程のFlame ThrowerのGrid 3D Gas Controls Emitterを消して、

Test Fuel Emitterの

Render SectionのSprite RendererにCheckを入れます。

更にTest Fuel EmitterのLocal SpaceのCheckを外します。

結果です。

原点以外でも普通にSpriteを放出しています。

この状態で、Grid3D Gas Controls Emitterを表示します。

やっぱり炎は表示しません。

しかしTest Fuel EmitterのSpriteは見えています。

Test Fuel EmitterのLocal SpaceにCheckをします。

炎が現れました。

うーん。

この現象は初めて知る事案ですね。

こういうものだと覚えておきます。

3.5 Static Mesh Collisionについて

こっちはUE5.1 のContents Exampleをまず確認します。

これ見ると普通にStatic MeshとCollideしています。

このStatic MeshのTagを見ると

普通にcolliderとなっていますね。

今度はSmokeを作成しているNSの実装を見ます。

中を開くと

Emitterが一つだけの簡単な仕組みです。

このEmitterのSummaryを見ると

Static Mesh Collisionは無いですね。

試しにColliderを消してみました。

結果です。

衝突しなくなりました。

という事はNSのどこかでColliderを指定しているはずです。

見つかりませんでした。

今度は5.0のContent Exampleを見てみます。

同じNiagara Fluid Simulationを見てみます。

こっちにはTutorial通りのAttributeがありました。

あ。

Niagaraの勉強に使う時間を大幅にOverしていました。

残りは来週考えることにします。

4. Materialの勉強

今週から、Ben Cloward先生のAdvanced Material Seriesを勉強します。今週はSparkling Snow Shader - Advanced Materials - Episode 2 [4]を勉強します。

4.1 Sparkling Snow Shader - Advanced Materials - Episode 2 [4]を勉強する

まず軽く全部見て何をしているのかを把握します。

以下に示したようなSparklingのある雪のMaterialを作成しています。

流石にAdvanced なだけあって前のTutorial Seriesよりだいぶ複雑です。

以下の構成で作成していました。

  • DownloadしたTextureを改良する
  • Materialの実際の実装

Textureの作成は、最初にDownloadしたTextureのサイズを変更したり、細部を切り抜いて別なTextureとして保存したり色々やっています。

その後の雪のMaterialの作成でも、Sparklingを雪の白の上から輝かせたり、太陽光に対して光らせたり、いろいろなTechniqueが使用されています。

以下に具体的な実装内容をまとめます。

いきなり以下の画面から始まっています。

これらはQuixel Mega ScanからDownloadしたTextureだそうです。

Quixel Mega ScanからこのTextureを手に入れる必要があります。

このDownloadしたTextureにある工夫をする事で、Textureの質をほとんど落とさないで、Textureのサイズを劇的に小さくする事が可能になるそうです。

そのやり方をここに示します。

まずこれらのTextureは4KでDownloadされています。

よく分からない以下の2つのTextureはAO とRoughness用のTextureでした。

まずColor Textureですが、Constantの値である215で代用します。

つまりTextureは使用しません。

次にNormal Mapですが、以下に示したGlobalな凹凸と

以下に示したMacro sizeの小さな凹凸の組み合わせで出来ています。

ので、GlobalなNormal Mapのための1KのNormal Mapを作成し、

それとは別に細部の凹凸を表すためのNormal Mapを作成します。

こっちのTextureのサイズが分かりません。512 x 512と言っていたかもしれません。

さらにAO TextureをGlobalのNormal Mapを表すTextureのBlue Channelに入れ、

Roughness TextureをGlobalのNormal Mapを表すTextureのAlpha Channelに入れています。

このような編集はMediBangで出来るんでしょうか?

出来なかった場合は、諦めて別のTextureでImportします。

ここでUE用に、Normal MapのGreen Channelの値をInvertした。と語っています。これQuixel Mega ScanからDownloadしたTextureなら元々UE用にNormal MapのGの値がInvertされていると思うんですがどうなんでしょう?

どうやって確認したらいいんでしょうか?

実装する時に実際にNormal Map用のTextureを見てどうするか決める事にします。

更に以下に示したSparklingなTextureの作成方法を解説しています。

まず256x256のTextureを作成します。

Textureを127で塗りつぶします。

Noiseを追加して以下の様にします。

Levelを以下の様に調整します。

すると以下のようなImageになります。

次にPixelのサイズを512に変更して

Scaled TypeをNearest Neighborに変更します。するとSparklingが四角になります。

うーん。

これそっくりに作成するのは無理かもしれませんね。出来るだけ真似る事にします。

ここからUEの作業に移ります。

まずImportしたTextureの確認です。

Detailを示したNormal Mapです。

Textureのサイズは512x512です。

Compression SettingはNormal Mapになっています。

Tutorialでは述べていませんが、sRGBは外していました。

次はMainのNormal Mapです。

Ambient OcclusionはBlue Channelに入っています。

RoughnessがAlpha Channelに入っています。

Compression SettingはDefaultにSetしています。

これはNormal MapにするとGやAlphaにDataをSaveする事が出来ないからだそうです。

当然、sRGBはOffになっています。

次はSparklingのTextureです。

Compression SettingはGrayscaleにセットされています。

これはこのSparklingのTextureはRed Channelしか使用していないからだそうです。

Materialの作成に入ります。

まずSparklingの部分から作成します。

以下の様に実装しました。

普通の実装ですね。

結果です。

この結果の問題はSparklingがStaticで実際にはSparklingしてない事です。

Sparklingさせます。

ここでBen Cloward先生、この方法は今思いついた独自のやり方で、別な方法でSparklingしたければそっちを採用しても全然問題ないです。と述べています。

Ben Cloward先生のUniqueなSparklingのやり方を勉強します。

まず以下の実装を作成しました。

これはTextureのSparklingを画面の1Pixelと同じサイズにして表すための実装だそうです。

結果です。

SparklingがScreen Spaceに投影されています。

うーん。なんで?

これは後で考える事にします。

これを先程の実装と掛けます。

こうする事で両方でSparklingがある場合のみSparklingが表示される事になります。

うーん。

成程!

結果です。

確かにキラキラしています。

この後Lightingの話になるのですが、Sparklingは本来はEmissive Colorに繋ぐそうです。

そこを直しました。

今の実装だと、以下に示した様に影になっている部分でもSparklingが見られます。

Emissive Colorに繋いでいるんだから光の影響は関係ないので当然の結果です。

でも実際の雪のSparklingは光が当たる方向のみに発生します。

これを直します。

うーん。

どうやってMaterial内でDirectional Lightの方向を得るの?

去年のAnime Renderingの勉強で、Custom Nodeを使用してDirectional Lightの情報を得るやり方を学びました。

かなりHacking的なやり方です。

同じ方法でDirectional Lightの方向を得るのでしょうか?

何と以下に示したAtmosphere Sun Light Vectorノードで太陽光の向きを示すVectorを得る事が出来るそうです。

ふえええっ!

正月からとびきりのお年玉です。

これは後でしっかり検討しますが、凄い事いきなり教わりました。

以下の様にStatic MeshのNormalとDot Productで掛ける事で、

光の当たっている部分のみを白くします。

更に以下の実装を追加して白みを調整します。

この辺はいつもの調整方法なのでSkipします。

この実装と先程の実装を掛けます。

その結果、太陽光の当たっているところだけSparklingが発生するようになりました。

おお。

凄い!

今度はNormal Mapの作成です。

Normal MapのNORを追加します。

これはMainのNormal、Ambient OcclusionそしてRoughnessのDataが入っています。

まずNormal Mapは-1~1の範囲で示されますが、通常のTextureは0~1の範囲で示されています。

それを以下の実装で直します。

これ結構忘れてしまいます。気を付けます。

Derive Normal Zノードを繋ぎます。

これは初めて使用するNodeです。

このNodeを繋ぐことでRed、Green Channelの値からBlueの値を計算してくれるみたいです。

Tutorialを見るとこの結果をそのままNormalに繋いでいます。

Alphaに入っているRoughnessの値はどうなるの?と思ったら最初からRGBの値だけ使用していました。

今度はNormalの細かい部分を表しているTextureを使用します。

こっちはSampler TypeがNormalにセットされているので

先程の調整は必要ありません。

Normalの大きさを以下の実装で調整します。

どうやってこのNormalと先程のNormalを混合するのかと思ったら、以下のNodeを使用していました。

Blend Angle Corrected Normalsノードです。

以下のようにBlendしていました。

結果です。

確かにMainのNormalと細かい部分のNormalが両方再現されています。

ふーん。

凄いですね。

こうやってMaterialで使用するTextureの数を減らすんですね。

最後にColorを指定します。

Tutorialの解説によると自然界に本当の白は存在しないそうです。のでここでの値も0.88が使用されています。

結果です。

何と、Sparklingが消えてしまいました。

のでSparklingの結果を5000倍にします。

結果です。

光っています。

今度はColorにFresnel効果を追加します。

これでCameraから見たMaterialの端の部分が白くなります。

これは、単に見た目を良くするためなのかそれとも自然界の何らかの法則を体現しているのか分かりません。

Tutorialでは以下の説明がありました。

ここのAccentuateって強引に意訳すると、アクセントを加えるって感じでしょうか?

以下に結果を示しますが、どうでしょう?

Fresnelを追加した事でNormalの細かい点が目立つようになっているでしょうか?

あんまり良く分かりませんね。

これでやっとTutorialの勉強が終わりました。

この後、実装をやります。

本当は、今年からこの勉強は止めて実装だけやるつもりでした。そうする事で時短に繋がると思ったし、去年のBlogを読み直しても、このTutorialの勉強の部分と実装の部分は重複している箇所が多く、無駄に見えました。

しかし実際に省略すると、その実装が何を目的でやっているのかと言う根本の部分が学べないです。

やっぱりこの部分の勉強は省略する事は出来ません。

今年もやる事にします。

4.2 Sparkling Snow Shader - Advanced Materials - Episode 2 [4]を実装する

<Textureの作成>

以下のTextureをMegascanからDownloadしました。

中身をチェックします。

T_Fresh_Windswept_Snow_uhpjdeyn_4K_Dです。

Base Colorを表すTextureです。

当然4kです。

これは使用しないのでそのままです。

T_Fresh_Windswept_Snow_uhpjdeyn_4K_Nです。

Normal Mapを担当しています。

中を見ると普通のNormal Mapですね。

拡大すると以下のようなDetailのNormal Mapが確認出来ました。

Flip Green ChannelにCheckが付いています。

という事はこのGreen Channelの値は反対になっているという事です。

Compression SettingはNormal Mapになっています。

T_FreshWindsweptSnow_uhpjdeyn_4K_ORDpです。

Ambient Occlusionです。Rの値に入っています。

Roughnessです。Gの値に入っています。

Bの値は何が入っているのか調べたらWorld Displacementでした。

それではNormal MapをExportしてMediBangで改良します。

聞いたことのないFormatでしかExport出来ません。

取りあえずEXRでExportしてPNGに変換します。

以下のサイトで変換しました。

これをMediBangで開いて細部を切り取り256x256 のTextureを作成しました。

名前をSnow Detail_Nとしました。

UE5にImportします。

Normal MapとしてImportしました。

更にGreen Channelの値をFlipしました。

次にNormal Mapの4Kを1kに変換して、BにAmbient Occlusion、AlphaにRoughnessの値を追加します。

まずNormal Mapのサイズを4kから1kに変換します。

これもNetで行いました。

で、この後で詰まりました。

このTextureにRoughnessやAmbient OcclusionのImageを追加する方法が分かりません。

更にこの1KのNormal MapはGreen Channelの値が逆になっています。

うーん。

考えました。

以下の方法でやります。

まず、MediBangで以下のImageを作成します。

これは赤と緑と青で構成されています。

ここから赤だけ以下の方法で抽出します。

赤のLayerを作成しClippingします。

更にBlendingを乗算に指定します。

結果です。

うーん。成程。

緑と青の部分のRGBの値は0になってもAlphaの値は255のままでした。

ここは黒のLayerを追加して全部黒くする事にします。

AlphaのLayerにImageを追加するのはMediBangの機能からだと一寸難しいそうです。

後で考えるか、諦めるかします。

結果です。

赤色だけ抽出する事に成功しました。

どうような方法で緑色だけ抽出します。

この2つの結果を加算します。

このやり方で、Normal MapのRとGの値だけ抜き出せます。

次に以下のようなGray ScaleのImageがあったとします。

これをRGBのBの値に変換します。

やり方は以下の様に青のLayerでClippingして

Blendで乗算します。

結果です。

白さに応じて青くなります。

このやり方でBにRoughnessかAmbient Occlusionを代入できます。

しました。

まずNormal Mapを1Kに縮小したImageに赤のLayerを掛けます。

これでNormal MapのRの値だけ抽出出来ました。

次にNormal Mapを色反転したImageに緑のLayerを掛けます。

これでNormal MapのGの反転した値だけ抽出しました。

ただしこれはMediBangの色反転が、UEのTextureのGreen Flippingと同じ機能である必要があります。

多分同じでしょう。

この辺は計算結果が合わなかったら検証する事にします。

今度は、以下のT_FreshWindsweptSnow_uhpjdeyn_4K_ORDpをExportして

1KのPngに変換しました。

そしてMediBangで開いて緑のLayerを掛けてRoughnessだけ抽出しました。

そしたら緑一色になってしまいました。

何で?と元のImageを確認したらRoughnessのTextureは以下の様になっていました。

これはBに追加しても良く分からないのでAmbient Occlusionに変更します。

緑の代わりに赤を掛けると

となりました。

これをGray Scaleに変換して

先程のTextureに追加しました。

これでBの値にはAmbient Occlusionの値が入っているはずです。

結果です。

なんかすごい赤いですね。

まあいいです。これだけ複雑な計算が最初から全部あっている確率はかなり低いでしょう。

でも大筋の流れはあっているはずです。

これでやる事にします。

UE5にImportしました。

開くとこんな感じです。

Texture GroupがWorldになっていてNormal Mapとしては認識されていません。

Compression SettingsもDefaultになっています。

これはDefaultではCheckされていたんですが外しました。

Flip Green Channelは別にNormal Mapじゃなくても使用出来るみたいですね。

既にFlipされているはずなのでCheckしません。

Rに入っているImageです。

これであっているのかどうか。

Gに入っているImageです。

何とも言えませんね。

BのImageです。

実際のAmbient OcclusionのImageです。

ん。

白さが全然違う。

どこかで計算をミスっていますね。

今回はその計算を徹底的に調べる余裕はないのでこのままやります。

最後にSparkling用のTextureを作成します。

MediBangにもNoiseの機能があるのかもしれませんがどこにあるのか分かりませんでした。

のでTutorialのNoiseをCopyしてここに張りつけてNoiseを作成しました。

一応、白の粒粒は1Pixelのサイズになっています。

その後Levelを調整して以下の様にしました。

Tutorialではこの後、Textureのサイズを256から512に変更しています。いますがこのNearest Neighborの意味がよく分かりません。のでこれをそのまま使用します。

<Materialの作成>

<<Sparklingの作成>>

まずは以下の部分だけ作成しました。

結果です。

なんかTutorialの結果と比較して白い部分が少ない気がするので、Powerは0.5を掛ける事にしました。

この辺は臨機応変です。

Screen Space用の実装も作成しました。

Divideノードの値は256にしました。

この部分の計算について一寸考えてみます。

Screen PositionノードのViewport UVですが、Screenが1920×1080だとすると、それぞれのPixel毎の位置を返すはずです。Viewport UVだと1920と1080がそれぞれ1に対応していると考えられます。

Screen ResolutionノードのVisible Resolutionは、Screenのサイズ、つまりこの場合だと1920×1080を返すと考えられます。

1920を256で割ると、7.5です。つまり7.5 PixelがTextureの1Pixelに対応するとこのTexture一枚でScreenを覆えるサイズになるわけです。

だから7.5をViewport UVにかけると…。

あれ、オカシイぞ。

Screen PositionノードのViewport UVは0~1に対応しているんじゃなくてScreen ResolutionノードのVisible Resolutionが0~1に対応しているのかもしれません。

それの方が辻褄があいそうです。

ここは色々検証しないと分からないですね。後でする事にします。

2つの実装を掛けます。

この結果、全くSparklingが無くなってしまったので値を少し変更しました。

結果です。

かなりキラキラしています。

今度は太陽光の当たる箇所だけキラキラするような実装を追加します。

はい。

Atmosphere Sun Light Vectorノードです。

うーん。

Anime Renderingで勉強したDirectional LightのVectorを得るためのCustom ノードの実装は何だったけ?

調べます。

これでした。

この2つの結果が同じって事でしょうか?

確認します。

Atmosphere Sun Light VectorノードにDebug Float 3 Valueノードを繋ぎました。

結果です。

次にCustomノードを繋ぎます。

結果です。

全く同じ結果ですね。

おお。

もうこれでこのMaterialの勉強、元取れましたって感じです。

こんなNodeが存在していたんですね。

以下の実装を追加しました。

ここはTutorialと全く同じです。

結果です。

光が当たっている方向だけキラキラするようになりました。

<<Normalの作成>>

正直あんまりやりたくないです。

自分の独自のやり方、しかも今即興で考えたやり方でNormal Mapを作成したので、どこかで計算が間違っていると思われるからです。

まあ、そこは諦めて実装方法の勉強という意味でやる事にします。

Normal Mapを抽出してNormal に繋ぎました。

結果です。

へんな斜線が形成されています。

うーん。

ImportしたNormal Mapを1K に縮小したTextureをImportして比較する事にします。

Importしました。

Normal Mapとして認識してもらえなくて通常のTextureとしてImportされました。

Flip Green ChannelにCheckが付いていません。

付けます。

あれ、変な色になってしまいました。

取りあえずこれでNormalに繋いでみます。

結果です。

あれ、ギザギザが出ている。

というかこんな色のNormal Map明らかにオカシイです。

これはGreen ChannelをFlipしないのが正しいのかもしれません。

FlipをOffにしました。

結果です。

ギザギザが消えました。

という事は、私の独自のNormal MapもGreen Channelの値を反転したのが問題だったのかもしれません。

という事は逆にFlip Green ChannelにCheckを入れたらギザギザが消えるかもしれません。

試してみます。

ギザギザが消えました。

うーん。

この結果から推測するとNormal MapやAmbient Occlusionを一つのTextureに統合するのは、私が考えていたほど単純じゃないみたいですね。

まあいいです。

その辺もそのうちしっかり勉強する事になるでしょうから。

今度はDetailのNormalの実装を作成します。

Blend Angle Corrected Normalsノードで混合しました。

結果です。

一応は出来ていますね。

<<Colorの指定>>

以下の様に実装しました。

この辺はTutorial通りに実装しました。

Fresnelノード以外は特に勉強する内容でもないのでここはサラッとやって終わりにします。

結果です。

非常にキラキラしています。

Fresnelの影響もはっきり見えますね。影の部分の端が白く浮き出ています。

4.3 Sparkling Snow Shader - Advanced Materials - Episode 2 [4]を勉強した感想など

NormalとAmbient Occlusionを持つTextureの作成が大変でした。

これ出来てないですね。

自分の頭の中ではこのやり方で出来ると思ったんですが、どこか勘違いしていますね。

まあ仕方ないです。

Atmosphere Sun Light Vectorノードの存在を知ったのは大きいです。これでMaterial内でDirectional LightのVectorを得る事が更に容易になりました。

後、こんなに時間がかかるとは思いませんでした。Niagaraの勉強時間よりも更に大幅に予定の時間をOverしてしまいました。

予定の立て直しが必要です。

5. 戦闘システムの続きを作成する

2023-01-01のBlogを見ると以下の予定になっています。

5.1 UE4からUE5へのUpdate方法を調べる

これ単にUE5から開けばいいだけみたいです。

PC1号からPC2号にProjectだけCopyして来ました。

これをUE5.1 で開いてみます。

開けました。

更にD3D12が使えるように設定を変更しろとあったので以下の様に変更し、

Projectをまた再起動しました。

戦闘システムがあるLevelを開きましたが普通に開けました。

試しに戦闘をしてみます。

普通に戦闘出来ています。

Stage 2で負けてしまいました。

でもUE5.1でも普通に動いているのは確認出来ました。

5.2 Packagingを試す

予想に反してUE5への移植が簡単に終わりました。

予定では1月いっぱい移植にかかると見ていたのでかなり時間に余裕が出来ました。

しかし逆に予定にはないけれど今、やっておくべき事がある事も気が付きました。

それはPackagingです。

ので今月はPackagingを試します。

<一月の予定>

2022-12-12のBlogに去年、どうやってPackagingしたのかがまとめられています。この方法を今週は試してみます。

以下の予定でPackagingをする予定です。

  • 一週目:とにかくPackagingしてみる
  • 二週目:サイズを小さくするために別のProjectにMigrateしてPackagingする
  • 三週目:Levelの直しを始める(Assetの調査)
  • 四週目:Levelの直しを始める( 採用したAssetによるLevelの作成)

<Packagingをする>

2022-12-12のBlogを見るとMatt Aspland氏のHow To Build Package And Export Your Game - Unreal Engine Tutorial [5] のやり方でPackagingしています。

今回もこのTutorialのやり方に沿ってPackagingする事にします。

最初にHow To Build Package And Export Your Game - Unreal Engine Tutorial [5]のやり方を簡単に復習します。

見直しました。

大体理解しました。

使用するすべてのLevelを把握しておく必要があります。

それを確認します。

以下の2つのLevelが使用されていました。

使用しているGame ModeはMy Game Mode Baseでした。

使用しているGame InstanceはMy Game Instanceでした。

これだけ分かったらPackagingに必要な情報は全部そろったはずです。

How To Build Package And Export Your Game - Unreal Engine Tutorial [5]のやり方でPackagingをしてみます。

<<Building The Game>>

Build Light OnlyをしてBuild All Levelもしました。

Build All LevelsをしたらLevel上に配置してある魔術師が消えてしまい焦りました。

Playをしたら普通に居たし、一回Levelを閉じて開いたら消えていた魔術師が現れました。

<<Setting Up The Settings>>

Project Settingの設定を直していきます。

まずMap and Modesです。

Packagingの設定です。

Advanced Settingの設定をやります。

Cook only mapsにCheckを入れます。

そしてList of maps to include in a packaged buildに使用するLevelを指定します。

Supported Platformの設定です。

Windows だけ残しておきます。

これでProject Settingの設定は完了しました。

<<Packaging And Exporting>>

まずSaveをします。

そしてPackaging Projectを選択します。

うーん。UE5.1 にはFileにPackaging Projectがないですね。

調べます。

JSFILMZ 氏のUnreal Engine 5 Tutorial How to Package Your Game [6]にUE5のPackagingのやり方が説明されていました。

以下の箇所にあるそうです。

JSFILMZ 氏によると最初のPackagingではVisual StudioをInstallしろとか、色々要求するそうです。

取りあえずやってみます。

Packagingが始まりました。

20分ぐらいかかりました。

普通に出来ているみたいですね。

<< Playing The Game>>

実際にPackagingされたGameをPlayしてみます。

Stage 10までいってそこで負けました。

結構、楽しくPlay出来ました。

BugらしいBugはなかったです。

<<Final Overview>>

Packagingした後のサイズは以下の大きさでした。

この規模のGameだとかなり大きいのかもしれません。

来週は別のProjectにMigrateして本当に必要なData以外は全部、省いた状態でPackagingして、どれだけGameのサイズが小さくなるか試してみます。

6. Gaeaの勉強

去年、Andrea Cantelli氏のGaea for Beginners Seriesの♯6である Gaea Tutorial for Beginners #6 | Texturing our first terrain [7]まで勉強しました。

所が、このGaeaのDataをどこに保存したのか分からなくなってしまいました。

のでもう一回このTutorialをやり直す事にします。

とは言っての同じことを繰り返すのは無駄ですので、前に勉強したBlogの内容をきっちり復習してもう一回勉強する事にします。

ので、今週はGaea Tutorial for Beginners #1 | Intro to the series & Analyzing the Interface [8]を勉強します。

6.1 2022-11-06のBlogを復習する

読みました。

このTutorial、作成された時が古いので今のVersionのGaeaとはUIがだいぶ違います。その辺を、考慮して勉強しないと全く理解出来なくなると警告しています。

以下のUIの機能について解説していました。

<Mouseによる3D Viewport内のTerrainの操作方法について>

3D Viewport内のTerrainとは以下の事です。

ここで説明されているのは以下の3つでした。

  • Alt + Mouseの左ボタンを押しながらMouseを動かすとTerrainがそれに合わせて回転する。
  • MouseのWheelでZoom が出来る
  • Mouse のMiddle Buttonを押す事でPanningが出来る

ここにSpace Keyを押すとTerrainがDefaultの位置に戻る事も付け加えたいです。

<Menu Barの解説>

Menu Barとは以下の部分の事でした。

ここは0.5KとPlus buttonだけが特殊で後の機能はどのSoftでも共通です。

  • 5 K―>3D ViewportのResolutionを設定する
  • Auto ―>説明なし
  • Plus Button―>同じProjectに番号を追加して別なProjectとして保存する。

Autoに関しては説明がなかったです。

<Toolbox>

以下の部分の事です。

これらが以下の箇所で使用するNodeである事だけ教えたそうです。

この箇所はNode Graphと言います。

<Graph Toolbar>

ここからNode GraphのUIについての解説になります。

それは分かるんですが、何故かGraph Toolbarから説明を始めています。

Graph ToolbarはDefaultでは表示されていません。Node GraphのMenu Barにある三本線をClickして以下のBoxを開きます。

そしてShow Graph ToolbarをCheckします。

すると以下に示したようなToolbarが表示されます。

そしたら

となっていました。

あれ?

今度はMouseのMiddle ButtonでNode Graph内をPanning出来る事について解説しています。

更に左Clickをしたまま、Dragをする事でBoxを表示し、そのBoxで複数のNodeを一遍に選択する事が出来る事を解説しています。

あ、これはTutorialのGaeaのVersionが違うからこういう説明になっているんです。

後で、Node Graph内のUIについては自分でまとめ直します。

今度は、Node Graphの右下にある以下に示した3つのButtonについて解説しています。

Propertiesについてです。

単に選択したNodeによってそのNode特有のPropertiesが表示される事だけ説明していたみたいです。

<Setting>

3D Viewportの右端にある以下のToolについて説明しています。

この辺の機能は押したら分かります。

<Buildについて>

機能については何の解説も無かったです。

大体こんな感じでした。

はい。

これを復習して、今、私が何をすべきかの方向性が見えてきました。

GaeaのUIについて簡単な解説を作成する事です。

6.2 GaeaのUIについての簡単な解説

GaeaのUIについて簡単な解説をします。

ここでの解説はVersion 1.3.2 Communityを元にします。

Gaeaはまだまだ進化途中のSoftで、Versionが変わる事でUIも劇的に変化する可能性があります。

ここの解説はあくまでもこのVersionの説明である事を理解して下さい。

まずGaeaを開くと以下のような画面が表示されます。

以下の画面はTemplateを使用する時に使用します。

今回は使用しませんので、右上の×ボタンを押して、閉じてください。

<4つのSub画面について>

すると、大体以下のような画面が表示されると思います。

今週はこの画面のUIについて簡単な説明をします。

まずこの画面ですが、4つのSub画面で構成されています。

まず①で示したSub画面は、3D Viewportと言います。

ここは、Terrainの形状を表示します。

次に②で示したSub画面ですが、ここはTool Boxと言います。

ここは、Gaeaで使用出来るすべてのNodeが表示されています。

その隣にある③で示したSub画面ですが、ここはNode Graphと呼ばれています。

ここでTool Box内に表示されているNodeを組み立ててTerrainを作成します。

最後に右端のSub画面ですが、PropertiesとBuildと表示されています。

PropertiesはNodeを選択した時にそのNodeの持つ特徴を表示します。

BuildはTerrainが完成した後で、UEにそのTerrainのDataをExportするためにHeight MapやMaskを作成するのに使用します。

<Menu Barについて>

まず画面の上部にあるMenu Barの機能について簡単に解説します。

左端から説明します。

Gaeaを左Clickすると以下のBoxが表示されます。

このBoxの中の機能はあらゆるSoftが大体において同じで、Gaeaも同様です。

次の以下の表示ですが、このProjectの名前です。

まだ名前を指定していないのでUntitledになっています。

試しにProject名をUI_Testとしたら、以下の様にUI_Testに変わりました。

次の0.5kですが、3D Viewportに表示されるTerrainのResolutionを指定しています。

以下に示した様に4kまで選択出来ますが、

2k以上を選択すると通常のPCでは処理できなくて止まるそうです。

次のAutoですが、3D ViewportのTerrainのMeshの質を指定します。

これも色々選択肢がありますが、

Autoのままで良いです。

その後にある以下のMenuは、他のSoftと全く同じです。

Newで新しいProjectを作成し、SaveでそのProjectをSaveします。SaveしたProjectはOpenから開く事が出来ます。

他のSoftと全く同じです。

この中で唯一、Gaeaに独特なのが以下の+ボタンで、

これを押すとProject名+番号でSaveします。

以下に示した様にProject名がUI_TestだったのでUI_Test001とSaveされました。

ここでもう一回+ボタンを押すと、今度はUI_Test002とSaveされます。

これは途中まで作成したProjectをSaveしておきたい時に使用するそうです。

最後の2つはRedoとUndoです。

この記号が意味するところは、どのSoftでも同じです。

<3D ViewportのUIについて>

今度は先程、説明した4つのsub画面の内の一つである3D Viewportについて解説します。

まず真ん中の灰色ですが、これが3DのTerrainを表すMeshです。

Nodeを組むと以下の様にTerrainを示します。

この画面の操作方法を説明します。

  • Alt + Mouseの左ボタンを押しながらMouseを動かすとTerrainがそれに合わせて回転する。
  • MouseのWheelでZoom が出来る
  • Mouse のMiddle Buttonを押す事でPanningが出来る
  • Space keyでDefaultの位置に戻る

以上です。

次にこの3D Viewportの右端にあるUIについて解説します。

最初の2つですが、Orbit ViewとFirst Personという名前です。

これはCameraの動き方を示しています。

Orbit Viewを選択した場合は、Cameraは先程のTerrainの周りを移動します。

First Personを選択した場合は、GameのFirst Personと同じで、WSAD Keyでカメラを前後左右に動かす事が出来ます。

DefaultではOrbit Viewが選択されています。

次の2Dですが、押すと

以下に示した様に、Terrainの2D画面が表示されます。

この2Dボタンを選択している時だけ以下に示したAのようなButtonが表示されますが、

これを押すと、このTerrainの生のDataを示します。

次は以下の太陽みたいなButtonです。

この太陽みたいなButtonはViewport Optionという名前で、Directional Light、つまり太陽光の向きを管理しています。

押すと以下のようなBoxが開きます。

以下のImageの白い部分をMouseでグリグリ動かすと

Terrainの太陽光の向きが変わります。

他のButtonはもう一回ClickするとBoxは閉じます。

しかしこの太陽みたいなButtonはそのやり方では閉じてくれません。

このBoxを閉じるには3D ViewportのどこかをClickする必要があります。

次は以下に示した雲のButtonです。

これを押すと3D viewportに空が現れます。

そんだけです。

次は以下に示した3つのButtonについてです。

最初のButtonについてです。

これを押すと以下に示したようなGridが表示されます。

残りの2つはDefaultで選択された状態です。

以下のButtonは

3D Viewport右上にある以下のMarkを出したり消したりします。

以下のButtonは

以下に示した薄っすらしたGridを表示させたり、消したりします。

これで3D ViewportにあるUIの説明はお終いです。

<Tool BoxのUIについて>

4つに分けたSub画面の内の②の部分です。

ここは、Terrainを作成するために使用するすべてのNodeが表示されています。

それだけ知っていれば十分です。

以下のUIについて知る必要は当分ないです。

<Node GraphのUIについて>

4つに分けたSub画面の内の③の部分です。

ここで先程のTool Boxから持ってきたNodeを組んでTerrainを作成します。

ここでProgrammingを書くわけです。

まず以下に示した右上のUIから説明します。

まず+のButtonですが、これを押すと

以下のBoxが現れて

新しいNode Graphを作成します。

こんな風にです。

何で、複数のNode Graphが必要なのかというと、

  1. Terrainを作成するNode Graph
  2. Textureを作成するNode Graph
  3. 作成したTextureにColorを追加するNode Graph

のようにそれぞれのNode Graphで機能を分割して表す事が出来るからです。

このおかげで、後からNodeを見た時に、どこに何が書かれているのか非常に分かりやすくなります。

残りのButtonに関しては、今はまだ知らなくて大丈夫です。

というか私もこれらのButtonがどんな機能なのか知らないか、知っていても一回も使用した事ないかのどっちかです。

初心者が今、絶対知る必要がある機能はここにはないです。

次は右下にある以下の3つButtonについてです。

まず以下のButtonですが、これを押すと

NodeをNode Graphの中心に移動します。

残り2つのButtonはこの後、説明するPropertyを理解しないと、その機能を説明する事が著しく難しくなるので、今回は説明しません。

Node GraphのUIの説明は以上です。

<PropertiesとBuild>

あ、ここに来て去年からずっとPropertiesとParameterを混合して使用していた事に気が付きました。

ClassにあるVariableがPropertyやAttributeで、ParameterはFunctionの()内で表される関数内にInputされるVariableの事でした。

うーん。ずっと間違って使用していました。

4つのSub画面の内、最後の④であらわされる箇所についての解説です。

まずPropertiesから説明します。

Node Graphに配置したNodeを一つ選択します。

例えば以下に示したMountainノードを選択します。

すると以下に示したような色々なParameterが表示されます。

これがMountain ノードのPropertiesです。

ここに表示されているそれぞれのPropertyの機能については、実際にNodeでTerrainを作成する時に勉強する事になるので、ここでは説明しません。

次にBuildです。

ここは作成したTerrainをUEにExportするためにHeight MapとMaskを作成する時に使用します。

その時にこの部分のUIの使用方法を勉強します。

以上です。

6.3 GaeaのUIの簡単な説明を作成してみて

Gaeaの勉強を始めたのが去年の4月からなので、私自身、まだ勉強中です。ので、説明が間違っていたり、不足している箇所もあるかもしれません。

しかしそれでもこの説明を聞いたら、Gaeaを初めて触る人でも、GaeaのUIの使用方法が一通り理解出来るはずです。

現状、GaeaのTutorialでUIの機能を説明しているものは、すべてVersionが古いものです。Gaeaを初めて触る人が、古いVersionの説明を見ると、UIの機能は全く理解出来ないです。

それに対して、私のこの説明は、そんな本当の初心者でも簡単に、GaeaのUIを理解する事が出来るはずです。

そういう訳でかなり良いTutorialが作成出来たと思っています。

7. Houdiniの勉強

今年からHoudiniの勉強をする事にしました。

去年、Landscape上に建物を作成しましたが、たった一個の建物を作成するだけでかなり大変でした。Houdiniを使用したらこの建物の作成が簡単になる気がします。それで勉強する事にしました。

7.1 HoudiniのInstallについて

年末にHoudiniをInstallしたのですが、かなり大変でした。

その時は忙しくて、その記録をしておかなかったんですが、今、思い出してその時のやり方をここに残しておきます。

これからHoudiniをInstallする人の参考になるように、なるだけ正確に思い出すように努めます。

まず、SideFX社のHomepageに行って以下のSiteに行きます。

ここでHoudiniをDownloadしようとしたら、DownloadするためにはLoginしろと言っています。

LoginするためにはRegisterする必要があります。

Registerしました。

そしてLoginしようとしたら出来ません。

うーん。

何で?

色々試したんですが分かりません。

30分ぐらい格闘していたら、ひょっとしてRegisterが出来ていないからじゃないの?と気が付きました。

Usernameが既に誰かが登録していたらしく、Registerが出来てなかったです。

これ、言ってくれないと分からないです。

別なUsernameでRegisterしたら出来ました。

正しくRegister出来た場合のみ、指定したE-mail AddressにMailが届きます。

今度はLogin出来ました。

これで一件落着になると思ったら、ここからも大変でした。

まず、DownloadしたいHoudiniの画面が出てこないで、以下に示したHoudini Launcherを代わりにDownloadしろと出てきます。

これいつからそうなったのか知りませんが、私が調べた限りですが、HoudiniのInstall方法を説明したサイトや動画で、このLauncherをInstallしろと言っている所はなかったです。

まあ、新しくそうなったんだろう。とLauncherをInstallしました。

当然ですが、容量に限界のあるC DriveではなくD DriveにInstallしました。

ここでも何かの問題に遭遇しました。

ただそれが何だったのか今はもう忘れてしまいました。

LauncherのInstallに成功して、そのLauncherを開くと以下のような画面が表示されました。

ここにHoudiniがありません。(上のImageにはHoudiniがありますが、それは今Screenshotを取ったからです。)

Launcherの右上にInstallとあるのでそこからHoudiniをInstallしました。

Installは何の問題もなく出来ました。Installすると上のImageにあるようにHoudiniが表示されるようになりました。

Houdiniを使用するためにHoudiniのLaunchをClickしました。

これでやっとHoudiniを使用出来ると思ったら、お前はこのHoudiniを使用するLicenseがないと表示され、それからまたひと悶着です。

具体的に何をしたのか覚えてないですが、出てきたBoxの質問に対してYesとかNoとか選択してたら、Apprentice(FreeのLicense)が発行され、それに対応したHoudiniがInstallされました。

それのLaunchをClickしたら今度はHoudiniが起動しました。

やっとHoudiniのInstallに成功しました。

こんな感じでした。

7.2 勉強するTutorialを決める

Houdiniを見てまず驚いたのが、そのTutorialの多さです。

以下に公式のSiteのTutorialのPageを示しますが、凄い量です。

この中で最も私に合ったTutorialを選ぶ必要があります。

まず、有料は外します。

金払ってまで勉強する気は毛頭ないですので。

次に、初心者向けを選択します。

選択しますが、このBeginnerの意味には、出来の悪いTutorialという意味も多分に含まれています。

これだけTutorialがある中で、敢えて出来の悪いTutorialで勉強する必要は全く無いので、この中から質が良いものだけを選別します。

基準は以下の様にしました。

  • 何を理解したらHoudiniを使いこなせるようになるのかを、Tutorialの製作者が理解し、それを理解するための基礎を教えている。
  • Houdiniにおける制作を、Designの一環として捉えているのではなく、Programmingの一環として捉えている。
  • 説明が簡潔で、声が聞き取りやすく、言いたい事がはっきりしている。

この基準で選んだTutorialが以下にしめしたHoudini Kitchenです。

https://www.youtube.com/@houdinikitchen/videos

ただしこのTutorial、作成されたのが3年前なので、今のVersionでそのままやるのは無理かもしれません。

まあやってみてから考えます。

7.3 Tutorial 1. Networks and Nodes [9]を勉強する

まず全部を軽く見て内容を把握します。

Download FileがDownload出来ませんね。

これはこのTutorialで勉強するのは難しいかもしれません。

仕方ないです。

以下の公式のTutorialで勉強しますか。

7.4 公式のTutorialであるFOUNDATIONS | OVERVIEW [10]を勉強する

PDFは入らないので次のIntroductionから勉強します。

<Introduction>

ここで何を勉強するのかについて簡単な説明があっただけです。

正直、聞いてないうちに終わってしまいました。

まあ、大丈夫でしょう。次に行きます。

<The Houdini Workspace>

いきなりHoudiniのUIの使い方を解説しています。

Cを押すと以下のUIが表示されるそうです。

試してみます。

されました。

まずHoudiniの画面を見るのがほとんど初めてなので、一寸観察を先にします。

以下のような画面です。

Sub画面は4つありますね。

上記に書かれた①はViewportです。ここに作成した3DのObjectを表示するんでしょうね。

次の②が何をする箇所か不明ですね。

その次の③はここでNodeを組むんでしょうね。

最後の④はTimelineのようです。Animationの設定をここで行うと思われます。

Menu BarとTool Barです。

一見すると複雑そうですが、Tool Barに全部の機能を表示しているからこんなに複雑に見えるだけにも思えます。一個一個見ると複雑さはUEと変わらない感じです。

Menu Barから見ていきます。

ぱっと見てよく分からないのは、RenderとAssetsですね。

Renderを開くと以下の様になっています。

Create Render Nodeの項にMantraとかRenderManとかあります。

これらはRenderする時の方法なのでしょうね。

Assetsの方は以下の様になっていました。

まあ、普通に考えたらAssetってStatic MeshなどのObjectを指しているはずです。

それをここの機能でどう扱うのか?

まあ、勉強していく内にだんだん分かっていくでしょう。

次はTool Barです。

CreateはもうStatic MeshをCreateするためのTool Barでしょう。

Contractは何をするのか全く想像つかないですね。

Cloud FXとかVolumeとかありますが、これはVolume Renderingの事でしょうか?興味を惹かれます。

次のTool Barですが、

作成したAssetに追加する機能を示しているみたいです。

Vellumとか意味不明ですね。

Viscous FluidsってHoudiniでは流体の解析をする時に粘性も計算しているんでしょうか?

UE5のNiagaraのFluid Simulationでは粘性を調整するParameterが無かったのでこれは興味ありますね。

次に4つのSub画面を見ます。

最初のSub画面です。

まずTabが凄いです。

6種類もあります。

Defaultで開いているのはScene Viewです。

Composite ViewとGeometry Spreadsheetは何をするためのものか全く想像出来ないですね。

Scene ViewのTool Barですが以下の様になっています。

更に左端には以下のUIがあり、

右端には以下のUIがあります。

Cursorを重ねるとそのButtonの機能の簡単な説明が表示されます。

うーん。数が膨大すぎます。

ここは時間があるとき見る事にします。

2番目のSub画面です。

Parameterって書いてある。先程、Gaeaの勉強でParameterとPropertyをごっちゃにしていたと書きましたが、してないみたいです。

この辺の名称はそれぞれのSoftによってPropertyになったりParameterになったり、Attributeになったりするんでしょうね。

ここでもchというのが出てきますが、これは何を表しているんでしょうか?

全く推測出来ません。

三番目のSub画面です。

ここでもchがありますね。

ここにNodeでCodeを実装するはずです。

こんな小さなSub画面でProgrammingが書けるんでしょうか?

Menu BarとTool Barが同じ段に配置されています。

なんかもう少し機能的な整理の方法はなかったのかと思いました。

最後のSub画面です。

これはAnimation作成のためのToolですね。

それだけ分かっていれば今は十分でしょう。

当分というかずっとかもしれませんが、HoudiniのAnimationを勉強する気はあんまりないのでここは無視し先に進みます。

Tutorialに戻ります。

なんといきなり以下に示したTorusを追加しました。

速すぎて何をしているのか全く分かりません。

コマ送りで確認して以下の事をしているのが判明しました。

まずSub画面①にCursorを置いている状態でCを押し、以下のUIを表示させます。

Createを選択します。

すると以下のUIが表示されます。

今度はGeometryを選択します。

すると以下のUIが表示されます。

ここでTorusを選択します。

するとOrangeのBoxが表示され、適当にClickしたらTorusが配置されました。

ふーん。

成程ね。

二番目のSub画面は以下の様に変化しました。

Parametersと表示された居た箇所はTorus_object1に変化しています。

更にTransformとかRenderとかのTabが表示されTransformには、配置したTorusの位置に関するParameterが表示されています。

ここは選択したNodeのParameterを表示していますね。

後、これってTorus ClassのVariableですよね。うーん。とてもObject Orientedな感じでProcedural なProgrammingではないですね。

三番目のSub画面です。

ああ。やっとNodeが見れました。

/chが/objに変わっていますね。

一寸Nodeを見てみますか。

Cursorを合わせるとなんか表示されます。

白いiを選択したら以下のBoxが表示されました。

これはこのNodeについての解説ですね。

緑の矢印を選択しました。

何も起きません。

青の点を選択しました。

Viewportに写っていたTorusの表示が消えました。

Torusそのものは消えましたが、Transformのための矢印は残っていますね。Modelが見えなくなっているだけみたいです。

それぞれのSub画面の正式な名称が分かりました。

Scene View、Parameter Pane、そしてNetwork Paneです。

Paneか、これは忘れそうな名前ですね。

Paneって、元々窓にはまっているガラスの事を指していたのになんでSub画面の事を指すようになったんでしょうね。

後、PaneとPainって発音全く同じですね。

うーん。

これだけじゃあんまり印象に残らないですね。

今度は、Vを押して以下の様にWireを表示しています。

Vを押しました。

Shadingを選択します。

以下のUIが表示されます。

Smooth Wire Shadedを選択します。

Wire Frameが表示されました。

TutorialとはWire Frameの色が違いますね。何故でしょう?

今度は以下に示したようにScene Viewを4つに分割しました。

出来ました。

V押してLayoutを選択して4つに分割しているImageを選択したら出来ました。

楽勝です。

これ出来ました。単に画面を区切っているBarを移動させただけです。

うーん。

Houdiniって簡単じゃねえ。

何でHoudiniを覚えるのは難しいってなっているの?

後、Zoomの仕方が知りたいですね。

と思ったらTutorialですぐにそのやり方を説明してました。

Space Bar+右Clickを押したままMouseを移動させてZoom inとOutが出来るそうです。

試します。

こんなにZoom out出来ました。

Defaultの位置に戻す方法も知りたいです。

今度はNetwork Paneで以下のUIを表示しています。

これの出し方、説明していません。

何このTutorial?

クッソこっちが素人だと思ってなめ切っているな。とキレそうになって、もう一回だけ確認のために見直したら「Nを押してこのUIを表示します。」って言っていました。

Go in Nと言っていたんですが、聞き逃していました。

Nを押したら以下の様に同じUIが表示されました。

Downを選択します。

Nodeの表示が以下の様に変化しました。

TutorialによるとこれでGeometry Levelに移動したらしいですが、どこで確認出来るんでしょうか?

左端の三角を押してTree Viewを開きました。

Torus Object1の下にTorus1 がありました。

確かにObjectの下の階層ですね。

Property Paneの表示も変わっていました。

Torus1になってParameterも全然違うのが表示されています。

ああ。分かりました。

先程、表示されていたTorusはObjectですので、その位置や大きさなどがParameterに保存されているんです。今度のはGeometryなので、Torusを形成するための半径とかの値が保存されています。

という事はすべてのObjectはGeometryを内在しているって事になりますね。

はい。

理解しました。

Scene ViewのTool Barの一部を以下に示します。

これ先程示したParameter PaneのParameterと同じです。

はい。

これはObjのLevelに居る時でもここに表示されているそうです。

今度はTab Keyを押して以下に示したTAB Menuを開きます。

そしてLineとTypeしてLineを選びます。

Line_Objectノードが追加されました。

TutorialがやっているようにLengthを5,Pointsを6に変更します。

Scene Viewの右端に並んでいるUIの中からDisplay Pointsを押すと

以下に示した様にPointが表示され、LineのPointが6になっているのが確認できます。

思ったより内容が濃いですね。

まだ8分の内2.46分しか終わっていませんが、一寸疲れました。今週のHoudiniの勉強はここまでにします。残りは来週やります。

8. Volumetric Cloudの勉強内容をまとめる

去年、Volumetric Cloudについてかなり勉強しました。

Volumetric CloudはUE5の空の形成になくてはならないものですが、その使用方法や作成方法についてきちんと解説しているものは少ないです。

特に日本語で解説しているものはほとんどないです。

ので私がまとめる事にしました。

8.1 Volumetric Cloudについてまとめる内容について

以下の構成でまとめようと思います。

  1. Parameterの機能と使用方法
  2. Volumetric Cloud用のMaterial InstanceのParameterの使用方法
  3. Volumetric Cloud用のMaterialについて
  4. Volumetric Cloud用のMaterialの作成方法について
  5. Plugin Volumetric について
  6. Volumetric の使用方法について1(雲の移動)
  7. Volumetric の使用方法について 2(Paintを用いた雲の作成)

それぞれについて以下に簡単に解説します。

<Parameterの機能と使用方法>

これはVolumetric Cloudを選択した時に

Detailに表示される以下のParameterの中から雲の形成に関して重要なものを解説します。

何せDefaultのVolumetric Cloudは以下に示したような形状をしています。

右側の雲だけ存在しているなら、まあそれなりに雲っぽく見えますが、左側にある雲なんて、どう考えてもおかしな形をしています。

しかもこれがPlayerのいる箇所を中心に、天が割れたってLevelで2つに分かれています。

これをDetailにあるParameterのみを使用して、それなりに自然に存在する雲の形状に変更します。

<Volumetric Cloud用のMaterial InstanceのParameterの使用方法>

Volumetric Cloudで変更可能なParameterはDetail内のParameterだけではないです。

Volumetric CloudのMaterialにSetされているMaterial InstanceのParameterも変更出来ます。

Defaultでセットされているm_SimpleVolumetricCloud_instを開くと以下のParameterが表示されます。

このParameterの操作方法を説明します。

<Volumetric Cloud用のMaterialについて>

m_SimpleVolumetricCloud_instの元になっているMaterialであるm_SimpleVolumetricCloudの実装について解説します。

ここはProgrammer向けというかProgrammerでもShader言語が分かる人向けになります。

<Volumetric Cloud用のMaterialの作成方法について>

簡単なVolumetric Cloud用のMaterialの作成方法について解説します。

<Plugin Volumetrics について>

以下に示したVolumetricsの使用方法について解説します。

<Volumetric の使用方法について1(雲の移動)>

Volumetricsを使用した雲の移動方法について解説します。

<Volumetric の使用方法について 2(Paintを用いた雲の作成)>

Volumetricsを使用した雲をPaintして生成する方法について解説します。

8.2 去年のBlogに書かれたVolumetric Cloudに関する勉強内容をまとめる

<2022-06-26のblog>

このBlogで本格的なVolumetric Cloudの勉強を始めています。

Unreal Engine 5 Beginner Tutorial | Sky And Clouds [11]で勉強しています。

このTutorialでは以下の方法でVolumetric Cloudの形状を直しています。

1. Volumetric Cloudに使用しているMaterialをPluginのVolumetricsにあるM Volumetric Cloud 02 Profiles Paint..,に変更する。

2. Volumetric CloudのParameterであるLayer Bottom Attitude とLayer Heightの値を調整

3. Directional LightのParameterであるLight Shaftの値を調整

を行っています。

まずUE5.1ではM_VolumetricCloud_02_Profiles_PaintCloudsがたくさんあります。

しかしこれらをそのままVolumetric CloudのMaterialに使用すると、以下に示した M_VolumetricCloud_02_Profiles_PaintCloudsと

MI_VolumetricCloud_02_Profiles_PaintClouds_Morning

以外のMaterialは雲の欠片も表示しません。(以下に他のMaterialを使用して雲が表示されない場合の空を示した。)

のでUE5.1ではVolumetric CloudにあるParameterの使用方法を理解するために、PluginのVolumetricsにあるMaterialを敢えて使用すると学習者を無駄に混乱させる要因になると思われます。

ここはDefaultで備わっているMaterialを使用してVolumetric CloudのParameterの使用方法を勉強すべきです。

このTutorialで使用しているParameterはUE5.1のVolumetric Cloudでも同じものがありました。

この二つは雲の高さを調整するのに大切なParameterで学習者は絶対知っておく必要があります。

更にDirectional LightのParameterであるLight Shaft OcclusionとLight Shaft Bloomを使用しています。これらのParameterのUE5.1に同じものがあります。

正直、Light Shaftについてはどんな機能なのか覚えていません。

Blogを読み直したらGod Rayの一種を表示するための機能みたいです。

2022-07-12のblog

この週はもうVolumetric CloudのMaterialの勉強を始めています。

なんか私はParameterの勉強はProgrammerの勉強ではない気がして、Parameterの勉強あんまり好きじゃないんです。

UE4: Analysis of Volumetric Clouds and How to Use Them [12]を勉強しています。

以下に勉強した内容をまとめます。

まずVolumetric CloudとSky Doom Meshを使用した雲の違いについて

  • Volumetric Cloudで作成した雲はPlayerが雲の中に入り込む事が出来る
  • Directional Lightの影響を受け雲の色が変化する

が説明されていました。

次にLevel上にVolumetric Cloudを追加する方法として3つある事が述べられていました。

  • Place ActorからVisual Effectsを選んでVolumetric Cloudを追加
  • Blueprint内に一つだけ雲を生成してそのBlueprintを配置(位置が自由に指定出来る)
  • 手動で雲をPaintする方法

3つのやり方が紹介されていますが、ここで実際に実装しているのは最初のやり方だけです。

残りの2つのやり方が分かるまでにはその他の沢山のTutorialを当たる必要がありました。

ここからparameterの解説が始まります。

Directional LightのParameterでVolumetric Cloudに関係している箇所です。

ここではAtmosphere and Cloudの欄が全部雲に関係していると紹介されていました。

以下のParameterはDetailから指定する事が出来なくなっていますが、

Cast Cloud ShadowsにCheckを入れる事で指定出来るようになると書かれていました。

まあ、確かにこれも大切な情報ですが、まずは雲の形状を直す必要があります。

その後に必要になるかもしれない情報ですね。

Skylightにも以下に示したような雲に関連したParameterがあります。

ここでもPluginにあるVolumetricsにたくさんのVolumetric Cloud用のMaterialが用意してあると書かれていました。

ここに紹介されているMaterialは前に書いた通りUE5.1の場合は2つの例外を除いて使用出来ません。

これでこのTutorialの勉強は終わりでした。

次にUE4: Step-by-Step to Creating Your First Volumetric Cloud Material [13]を勉強しています。

ここでは最低限の基礎だけで構成されたVolumetric Cloud用のMaterialを作成しています。

このTutorialはかなりの神回なので、Volumetric Cloud用のMaterialを作成する時のTutorialでは、ほとんどそのまま紹介したい内容です。

2022-07-18のblog

Ben Cloward先生のVolumetric Clouds - Building Worlds In Unreal - Episode 32 [14]を勉強しています。

このTutorial自体は重要なんですが、話がCostと精度の関係についてなんです。

今回私が作成したいと思っているVolumetric Cloudの話とはあんまり被らないんです。

一応。このTutorialで紹介されているParameterだけはここに記録しておきます。

<<Volumetric Cloud>>

  • Layer Bottom Altitude
  • Layer Height
  • Use per Sample Atmospheric Light Transmittance

<<Volumetric Cloudに使用されているMaterial内で使用されているVolumetric Advanced Outputノード>>

  • Multi Scattering Approximation Octave Count
  • Ray March Volume Shadow

<<Directional Light>>

  • Cast Shadows on Clouds
  • Cast Shadows on Atmosphere
  • Cast Cloud Shadows

<<Skylight>>

  • Cloud Ambient Occlusion

以上でした。

この中で雲の形状を変化させる機能の解説はあんまり無かったですね。

2022-07-25のblog

Ben Cloward 先生のVolumetric Cloud Materials - Building Worlds In Unreal - Episode 33 [15]を勉強しています。

ここでは、Volumetric CloudのMaterialにDefaultで使用されているm Simple Volumetric Cloudの実装について解説されています。

2022-08-01のblog

Ben Cloward 先生のVolumetric Cloud Materials - Building Worlds In Unreal - Episode 33 [15]の続きを勉強しています。

2022-08-08のblog

Volumetric Cloud用のMaterialにおける最低限の実装について検証しています。

以下のVolumetric Cloudを最低限の実装で作成しました。

2022-08-14のblog

Volumetric Cloud用のMaterialにおける最低限の実装について検証の続きで、UE4: Step-by-Step to Creating Your First Volumetric Cloud Material [13]をもう一回勉強しています。

それなりの検証結果が記録されていますが、述べている内容が細かすぎるのでここにまとめる事は止めておきます。

2022-08-22のblog

この週もUE4: Step-by-Step to Creating Your First Volumetric Cloud Material [13]の勉強の続きをしています。

Volumetric Advanced Outputノードの機能を理解するのにSuccessive Octaveを理解する必要があると書いてありました。ところがこのSuccessive Octaveの意味が分からない。と書かれていてかなり苦しんでいるのが文体から感じられます。

このNoiseにおけるOctaveの意味はBen Cloward先生のTutorialで氷解したんですが、そのTutorialを勉強するまでは本当にわけわからない状態が続いていました。

2022-08-29のblog

UE4: Step-by-Step to Creating Your First Volumetric Cloud Material [13]の勉強の続きをしています。

ここでやっとUE4: Step-by-Step to Creating Your First Volumetric Cloud Material [13]の勉強が終わりました。

2022-09-05のblog

Ben Cloward 先生のVolumetric Cloud Materials - Building Worlds In Unreal - Episode 33 [15]の勉強をやり直しています。

2022-09-12のblog

無料でもらったAssetであるDynamic Volumetric Skyについて簡単な解説をしています。

その後で、Ben Cloward 先生のVolumetric Cloud Materials - Building Worlds In Unreal - Episode 33 [15]の勉強の続きをしています。

この週で上空から見た雲の形が

以下のTextureの

形状だった事、そして以下のTextureが

雲の上下の形状を指定していて、例えば以下のTextureを代わりに使用したら

こういう雲の形が作成出来る事を理解します。

ここでやっとm Simple Volumetric Cloudの実装が理解出来ました。

2022-09-19のblog

前に勉強した内容を復習しています。

2022-10-10のblog

PluginのVolumetricsで使用されているVolumetric Cloud用のMaterialを調査しています。

これはUE4のVolumetricsにあるMaterialですね。

ここにあるMaterialを使用してもそれなりに雲が生成されています。

2022-10-16のblog

UE5.1のPluginのVolumetricsで使用されているVolumetric Cloud用のMaterialの内の一つであるM_VolumetricCloud_02_Profiles_PaintClouds_Morningの実装を詳しく読んでいます。

その結果、計算結果が全部0になってしまう。と驚いています。

雲一つない空が形成されているので返し値が0になるのは正しいんですが、この時はそれが何故なのか全くわかっていなかったです。

2022-10-23のblog

M_VolumetricCloud_02_Profiles_PaintClouds_Morningの実装の続きを読んでいます。

計算結果が0になるのは以下のTextureが0だからだという事に気が付いたみたいです。

2022-10-31のblog

M_VolumetricCloud_02_Profiles_PaintClouds_Morningの実装の続きを読んでいます。

2022-11-06のblog

M_VolumetricCloud_02_Profiles_PaintClouds_Morningの実装の続きを読んでいます。

先程の黒いTextureの代わりに以下のTextureを代用すると

雲が表示される事に気が付きました。

2022-11-14のblog

ここで初めて、最初にUE4: Analysis of Volumetric Clouds and How to Use Them [12]で一寸だけ聞いた、望んだ位置にVolumetric Cloudを配置する方法について調べています。

Volumetric Cloud Secrets [Unreal Engine 4 & 5] Works in UE5! [16] にそのやり方が解説されていると聞いてそれを勉強しています。

以下のような雲を作成していました。

正直言ってこれのやり方、全く覚えていません。Tutorialを書く段階になったらもう一回勉強し直します。

この週では更にPaintによるVolumetric Cloudの作成方法についても勉強していました。

Unreal Engine Volumetric Paint Clouds Tutorial [17] でPaintによるVolumetric Cloudの作成方法を勉強しています。

ここで初めてZero Conditional氏のTutorialを知ったんでした。

このTutorialで勉強して一応Paintは出来るようになったんですが、

UIが文字化けしています。

今、SampleにあるPaint用のMapを開いて確認したらUIは普通に表示されています。

はあ。何故これをこの時確認しなかったんでしょう。

つまり、Unreal Engine Volumetric Paint Clouds Tutorial [17] のやり方は古すぎて今のVersionである5.1には対応してないって事です。

ちなみにこのSample MapはPaint_Cloudsという名前で以下の場所にあります。

<2022-11-20のblog>

ここはPaintした雲がSave出来ているのかどうかを調べています。

まあ、正解にたどり着くためには一歩ずつ進むしかないです。

<2022-11-28のblog>

ここでPaintで描いた雲はSaveされていない事に気が付きます。

まあそういう訳で、まだPaintの使用方法に関してはこれから勉強する事がかなりあります。

<2022-12-04のblog>

ここでZero Conditional氏のTutorialが全てのVolumetric CloudのTutorialの元になっているらしい。という噂を聞いて、Beginners Intro to Volumetric Clouds in Unreal Engine 4.26 [18]を勉強しています。

Volumetric CloudのParameterについての説明がまとめられていました。

<2022-12-12のblog>

今までの勉強から得た知識からのVolumetric Cloudに関する私の見解がまとめられていました。

後、Beginners Intro to Volumetric Clouds in Unreal Engine 4.26 [18]の勉強の続きを行っています。

8.3 去年勉強したTutorialと今年まとめる内容を一致させる

全部、見直した結果、あんまり被っている部分がない事に気が付きました。

後、BPを使って好きな場所にVolumetric Cloudを配置する方法と、Paintを使用して好きな形状の雲を作成する方法はもう少し勉強が必要です。

Volumetric CloudのParameterもこうやって見直すと雲の形状を変える機能についてはほとんど勉強してない事が分かりました。

一寸どうまとめるか考え直す必要がある気がしてきました。

例えばUE5.1 のSample Mapを使用するとPaintのUIが使用出来ます。

すると、

  1. Paintで望みの雲を作成。
  2. それをSaveする。
  3. SaveしたTextureをMaterial内の黒のTextureと交換する。
  4. そのMaterialを使用してVolumetric Cloudを作成。
  5. Paintで作成した雲をVolumetric Cloudとして自由に使用出来る

みたいな事が可能になります。

これがUE5が目指しているVolumetric Cloudの真の使用方法なのではないのか。という気がしてきました。

これを検討してみる必要があります。

来週からこれをやります。

9. DirectX 12の勉強

2022-12-12のBlogを見るとOlympusMonsTutorials氏のC++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [19]を一寸だけ勉強した所で終わっています。続きをやります。

ただし3週間もDirectX 12の勉強を休んでいて、今まで何をやったのかをわすれてしまっています。

ので、最初に今までの勉強内容の復習から始めます。

9.1 今までの勉強内容の復習

2022-10-16

まずBlogを読み直して思ったのが分かりにくい。

前文を書く時間を潰してDirectX 12の勉強を始めたので、前文に勉強した内容がまとめられています。その後でUEの予定していた勉強が終わった後にもDirectX 12の勉強をしているのでBlogの最後にもまとめられています。前文の内容とBlogの最後の内容の両方をここにまとめます。

<<前文>>

ここでは、どのTutorialで勉強するかを検討しています。著作権的にグレーになる可能性のある日本の教科書は採用したくない事が書いてあります。

<<本文>>

Visual Studioを新しいPCにInstallするところから始まっています。

無駄なSoftはなるだけInstallしたくないので.netをInstallする必要があるのかどうかを特に検討しています。

UEでVisual Studioを使用する時に言語設定が日本語になっているとUE側でCompileした時にErrorになるみたいな話があり、言語は英語に統一する事にしています。

Visual StudioをInstallして終わっています。

2022-10-23

<<前文>>
今度はVisual Studio内でDirectX 12を使用するための設定について調査しています。

この設定がTutorialによって全く違うので、???となっています。

結論として、Visual StudioDirectX 12を使用するための設定って実はないんじゃないのか。となっています。

それぞれのTutorialがやっている事はそれぞれのTutorialに最適化した設定であって、別にDirectX 12を使用するための設定じゃない気がすると書いてあります。

この辺、本当はどうだったのか覚えていません。

確かにOpenGLの時にGLFWが使用出来るようにする設定はすべてのTutorialでほぼ同じで、そういうのがDirectX 12のTutorialにないのは事実ですが、Visual Studioの設定を全くいじる必要がなかったかどうかは覚えていません。

<<本文>>
 C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [20]の勉強を始めています。

後、補助として以下の3つの日本語の教科書を読む事にしました。

C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [20]の説明通りにVisual Studioの設定を変更しています。

この途中で、先週D:DriveにDownloadしたと思ったWindows SDKがC:Driveに入っている事が判明しました。

絶対C:Driveには必要最低限のSoftしかDownloadしないと決めていたのでかなりショックを受けています。

最後に何でWindows SDKがD:DriveにInstallされてしまったのかについて調べています。

なんと、Windows SDK がInstallされる場所はRegistryで決定されていて、Visual StudioをInstallする時に指定したFolderにはInstallされない事が最初から決まっている事が分かりました。

のでWindows SDKをD:DriveにInstallする事は諦めています。

ただ、ここでRegistryについて勉強した事は、後でPC1号のOSをWindows 8.1 からWindows 10にUpgradeする時に大いに役に立ちました。

2022-10-31

<<前文>>

以下の日本語の3つの本で勉強した内容についてまとめています。

3つの本の第一章を読んで感想をまとめています。

その結果、Command QueueとかCommand Listを理解する事がDirectX 12を理解する上で重要なのではないか。との結論に至っています。
<<本文>>
 C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [20]の内のProjectの作成を実行しています。

Configurationの設定とかを行っています。

今読み直すと、何をしているのかよく分からない所がありますね。

まあ今、勉強し直す必要がある箇所でないはずですので、後で必要になった時に読み直す事にします。

2022-11-06

<<前文>>

Descriptor、Descriptor Heap、Descriptor Table、Root Signature、Pipeline State、Command List、Command Queue、FenceとBarrierについて調べています。

今読み直すと一個もその意味を覚えていません

自分で書いた内容じゃないみたいです。
<<本文>>

 C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [20]の内のCreating our Empty Project、Creating Windowsを勉強しています。

Window Classにある沢山のPropertiesの値を指定しています。

それぞれのPropertiesの機能についてはよく理解してないので、ここではまとめないと書いています。

確かWindows ClassのPropertiesはWindows APIの公式サイトを見たら全部説明されていたはずです。

今、それぞれのPropertiesを見直しましたが、それらの機能に関しては全く覚えていません。

うーん。

調べます。

WNDCLASSEXA structure (winuser.h) [21]に全部解説されていました。

まあこれも覚えておかないといけない事の一つでしょうね。

2022-11-14

<<前文>>

DirectX 12の魔導書」の2章、「グラフィックスパイプラインとさまざまなシェーダー」を読んでいます。

Pipelineについては、

Input Assembler -> Vertex Shader -> Pixel Shader -> Output-Merger

という流れを簡単に解説しているだけでした。

このPipelineに関して2つの質問をここに述べていますが、この解答はまだわかっていません。

HLSLについての勉強では、重要だと思った内容や疑問を抜き出したまとめていました。

これについては今でも分かりません。

他の2冊についても同様の内容が書かれている場所を抜き出した読んだそうです。

次の週からはSample CodeをDownloadして実際に動くのか確認する事を始めると書かれていました。

<<本文>>
 C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [20]の続きを勉強しています。

前の週に勉強した内容を実装しています。

Tutorial通りに実装したんですが、AnnotationがInconsistentだ。とErrorになってしまいました。

そこからAnnotationについて調べて、直したりしています。

2022-11-20

<<前文>>

DirectX 12の魔導書」、「HLSLシェーダーの魔導書」と「Direct3D 12 ゲームグラフィック実践ガイド」のSample CodeをDownloadして動くかどうかの確認をしています。

Direct3D 12 ゲームグラフィック実践ガイド」のSample Codeを実行するにはAssimpとDirectX Tool Kitを自分で追加する必要があるみたいで、NuGetを使用して自動でVisual Studioに追加するか、全部自分でやっておくべきか悩んでいます。

一応、DownloadしたSample Codeの一番最初にあるのは全部正常に動いたみたいです。
<<本文>>
 C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [20]の続きを勉強しています。

この週は、Display our windowを勉強しています。

CreateWindow()関数を使用していて、そのParameterに使用されている変数をここで作成すると書いていました。

まだ実装していないので、忠実にTutorialの内容をまとめているって感じです。

2022-11-28

<<前文>>

前の週で C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [20] で勉強したところと、大体同じ箇所を、いつもの3つの本で勉強する事にします。

DirectX 12の魔導書では3.1の最初のProjectをやっています。

やっているんですが、3.1で何をやったのかについては全く書いていません。

これ著作権に配慮してその部分を丸っと削ったんだと思いますが、後から読むと何をしたのか全く分かりません。

しかたないのでDirectX 12の魔導書の3.1を今読み直します。

大した事、やってなかった。

単にTextを表示するCodeを実装しただけでした。

HLSLシェーダーの魔導書です。

これは、一番最初のSample CodeでもC++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [20] で勉強したところより大分先を言っているので、まだ勉強しない事にした。と書いてありました。

Direct3D 12 ゲームグラフィック実践ガイドです。

まずAssimpもDirectX Tool Ketの追加ですが、これが必要にあるのはずっと後の事だと判明しました。のでその時になったら考える事にした。と書いてありました。

この本ではProjectの設定方法について非常に詳しい解説が書かれていました。

のでC++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [20]のやり方と比較して違う箇所を抜き出して、何故違うのかについて検証しています。
<<本文>>
 C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [20]の続きを勉強しています。

前の週に勉強したDisplay our windowを実装しています。

この週はほんとに一寸しか勉強していません。

2022-12-04

<<前文>>

CreateWindow()関数あたりの実装をいつもの3つの本ではどうやっているのかについて調べています。

これ C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [20]の事ですね。全部間違っていますね。

まあ、直すのが面倒なんでそのままにしておきます。
<<本文>>
C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [18]のMessage Loopを勉強しています。

結論から言うとTutorialでこの部分は難しいので実装はそのままCopyして説明だけします。とあってその通りにCopyしてしまったので、動きました。以上の感想はないです。

2022-12-12

<<前文>>

Message Loopがいつもの3つの本でどうやって実装されているのかについて調べています。

DirectX 12の魔導書です。

Message Loopの部分を勉強する前にCreate Window()関数の実装をまだしていなかったです。のでそれをまず実装しています。

というかCreateWindow()関数を作ったところで力尽きてしまいました。

HLSLシェーダーの魔導書です。

こっちもCreateWindow()関数について勉強しています。Sample CodeにこのCreatewindow()関数について詳しく解説してあったので、それを見て勉強しています。

この解説が結構分かりやすくて、前の勉強でもう力尽きてしまったと思った私ですが、生きを吹き返して、かなり熱心に勉強しています。

Direct3D 12 ゲームグラフィック実践ガイドです。

この教材だけ別な事をやっています。「2.2 アプリケーションクラスの作成」を勉強しています。

あー。

段々思い出して来ました。

WindowProcedure()関数について熱心に調べたり、機能を述べたりしています。

去年は、この辺を勉強していたんです。

<<本文>>

ここでOlympusMonsTutorials氏のC++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [19]の勉強を始めています。

取りあえず全部見て、何をやっているのかを簡単にまとめています。

9.2 復習した感想とまとめ

兎に角疲れました。

でも今まで何をやっていたのかと言うか、全体の流れを思い出す事が出来ました。

そうか、WindowProcedure()関数について勉強している所で終わっていたんでした。

まだもう少しWin32の勉強する必要がありそうですね。DirectX 12の勉強はその後からです。ここは慌てずゆっくりとしかししっかりと勉強していきます。

9.3 C++ DirectX 12 Game Engine - [S01E02] - Refining Our Window[19]を勉強する

今週は復習していたら時間がなくなってしまったのでこれは来週に回します。

10. まとめと感想

今週は去年の終わりに考えた予定に沿って勉強をしてみました。

簡単すぎる所ときつ過ぎる所がありました。

それぞれの勉強について感想をまとめます。

10.1 制作系の勉強について

ここでは以下の3つの感想を述べます。

  • LandscapeのみのGameを作成する
  • 戦闘システムの続きを作成する
  • Volumetric Cloudの勉強内容をまとめ、Volumetric CloudのTutorialを作成する

これらは兎に角、完成させる必要があります。

所が、何をどこまでやったらいいのかがはっきりしません。Tutorialの勉強と比較すると曖昧な部分が多くてどうしても手を抜いてしまいます。

それを避けるために、作業予定表を作成しましたが、うーん。まだ暗中模索です。

Volumetric CloudはPaintに関して、今週新たな事実が判明したので予定していた内容を一から考え直す必要があるかもしれません。

しかしもし今週考えた方法でVolumetric Cloudの作成が可能になると、今まで誰も作った事のないオリジナル(Unique)なTutorialが作成出来るかもしれません。これは挑戦し甲斐があります。

10.2 UE5の勉強

ここでは以下の2つについての感想を述べます。

  • Niagaraの勉強
  • Materialの勉強

まずMaterialの勉強ですが、Ben Cloward先生のAdvanced Material Seriesですが、前のTutorialと比較して内容がかなり濃いです。

これ一個のTutorialを一回の勉強で終わらせるのは無理があるかもしれません。

うーん。どうしよう。

これはまだ考え途中です。

Niagaraの勉強ですが、UE5.1 のFluid SimulationのModuleはUE5.0とかなり違います。その違いを理解するためだけに相当な時間が取られそうです。

これNiagaraのFluid SimulationにおけるEmitter StackのSectionを理解する方が何倍も大切なきがします。

あえてUE5.1 で勉強する必要あるのかな?と思っています。

10.3 それ以外の勉強

  • Gaeaの勉強
  • Houdiniの勉強
  • DirectX 12の勉強

まずGaeaの勉強ですが、これは最終的にはTutorialとして自分で書くつもりです。まだどうやってまとめるのか構想がついていないのと、まだ勉強不足な所があるのでここに分類しました。

YouTubeにあるGaeaのTutorialは公式サイトと英語の2つだけです。

しかしすべてのTutorialで使用されているGaeaのVersionは古いもので、今のGaeaの使用方法は、それらのTutorialを見るだけでは理解出来ないです。

なので、そんなに深く理解しなくても、かなりの需要はありそうです。どのくらい勉強してからTutorialを作成するのか、その見極めが重要になって来ます。

Houdiniは今週、初めて勉強しました。

みんなHoudiniは難しいと言っていますが、今週勉強した限りでは、理解するのは全く問題なさそうです。

ただ勉強する量はかなり多いです。

今週は8分のTutorialを試しに勉強しましたが、最初の2分しか終わらなかったです。その2分だけでも正直多すぎで脳がパンクしてしまいました。

こっちはDirectX 12の勉強と違ってなるだけ早く使い方を覚えて、教える方に回りたいです。

正直、日本語のHoudiniの教材で英語と同じLevelのものはまだ無いみたいで、今のうちにHoudiniの使い方を覚えて、教える側に参入出来れば、かなり美味しいPositionが取れる気がしています。

英語圏でバズっている(Viralな)Houdiniの動画って、Houdiniで単に超美麗な映像を作るだけじゃダメで、ジブリとかナルトとかの有名な一シーンをHoudiniの超美麗な映像で再現しています。

しかし逆に言えば、そういうのさえ作成出来たら、SNSでバズるのはほとんど約束されているようなものです。

そして一回SNSでバズった映像を作成出来さえすれば、しれっとHoudiniの先生として教える側に参入出来るでしょう。

のでなるだけ早く機能を覚えたいです。

いや、そもそもHoudiniの勉強はUEで使用する建物をもっと簡単に作成するために始めたんでした。既に目的がズレています。

DirectX 12の勉強は、今、復習してやっと今まで何を勉強していたのかを思い出しました。

こっちは参入障壁が高すぎて慌てて勉強する必要は全くないので、今までと同じようにゆっくり勉強していきます。

後、前文をどうするかです。これは継続して書いていきたいです。

これについてももう少し考えます。

11. 参照(Reference)

[1] Klaus. (2022, May 21). How To BUILD AN ISLAND In 20 mins | Unreal Engine 5 Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=Obfq-Zh3iXs

[2] renderBucket. (2022, April 28). Unreal Engine 5 Tutorial - Niagara Fluids - Flamethrower [1/2] [Video]. YouTube. https://www.youtube.com/watch?v=k3EBxQGVSj8

[3] renderBucket. (2022, April 28). Unreal Engine 5 Tutorial - Niagara Fluids - Flamethrower [2/2] [Video]. YouTube. https://www.youtube.com/watch?v=28YFVQjgwbA

[4] Ben Cloward. (2022, October 6). Sparkling Snow Shader - Advanced Materials - Episode 2 [Video]. YouTube. https://www.youtube.com/watch?v=TCz-fKJS3wI

[5] Matt Aspland. (2022, February 6). How To Build Package And Export Your Game - Unreal Engine Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=O2PKihXmejw

[6] JSFILMZ. (2021, May 30). Unreal Engine 5 Tutorial How to Package Your Game [Video]. YouTube. https://www.youtube.com/watch?v=L6PSdDX4oYI

[7] Andrea Cantelli. (2020, June 8). Gaea Tutorial for Beginners #7 | Color correction [Video]. YouTube. https://www.youtube.com/watch?v=jUunmkdsT04

[8] Andrea Cantelli. (2020a, May 21). Gaea Tutorial for Beginners #1 | Intro to the series & Analyzing the Interface [Video]. YouTube. https://www.youtube.com/watch?v=fX1PJNvl8c0

[9] houdinikitchen. (2019, April 23). Tutorial 1. Networks and Nodes [Video]. YouTube. https://www.youtube.com/watch?v=aNsUTQessXg

[10] Magee, R. (n.d.). Foundations | Overview | SideFX. https://www.sidefx.com/tutorials/foundations-overview/

[11] pinkpocketTV. (2022, January 14). Unreal Engine 5 Beginner Tutorial | Sky And Clouds [Video]. YouTube. https://www.youtube.com/watch?v=lYZoR3ZLD-o

[12] WorldofLevelDesign. (2021, February 9). UE4: Analysis of Volumetric Clouds and How to Use Them [Video]. YouTube. https://www.youtube.com/watch?v=8XjEk-CP-kQ

[13] WorldofLevelDesign. (2021b, February 16). UE4: Step-by-Step to Creating Your First Volumetric Cloud Material [Video]. YouTube. https://www.youtube.com/watch?v=aYxvN5cs-EU

[14] Ben Cloward. (2021, May 27). Volumetric Clouds - Building Worlds In Unreal - Episode 32 [Video]. YouTube. https://www.youtube.com/watch?v=dolfk2z4LDo

[15] Ben Cloward. (2021b, June 3). Volumetric Cloud Materials - Building Worlds In Unreal - Episode 33 [Video]. YouTube. https://www.youtube.com/watch?v=rEYojMx26T0

[16] William Faucher. (2021, May 25). Volumetric Cloud Secrets  [Unreal Engine 4 & 5] Works in UE5! [Video]. YouTube. https://www.youtube.com/watch?v=yolGEIrhu0s

[17] Zero Conditional. (2021, March 2). Unreal Engine Volumetric Paint Clouds Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=SlR3eDr4jQc

[18] Zero Conditional. (2020, December 22). Beginners Intro to Volumetric Clouds in Unreal Engine 4.26. YouTube. https://www.youtube.com/watch?v=M2rOitk_I9g

[19] OlympusMonsTutorials. (2021, March 3). C++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [Video]. YouTube. https://www.youtube.com/watch?v=rWylZKi8QbM

[20] OlympusMonsTutorials. (2021, February 17). C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [Video]. https://www.youtube.com/watch?v=2vrEIhAajhM

[21] WNDCLASSEXA (winuser.h) - Win32 apps. (2022, July 28). Microsoft Learn. Retrieved January 8, 2023, from https://learn.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-wndclassexa