UE4の勉強記録

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

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

1. 今週の予定

1.1 今週の予定

DirectXの勉強>

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

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

先週作成した海の波の泡の検証をします。

<Materialの勉強>

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

Niagaraの勉強>

CGHOW氏のTutorialをやります。先週の実装の続きを行います。

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

UIの改善の続きを行います。

今週はMonsterの召喚というか、Monsterの配置を決定するWidgetのDesignについて検証します。

<Gaeaの勉強>

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

<Houdiniの勉強>

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

<UEFNの勉強>

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

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

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

YouTube動画の作成>

Mind Map Appを使用して話す内容を整理します。

Davinci Resolveの編集方法についてもう少し勉強します。

2.DirectXの勉強

2.1 Olympus Game Engineの作成

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

2.1.1 C++ DirectX 12 Game Engine Episode 4 : Settings and Loggersを勉強する

この節は、このTutorialで何をやるのかをまとめているだけで、具体的に何かをやる訳では無かったです。

先週のBlogを見たら

とまとめられていました。

しかし

とこのTutorialの確信をついた疑問を発信していました。

2.1.2 Our Logger Class

これでは何も勉強した事にならないので次の節を勉強します。

最初は先週まとめたこの部分について解説しています。

これらの事を実現するための実装を作成する前に、元々備わっている関数の復習をしています。

以下の2つの関数は

Programmingの方から自発的に何が起きたのかを教えてくれる関数です。

うーん。

そうなのか?

これらの関数は単に指定された事をPrint outしているだけだと思います。

ここで作成するLog ClassはLog Fileを直接HDDにSaveして後で、Programmingに問題が有った時にそのFileを見る事でどんな問題が有ったのかを理解出来るようにするようです。

まあ、普通のLog fileですね。

ここからやっと実装の話になります。

まずLog.hとLog.cppを作成します。

作成する場所ですが、

まず以下のIconを押してFolder Viewに切り替え

OlympusのSourceを選択しCommon Folderを作成し

その中に作成します。

Solution Viewに戻り

Olympus、SourceときてPrivateとPublicにCommon Folderを追加します。

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

まずLogger.cppに以下のcodeを追加します。

ところで、ここでIncludeしているOlympus.hを見ると以下に示した様にEpsoide3を指しています。

うーん。

これはBlogにはまとめてないかもしれませんが、TutorialではそれぞれのTutorialが始まる前にSolutionをCopyして新しいSolutionを作成しているんです。

以下の様になっています。

で、このTutorialでも新しくSolutionが作成されています。

名前はEpisode 4になっています。

ので先程のような事態が発生する訳です。

兎に角、これの直し方です。

Olympus ProjectからPropertiesを開き

C/C++のGeneralを選択して

Additional Include Directoriesを見ると

となっています。

これを

と書き換えます。

Blank Projectも同様に設定を変更します。

ただし、Blank Projectの場合は2か所変更する必要があります。

これで、以下に示した様に先程の問題が直りました。

この直し方って、一回やり方を見せてもらえば自明ですが、全くヒントが無い状態で直すとなると結構悩みますね。

今度はLog.hの実装です。

いきなりこれを書きました。

これって自動化で作成出来るんでしょうか?

それともTutorialでは前もって作成したのをコピペしたんでしょうか?

Tutorialの説明を聞いたら、どうもこのやり方はSingletonの作成方法としては普通みたいです。

調べたら、うーん。いろんな意見があってどれが適切なのかよく分かりません。

あんまりC++の沼には深入りしたくないので、この実装が正しいとして先に進む事にします。

DirectXでGame Engineを自作する時があったら、勉強し直す事にします。

CPP fileの実装です。

うーん。

最初の

の意味が分かりません。

これってLogger ClassのInst変数を呼び出しているの?

これってConstructorの前に書いても機能するんでしょうか?

その辺から分かりません。

Singletonについて調べるとMemoryの解放を正しく行うには?とかThread SafeなSingletonの作成方法についてとかのAdvanceな解説はいっぱい出て来るんですが、もっと基礎的なSingletonの作成方法についての解説が出て来ません。

ので今回はこのTutorialのやり方が本当に正しいのかは分かりませんが、正しいとしてSingletonは実装します。

このLogger ClassはどのProgrammingからもAccess出来るようにする必要があります。

それを可能にするためにはこのClassをPch Fileに移動する必要があるそうです。

うーん。そうなのか?

よく分かりませんがTutorialが言うならそうなんでしょう。

それでそのやり方です。

ぱずpch FileのOlympus.hを開きます。

ここにLogger.hを追加します。

そしてLogger.cppの方はLogger.hのIncludeを外します。

うーん。

これで全てのClassがLogger ClassにAccess出来るようになるの?

よく分かりません。

ここは来週実装する時にもう少し考える事にします。

最後にOlympus.hのLogger.hにCommon/を追加しました。

これって、単にLogger.hにAccess出来る事かどうかを言っている気がして来ました。

今度はWinEntry.hを開いてLoggerのInstanceを作成するための実装を追加しました。

これでこの節はお終いでした。

2.1.3 Singletonについて

さすがにSingletonについて何も勉強しない訳にはいかないので、一寸だけ調査します。

Explain C++ Singleton design pattern. [2]を見つけました。

このサイトはSingletonの基本的な内容だけを語っています。

まずExampleに載っていた以下のCodeですが、

何も指定しないとAccess SpecifierはPrivateになるそうです。

ので赤線で囲った部分はPrivateの設定になるそうです。

ここのPointはConstructorをPrivateにしているため通常の方法では呼び出せません。

そしてPrivateの変数にStaticでこのクラス型から作成したObjectのPointerがあります。

このPointerの値が指定されてないの?と思ったら以下のメンバー関数で指定していました。

もしInstanceの値が無い場合は新しいSingletonを作成してそのAddressを追加しています。

そして既にInstanceの値が有る場合は、その値を返しています。

これでSingletonのInstanceは常に1つである事を保証している訳です。

Main()関数内でSingletonを初期化しています。

普通のInstanceを作成するようにNewは使用しないで先程のメンバー関数であるGetInstance()を使用していました。

なる程、これなら確かにSingletonになります。

よーし。

これでSingletonの最初の基礎は理解しました。

この実装を見て思ったんですが、

これだとこのInstanceを解放する時はどうするんでしょうか?

DestructorはそのままAccess出来るんでしょうか?

これについて調べます。

Stack OverflowのSingleton pattern destructor c++ [3]を読んでいたら

と書いてありました。

以下の様に宣言するそうです。

これでSingletonのDestructorについて考える必要が無くなるそうです。

ふーん。です。

そう言えば、こういう書き方というかPrivateの変数にSingletonのObjectがない例を何個か見ました。

この書き方の意味が分からんかった。

もう一回TutorialのLog Classの実装を見直します。

今度はもっと理解出来るでしょう。

まずHeaderです。

うーん。

Logger*の変数がStatic Class Memberになっていますね。

更にConstructorがPublicです。

うーん。

これでSingletonになるんでしょうか?

Cpp fileの方です。

まずConstructorですが、InstにThisをAssignしているだけなので、新しいInstanceが生成されないようになっていました。

これならSingletonになりますね。

でも最初のInstanceはどうやって生成しているんでしょうか?

うーん。

分からん。

後、以下の部分の意味はまだわかりません。

これが

Logger::inst = this

とかならInstにこのInstanceを紐づけているんだなと分かりますが、

Logger*がLogger::instの前にあるんです。

これってLogger::instをここで宣言しているみたいです。

InstはStaticですよ。そんな事って出来るんでしょうか?

もし出来たとしても、Instが既に存在している場合はこの宣言どうなるんでしょう?

