UE4の勉強記録

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

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

1. 今週の予定

1.1 今週の予定

DirectXの勉強>

Olympus Game Engineの作成の続きといつもの3冊の教科書を勉強します。

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

先週、考えた構想はLandscapeをGameとして使用するのではなく撮影場所や神社などのEvent会場として使用したらどうかという事でした。

その辺の構想をもう少し深堀します。

後は川でも追加します。

<Materialの勉強>

Ben Cloward先生のAdvanced MaterialのTutorialをやります。

先週勉強した内容を実装するか、新しいTutorialの勉強をするかどちらかをやります。

Niagaraの勉強>

CGHOW氏のTutorialをやります。先週勉強した内容を実装します。

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

Packagingしてきちんと動くのかを確認します。

特に他のPCでも動くのかを確認します。

<Gaeaの勉強>

今週はGeologyの勉強とYouTube用のTutorialの作成の両方をやります。

<Houdiniの勉強>

Houdiniの勉強は一端お休みしてUE5.2のProcedural Content Generationの勉強をします。

<UEFNの勉強>

先週の実装の続きを行います。

Water Body Oceanを使用するとLandscapeがおかしくなります。

これに対してどう対応するのかについて検証します。

YouTube動画の作成>

先週出来なかったDavinci Resolveの編集方法についての勉強をします。

2.DirectXの勉強

2.1 Olympus Game Engineの作成

2.1.1 先週の復習

先週はOlympusMonsTutorialsのC++ DirectX 12 Game Engine - [S01E04] - Settings and Loggers [1]の最初の節であるC++ DirectX 12 Game Engine Episode 4 : Settings and Loggersを勉強しました。

<Singletonについて>

実装内容そのものも理解出来ない部分があったんですが、それよりもSingltonの作成方法の意味が分からないで困ってしまいました。

一応、先週もSingletonの基礎について勉強はしましたが、Tutorialで使用されているSingltonを全部理解する事は出来ませんでした。

<Log Classの作成>

これはTutorialの内容を忠実にまとめたので、先週のBlogの内容にそって実装すれば問題なく再現出来るはずです。

このLog ClassがSingletonなのですが、それ以外にも特徴があって例えばどのProgrammingからもAccess出来るように作成されています。

このための設定方法は分かりましたが、何故それをやるとどのProgrammingからもAccess出来るのかは不明です。

<先週の結論>

DirectXの勉強を今更増やす事は出来ません。

軽く勉強して分からないところは分からないで終わらしておくべきと結論づけました。

この結論は正しいですね。今更C++でしこしこCodeを書く気はないです。

そんな事する位ならVerseの勉強でもします。

軽く勉強して分からない部分は分からないでお終いにします。

2.1.2  C++ DirectX 12 Game Engine Episode 4 : Settings and Loggersを実装する

今週から新しいTutorialに移行するので今までのProjectをDuplicateして名前をEpisode4に変更しました。

DuplicateしたProjectがきちんと起動するか確認します。

OKを押します。

後はOKを押しても同じBoxが表示されるだけでした。

出来ていますね。

まずLog Classを作成します。

Folder Viewを表示します。

Tutorialではこの一個上のFolderまで表示されています。

これってどうしてなんでしょう?

別にこれが出来ないと困る訳では無いですが一寸気になります。

OlympusのSourceを選択しCommon Folderを作成します。

そこにLogger.hとLogger.cppを作成します。

しました。

Solution Viewに戻ります。

OlympusのSourceのPrivateとPublicのFilterにCommonを追加します。

更にそれぞれのCommon FilterにLogger.hとLogger.cppを追加します。

Logger.cppに以下の実装を追加しました。

ただしこのOlympus.hはEpsoide3のProjectのOlympus.hを参照しています。

これを直します。

OlympusのPropertiesを開きC/C++のGeneralのAdditional Include Directoriesの設定を以下の様に変更します。

Blank ProjectのPropertiesも同様に直します。

結果です。

Olympus.hの参照先がEpisode4になっています。

直りました。

Log.hの実装をします。

Singltonの実装です。

今回はまだ実装内容を完全に理解した訳では無いのでTutorialのCodeを丸コピーします。

うーん。

今、Codeを見ると先週気が付かなかった事が結構ある事に気が付きますね。

例えば以下の2つのCodeは単なるGetterとSetterでした。

正し両方ともStaticの指定がされています。

Static Members of a C++ Class [2]に、C++におけるStaticの変数や関数についての説明がありました。

まずStaticな変数ですが

と解説されています。

ここではMemberと書かれていますが変数の事です。

つまり何個Instanceが作成されても一個の変数しか存在しないという事です。

今度はClass内のStaticな関数についてです。

要するに独立した関数と同じ扱いになるという事です。

しかもObjectが無くても使用する事が出来るそうです。

そしてこれらのStaticな関数はClass名::関数名()で使用するそうです。

ああ、これって先週意味が分からなかった

これの事じゃ。

と思ったらこっちは変数でした。

うーん。

だったら先程のStaticな変数の説明をもう一度読み直してみます。

ありました。

ここにしっかり説明されていました。

これを読むとClass名::変数名で、そのClassのObjectが生成されていない状態でもその変数を作成出来ると書かれています。

以下の実装でInst変数を生成します。

そしてここは推測ですが、この生成されたInstはまだ初期化されていないので値を持っていません。

そこで以下のConstructorで値を追加します。

こんな感じな気がします。

あ、そうだ!

ConstructorとDestructorをLogge.cpp内に作成します。

更に先程のStaticな変数の初期化も追加します。

うーん。

でもやっぱり意味が分からない部分がありますね。

この変数がLogger Classじゃなかったら分かるんですが、Logger Classを生成するのにLogger ClassのConstructorの前に呼び出すというのがよく分からんです。

  • Logger Classを生成するー>Logger Class内にLogger Classの変数があるー>Logger Classを生成する必要がある

