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