なんかその辺に秘密がありそうです。

Instが無い場合、つまりLoggerがまだ作成されていない時は、ここでInstからLoggerが生成され、Loggerが既にある場合は無視される。もしくは今まであるLoggerのInstが呼び出されるみたいに機能しそうです。

その後でConstructorでThisに紐づけられるみたいな感じです。

うーん。

今はC++の勉強に集中する訳にはいかないです。適当なところで切り上げるしかないです。

このTutorialではこんな方法でSingletonを作成していた。と覚えておく位で留めておきます。

2.2DirectX 12の魔導書」の勉強

2.2.1先週の勉強を復習する

先週は以下の実装が実際に何をやっているのか調査しました。

最後の

は教科書に2つのやり方が載っていてSample Codeと別解のやり方は理解出来たんですが、教科書の本解はよく分からなかったんです。

それ以外はまあ大体は理解しました。

2.2.2 「3.3.6 Swap Chainを動作させる」を読む

先週で「3.3.5 Render Target View」の実装が終わったので、今週は次の節である「3.3.6 Swap Chainを動作させる」を読む事にします。

まず軽く読みます。

読みました。

ここはWhile Loop内でSwap Chainを作動させるための手順を説明しています。

今までの実行で、既にSwap Chain内のBack BufferとRender Target Viewは既に紐づけられているんじゃないの?

何でWhile内で更にSwap Chainを作動させる必要があるの?

とかなり最初から混乱しました。

全部読んだら、何となく理解しましたが、兎に角、While内でSwap Chainを作動させる必要があるんです。

以下にWhile内でSwap Chainを作動させる手順を教科書に書かれているまま示します。

  1. Command AllocatorとCommand ListをClear
  2. Render TargetをBack Bufferにセット
  3. Render TargetをClear
  4. Render TargetのClose
  5. たまったCommandをCommand Listに投げる
  6. SwapChainのFlip処理(Present処理)

この手順のまとめをSample Codeで確認したら名称や順番が微妙に違っていました。

その違いについて検証するためにも教科書の手順をそのまま使用する必要があるので敢えて全部、ここに記しました。

以下に簡単にSample Codeと比較検証した結果をまとめます。

<Command AllocatorとCommand ListをClear>

これSample Codeだと最後から2番目に行っています。

しかもAllocatorをResetすれば良いと書かれていますが、Sample CodeではCommand ListもResetしていました。

<Render TargetをBack Bufferにセット>

ここは教科書の「Render Targetの設定」に詳しく説明されています。

まず以下の関数を使用してBack BufferのIndexを取得して

そのIndexを使用して以下の実装でRender Targetを指定しています。

教科書の詳しい説明はこの部分を実装する時にしっかり読み直します。

今週はこんだけ理解していれば十分です。

<Render TargetをClear>

この部分は教科書の「Render TargetのClear」にまとめられています。

Sample Codeでは以下の部分です。

ClearしなくていけないところでClear Render Target View()関数を読んでいるので、特に疑問もないです。

<Render TargetのClose>

ここは教科書の「ためておいた命令を実行する」で説明されています。

Command Listを実行に移す前にCommand ListをCloseする必要があるそうです。

Sample Codeを見たら以下のように実装されていました。

これも特に疑問は無いです。

<たまったCommandをCommand Listに投げる>

ここも教科書の「ためておいた命令を実行する」で説明されています。

Sample Codeの実装は以下の様になっています。

最初のCommand Listの実装方法はよく分かりません。

ここは実装する時にしっかり検証する事にします。

<SwapChainのFlip処理(Present処理)>

ここで手順では「SwapChainのFlip処理(Present処理)」が次に来るはずなんですが、教科書の「ためておいた命令を実行する」では、先にCommand ListをClearしておきましょう。と書かれています。

実際Sample Codeでも以下の様にClearされています。

しかしこれって手順の最初に示されている「1. Command AllocatorとCommand ListをClear」の事ですよね。

Sample Codeでも確認しましたが、

はここでしか使用されていません。

で、教科書のこの節の最初に紹介された以下の手順は

  1. Command AllocatorとCommand ListをClear
  2. Render TargetをBack Bufferにセット
  3. Render TargetをClear
  4. Render TargetのClose
  5. たまったCommandをCommand Listに投げる
  6. SwapChainのFlip処理(Present処理)

本当は

  1. Render TargetをBack Bufferにセット
  2. Render TargetをClear
  3. Render TargetのClose
  4. たまったCommandをCommand Listに投げる
  5. Command AllocatorとCommand ListをClear
  6. SwapChainのFlip処理(Present処理)

何じゃないの?と思った次第です。

それは兎も角、最後の「6. SwapChainのFlip処理(Present処理)」は

で終了しています。

教科書は「画面のSwap」で詳しい解説が書かれています。

ここでは垂直同期などの説明もあります。この辺は実装する時に勉強します。

以上です。

今週は「3.3.6 Swap Chainを動作させる」を軽く読んだだけですので、こんなもんで充分でしょう。

来週から実際の実装を勉強する事にします。

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

2.3.1 先週の復習

先週は三章の最後で以下の様にまとめられていたんですが、

この中でIndex Bufferが何を指しているのか分からない。一体三章の何を俺は勉強していたんだ。と焦って三章をもう一回読み直したんでした。

そしたらIndex Bufferについてはほとんど解説してなかった事が判明しました。

と書いていますが、やる意味ないでしょう。

今週は、四章を読む事にします。

2.3.2 四章を読んだ感想やまとめ

読みました。

これは初めて3D Graphicsを勉強する人には有益な内容ですが、OpenGLを何年も使用してた私には、ほとんどの情報は常識Levelで知っている内容でした。

DirectX 12からHLSLにどうやって光の情報をPassするかは全く知らないのでその辺はこれから勉強する事にします。

後、Specular lightを鏡面反射光って訳すのってどうなんでしょう。

Specular の語源は鏡のようなという意味である事は知っていますが、Specular Lightが鏡みたく反射した物体を写し込むという事は絶対にないです。

単なる明るい光の塊です。

それに対して鏡面反射って鏡のようにImageが写り込む事を指しているはずです。

英語で言うとSpecular reflectionです。

Specular lightはSpecular Reflectionとは関係ないでしょう。

どこでこの変な訳が入り込んだのか気になります。

以上です。

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

2.4.1先週の復習

先週はGet Current Back Buffer Index()関数を使用してBack Bufferの値を得る実装をしたところで終わりました。

教科書でいうとこの「2.3.3 Swap Chainの生成」の最後の部分です。

ので今週は「2.3.4 Command Listの生成」を読みます。

2.4.2 「2.3.4 Command Listの生成」を読む

Create Command Allocator()関数を使用してCommand Allocatorを作成しそのCommand AllocatorとCreate Command List()関数を使用してCommand Listを生成しています。

これは「DirectX 12の魔導書」で似たような事やったはずです。

調べます。

有りました。

Direct3D Deviceの初期化をやったすぐ後でやっていました。

DirectX 12の魔導書」では「3.3.2 Command Listの作成とCommand Allocatorについて」でこの2つの作成をしていました。

多少、順番は前後しますが、やっている事は同じです。

DirectX 12の魔導書」の「3.3.2 Command Listの作成とCommand Allocatorについて」は2023-03-20のBlogで勉強していました。

読み直すとCommand ListやCommand Allocatorの概念が今一掴めなくて苦労しながら説明しています。

Direct3D 12 ゲームグラフィック実践ガイド」におけるCommand Allocatorの説明は、一言、

Command Listが使用するMemoryを割り当てるために作成される。

です。

これは短いですが、本質をついていて分かり易いです。