で永遠の生成Loopに入ってしまいそうです。

だからStaticな変数にしているのか。

ああ、Logger Class自体はStaticなClassでは無いのか。Logger Classの変数InstがStaticなので、Instの値は常に一個しかないのか。

違う。

問題はそこじゃない。

同じクラス内にそのクラスの変数を作成したらどうなるのかが分からないのが問題なんです。

こっちを調べます。

Staticな変数だとClassから独立しているとみなされるため、同じClass内から呼び出されても関係ないそうです。

うーん。

ここはInstがPrivateである事も一緒に考える必要が有るのかもしれません。

以下の仮説を思いつきました。

InstはStaticな変数なのでClass内で使用するにしても一回初期化する必要がある。

それがこれ

しかもこの変数はPrivateで指定されているため、Logger Class内からでしかAccess出来ない。

Logger.cpp内で初期化した後にConstructorで以下の指定を行う。

これでInstに今生成されたLoggerのObjectを指定出来る。

Logger Class自体はStaticではない。ので何個でも生成出来る。しかしInstはStaticなのでInst変数は一個しか生成されない。

生成されたLoggerのInstanceでInstに紐づけられるのは一個だけ。

それ以外のLoggerのInstanceはInstに紐づけできず破壊される。

結果Logger ClassのInstanceは一個しか生成されない。

うーん。

これだとInst変数を敢えてPrivateにする必要をあんまり感じませんね。

この初心者向けのTutorialで、絶対に誰もやった事が無い方法でSingletonを実装する事は無いと思うんです。

なのにこのやり方でSingletonを作成するTutorialが一個も見つからないんです。

これが謎です。

という事はこれはGame Engineを作成する人達の間では共通のSingletonの作成方法なのかもしれません。

そしたらやっとこのTutorialと同じやり方でSingletonを作成しているTutorialを見つけました。

The Cherno氏のSINGLETONS in C++ [3]です。

The Charno氏はEA社でFrostbiteの開発に関わっていた人で、退社後はYouTube上で個人でGame Engine作成のTutorialをずっと上げている人です。

やっぱりGame Engine関連のTutorialを探すのが正解でした。

このTutorialの7:30からのSingletonの実装例で、以下のような実装を追加しています。

しかもこれについて

「Staticなのでどこか(例えばCPPファイルとか)でDefineする必要があります。」

と解説して上記の実装を行っています。

これを私流に解釈すると

「Staticな変数をClass内に作成した場合、その変数を一回宣言してからでないとそのClass内でも使用出来ない」

という事です。

これであっているでしょう。

確認します。

Cppreferemce.comのstatic members [4]の説明です。

しっかりここに書いてありました。

Staticの場合は通常のDeclarationではIncompleteでその後で、Class名::変数名のDefinitionを行う必要があります。と

これで以下の部分のCodeの意味は完全に分かりました。

これはDefinitionを行っていたんです。

通常の変数なら初期化する時に一辺にDeclarationとDefinitionとInitializationを行ってしまいますが、Staticな変数の場合はこれらを全部別々に行う必要が有ったんです。

今、仮説から読み直してみましたが、かなり近い予測をしていました。

ただDeclarationとDefinitionとInitializationの定義が曖昧だったのでそれぞれの言葉を適当に運用しています。

Differences Between Definition, Declaration, and Initialization [5]にそれぞれの定義が分かり易く説明されていました。

まずDeclarationですが

要するに

です。

次にDefinitionですが

つまり必要なMemoryを確保します。

そしてInitializationです。

はい。値をセットします。

このLogger ClassのInstを例にすると

ここでDeclarationを行い

ここでDefinitionを行い

最後にここでInitializationを行っていたと言う訳です。

やっとこのCodeの意味が分かりました。

うーん。

こんなに時間が掛かってしまった。

でもそれなりに面白かったので良しとします。

Settings and Loggersの実装を最後までやります。

Olympus.hにLogger.hをIncludeします。

最後にWinEntry.hを開いてLoggerのInstanceを作成するための実装を追加しました。

以上です。

最後の確認のためにTutorialを見直していたら

をやるのを忘れていました。

やりました。

2.2「DirectX 12の魔導書」の勉強

今週は他にやらなくてはいけない事が沢山あるので、既に予定した内容を全部終わらせる事は不可能になってしまっています。

出来るだけやる事にします。

2.2.1先週の勉強を復習する

先週、何を勉強したのか既に忘れてしまったので、先週のBlogを読み直します。

分かりました。

先週は教科書の「3.3.6 Swap Chainを動作させる」を読んでその内容を簡単にまとめました。

今週から「3.3.6 Swap Chainを動作させる」の実装をやっていきます。

2.2.2 「3.3.6 Swap Chainを動作させる」の「Render Targetの設定」の実装を行う

まずこの節の実装を行う前に全体の流れを確認しておきます。

以下の順番で実装します。

しかし先週、教科書を読んだ限りでは実際は

の順番で実装しています。

ここでCommand AllocatorのResetですが、教科書だとRender Targetの設定の前に一回実装していて、その後の「ためておいた命令を実行する」でも実装しているように読めます。

先週、Sample Codeで確認したんですが、「ためておいた命令を実行する」の実装部分のCommand AllocatorのResetしか確認出来ませんでした。

これだけもう一回確認します。

はい。

「ためておいた命令を実行する」の実装部分のCommand AllocatorのResetしかないです。

それでは「Render Targetの設定」の実装を行います。

まず現在のBack BufferのIndexを取得します。

Indexで表示されたBack Bufferをこれから使用するRender Target Viewとしてセットします。

このOMSetRenderTargets()関数の機能から調べます。

公式のID3D12GraphicsCommandList::OMSetRenderTargets method (d3d12.h)[6]から読みます。

CPUのDescriptor Handleをセットします。とだけ書いています。

うーん。

これはParameterから先に考えます。

ここで大切なのは二番目のParameterです。

これです。

よく分からん。

先に実装部を見てみます。

うん。

これを理解するには、D3D12_CPU_DESCRIPTOR_HANDLE structureの構造を知る必要がありますね。

公式のD3D12_CPU_DESCRIPTOR_HANDLE structure [7]を見ます。

何と、Pointerしかないです。

でDescriptorのAddressを保持します。

うん。

OMSetRenderTargets()関数が大体何をやっているのかのImageが掴めました。

それではOMSetRenderTargets()関数の実装をします。

これで完成です。

2.2.3 全体像が分からなくなってきた。

なんか、細かい実装ばっかりやっているので全体の流れがよく分からなくなって来ました。

Render Target ViewとDescriptorとSwapChainとCommand Queueとかの関係を忘れてしまいました。

この「3.3 画面色のClear」を勉強し終わったら一回全部の流れを復習し直します。

2.3 「HLSLシェーダーの魔導書」を勉強する

2.3.1 先週の復習

先週は四章を読みました。

光について勉強しました。大体この四章にかかれている内容は元から知っている事でした。

2.3.2「4.1 Lightingなしの3D Model表示」を実装します

Sample_04_01.slnのSample Codeを開きます。

これにCodeを追加していきます。

<Step1>

Step1の実装を行います。

Model Init Dataはおそらくこの教科書が作成したClassなのでここでは調べません。

全体の流れを簡単に把握する事を優先します。

.tkm fileのパスを設定します。

確かに指定した箇所にFileがありました。

Sample.fxも指定したFile内にありました。

以下に実装を示します。

うん。

これは今まで勉強した範囲で理解出来るHLSLの内容ですね。

ただHLSLの魔術書と歌うんなら、ここでもHLSLに関してはもっと詳しい解説をして欲しかったです。

<Step2>

以下の実装を追加しました。

Modelクラスの初期化を行っています。

<Step3>

DrawをCallします。

これで実装は終わりです。

テストします。

当然ですけど出来ました。

この教科書はこんな感じで軽く勉強していきます。

一回勉強が終わった後で実装をじっくり見るかもしれませんが、しないかもしれません。

2.4「Direct3D 12 ゲームグラフィック実践ガイド」の勉強

2.4.1先週の復習

先週は、「2.3.4 Command Listの生成」を一寸読んで終わりにしました。時間もあんまり無かったんです。

もうこのCommand ListとかCommand Allocatorとかの役割がよく分からなくなってしまったので一回実装してから復習する事にします。

2.4.2「2.3.4 Command Listの生成」を実装する

ので今週は兎に角実装してしまいます。

まずCommand Allocatorの実装です。

以下の実装を追加しました。

この実装方法自体は「DirectX 12の魔導書」の「3.3.2 Command Listの作成とCommand Allocatorについて」と同じなので特に疑問は無いですが、こっちはFor Loop内で2回Command Allocatorの指定をしています。

DirectX 12の魔導書」の「3.3.2 Command Listの作成とCommand Allocatorについて」ではBlogを見直す限り一回しかしていません。

DirectX 12の魔導書」ではCommand AllocatorとCommand Listは一回毎に廃棄して新しくしているみたいです。

この辺は後で復習する時しっかり理解します。

Command Listを追加しました。

こっちもFor Loopの中にある事以外は、「DirectX 12の魔導書」の「3.3.2 Command Listの作成とCommand Allocatorについて」の実装方法と同じです。

2.5 DirectX 12の勉強の総括

6月の終わりで半年経つので、DirectX 12の勉強の総括を行います。

まず一週間に一回、全部で3時間程度の勉強では全然時間が足りません。

ただし別にDirectX 12で何かを作成する訳ではないので、そんなに時間を割く訳にもいきません。

ので残りの半年の勉強は以下の様にします。

まずOlympusとHLSLの魔導書の勉強は一端、Pendingします。この2つはDirectX 12そのものの勉強とはあまり関係ないからです。

次に「DirectX 12の魔導書」と「Direct3D 12 ゲームグラフィック実践ガイド」の内容をもっと集中して勉強するようにします。

この2つは内容が似通っているので勉強すると相互に補完しあって知識や理解度が深まります。

これで後、半年ほど勉強する事にします。

以上です。

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

今週は川を追加します。

3.1 川を追加する

以下の箇所に川を追加します。

こんな感じで川と湖を追加しました。

川や湖の底のLayerを変更します。

この周りに岩を配置して見た目を良くします。

途中経過です。

あまり根を詰めると気持ち悪くなるので休憩を挟みつつやる事にします。

出来ました。

Play画面から確認してみます。

思ったよりTextureの目が粗いです。

更にCollisionが無かったです。

Static Meshを開きCollision Complexityの設定を以下の様に変更します。

Collisionが発生するようになりました。

この辺の風景はそれなりに良い感じです。

湖の周りです。

これ一発でCGって分かりますね。

Naniteも確認しておきます。

更に石を敷き詰めてみました。

これを見るとVirtual Textureで岩と砂の境界を曖昧にする必要がありますね。

せっかく川を追加したので川の様子もScreenshotに取っておきます。

ここの見た目もなるだけ本物に近づけます。

4.Materialの勉強

お休みします。

5.Niagaraの勉強

お休みします。

6.戦闘システムの続きを作成する

今週はPackagingをしてそのExe.fileが他のPCでも動くのか確認します。

6.1 Packagingをする

出来ました。

テストします。

普通に動きますが、途中で終了するためのButtonが無かったです。

6.2 Gameを終了する機能を追加する

ESCを押すとGameが終了するように実装します。

以下の実装をそれぞれのLevel BPに追加しました。

もう一回Packagingをします。

Combat画面ではESCを押してもGameが終了しません。

何故でしょうか?

調べたんですが分かりません。

他のPCでこのGameを操作した時にGameを止める事が出来なくなったらかなり問題です。