DirectX 12の魔導書」の「3.3.2 Command Listの作成とCommand Allocatorについて」を念のために読み直したら、Command AllocatorはCommand Listを収める箱のような解説をしていました。

あれ、こんな解説だったけ。

Blogのまとめをもう一回読み直したら、2023-03-27のBlog

と書いていました。

この辺は実装する時にもう一度確認します。

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

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

今週は先週追加したOceanのFoamの確認を行います。

3.1 海岸線を回ってOceanのFoamの形状を確認する

先週は以下の部分まで確認したんでした。

今週はこの続きからやっていきます。

初っ端からFoamの無い海岸が有りました。

この辺のFoamは本物の海そっくりです。

洞窟の入り口まで戻りました。

この辺はほとんどFoamが形成されていません。

何故場所によってFoamの形状がこんなに変化するんでしょうか?

先週の開始地点まで戻りました。

録画のDataです。

今回は、何回も分けて録画しました。

後で編集しやすくするためです。

3.2 海岸線を回った感想

まずFoamの形状が小さくなっている箇所や全くない場所が有りました。ほとんどFoamを追加した意味がない箇所です。

それに対して、Foamが比較的大きく形成されている箇所もありました。

Foamが大きく形成されている箇所は本物感が2倍位増していました。

Foamに関してはこれ以上の改善を行うのはタイパが悪すぎる気がします。

ここで一端終了にします。

以下に海のFoamは関係ないですが、気づいた点についてまとめておきます。

<木について>

Foliageで形成された木がかなり曲がって生えていて気になりました。

これは木そのものが曲がっているのか、何かしらのFoliageの設定に間違いがあるのか不明ですが、兎に角、曲がって生えています。

<風景全体>

後、風景はまだまだ殺風景で、物が圧倒的に足りないです。

木をもっと植えるのか、岩やごみをもっと配置するのか?

何かしらの対応をしないとPhoto-Realisticとしてはかなり不完全なMapになってしまいます。

これはPCの性能とも関連しますが、どの程度の奥まで映像として見せるのかについても検証する必要があるとおもいます。

霧を濃くするとか、設定すればあまりPCに負担を掛けずにPhoto-Realisticな風景を作成出来ます。

しかし海岸で遥か彼方まで見えるのはかなり爽快ではあります。

どちらを選択するのかについても検証する必要があります。

3.3 Landscapeをどう利用するのか?

Landscapeとして完成させる。という定義がまだ曖昧で、GameとしてPlay出来る程度に完成させる?と考えていますが、そもそもそれが可能なのかすら不明です。

ここでは他の利用方法についても考えてみます。

<Game制作は時代遅れ?>

もうGameを制作するのは、時代に合わないと思うんです。

UEの発達は個人でもGameを作成出来るようになりましたが、それに相反して誰もGameをPlayしなくなりました。

Businessとして見た場合、Game作成のコスパは悪すぎます。

これには2つの原因があると思われます。

一つ目はYouTubeを代表とするInfluencerの存在です。

GameをPlayしなくてもGameについて論評出来る仕組みが完成してしまったのと、新作のGameが出る度にNegativeな誹謗を繰り返す程、再生回数が稼げるようになってしまったのがGameを殺してしまったんだと思います。

Gameについて語る分野はとんでもない成長しているんですが、Gameそのものは急激に斜陽産業になってしまいました。

これからのGame業界で成功するためにはInfluencerに誹謗中傷させない政治力が無いとそもそも黒字化も無理な気がします。

そしてそれはGameそのものの品質や面白さとは全く違う事で、いくらGame制作者が頑張ってもどうにもならないものです。

2つ目の原因ですが、UEなどのGame Engineは元々は3D Graphics Engineなんです。

Gameも作成出来ます。

というのが本質なんです。はっきり言えばGameを作成するために設計されたものではないんです。3Dの仮想空間を作成しやすくするために設計されたのが元々なんです。

でもそれでは売れないので、Gameの作成に必要と歌ったんです。

これは3D Graphicsが苦手でだけと面白いGameを作成するKnow-howはしこたま持っている日本のGame会社にとっては渡りに船で、日本のGame会社はみんなGame Engineに飛びつきました。

その結果Game Engine全盛期が来たわけです。

しかしそれはGame Engineさえ使えば誰でもGameが作成出来るという誤解を生みだす結果にもなってしまいました。

いや誰でもGameが作成出来るのは誤解ではないですが、誰でも面白いGameが作成出来ると錯覚さえてしまったのは大きな誤解でした。

<撮影場所とするのは?>

それでこの2つの問題を一気に解決する策があるんです。

それはUEで作成したMapを撮影空間として使用する事です。

実際に砂漠まで移動して撮影するのは物凄くお金がかかりますし、安全も保障されません。

UEで砂漠を作成してその上で撮影すれば、お金もかからないし、俳優たちも危険にさらされる事もないです。

更に撮影場所としてUEのMapを使用する事は、今述べたGameを衰退させる2つの原因とぶつかりません。

そもそも映像作品は著作権として保護されているため、GameのようにYouTubeのInfluencerが勝手に使用する事は出来ません。

さらにその映像はみんなが見る事が出来るため、批評内容が適切かどうかの判断を視聴者が下す事が出来るため、勝手な誹謗中傷を行うのは難しくなります。

ので最初のInfluencerのNegativeな誹謗を避ける事が出来るんです。

さらにUEのPhoto-Realisticな世界をReal timeに表示する能力を存分に発揮できます。

これはGameと違ってUEの使用方法を覚えれば誰でも出来るようになります。

つまり2番目の原因である面白いGameを作成するKnow-Howが無くても、UEの使用方法さえMasterすれば、商業的に成功出来る可能性はかなり高くなります。

<Meta-Verse空間としての利用>

これは簡単に言うと、今現実の空間でやっている行為をMeta-verse空間で代用する時にこのMapを使用するという事です。

例えば100人が集まってかくれんぼや鬼ごっこをやる場合、現実の空間では場所の確保も難しいですし、怪我したりした場合の責任や保証などの問題も解決する必要があります。そういう事を仮想空間で代わりに行うのは現実的なんです。

当然、そのためにはLandscapeのあるMapが必要になります。

みんながMeta-Vese空間で利益が取れると考えているのはConcert会場です。

これ自体はその通りと思いますが、私がConcert会場より利益が出ると考えているのがあります。

それは神社の作成です。

初詣は日本の伝統的な風習ですが、コロナ禍で人込みはなるだけ避けたい人も多いはずです。それをVirtualな空間で出来るようにしたらかなりの人が参拝に訪れるはずです。

これはBusiness的にも成功しそうです。

日本全国を探せば、仮想空間にも神社を作成しておきたいと思う宮司もいるはずです。別に実際にその神社に行くわけではないので、日本のどこにあっても良い訳です。

更に言うと海外からの参拝客もかなり見込めます。欧米ではChristmasは大きなEventですが、新年になったらもう仕事始めと言った感じで、一月一日は祝日ですが特に何もやる事は無いです。

Virtualでも日本の神社にでも行ってみようとなったら、かなりの人数が参加するでしょう。

更に人気のVtuberやGameのキャラが巫女さんになってそのCharacterのお守りやおみくじを販売したら売上も凄い事になるでしょう。

<LandscapeをGameとしてではなく撮影場所として完成させる>

来週からはLandscapeを撮影場所として完成させる方向で考える事にしました。

またLandscape上に建設する建物は神社にします。古代の出雲大社みたいな神社を作成します。

以上です。

4.Materialの勉強

今週もBen Cloward先生のAdvanced Material Seriesを勉強します。

Sand Shader - Advanced Materials - Episode 14 [4]を勉強します。