Windows+Tab Keyで強制的にGame画面から離れて、画面下に表示されているTask BarからGameを閉じる事は出来ますね。

取りあえずはこれで試す事にします。

6.3 PackagingしたGameを他のPCで起動させてみる

まずLaptopのPCでWindows 10にUpgradeしたのがあるのでそれで試します。

先週、古いPCを起動させてDataだけ回収しようとしたらPCから火花が出てパーンと音がして壊れてしまいました。

正直半年以上、起動させてないPCを起動させるのは怖いです。

もしLaptopが正しく起動しない場合は、テストは別な機会にする事にします。

Laptopを起動したら普通に動きました。

Windows 10になっていました。

そこでUSBからこのGameのExe.fileを起動させました。

C++のRedistributionが無いです。と表示されたのでそれをInstallしました。

その後で、GPUのDriverが古くてGameを起動できません。みたいな表示がされました。

そりゃそうです。

もう5年以上GPUのDriverはUpdateしていません。

無視してGameを開始してみました。

なんと。

普通に動きました。

夜ですのでSpeakerはMuteにしていましたが、それ以外は普通に動いています。

かなり感動しました。

7.Gaeaの勉強

今週もまたGeologyの勉強とYouTubeの動画の作成を行います。

7.1 Geologyの勉強

7.1.1 Geology 5 (Igneous Rocks)[8]の勉強

まず軽く全部見ます。

Igneous RocksについてのLectureでした。

Igneous RockとはLavaが固まった出来たRockの事です。

4種類位有ったと思います。

あんまり仮説の証明とかは無かったです。

で今週からそれぞれの節事にまとめる事にします。

<Intro>

Igneous Rockの定義を説明しています。

Igneous Rockは溶けた岩が冷えて結晶化したものを指すそうです。

つまりMagmaがIgneous Rockの元になります。

地表に飛び出したMagmaをLavaと呼びます。

<Characteristics of Magma>

Magmaの特徴についてです。

Magmaの特徴は3枚のSlideで解説していました。

一枚目のSlideではMagmaを構成する3つの物について説明していました。

次のSlideではMagmaの結晶についての解説をしていました。

最後のSlideはIgneous Rockがどこで形成されたかによって名称が変わる事について説明していました。

以下にそれぞれのSlideの内容をまとめます。

<<最初のSlideの内容>>

Magmaが3つのComponentで構成されている事を説明しています。

  • 液体、溶けた鉄です。
  • 固体、結晶化したSilicateです。
  • 気体、Water Vapor(H2O)、CO2、そしてSulfur dioxide(SO2)です。

<<2つ目のSlideの内容>>

Magmaの結晶化についてです。

Igneous Rockはそれに含まれるMineralの構成とTextureによって分類されます。

Textureによる分類とは、Igneous Rockの表面に含まれるMineralの粒の並び方やSizeによって分類されます。

LectureではIgneous Rockの種類として以下に示したGranodioriteとDaciteが紹介されていました。

確かにそれぞれのRockのTextureは全然違います。

含まれるMineralの構成も違うんでしょうか?

Lectureを聞いたら説明していました。

GranodioriteとDaciteの化学的な構成は同じだそうです。にもかかわらずこの2つは別のIgneous Rockとして分類されています。それはこの2つのRockのTextureが全く違うからだそうです。

<<三枚目のSlideの内容>>

地表でLavaから形成されるRockをExtrusiveもしくはVolcanic Rocksと呼びます。

地中でMagmaから形成されるRockをIntrusiveもしくはPlutonic Rockと呼びます。

<Mineralogy of Common Igneous Rocks>

一般的なIgneous Rockの化学的な構成についての解説です。

Granite、Diorite、Gabbro、Ultra-Mafics、Rhyolite、Andesite、Basalt、そしてOlivine Basaltなどが紹介されていました。

以下にそれぞれのTextureの特徴と化合物の混合の割合を表す図を以下に示します。

それぞれのIgneous Rockの写真を最初に見せてほしかった。

それぞれのIgneous RockのImageが全く思いつきません。

最後までこれらのIgneous RockのImageが紹介されなかったら自分で調べます。

2枚目のSlideでは同じ内容を別なGraphで解説していました。

Igneous RockのImageはLectureでは紹介されなかったので調べます。

<<Granite>>

ああ、これは台所とか洗面所やShower室に使用されるヤツです。

これアメリカでは普通のアパートでも台所とかに使用されていましたが、日本だと結構高級感ありますね。

この辺がアメリカの家が立派に見える一因なのかもしれませんね。

日本だとこの石は結構高価なのかもしれません。

白いのと茶色のがありますね。

<<Diorite>>

Dioriteです。

なんとMinecraftにDioriteと言う物質があるそうです。

後、みんな醜いって言っています。それ故か家に使用されている例は表示されません。

<<Gabbro>>

Gabbroです。

ここまで来ると単なる汚い岩ですね。

<<Ultra-Mafics>>

変な図が大量に表示されています。

写真は僅かにありました。

緑色しています。

ここからのIgneous RockのTextureは微細だそうです。

肉眼からの見た目は変わらないかもしれませんが、一応調べます。

<<Rhyolite>>

Rhyoliteです。

この茶色のやつって、さっきLandscapeの作成で川の周りに配置したRockのTextureと同じです。

これらの岩ってIgneous Rockだったの?

それは兎も角、RhyoliteとGraniteの成分は全く同じだそうです。

それでこんなに見た目に差があるのは驚きです。

<<Andesite>>

Andesiteです。

これはあまりDioriteと差がないですね。

こっちもMinecraftに物質としてあるみたいです。

Gameからこういう鉱物について勉強出来るのは良いですね。

<<Basalt>>

Basaltです。

これも単なる岩ですね。

<<Olivine Basalt>>

こっちは緑色しているんでしょうか?

<<Igneous Rockのまとめ>>

だいたい理解しました。

ここで最も重要なのはGraniteです。これは綺麗なので台所などの石に使用されます。

このGraniteと成分が全く同じなのに単なる岩なのが、Rhyoliteです。これはUnrealで砂漠の岩のTextureとしてよく使用されています。

Diorite、Andesite、そしてBasaltの3つはMinecraftにもあるそうです。知らんと小学生からバカにされそうです。

この5つを理解しておけば最低限のIgneous Rockの種類は把握したと言えると思います。

<Igneous Compositions>

Igneous Rockの中でSilicaが重要。

Silicaの割合で、Lavaの動きや結晶化の形状が大きく変わる。

Silicaの割合が大きいと以下のような地形を生成する。

粘性が非常に高くなりLavaが横に移動しないで固まるそうです。

こんな地形が実際に存在するのか。

GaeaをTweakしているとたまにこんな地形になります。これって本当に存在するのか。

と言う事はこういう地形を作成した場合は、RockのTextureはSilicaの割合の多いGraniteやRhyoliteを選択する必要があるのか。

こういう所でLandscapeが本物かCGかがばれてしまうんですね。

Geologyをどれだけ理解しているのかが鍵になる訳です。

粘性が低い場合の地形です。

Lavaが横に広がって固まっています。

こっちはテレビとかでよく見る溶岩ですね。

<Different Igneous Textures>

Igneous RockのTextureの種類についてまとめてありました。

重要そうなのだけここに記録しておきます。

  • Glass(結晶なし)
  • Aphanitic(細かい結晶で構成)
  • Phaneritic(比較的大きな結晶で構成)

Aphaniticは急速にLavaを冷やすと生成され、Phaneriticはその逆だそうです。

GraniteとRhyoliteの違いはLavaの冷やす速度だけの問題なんでしょうか。それでこんなに見た目と値段に違いが出るんでしょうか。もしそうなら驚きです。

Lectureの説明を聞いたらAphaniticは拡大鏡を使わないと結晶が見えない物を指すそうです。

RhyoliteはAphaniticになるんでしょうか?

Googleの検索結果を見た限りでは該当しないのもありそうです。

<Porphyritic Textures>

以下に示した様な2つの大きさの違う結晶が存在しているRockです。

<Pyroclastic Textures>

以下に示した様なスカスカの穴の開いたRockです。

Lectureの説明ではSedimentary Rockに似た形状をしていると言っていました。

穴の事をVesicleと呼んでいました。

<Igneous Rocks: Granitic Compositions>

Graniteの構成についてです。

岩の値段から考えたらこれが一番重要です。

以下にLectureの写真を示します。

茶色のGraniteですね。これはあんまり美術的な価値は感じないです。

でもTable用の板に加工したら高級感が出て来るんでしょうか?

それぞれの色を構成する結晶の成分について説明していました。がそれ口頭で説明しただけです。

流石にそれを自分でまとめるのはしんどいです。

<<Rhyolite>>

なんとRhyoliteの成分の説明もしていました。

RhyoliteがPhaneriticなのかどうか知りたかったんですが、それについての説明は無かったです。

<Naming Igneous Rocks>

Dioriteについて説明しています。

Dioriteは醜い岩なので勉強しても意味ないです。

Skipします。

<Igneous Rocks: Dioritic Rocks>

ここでもDioriteについてまだ解説しています。

一個だけ新しい知見を得ました。

結晶の粒を大きくするためにはLavaが地表で固まるのは駄目でMagmaの時に地中で固まる必要があるそうです。

<Igneous Rocks: Gabbroic Compositions>

Basaltと化学的には同質のGabbroです。

Gabbroは高価な石なんでしょうか?

墓石とかこれ使ってそうです。

<End of Lecture>

特になし。

7.1.2 Geology 5 (Igneous Rocks)[8]の勉強をした感想

Igneous Rockの分類はLandscapeやRockのTextureの種類を選ぶのに役に立ちそうです。

Silicaの割合でLavaの粘性が変化して地形の形成が変わるのは初めて知りました。

Rhyoliteは結構脆いそうです。それであんな形状になるでしょうか。

Diorite、Andesite、そしてBasaltの3つはMinecraftのItemであるみたいです。

ので、Igneous Rockの種類の内Granite、Rhyolite、Diorite、Andesite、そしてBasaltは覚えていた方が良いかもしれません。

7.2  GaeaのTutorialの作成

7.2.1 先週の復習

先週は、以下のMind Mapの内容に基づいた講義を作成して何回も録画したんでした。

それなりに喋る練習にはなりました。

7.2.2 Mind Map作成の続き

今週は以下のMind Mapの続きを作成していきます。

以下の手順を追加しました。

更にそれぞれの手順で使用するNodeのGroupを追加しました。

次にColorの指定をします。

このColorの使用方法のやり方は忘れてしまいました。

今週はこれを復習する事にします。

2023-05-01のBlogにGaeaのColorの実装方法をまとめていました。

これを確認します。

しました。

以下に簡単にまとめます。

Colorは以下の様に今まで作成したTerrainに色を追加します。

こんなTerrainに

こんな色付けをします。

どうせUE5で新たにLayerで色を付けるのだからここでどんなに色塗っても無駄だと思うかもしれませんが、

ここの設定をMaskとしてExportする事によりUE5でもほぼ同様な色付けをする事が出来るようになります。

のでこの勉強はかなり大切です。

ここでは以下の2つのGroupに属するNodeを使用します。

Data Groupです。

これはMaskを作成します。

Color Groupです。

作成したMaskに色を追加します。

それでは具体的に説明します。

簡単にするためにHero Mountainの結果を元にColorします。

以下にColorの基本の実装を示します。

そして①と②に以下に示したData GroupのNodeを使用します。

ここにあるNodeは主に2種類に分けられます。

Textureノードのように全体に万遍なく白黒つけるNodeと