4.1 Sand Shader - Advanced Materials - Episode 14 [4]を勉強する

Quixel Bridgeにある砂のMaterialを改良して少ないTextureでSandのMaterialを作成していました。

Textureの数を少なくしても以下に示した様に、

Quixel BridgeからImportした砂です。

このTutorialで改良したVersionです。

近づいて砂を見た場合です。

Quixel BridgeのMaterialを使用した場合です。

全体的にぼやっとしていますし、写真とはっきり分かります。

このTutorialの方法で改良したVersionです。

写真である事ははっきり分りますが、ぼやっとした感じは無いです。

Materialの質は向上しています。

以下に手順をまとめます。

<Textureの作成>

まずQuixel Bridgeから以下のMaterialをImportします。

以下の4つのTextureが含まれているそうです。

左からBase Color、Normal Map、Ambient Occlusion、そしてRoughnessでしょうか?

まずこれらのTextureの最適化を行います。

この最適化のやり方は、2023-01-30のBlogやその前後のBlogでかなり真面目に勉強しました。

今回も同様のやり方で最適化を行うと思いますが、確認のために全ての手順を記録します。

まずBase Colorを見ると細部は以下の様な細かい模様がありますが、大きく見れば単一の色です。

前にやったように、この一部のみをTextureとして作成してSizeによって使い分けるのかと思ったら、

以下の様にDesaturateしました。

更にBase Colorの色だけ抽出したTextureを作成しました。

Color Pickerでこの色を確認していました。

このTextureは使用するのではなく、ここで採取したRGBの値をMaterial内で使用するみたいです。

今度は灰色にしたTextureのLevelを以下の様に調整しました。

これはMaterial内でこのTextureを使用する時に0.5より上は白く、0.5より下は黒くするための調整と言っていましたが、実装する時に確認します。

今度はNormal Mapの最適化です。

まずNormal MapのBの値は計算で求める事が出来ます。

のでNormal MapのB channelのImageは消して、先程のGray ScaleのBase ColorのImageを代わりに追加します。

結果の一部です。

これは前にやったTextureの最適化とほとんど同じです。

Material側で色々計算をする必要がありますが、正しい計算をすれば元のNormal MapとBase Colorの作成が出来ます。

なんとこれでTextureの最適化は終わりだそうです。

Ambient Occlusionは以下に示した様に単なる白で

使用する意味は全くないし、

Roughnessは以下に示した様な

単なるNoiseなのでMaterial内で別な方法で生成するそうです。

<Materialの作成>

まず先程作成したTextureをUE5にImportします。

ImportしたTextureの設定を以下の様に変更します。

まずsRGBのCheckは外します。

次にCompression Settingは以下に示したBC7にします。

Materialを作成しこのTextureを使用します。

以下の実装でNormal Mapを復元します。

そう、これでNormal Mapになるんでした。

TexCoord[0]を使用してTextureのサイズを10倍にしました。

このMaterialを使用した結果です。

まだColorもDetailもないです。

今度はColorを追加します。

Blend Overlayノードを使用してDetailと色を混合します。

結果です。

Specular Lightが変です。

直します。

まずRoughnessの値を1にしてみます。

結果です。

うーん。

これでも良いのか?

かなり良い感じになっています。

今度は以下に示した様な地面に異常に近づいた場合のDetailについてです。

ここまで近づくと元のDetailのPixelがそれなりにはっきりと見えるようになります。

これを改良してPixelが見えないようにします。

Photoshopに戻ってSandのDetailを作成します。

以下のようなNoiseのあるTextureを作成しました。

作り方です。

WidthとHieightが2048のTextureを作成します。

RGB値をそれぞれ127にして一面塗りこみます。

以下の方法でNoiseを追加します。

以下の条件をセットします。

Amountが13%、GaussianでNono-Chromaticです。

うーん。

まだ実装するかどうかは決めていませんが、もしするならこのTextureはGIMPで作成します。

でもなんかこれMaterial内でも作成出来そうです。

Tutorialの先をみて確認します。

何とこのTextureを使用してNoiseのNormal Mapを作成しました。

これは完全に予想外です。

作成方法を以下にまとめます。

まずこのTextureのSizeを1024に変更します。

このNoiseをRed ChannelにPasteします。

同様にこのNoiseをGreen ChannelにもPasteします。

Blue Channelは白いままにしておきます。

これでこのNoiseのNormal Mapが出来ました。

うーん。

これで先程のNoiseのNormal Mapが出来るのか?

いや、先程のNoiseがそもそもNormal Mapを作成するためのものだったんでしょうか?

UnrealにImportした時の設定です。

Normal Map用のTextureの標準的な設定です。

まずこのTextureの1 Pixelを一個の砂と同じにするためTexCoord[0]を2000で掛けます。

このTutorialの計算方法は今一よく分かりません。

これでTextureの1Pixelが一個の砂と対応するんでしょうか?

NoiseのTextureは以下に示した様に10倍にされています。

かりにこれが10mだったとしてこのTextureのサイズは1024ですので、一個のPixelのサイズは1cm弱になります。

この1cmの事を1 Pixelって呼んでいるんでしょうか?

Tutorialの説明を聞いて分かりました。

こっちのTextureのSizeは関係なかったです。

まず砂の一粒のSizeは0.5mmです。

TextureのSizeは1mです。ので2000で割ると丁度0.5mmになります。

そんだけでした。

Blend Angle Correct Normalノードで混合します。

これで完成かと思ったら今度はこのNormalに対応したSpecularを作成するそうです。

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

この実装は、Normal Mapの値を-1~1から0~1に変換しただけです。最後のPowerノードはContrastを弱くしただけです。

何とここで先程の2000を掛けたのは間違っていた。2が正しいです。と修正しました。

うーん。

Ben Cloward先生もこの辺あんまり理解してないみたいです。

なんか誰かの説明をそのまま反復している感じがします。

一寸考えてみます。

1024を10倍にしたので、10mで一枚のTextureを使用しています。砂一粒のサイズが1 Pixelとしたらやっぱり1cm弱になります。

Detail のNoiseのNormalは1024を2で割ったので、50㎝で一枚のTextureを使用しています。砂一粒のサイズが1 Pixelとしたら50cm/1024=0.048828125cm です。約0.5mmになります。

これは本当の砂のSizeにあっています。

ただし、Base ColorのNoiseのSizeとは全然あっていません。

大体何を計算しているのか理解しました。

結果です。

まず砂に異常に近づいた時ですが、以下のような凸凹が確認出来るようになりました。

ああ、なるほど。

別にBase ColorのNoiseは関係なかったんっだ。Base ColorのNoiseとは独立してNormal MapのNoiseが細かい砂を表現しています。

これはかなりRealに見えます。

更に以下の風景です。

Specular Lightの不自然な感じが無くなりました。

うーん。

こんな効果を生むのか。

これは凄い。

これは自分で試してみる必要があります。

4.2 Sand Shader - Advanced Materials - Episode 14 [4]を勉強した感想

最初に文句が一個あります。

Sand Dunesに対してNormal MapかVirtual Textureで凹凸は追加すべきだったと思う事です。

これ元々のQuixel BridgeのDataにその凹凸に対応したNormal Mapが無かったからなのか分かりませんが、そのせいで近くの部分の写真感が最後まで消えません。

はい。

それでは勉強した感想をまとめます。

まずTextureの最適化についてですが、いつも通り勉強になります。

Task Managerから私のGPUを見るとVRAMは一杯になっていますが、GPUはせいぜい50%位しか稼働していない場合がほとんどです。

なので、Textureを読み込む負担はなるだけ小さくすべきなんです。

この事を忠実に実行するだけでGPUの機能を過不足なく発揮できるようになるはずです。