Slopeノードのように特定の条件に合う部分を白、それ以外を黒くするNodeです。

Textureノードのように全体をまんべんなく白黒つけるNodeは①の箇所で使用します。

Slopeノードのように特定の条件に合う部分を白くするNodeは②の箇所で使用します。

うーん。

この説明では初心者はよく分からないと思います。

どうやって説明しましょう?

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

これで②に使用するData GroupのNodeの機能を説明します。

まず上記の実装を説明します。

Constantノードの①は赤色を指定しています。Constantノードの②は青色を指定しています。

でData GroupからHeightノードを使用しています。

でHeightノードでは以下の様にTerrainにMaskを掛けています。

そしてCombineノードで黒にConstant①の色、白にConstant②の色を指定します。

これが最初の色の指定方法です。

のでHeightノードの代わりにFlowノードを指定します。

Flowノードは以下のようなMaskをします。

これに先程の色を追加すると

こうなります。

このようにData Groupの2つ目のTypeのNodeを使用するとTerrainのある条件にそって2つの色を分けてPaintする事が可能になります。

うーん。

初心者からしたらだからって感じでしょうね。

そこから説明しますか。

これから説明します。

うん。

でもこれは来週やる事にします。

今週はここまでにします。

8.Houdiniの勉強

今週も、Houdiniの勉強は少しだけお休みして、Free Time Coder氏のUnreal PCG Tutorial [9]を勉強します。

8.1 Unreal 5.2 Preview PCG Tutorial - Part 3 - Scattering Points [10]を勉強する

まず軽く全部見ます。

見ました。

このTutorialではPointを生成し、そのPointの周りに小さなPointを沢山生成します。

こんな感じです。

うーん。

これが何の役に立つのかあんまり思いつきません。

真ん中のPointを池にしてその周りのPointsを木にするとか?

うーん。

兎に角、やり方を勉強します。

<Intro>

特になし。

Surface Sampler>

PCGを作成し

Surface Samplerノードを追加します。

当然Debugにします。

以下の結果になります。

更にDensity Filterノードを追加し

以下の設定にします。

Tutorialではこの後0.9にしていました。

そしてTransform Pointsノードを追加し

Rotation MaxのZの値を360にします。

結果です。

この辺は最初のTutorialで勉強した内容と同じですね。

これが大きなPointになります。

このPointの周りに小さなPointを沢山発生させます。

<Grid>

Create Points Gridノードを追加します。

Scale MethodをRelativeに変更します。

Debug Modeにセットすると以下の様に表示されました。

これではPointが分からないのでPoint Scaleの値を0.5にします。

結果です。

そしてCopy Pointsノードを使用して以下の様に接続します。

結果です。

Create Points Gridノードで作成したPointsは表示されていません。

Copy PointsノードのPoint ScaleとScale Methodの値を以下の様にセットします。

すると以下の様になりました。

この後、画面をClickしたら以下の様になりました。

これは単に画面の更新が滞っていただけかもしれないですね。

うーん。

これで「Pointを生成し、そのPointの周りに小さなPointを沢山生成する。」というこのTutorialの目的は達成出来てしまいましたね。

Copy PointsノードのTargetとSourceの設定が通常のSourceとTargetの逆じゃないの?と言う疑問がありますが、それ以外は別に普通の使用方法の範囲だと思います。

NiagaraでEmitterを2つ用意して一方をSourceにしてもう一方をTargetにするのと同じ原理です。

こっから先は何をやるんでしょうか?

続きを見ましょう。

Copy Pointsノードの以下の設定をDefaultに戻し、

以下の箇所にBounds Modifierを追加しました。

Bounds MinとMaxの値を以下の様にセットします。

結果です。

Transform Pointsノードを追加して小さいPointsを散らします。

Transform Pointsノードの以下の設定を変更しました。

結果です。

更にRandom Rotationの値も変更します。

結果です。

これは全てのPointsがRandomに回転しているみたいです。

別に小さいPointsだけじゃないです。

今度はこの大きいPointの周りにある小さいPointを消します。

これは大きいPointには大きな岩などを配置する事になるので、その周りの小さいPointは要らなくなるからだそうです。

うーん。

これって微調整の範囲で本質的な操作には関係ないですよね。

なんかこのTutorial全体で事の軽重が曖昧になっている気がします。

Distanceノードを追加します。

Sourceノードには全部のPointsの結果を、Targetノードには大きなPointの結果を繋ぎます。

これって反対な気がします。

PCGのNodeのTargetとSourceの設定って全部逆じゃないでしょうか?

Set DensityをEnableしてMaximum Distanceの値を600にしました。

結果です。

小さいPointsのDensityの値が中心から離れていくにしたがって1に近づいています。

Density Filterノードを追加します。

以下の設定にします。

結果です。

白い部分がカットされています。

え、これって中心に近い小さいPointをカットするんじゃなかったの?

って確かに聞きました。

確認します。

端の方に配置されている小さいPointが四角上に配置されています。それを直します。中心からそれぞれの小さいPointの距離を計算して値の小さいPointを消します。

と言っていました。

岩の配置とか全く言っていませんでした。

でもこの説明も変ですよね。

値の小さいPointをFilter outしたら中心に近いPointから消えていきます。

実際は値の大きい白い部分をFilter outしています。

なんか英文がかなりBrokenなんです。

それで脳内で勝手に足りない部分を補ってしまったんでしょうか?

それとも聞こえない英語が聞こえてしまったんでしょうか?

脳に障害とか発生していたらどうしましょう。

一寸怖いです。

<Scale by Density>

今度はDensityの値を利用して外側のPointに小さい木を生成出来るようにします。

Scale By Densityノードを追加します。

Scale Minに5.0、そしてScale Maxに1.0をセットします。

結果です。

PointのSizeが変更されました。

今度はTransform Pointsノードの

OffsetのRangeの値を100から50に変更しました。

結果です。

小さいPointがRing状に大きいPointの周りに集まるようになりました。

この辺は単なる微調整です。

適当に流します。

そしたらOffsetの値を0にしてしまいました。

そして大きなPointを消しました。

何故か中心に近い箇所の小さいPointも消えています。

Density Filterノードが中心に近い箇所の小さいPointも消していました。

ただしDensity FilterノードのLower Boundの設定は0になっていて

中心に近い小さいPointの値は0なのでそれらを消すのはおかしいです。

Tutorialでは色々やっていましたが直せないので、以下の様にして解決しました。

Invert FilterをEnableしてBoundに指定した範囲をFilter Outする事にします。

結果です。

結果です。

今度は中心に近い箇所のPointsも表示されるようになりました。

Transform PointsノードのOffsetの値を元に戻し

小さなPointsのばらつきを以下のようにRandom化しました。

更に大きなPointも表示しました。

Scale By Densityノードの結果です。

これって中心に近い所にある小さいPointsは大きなPoint内に隠れてしまっているの?

当然、Tutorialもそれは問題と認識していて、今度はその重なっている小さいPointsを消します。

やり方は前回のSplineのTutorialでやったやり方と同じだそうです。

まずDifferenceノードをセットして

Sourceに全部のPointsをパスします。

Differenceには大きなPointをPassします。

結果です。

あれ?

大きなPointの周りの小さなPointも消えています。

Bounds Modifierノードを追加して

BoundのSizeを小さくします。

結果です。

前よりは大きなPointの周りの小さなPointも表示されるようになりました。

Tutorialではこの後にSelf Pruningノードの解説をしていますが、

これについては作者もどんな機能なのか理解していないと言っていてここでまとめる価値はないと判断しました。

この部分はSkipします。

以上でした。

8.2 Unreal 5.2 Preview PCG Tutorial - Part 3 - Scattering Points [10]を勉強した感想

今週は、生成したPointの周りに沢山の小さなPointを生成する方法について勉強しました。

基本的には以下の実装で出来ます。

肝はCopy Pointsノードを使用する事です。

Copy PointsノードのSourceに大きなPointのDataをパスし、

Copy PointsノードのTargetに小さなPointのDataをパスします。

今回のTutorialを勉強した感想を述べると、Niagaraに似ていると思いました。

その実装方法は全く違いますが、何を実装する必要があるのかと言う部分で、Niagaraと似ているんです。

NiagaraではEffectを作成するに当たってParticleに沢山のParticleを繋げたいと思う訳ですが、PCBでもProceduralなLevel designを作成するに当たって同様な発想がある事を知りました。

後、Free Time Coder氏のTutorialが異常に絶賛されていましたが、今まで3つのPCGのTutorialを勉強しましたが特別に優れているとは思いませんでした。

まあ普通です。

これから凄くなっていくんでしょうか?

9.UEFNの勉強

今週も Unreal Editor for Fortnite Beginner Tutorial - UEFN Starter Course! [11]の実装の続きをやっていきます。

9.1 先週の復習

先週どこまで実装したのか忘れてしまったので、それを確認します。

ここまで作成したところで3D酔いしてしまったので中止したんでした。

この続きを作成します。

9.2 緑の向きがオカシイStatic Meshを直す

以下の表示がされました。

Login出来ないですね。

別な事をやる事にします。

次の日になったらLogin出来るようになりました。

どうやらFortniteの新しいSeasonが今日から始まるのでそのためのMaintenanceだったそうです。

全然知らなかった。

YouTubeのTrendingを見たら一応、5位に入っていました。

ただアメリカ政府が異星人のTechnologyを隠しているというNewsに負けていました。

一応、書いておきますがこの異星人のTechnologyのNewsは嘘です。

アメリカでは歴史的にこういう壮大な嘘をちょくちょくやる文化があります。

一番有名なのが1938年に起きた、火星人が攻めてきたとあるRadio局が放送したらその放送を聞いた人が全員信じて大変な騒ぎになったやつです。

最近ではHawaii州で、核攻撃されたので近くのShelterに避難して下さい。という放送がありました。

その放送を聞いた裕福そうな中年の紳士が老人を突き飛ばして逃げようとするSceneがしっかり撮影されていて、後でその動画がTVで放送される事になります。

それを見てみんなで大笑いする訳です。

「そんな事言っても、万が一本当かもしれないかも。」と思う人がいるかもしれませんが、そういう人はこの前、Pentagonの機密書類が漏れた時を思い出すと良いです。

徹底的に誰が漏らしたのかを追求して、とうとう犯人を突き止めました。

その犯人は国家に対する重罪として逮捕されています。おそらく10年以上は刑務所に入る事になります。

アメリカ政府が異星人のTechnologyを隠しているのが本当だったら、そんな情報を漏らした人が逮捕されない訳が無いです。

逮捕されないところが、犯人捜しすらされていません。

更に言うと、このようなNewsは政治関連のScandalが出た時にそのNewsの影響を小さくするために意図的に流される事もあります。

今回の場合で言えばFormer PresidentであるTrump氏がとうとう起訴されたNewsがこれにあたります。

Trump氏が政府の機密書類を自宅に隠し持っている件でとうとう起訴されてしまったんです。

これ自体がどれほどの罪なのかは不明ですが、その疑惑でかなり問題なのが2つあります。

  • 機密書類にはアメリカの核の配置場所などを記した書類も含まれていると言われているが、この書類を外国(サウジアラビアやロシア、もしかしたら中国も)に売った可能性。
  • ロシアにいるアメリカのスパイが大量に処刑された件があったが、誰がスパイであるのかの情報がアメリカ政府から漏れている。という噂がある。これがTrump氏である可能性が出てきた。

まあ、こういうそれなりに深刻なNewsが流れた時に、異星人関連のNewsが流れる場合が多いです。

話はもどりますが、以下の様に直しました。