ここを無視しないで必ず実行しているのは凄いと思いました。

Photoshopを持っていない私はGIMPを使用して再現したので、最初は凄い大変でした。しかし後からこのTextureを最適化する事の大切さが分かりました。Textureの読み込みはGPUのBottle Neckです。

NormalのNoiseを追加する事が全体のSpecular Lightの状態も変化させるのは、圧巻でした。

これは自分で実装して試してみます。

以上です。

5.Niagaraの勉強

今週もCGHOW氏のTutorialの勉強をします。

今週からこれを勉強する事にします。

5.1 Waterfall Scene in UE5.2 Niagara Tutorial [5]を勉強する

まず滝用のLevelを作成します。

そしてSequencerを開いています。

この部分の作成方法が不明です。

前にSequencerを使用したNiagaraのTutorialを勉強した事があったはずです。

それを復習します。

2023-03-131のBlogでLevel Sequencerを追加してNiagaraのAnimationを作成しています。

こんな感じで作成するんでしょうか?

Level Sequencer内の設定は以下の様になっていました。

Cine Camera Actorが追加されたんでしょうか?

Timelineです。

Transformの位置がTimeline内で指定されています。

Cameraの位置がTimelineによって移動します。

Niagara Systemを作成します。

Niagara Systemを開きます。

EmitterのPropertiesの設定を

GPUに変更します。

更にBounds ModeはFixedにしました。

今週はいつもと違う調整をしています。

更にFixed Boundsのサイズを以下の様に調整します。

次にParticle Spawn SectionにあるAdd Velocity Moduleを消します。

今回は滝を作成するのでVelocity Moduleは要らないですが、それ以外のGravityなどを計算するModuleはそのまま残すそうです。

Particle Spawn SectionにあるShape Location Moduleの設定を

以下の様にBoxに変更します。

そしてBox Sizeを以下の様に変更します。

Emitter Update SectionのSpawn Rate ModuleのSpawn Rateは1000に変更します。

そしてParticle Update SectionにCollision Moduleを追加します。

取りあえずこれでLevelに配置してみます。

ParticleがBounceするのは必要ないので、

Particle Update Section にあるCollision ModuleのRestitutionの値を0にします。

更にFrictionの値も0にします。

結果です。

そしてRender SectionにあるSprite Renderer Moduleの

Alignmentの値をVelocity Alignedに変更します。

そしてParticle Spawn SectionにあるInitialize Particle Moduleの

Sprite Size ModeをRandom Non-Uniformに変更し更にSprite Size を変更します。

Particle Spawn SectionにCurl Noise Force Moduleを追加します。

以下の設定にしました。

結果です。

おお、これは水っぽい動きをしています。

Spawn Rateを10000に変更します。

結果です。

この時点でかなり水っぽい動きを示しています。

滝の位置を微調整します。

一寸だけ水が飛び出した方が滝らしくなるので

Particle Spawn SectionにAdd Velocity Moduleを追加します。

そしてAdd Velocity ModuleのVelocityの値を以下の様に変更します。

結果です。

正直、最初の状態とそんなに差は無い気がします。

まあいいです。

実装する時はこの辺は自分の好きなように調整する事にします。

Particle Spawn SectionにあるInitialize Particle ModuleのLifetimeの値を以下の様に変更しました。

今度はParticleの色を変更します。

Particleが落ちている時は白、止まっている時は青になるようにします。

Particle Update SectionにColor Moduleを追加し

以下の様に設定しました。

結果です。

うん。

逆じゃない?

色の設定を逆にしました。

Level上に更に幾つかのNiagara Systemを配置しました。

全部の配置が終わったところで、

System StackのPropertiesの

WarmupのWarmup Timeの値を10に変更しました。

この後はずっと見栄えを良くするために、微調整をしています。

<後述> ここからDuplicateしたNiagara SystemであるMistの作成になっています。

そしてRender SectionのSprite Renderer Moduleの

Materialに以下の設定をします。

このMaterialはSub UVですので Sub Image Sizeの値もセットします。

更にParticle Spawn SectionにSub UV Animation Moduleを追加します。

まずErrorが表示されているのでSprite RendererにSprite Rendererをセットします。

そしてFrameの表示方法をRandomに変更します。

今度はこのMaterialの設定に合うように他のModuleの設定をまた調整します。

Emitter Update SectionにあるSpawn Rate ModuleのSpawn Rateを50に変更します。

Particle Spawn SectionにあるShape Location Moduleの

Shape Primitiveの値にSphereに変更します。

そしてHemisphere Distributionの値も以下の様に変更します。

次はAdd Velocity Moduleの設定です。

Velocity Modeの値をFrom Pointに変更し

Velocity Speedは100にします。

Particle Spawn SectionのInitialize Particle ModuleのSprite Attributesの値を以下の様に変更しました。

この時点でReviewの画像が

となっています。

凄いEffectが出来て来ました。

なんと今度はParticle Update SectionにあったGravity Force Moduleを消してしまいました。

ふえー。

これもう何を目指しているのか不明です。

Previewの画像です。

そしてRender SectionのSprite RendererのAlignmentの値も変更しました。

Particle Spawn SectionのInitialize Particle ModuleのLifetimeの値を以下の様に変更しました。

Particle Update SectionのColor Moduleを何と外して、Scale Color Moduleを代わりにセットしました。

Scale Color Moduleの値は以下の様にセットしました。

Particle Spawn SectionのInitialize Particle ModuleのColorのAlphaの値を0.2に変更して

Particle Update SectionのDrag ModuleのDragの値を

に変更しました。

最後にEmitter StackのPropertiesのLocal SpaceをEnableして

なんとこれ、滝が衝突したところに発生する湯気を作成していました。

あれ、どこでNSをDuplicateしたんでしょう?

NSが2つあります。

13分1秒の時点で既にDuplicateしています。

直しました。

Level上にMistを配置したら霧が小さすぎるので直します。

Add Velocity Moduleの

Velocity Speedを500にします。

Initialize Particle ModuleのSizeも変更します。

Lifetimeも変更しました。

更にPropertiesのSim Targetの設定をCPUに戻しました。

結果です。

以上でした。

5.2 Waterfall Scene in UE5.2 Niagara Tutorial [5]を勉強した感想

今回のTutorialは注目すべき点が何個かあります。

まずNiagara Fluid Simulationを使用していない点です。

私の感想としては、やっぱりFluid SimulationはCGHOW氏にとってはまだ信用するには足らないみたいです。

Niagara Fluid Simulationはぜひ勉強したい分野だったし、新しいPCを買った理由の一つもそれでしたが、今のところは今年の最初に一寸だけ勉強しただけです。

普通のParticleを使用してもこれぐらい滝を表現出来るのは驚きです。

次にLevel Sequenceを使用してCameraの位置を移動させています。

これがPlayを押すと移動したCameraの映像が画面に映し出されます。

この辺のUEの機能を勉強したいんです。

UEでGameを作成するのは一寸お休みして映像を作成してそれをYouTubeに上げる方向にShiftします。

でその手始めとしてLevel SequencerにおけるCameraの使用方法をこのTutorialで勉強しようと思いました。

実装は来週やる事にします。

後、YouTubeで同じWaterfallのTutorialとしてUnreal Engine 5 Niagara Particle waterfall Tutorial [6]を見つけたんですが、

こっちのTutorialの方が先に発表されています。

そしてやり方もほぼ同じです。

どう見てもこのTutorialを参考にして今回のWaterfallのTutorialは作成されています。

こういうのを参考文献として挙げないのはどうなんでしょう。

前のUnreal Sensei氏のVirtual TextureのTutorialもほとんど同じやり方のTutorialをUnreal Sensei氏より前にYouTubeの動画にした人がいました。