上から見た感じです。

取りあえずこれでOKとします。

次は

を配置します。

これ空中に浮いています。

以下の様にして対応しました。

湖の水面のすぐ上に家が建っています。

こんなのすぐに浸水してしまいます。

直します。

水面よりかなり上に家を移動しました。

ここで気持ち悪くなってしまいました。

今週はここまでにします。

10.YouTube動画の作成

10.1 先週の復習

先週はGaslightingについてMind Mapの作成とそのMind Mapに基づいて動画を作成しました。

録画した動画を見直しました。

非常に勉強になります。

YouTubeの動画として即使用できるLevelだと思いました。

これは編集して完成させましょう。

10.2 Gas Lightingの動画をDavinci Resolveで編集する

動画の上下をCutしました。

Thumb Nail用の題を作成しました。

最後にYouTube用の動画としてExportしました。

10.3 共和党は崩壊するの続き

前にアメリカの共和党が崩壊する可能性がある。と書きましたがその時、共和党の必殺コンボとして以下の話をしました。

これを多用しすぎたために、もう使用出来なくなって来ているという例として以下の2つをあげました。

これに追加出来るNewsが飛び込んできたのでそれについてまとめます。

Governor Ron DeSantis Signs Strongest Anti-Illegal Immigration Legislation in the Country to Combat Biden’s Border Crisis [12]です。

まあ、簡単に言うと不法に労働している外国人が働けなくなる法律なんです。日本ならそれ当たり前だろ。って思うんでしょうが、アメリカは違います。

そもそも白人がEuropeから渡ってきた時にアメリカには先住民が住んでいたんです。それを追い出したり、虐殺したり、はたまた伝染病に感染させたりして土地を奪っていったんです。

のでアメリカにはアメリカ人じゃない人が住んでいるのが当たり前なんです。

分かり易く例えると、中国から大量の中国人が本州に渡って来て武力で日本人を追い出します。

日本人は住む場所がないので北海道とか沖縄に逃げたとします。そしたら本州にいる中国人たちが北海道と沖縄などを抜かした日本で中国日本省を建国します。

この中国日本省は経済的に非常に発展しているので北海道や沖縄に逃げた日本人は、国境をまたいで中国日本省で働こうとします。元々祖父はその土地に住んでいたので、日本人からしたら国境を跨いでいる感覚もないです。祖父の住んでいた時に戻る感覚です。

こんな感じです。

ので例えばFlorida州のような国境付近の州だと建築現場の労働者の3割とかが、不法に労働している外国人だったりします。

彼らは一応ヒスパニックに区分されていますが、顔を見ればアメリカ先住民である事は明らかです。

その三割の人がまあ、働けなくなる法律を可決したそうです。まだRon DeSantis知事です。

で、その結果なんですが、

不法移民がFloridaから他の州に逃げ出していなくなってしまったそうです。

その結果、Florida州の工事現場は工事が止まってしまいました。

更にもっと打撃を受けるのが農業だそうです。

これから収穫期になるのに半分の人手しか確保出来ないそうです。しかもこれから更に不法移民対たちは逃げ出すのでもしかすると今年は果物の収穫自体が出来なくなるかもしれません。

もうアメリカは変わったんです。

今までの様に共和党の嘘は通じないんです。彼らが嘘を付けばつくほど、その結果はもっとひどく彼らに帰って来ます。

と思っていたら、何とFormer PresidentであるDonald Trump氏が正式に連邦政府から起訴されたNewsが入って来ました。

やっぱり共和党と言う存在自体がもう終わりを迎えていると思いました。

11.まとめと感想

今週は、色々な用事が入ってしまったので勉強する時間を確保する事が出来ませんでした。

6月はまだまだやらなくてならない事が沢山あるので、こんな感じになってしまう週がこれからもちょくちょく起きそうです。

慌てず出来る範囲でやる事にします。

12.参照(Reference)

[1] OlympusMonsTutorials. (2021, May 9). C++ DirectX 12 Game Engine - [S01E04] - Settings and Loggers [Video]. YouTube. https://www.youtube.com/watch?v=Q7JKBDNIgvI

[2] Static Members of a C++ Class. (n.d.). https://www.tutorialspoint.com/cplusplus/cpp_static_members.htm

[3] The Cherno. (2020, February 7). SINGLETONS in C++ [Video]. YouTube. https://www.youtube.com/watch?v=PPup1yeU45I

[4] static members - cppreference.com. (n.d.). https://en.cppreference.com/w/cpp/language/static

[5] Simic, M., & Simic, M. (2022). Differences Between Definition, Declaration, and Initialization | Baeldung on Computer Science. Baeldung on Computer Science. https://www.baeldung.com/cs/definition-vs-declaration-vs-initialization

[6] Stevewhims. (2021, October 13). ID3D12GraphicsCommandList::OMSetRenderTargets (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-id3d12graphicscommandlist-omsetrendertargets

[7] Stevewhims. (2022, August 23). D3D12_CPU_DESCRIPTOR_HANDLE (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ns-d3d12-d3d12_cpu_descriptor_handle

[8] Earth and Space Sciences X. (2015, October 30). Geology 5 (Igneous Rocks) [Video]. YouTube. https://www.youtube.com/watch?v=PVF9jeH2-8U

[9] Unreal PCG Tutorial. (n.d.). https://www.youtube.com/playlist?list=PLA03OHAaHgYpo0enf8p-2oEpja3grLOKZ

[10] FreetimeCoder. (2023, March 27). Unreal 5.2 Preview PCG Tutorial - Part 3 - Scattering Points [Video]. YouTube. https://www.youtube.com/watch?v=cgC9zDxxOB0

[11] Fortnite Sensei. (2023, March 31). Unreal Editor for Fortnite Beginner Tutorial - UEFN Starter Course! [Video]. YouTube. https://www.youtube.com/watch?v=0CcoOq963O8