CCGHOW氏もUnreal Sensei氏もUEのTutorialでは大御所です。

そういう人達がそれこそ登録者数が100人位の小さなYouTube Channelで発表された内容とほぼ同じ内容のTutorialを後からしれっと発表しているのは、著作権上は問題ないとしても傍から見ている分にはあまり気持ちの良いものではありません。

以上です。

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

6.1 先週の内容

先週は以下のWidgetが何をすべきなのかが分かりにくいと判明しました。

そしてその理由は

である事を解明しました。

そして

として、その具体的な内容は

で終わりました。

6.2 先週のBlogを読み直して

先週の内容を読んで、まず思ったのは「仮説にすぎない。」です。

先週の結論に何か不安を感じて、一週間熟成させる事にしましたが、その結果、何がオカシイのかが判明しました。

以下のWidgetの指示が分かりにくいのは真実ですが、

そこから導出された以下の結論は

控えめに言っても単なる仮説で、これが正しいかどうかを検証する必要があります。

それをしないでその先の

に進んでしまい、更に具体的なUIのDesignを今週決めると宣言してしまっています。

6.3 誰かにGameをやってもらってから結論つけるべきでは?

今回、もう一度このWidgetを見直すと本当に分かりにくい理由は、Drop and Dragや壺にMonsterをセットすると言う表現にある気もします。

更に言うとまだ、誰かにこのGameを試して貰った事もないので、本当にこのWidgetの指示が分かりにくいのかどうかも不明です。

ここは一回誰かにPlayして感想を聞くべきです。

その結果、本当にこのWidgetの指示が分かりにくいのかどうか、そして分かりにくかった場合はどの箇所が分かりにくかったのかを判明させます。

以上です。

7.Gaeaの勉強

今週もGeologyの勉強とGaeaのTutorialの作成を行っていきます。

今週のGeologyの勉強は

Geology 4 (Minerals)[7]を勉強します。何故かGeology 3の動画は上がっていませんでした。

その後で、GaeaのTutorialの作成を行います。

7.1 Geology 4 (Minerals)[7]の勉強

まず全部軽く見ます。

その上でこのTutorialでもっとも大切だと私が思った事を3つまとめます。

更に仮説を証明するための証拠となる話で興味深かったのも3つ位まとめる事にします。

最後に覚えておくべき専門用語も3つ位選択してまとめます。

7.1.1 Lectureを見た感想

MineralについてのLectureです。

そもそもMineralの厳密な定義を知りません。

調べます。

WikipediaMineral [8]によると

  • 固体である事、
  • 化学的に構成がはっきり分かっていて、かつ結晶である事、
  • そして自然の力で生成されたものである事

が定義のようです。

その後で、自然の力の中に基本的には生物の働きは含まれないが、例外もある。と書かれています。

無機物である事は定義に入らないんでしょうか?

結晶である事が無機物である事を証明しているんでしょうか?

調べたら有機物も結晶化しますね。

この定義はかなり曖昧ですね。

まあでもそれなりのImageは掴めました。

そこから私のMineralの定義を導出すると以下の様になります。

  • 見た目の美しい石

これが、もっとも原始的かつ根源的なMineralの定義だと思います。

後で、化学が発展してからMineralが結晶化している事が判明したので結晶化している事とかの条件が加わった考えると納得いきます。

特にMineralに含まれないその辺の石が結晶化していないなんで、昔の人が知るはずもありません。

昔の人が区別出来たのは石の美しさだったはずです。

最後まで見ました。

まず感想を書くと

Inorganic Chemistry的な解説はMineralの基本を理解するのにはかえって邪魔。

です。

分子の構造があってそこからMineralが見つかったんじゃないです。

Mineralがあってそれを分類している過程で、化学が発展して分子的な視点からのMineralの分析が出来るようになったんです。

最初からInorganic Chemistry的な分類で説明されても何でその2つのMineralがそもそもこの分類に登場しているのか分からなくなります。

まあでも今回のGeologyの勉強で大切なのはあくまでもGaeaでLandscapeを設計するにあたって必要な知識を得る事です。

そういう意味では今回のMineralの勉強はそんなに重要ではありませんでした。

以下にこのLectureで私が大切だと思う事などをまとめます。

7.1.2  大切だと私が思った3つの事

  • Mineralの特質すべき特徴であるCleavage。(ただしQuartsにはない。)
  • Mineralを構成する元素の内40%以上を占めるのはOxygen、次がSilicon。
  • Felsic MineralとMafic Mineral

まあ、はっきり言うと今回のLectureはGaeaでLandscapeを作成するにあたってはそんなに大切な内容では無かったです。これを理解しておかないと次からのLectureについていけないとかもなさそうです。

見なくても良い内容でした。

7.1.3 仮説の証明

「科学的な論理に基づいて仮説を立てその仮説が正しい事を検証して証明する。そして聖書に書かれてる天地創造を無批判に受け入れる事を拒否する。これがGeologyと言う学問の根本である。」という先週の私の推測はかなり的を射ていたと思われます。

今週も色々な手法を用いてMineralが同じ種類である事を証明していました。

<StreakとHardness>

LectureによるとMineralは同じ種類でも含まれる不純物によってかなり色が変わってしまうそうです。ので同じMineralである事を証明するのはかなり大変だそうです。

その中で以下の方法によってそのMineralが同じ種類である事を証明する事が出来たそうです。

  • Streak
  • Hardness

このStreakはMineralを粉にしてその色を比較する方法だそうで、そもそも色が違うが同じ種類のMineralには意味がないじゃないか。と思ったんですが、なんとMineralは形状によっても色が変わったりするそうです。

<Lectureで紹介されていた粉にしたら色が全く変わったMineralの例>

ので粉して色を比較するという手法で同一のMineralであるという事が解明出来るそうです。

Hardnessは、所謂Mohs Scales(モース硬度)の事で、お互いで引っ搔いたらどっちに傷が出来るのかを競う手法です。

この手法でもっとも固いと言われるDiamondが衝撃で簡単に砕けてしまうのはネットの発達で周知の事実になりました。

この手法が優れているのは見た目がそっくりなCalciteとQuartsの区別が簡単につく事です。

LectureでもCalciteとQuartzのMohs Scalesの違いについて説明していました。

この写真のCalciteとQuartzの見た目はかなり違いますね。

一応、Google検索で表示されたCalciteのImageも追加しておきます。

こっちはQuartzとそっくりです。

ここまでは良かったんですが、この後は単なるそれぞれのMineralの化学的な構成についての解説になってしまいました。

化学的な解説が悪い訳ではないですが、物事を分子Levelで見る事の本当の大切さを解説している訳ではないので、聞いている人は「ふーん。」で終わってしまいます。

それについてここでまとめると長くなってしまうので今回はしませんが、その辺は不満があります。

7.1.4 専門用語について

<Luster>

  • 光を反射する能力の事。鏡のように周りを写すMetallicやガラスのように透明になるVitreousがある。

UEのMaterialの設定にも非常に関係していて面白い。

<Felsic Mineral>

この専門用語は繰り返し使用されていますが、そのものずばりを指す定義が説明されなかったです。

特徴として以下の事を含むそうです。

  • 薄く明るい色
  • QuartzやClay(粘土)を含む

<Mafic Mineral>

  • 黒や緑
  • 固い
  • ガラスっぽい

この用語も分かり易い定義は紹介されませんでした。

上記のような特徴があるものが多いそうです。

7.2 GaeaのTutorialの作成

7.2.1 先週の復習

先週は作成したMind Mapを元にして講義を作成しそれを録画したんでした。

これです。

どんな内容を話したのかもう忘れてしまいした。

録画を見て確認します。

見ました。

かなりQualityが高いです。

このままYouTubeにUploadしても問題なさそうです。

2つ程直したい箇所があるとすれば、GDCの動画を表示している時に音が入ってしまった件と最後にTutorialの内容を説明している部分は要らないです。

それ以外はかなり良いと思いました。

一応、もう一回録画し直します。

結局4回やり直しました。

何回も喋っていると喋る事自体は上手くなりますが、アドリブが減って内容自体はつまらなくなります。

作成方法のTemplateが決まったら一発撮りで決めた方がアドリブが神懸って面白いです。

あんまりにもしゃべり過ぎて喉が痛くなりました。

ただし、四回目を撮る前に以下に示したMind MapのManualのTYPOを見つけました。

元々はManulと書いていました。

こういう間違いは何回も復習している内に見つける事が出来ます。

何回もやり直す事がいつでも悪い訳ではないです。

8. Houdiniの勉強

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

今週は先週勉強したUnreal 5.2 Preview PCG Tutorial - Part 2 – Splines [10]を実装します。

8.1 Unreal 5.2 Preview PCG Tutorial - Part 2 – Splines [10]を実装する

<Spline>

新しいPCGを作成しました。名前はTutorialと同じPCG_Splineにしました。

Get Spline Dataノードを追加します。

Actor SelectionにTagをセットしActor Selection TagにTestSplineをセットします。

ここは先週のまとめとは一寸違っていました。

まずActor Filterの値をAll World Actorsに変更する必要がありました。

その上でActor SelectionにBy Tagを選択し、Actor Selection TagにTestSplineをセットします。

Tutorialを見直したらしっかりこのやり方を説明していました。

次にBlueprint ActorからBlueprintを作成します。名前はBP_Splineにしました。

中を開きComponentにSplineを追加しました。

Start with Tick EnabledをUncheckして

TagにTestSplineを追加しました。

これはSpline Componentに追加していたと思ったんですが実際はBPそのものに追加していました。

今度はPCG_Splineに戻ってSpline Samplerノードを追加します。

BP_SplineとPCG_SplineをLevel上に配置します。

以下のように配置しました。

PCG_SplineのSpline Samplerノードを選択してDebug Modeにセットしました。

更にLevel上に戻りPCG_SplineのGenerateを押しました。

結果です。

うーん。

確かにOrangeの線は見えますが、これって前からあったような気もします。よく分かりません。

<Distance>

Spline SampleノードのParameterをTweakしていきます。

ModeをDistanceに変更しました。

結果です。

Orangeの線が短くなる代わりに沢山現れました。

更にDistance Incrementの値を300に変更しました。

結果です。

Orangeの線が長くなって数は少なくなりました。

次にBP_SplineのSplineを選択して

Closed LoopをEnableします。

結果です。

念のためにTutorialで確認したらTutorialはLevel上に配置したBP_SplineのPropertiesでClosed LoopをEnableしていました。

直します。

直しました。

そしてPCG_SplineのSpline SamplerノードにあるDimensionにOn Interiorをセットします。

結果です。

Tutorialと同じ結果になりました。

Pointを小さくするためにTransform Pointsノードを追加します。

以下のようにScaleを設定します。

結果です。

おお、良い感じに出来ています。

Splineのサイズを大きくしてみました。

うーん。

出来ていますね。

今度はDensityの値をSplineの中心からの距離で決定します。

Spline Samplerノードの

Interior Density Falloffの値を以下の様にします。

結果です。

これをDensity Remapノードを使用して値を逆にします。

以下の設定に変更します。

結果です。

逆になりました。

当然これは先程のSpline SamplerノードのInterior Density Falloffの値を逆にしても同じ結果になります。

<Fixed Distance>

以下の様にSplineのサイズを大きくすると

黒い部分の割合も大きくなります。

これを直します。

以下のような実装を組みました。

まず二個目のSpline Samplerノードですが以下のような設定にしました。

これをDistanceノードに繋ぎます。

Distanceノードの設定です。

Set DensityをEnableして

Maximum Distanceを1000にしています。

ここは完全な推測ですが、

一番目のSpline Samplerノードで生成されたPointと二番目のSpline Samplerノードで生成されたNodeの距離を計測して1000以上だったら無条件で白くなるんだと思います。

ので黒い部分はSplineのサイズに関わらず変わらなくなっていると思いました。

確認します。

現在のDensityです。

Maximum Distanceを3000にします。

黒い部分が増えました。

うーん。

逆ですね。

一番目のSpline Samplerノードで生成されたPointと二番目のSpline Samplerノードで生成されたNodeの距離を計測してMaximum Distance以下だったら問答無用で黒くなるみたいです。

サイズを小さくして黒い部分を確認しました。

あれ、黒い部分の幅は確かに変わっていませんがPointの数が増えています。

これってPointの総量はSplineの大きさに変わらず同じみたいです。

<Path>

今度はこのSplineのLoopの中を通るPath、つまり道を作成します。

BlueprintをActorから作成します。名前はBP_PathSplineとします。

Splineを追加します。

SplineのScale Visualization widthをEnableします。

結果です。

今度はScale Visualization widthの値を100にします。

結果です。

BPのTagsにPathにPathをセットします。

今度はPCG_Spline内で新しいGet Spline Dataノードを追加します。

設定は以下の様にしました。

Spline Samplerノードを追加しました。

このNodeの設定を記録してなかったです。

Tutorialを見て見直します。

以下の様になっていました。

BP_PathSplineを以下のように配置します。

Boundの設定を以下の様にします。

結果です。

Boundの値を以下のように変更しました。

結果です。

最後にDifferenceノードでTestSplineの結果からPathの結果を引きます。

以下の設定にします。

結果です。

おお、Pointが道に沿って消えています。

先週のBlogでは以下の様に書いています。

うーん。

これは後で考えます。

この後はCaveatです。

まずPathを移動させてみます。

普通に移動させた先に道が出来ました。

あれ?

Tutorialの結果と違いますね。

確認します。

はい。

勘違いしていました。

PathをDuplicateして2番目の道を作成していました。

2番目のPathを配置したらTutorialと同じ結果になりました。

Pathの方のGet Spline Dataノードの

Select MultipleをEnableしました。

結果です。

今度は2つの道が形成されました。

今度は2つ目のTestSplineを追加しました。

Pointが表示されません。

こっちもGet Spline Dataノードの

Select MultipleをEnableします。

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

うーん。

何でPointの大きさが違うの?

しかもSizeを変えてもPointの数は変化しません。

Unionノードはテストしなくでも良いです。

はい。実装が出来ました。

8.2 Unreal 5.2 Preview PCG Tutorial - Part 2 – Splines [10]を実装した感想

Loopで囲んだSpline内のPointsの数が調整出来ない点以外は、かなり思った通りの操作が出来る事が分かりました。

今回、確認出来たことで大きいのはやっぱりDensityの値は自由に変更する事が可能だという事です。

今回はDensityの値は以下のSpline Samplerノードか

Transform Pointsノードで変更しています。

更にDistanceノード内でもDensityの値を変更しています。

Distanceノードの使用方法に関してはまだよく分からない部分があります。

SplineをLoopして作成したPointから別なSplineのPointをDifferenceノードを使用して引きましたが、

このNodeの設定に関してはまだよく分かりません。何故この設定だと引き算した事になるのかが分かりません。

また前回のTutorialでやったようなSurface Samplerに対しても同様の事が出来るのか気になります。

当然、先程述べた海のSplineを引く事も試してみたいですが、このDifferenceノードをどのように調整すると正しく出来るのか不明です。

のでしばらくはTutorialをやるだけにします。

9.UEFNの勉強

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

9.1  Unreal Editor for Fortnite Beginner Tutorial - UEFN Starter Course! [11]の実装の続き

先週は以下の箇所まで作成しました。

島の形状には不満がありますが、取りあえずはこれでOKとします。

以下の様にRiverを追加しました。

Riverの底のLayerをPaintします。

はい。川底に当たる部分をLayerの6で塗りこみました。

水の底から見るとこんな感じになりました。

島の形状も調整しました。

すこしはましになりました。

<Performance Settings>

Cameraがどれ位近づくと草が生えるのかの設定を変更します。

Cinematicに変更しました。

この位の距離でも草が生えるようになりました。

GPUの使用率ですが、たった6%です。

しかしGPU温度は73度まで上がっていました。(Screenshotを撮った時には温度は下がっていた。)

そんなにGPUには負担になってはいないようですが、

消費電力が非常に高いとなっているので設定はEpicに戻します。

<Prefabs and Grouping>

ここでは何をやるのかBlogを読み返しただけではよく分からなかったので、Tutorialを見直しました。

そしたらPrefabからAssetをLevelに配置してその一部のPartsを操作したりしていました。

つまりここはPrefabからどうやってAssetを選択したり、そのAssetを使用してどうやって建物を作成したりするかなどを学習する所です。

Pirates Innを追加します。

ここのAssetの操作方法はBlogにはまとめてなかったのでTutorialを見ながらやる事にします。

まずこれです。

Assetを選択して右ClickしてBoxを表示してBrowse to Assetを選択します。

うーん。

流石に日本語はきつくなって来ました。

Editorの設定から言語の設定だけ英語に変更しました。

Localeは何を指しているんでしょうか?

よく分かりませんね。

先程のCartをBrowseしました。

Dragして配置します。

同じAssetです。

Ctrl+Bでも同じ事が出来ます。

この壁だけUngroup化します。

Attach ToからNoneを選択します。

これでPirate Innを消してもこの壁は消えなくなりました。

今度はFortniteのGrid Systemについてです。

FortniteのAssetは以下のGridに沿って作成されているので

以下の様に壁を2つ並べる時、GridをEnableしておけば細かい調整をしなくても自然と壁がそろうようになっています。

以下の様な部屋の壁も一瞬で作成出来ました。

これらのAssetをCtrl+GでGroup化します。

全部の壁が一緒になりました。

<Adding Assets>

以下のAssetを準備しました。

ここに滝を追加します。

こんな感じの滝を作成しました。

滝の元になる池様に穴を開けました。

以下のAssetを追加して

こんな感じにしました。

更に岩を配置して以下の様にしました。

完全に3D酔いしました。

今週はこの辺で終了します。

10.YouTube動画の作成

今週はGaslightingについてMind Mapを作成します。

その後でその講義を動画にします。

さらにその動画をDavinci Resolveで編集します。

10.1 Gaslightingについて

最近、英語のVTuberの動画を見てたらAIに対して「お前、Gaslightingしてるやろ。」と言って大爆笑しているシーンがありました。

でGaslightingって何?となったので、調べたら結構深い言葉だったのでそれについてまとめる事にしました。

取り留めなくGaslightingについて書くと以下の様になりました。

  • Gaslightingと言う言葉そのものがMerriam-Websterの2022のWord of the Yearに選ばれるほど、今英語圏ではviral(バズっている)な言葉。
  • 本当の意味とは一寸乖離して使われている場合もある。
  • 一般に使用されている場合は、AがBを騙してAに得になるようにする行為を指すみたい。
  • 専門的な意味では、
    • 一定の期間を掛けて犠牲者の考え方や記憶が間違っていると洗脳する行為を指す。
  • 自信の喪失や、自分で物事を決められない事態を引き起こすなどの結果をしばしば伴う。
  • アメリカではまだ犯罪と認定されていないが、のちにDomestic Violenceに繋がるCaseが多い。
  • 仕事場でも上司から部下に対して行われている場合がある。
  • Gaslightingの例を見ると日本でも頻繁に使用されている事が分かる。
  • Gaslighter(Gaslightingを行う人)は後に犯罪を行う可能性が高いので直ぐに対策する必要がある
  • Gaslighterにならないために
  • Gaslightingの例について

これでMind Mapでまとめてみます。

10.2 Mind Mapの作成

以下のような構成になりました。

参考文献が無かったです。

追加しました。

簡単に内容を説明します。

まずそもそもで何でこの言葉を選択したのかについて解説しています。

次に結論を先に述べてしまいます。

結論としては、勉強して理解しておいた方が良い用語である事が分かったと述べています。特に企業やNetにおける倫理に関連する人達には、重要であると述べています。

ここから本番ですが、Gaslightingの意味についてです。

現在、3つの意味で使用されている事が判明しました。

最初は間違って使用している場合です。

まあ、当たり前ですが、アメリカ人でも英語間違えて使用します。専門用語ならなおさらです。

この間違って使用されている例では、単なる見解の相違という意味で使用されています。この使用方法が間違っている理由は、Gaslightingには被害者と加害者がいる事を無視しているからだそうです。

次に一般的な意味のGaslightingです。

とにかく誰かが騙そうとしたらGaslightingしている。って言います。騙す方をGas Lighterと言います。

私がYouTubeでよく見るのはこの用法です。

あ、Mind MapのSpellが間違っていました。直します。

直しました。Gas Ligheterって書いている箇所もあり、結構直すのに時間が掛かりました。

最後に心理学的、要するに専門的な定義です。

こっちも結局は騙すんですが、記憶や考え方が間違っていると言う具体的な手段が追加されています。

更に以下の結果も追加されています。

記憶や考え方に関しては以下の内容になっています。

複雑なのでここでは解説しません。

一個だけ自分が思いついた例を追加しています。

更に以下の内容についてもコアな情報を紹介しています。

これも長いのでここにはまとめません。

最後にまとめと感想を書きました。

10.3 動画の作成

動画を作成します。

このMind Mapを読んで説明しているところを録画します。

その後で、Davinci Resolveで編集します。

出来ました。

今週は他にやる事が出来てしまったのでここまでとします。

11.まとめと感想

時間がないのでまとめと感想はなしです。

何と古いPCを久しぶりに起動させたら火花を吹きました。

慌てて全部の電源を停止させましたが、多分もう古いPCは動かないでしょう。

時間が有るときにDataだけでも回収したいです。

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] Explain C Singleton design pattern. (n.d.). https://www.tutorialspoint.com/Explain-Cplusplus-Singleton-design-pattern

[3] Singleton pattern destructor C++. (n.d.). Stack Overflow. https://stackoverflow.com/questions/20098254/singleton-pattern-destructor-c

[4] Ben Cloward. (2023, February 2). Sand Shader - Advanced Materials - Episode 14 [Video]. YouTube. https://www.youtube.com/watch?v=NDb4WpE5bak

[5] CGHOW. (2023, May 17). Waterfall Scene in UE5.2 Niagara Tutorial | Download Files [Video]. YouTube. https://www.youtube.com/watch?v=IwEmx04MZyM

[6] AMMediaGames. (2023, February 4). Unreal Engine 5 Niagara Particle waterfall Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=d3lcHp197Mc

[7] Earth and Space Sciences X. (2015, October 30). Geology 4 (Minerals) [Video]. YouTube. https://www.youtube.com/watch?v=EZMBoXQbA6k

[8] Wikipedia contributors. (2023). Mineral. Wikipedia. https://en.wikipedia.org/wiki/Mineral

[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 2 - Splines [Video]. YouTube. https://www.youtube.com/watch?v=zp1pvaZraGM