UE4の勉強記録

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

UE5の勉強 -映像作品としてのLandscapeを作成する-

1.今週の予定

<映像作品としてのLandscapeの作成>

建築用のLevelの作成の勉強の続きをやります。

先週、勉強した3D Gaussian Splattingの続きをやります。

Niagara の勉強>

Unreal Engine 5で学ぶビジュアルエフェクト実装 基本機能からNiagara、シミュレーションまで」の実装の続きをやります。

<Materialの勉強>

Ben Cloward先生のTutorialを勉強します。

<Gaeaの勉強>

GaeaのTutorialを作成します。

<Houdiniの勉強>

Castle Wall Tool [1]の勉強をやります。

<UEFNの勉強>

Pi Equals Three氏のTutorialをやります。

<DirectX12の勉強>

DirectX 12の魔導書」の勉強をやります。

更にLötwig Fusel氏のDirectX12のTutorialをやります。

2.Landscapeの作成

 2.1 今週の課題

先週、How to 3D Gaussian splat from Aerials to Unreal 5 (Free plugin)[2]を実装しましたが結果は期待してたよりかなり悪かったです。

これは使用したSampleの質が悪かったからかもしれません。

別なSampleでも試してみます。

先週のBlogを見ると以下の事をやると書いていました。

この中で特に重要なのがUnreal Engine 5 for Architecture - 2023 Full Beginner Course [2]の勉強です。

とっととこれを終わらせないと次の勉強をする事が出来ません。

道路を作成して追加するのは、かなり後で良い気がします。

道路の作成は延期します。

2.2 How to 3D Gaussian splat from Aerials to Unreal 5 (Free plugin)[2]を別なSampleで試す

先週のBlogを読み直すとBPのEnvironmentの使用方法がよく分からない。と書かれていました。

ますこれについて調査します。

How to 3D Gaussian splat from Aerials to Unreal 5 (Free plugin)[2]を見直しましたが、それについては何の説明もありませんでした。

そう言えば一番最初に3D Gaussian Splattingを勉強したTutorialでSky LightのCube Mapの設定について何か言っていた気がします。

Environmentの使用方法のヒントがあるかもしれません。

確認します。

2024-01-14のBlogで勉強していました。

Tutorial名はStep-by-Step Unreal Engine 5 Tutorial: 3D Gaussian Splatting for Beginners [3]でした。

そのTutorialを見てたら

と言っている箇所がありました。

前回このTutorialを勉強した時はこの3D Gaussian SplattingのDataがDownload出来なくてあきらめたんですが、無料でDownload出来るんでしょうか?

Downloadを押したらずっとグルグル回っています。

20分位たっても何の変化もありません。

やっぱりDownload出来ないや。と思って諦めて止めたら、更に5分位経ってから、どこにDownloadしますが、と聞いてきました。

のでDownloadするFolderを指定したら

Download出来ました。

何がDownload出来たのかは分かりません。

どうしてDownload出来たのか不明なのでもう一回試していたら今度はBrowserから開きました。

凄い、空に少しだけオカシイ部分がありますが、その場でVideo撮影したのと変わらないです。

いやそれは良いです。

もう一回Download出来るか試します。

以下の場所に戻りました。

今度は右のMoter Bikeを選択して以下のBoxを表示させExportを選択します。

以下の画面を表示しました。

あ、分かりました。

最初にExport toにUnrealを選択すると

GAUUSIAN SPLATが選択出来なくなって

DOWNLOADが押せなくなります。

Export toがAll Formatsの状態の内に

DownloadするPLYを選択しておきます。

その後でExport toの設定をUnrealに変更すればDOWNLOADのButtonが押せるようになりました。

むぐぐ。

このUIの設計は一寸問題でしょう。

Polycamからも3D Gaussian SplattingのDataがDownload出来るようになりました。

2024-01-14のBlogを読むと

と書かれていました。

一応、前に勉強した時もDownload出来る所まではやっていたんですね。

前回、Download出来なかった理由は何だったんでしょう?

利用者が多すぎてServiceがパンクしていたのかもしれません。

2.3 Step-by-Step Unreal Engine 5 Tutorial: 3D Gaussian Splatting for Beginners [4]の続きを実装する

予定変更ですが、PolyCamの3D Gaussian SplattingのDataがDownload出来たんで、2024-01-07のBlogで勉強し、2024-01-14のBlogで途中まで実装した内容の続きをやる事にします。

以下の箇所からPly FileをImportしました。

以下のFileが作成されました。

Blueprintを開いてみます。

何も表示されません。

うーん。

出来てない気がします。

一応、Level上にBPを配置してみました。

あれ?

出来てそう。

向きが間違っています。

直しました。

画質は結構荒いです。

ですがカクカクする事はないです。

次はWith Relightingを試します。

画面が明るくなりました。

Directional Lightの向きを変えてみました。

全体に夕焼け感が追加されましたが、Moter Bikeに特別な影が追加されたりはしませんね。

まあ大体予測通りです。

Spot Lightを追加してみました。

あんまり差はないですね。

Directional Lightを消してみました。

一応、効いてはいました。

この辺もぼちぼち試していきます。

Cropの方法が説明されていました。

これも試してみます。

Location Volumeを追加しました。

Sizeを調整して以下のようにしました。

BPからこのLocation Volumeを選択します。

そしてCrop TypeにKill outside volumeをセットします。

結果です。

Boxの中だけRenderingされるようになりました。

近づいてみました。

周りが無い事以外は同じです。

これで終わりでした。

もう一個のSampleも試してみました。

Browserで見た画質が100だとすると5位しかないです。

でも凄い事は凄いです。

以下のような意味深な背景とかも撮影出来ました。

うーん。

やっぱり3D Gaussian Splattingは凄い。

3D Gaussian Splattingはもっと深堀していく事にします。

 2.4 Unreal Engine 5 for Architecture - 2023 Full Beginner Course [5]の勉強の続きをやる

2024-01-29のBlogに<Light Source>の内容がまとめられていました。

ここでやっている重要な事の一つに以下のCast Ray Traced ShadowsをEnableするのがあります。

Ray Tracingはやった事が無いです。

多分、Projectを作成する時にRay TracingをEnableさせないと使用出来ないと思いますが、試しにやってみます。

以下のようにSpot Lightを追加しました。

以下のBedの影を見てみます。

Spot lightのCast Ray Traced ShadowsをEnabledに変更しました。

結果です。

何も変わっていません。

やっぱり効いてないです。

以下のRect Lightでも確認してみました。

Defaultでの状態です。

Cast Ray Traced Shadowsの値をEnableに変更しました。

Screenshotだと一寸変わったように見えますが、実際は全く変化していません。

試しにDisabledに変更してみました。

あれ?

Bedの影が濃くなりました。

もしかしてDefaultでCast Ray Traced ShadowsがEnableになっていたのかも。

Project Settingから確認するとRay Tracing ShadowsはEnableになっていますね。

うーん。

出来てそう。

Tutorialにあるようなこれが

こうなる。

というような劇的な変化は見られないのではっきり良くなっているとまでは言えませんが、効いている感じはします。

今週のUnreal Engine 5 for Architecture - 2023 Full Beginner Course [5]の勉強はこれぐらいで良いです。

他にやりたい事が出来ました。

2.5 10 Things You Can Do With 3D Gaussian Splatting & Reality Capture [6]を勉強する

Creative Tech Digest氏が3D Gaussian Splattingの応用方法についてまとめた動画を上げていました。

軽く見たんですが、かなり詳しい知識に基づいて推察しているのでこれからの指針を決めるのに役に立ちそうです。

のでここにまとめる事にしました。

<The Reality Capture Revolution>

3D Gaussian Splatting関連の簡単な歴史の説明をしていました。

NeRFsが来て革命が起きたと思ったらすぐ後に3D Gaussian Splattingが来て更に凄い事になった。と興奮気味に言っていました。

現実と変わらない仮想空間を再現出来る上に100FPSが簡単に達成できるのが凄いと言っていました。

確かにこの点は3D Gaussian Splattingについて語る上で非常に重要です。

<3D Memory Capture>

これは簡単にいうと3Dの写真化です。

今まで長い事暮らしていた家を取り壊すとかなった時に、その家を撮影して3D Gaussian Splattingで仮想空間に丸ごと保存するそうです。

以下のようにLiving Roomが丸ごと再現されていました。

この分野で一番進んでいるはAppleだそうです。

うーん。AppleVRはそういう目的で使用する目標があるのか。

<Reality Bending Visual Effects>

これは3D Gaussian Splattingが沢山の粒で構成されている事を利用してVFXを追加する技法の事だそうです。

参考文献として以下の映像が紹介されていましたが

VFXと言われるまで本当の映像だと思っていました。

更にImageをReskinするのも良いと紹介していました。

Reskinって何をするのかが分かりません。

作成した3D Gaussian Splattingを以下のSoftwareで開くそうです。

以下のような映像を作成していました。

VFXの一種のようですね。

<Dynamic 3D Capture (Movement!)>

ここでは更に動きのある映像から3D Gaussian Splattingを作成する方法を説明していました。

ただしこれは以下のように沢山のCameraで撮影する必要があるそうです。

そりゃそうだ。

しかもこれ沢山のCameraで被写体を囲む必要もあります。

でも以下のような方法で対応可能みたいです。

うーん。

これはこれで未来がありますね。

この分野でももっとも研究が進んでいるはApple社だそうです。

<Advanced Relighting Effects>

これはLightの位置を指定すると影が追加される技術だそうです。

韓国のBbleと言う会社の技術だそうです。

調べたんですが見つかりません。おそらく会社名が間違っています。

Gaussian Splattingの情報からNormal Mapまで生成するそうです。

更に皮膚などのSubsurfaceも再現するそうです。

<Kitbashing in 3D Game Engines>

Game EngineにGaussian Splattingを使用した例が紹介されていました。

Bad Decision Studioの例が紹介されていました。

Kitbashingの意味が分からなかったですが、これは今あるMeshとかAssetとかを再利用して何かの新しいモノを作成する時に使用される用語だそうです。

<Sharing Content Everywhere (Web & Mobile)>

3D Gaussian Splattingで作成したものは簡単にいろんなDeviceを跨いで使用する事が可能だそうです。

まあそういう長所があると言う話でした。

<Editing Gaussian Splats & E-Commerce>

Splatsについて解説していたんですが、あんまり理解出来なかったです。

このSoftを使うとGaussian SplattingのDataを編集してもっと綺麗に出来ると言う意味なんでしょうか?

この技術を使用すると以下のような靴や服を3Dで表示でき、ネットにおける販売が変わると言っていました。

これは凄いですね。

<Virtual Production & Game Dev>

映画の撮影で使用されるだろうと言っています。

これBack Screenに映像を写して撮影しているんですね。

しかも光の計算もComputer側で同調してやっている訳です。

AAAのGameでもこの技術は使用されているそうです。

<Heritage Conservation>

これは文化財の保存に使用する話でした。

<Big Picture: Connecting Physical & Digital Worlds>

ARについての話でした。

と思ったら3DでMapを作る話が紹介されていました。

うん。

兎に角DataのSizeが小さいから何でも出来ますね。

<Conclusion & What’s Next For 3D Capture>

次のVideoではHuman Captureについて解説すると言っていました。

以上でした。

2.6 10 Things You Can Do With 3D Gaussian Splatting & Reality Capture [6]を勉強した感想

Gaussian Splattingを取り巻く現在の状況が何となく理解出来ました。

服とか靴を3Dで表現出来るようになるのはBusiness Chanceがありそうです。しかしその分野の技術は私はよく知らないのであんまり参戦はできそうにないです。

UEを使用して簡単に出来るようになったら私にもBusiness的に参戦出来る可能性が出るかもしれません。

後、Gaussian Splattingで作成した3D Imageを写真の上位交換にするのは現実になる可能性が非常に高いですね。

3Niagara の勉強

3.1  「Unreal Engine 5で学ぶビジュアルエフェクト実装 基本機能からNiagara、シミュレーションまで」を勉強する

3.1.1 「16.4 Pressure VectorとViscosity Vectorの計算」を実装する

<「16.4.1 Scratch Pad Moduleの準備」を実装する>

Accumulate ForceのScratch PadのMap Getノードに変数を追加していきます。

[Particle]Velocityを追加していますが、

私のParameterには無いです。

教科書を読んだらMap Getノードの+を押すと追加出来るとありました。

試したら出来ました。

Custom HLSLノードを追加しました。

Inputを追加しました。

次にMap Setノードに変数を追加します。

この変数をCustom HLSLノードのOutputに繋ぎます。

<HLSLのCoding>

ここはCodeがずばっと書かれてそれだけです。

まあ。今まで散々理論について解説して来たので今更Codeの解説しても仕方ないですね。

ここはSample CodeをそのままCopyして貼り付けます。

うん。

本当に軽く見ただけですが、これは「16.2 数式をCodeに落とし込む」で勉強した内容そのままな気がしますね。

後で時間がある時にこの実装については検証する事にします。

Compileします。

Errorが凄いです。

一個ずつ直していきます。

最初のErrorです。

_KernelHと言う変数が無いと言っています。

いやここにあるじゃん。と思ったら

Spellが間違えていました。

Kernelが正しいSpellでした。

もう一度Compileしてみます。

直りました。

<16.4.3 Scratch Pad Moduleの入力(Parameter)の設定>

Emitter AttributesにParticle Attribute Reader型の変数を作成します。

名前はAttribute Readerとします。

この変数をEmitter Update StageにSetします。

Set:[EMITTER]Attribute Readerの以下のParameterにEmptyをセットしました。

教科書ではこのEmitterの名称はFluid Simulationとなっていましたが、私のEmitterの名前はEmptyのままだったのでEmptyとSetしました。

Accumulate ForceのAttributeの値を指定します。

Sample Codeの値をそのままCopyしました。

後で教科書の値と比較しましたが全く同じでした。

いや以下のIconだけは違っていました。

この違いは何なんでしょうね?

ここで「16.4 Pressure VectorとViscosity Vectorの計算」は終わっています。

3.1.2 「16.5 外力の計算」を実装する

<16.5.1 Scratch Pad Moduleの準備>

今度はAccumulate External Forcesノードの実装をやります。

Map Getノードに以下の変数を追加しました。

Custom HLSLノードを追加します。

Inputを繋げます。

<16.5.2 HLSLのCording>

以下のCodeをSample CodeからそのままCopyして追加しました。

Compileしました。

普通に出来ました。

教科書の説明によると、この部分のCodeに関しては群れのSimulationで扱ったものと同じだそうです。

この辺も後で復習する事にします。

<16.5.3 Scratch Pad Moduleの入力(Parameter)の設定>

Accumulate External ForcesのAttributeがありません。

結構悩んだんですが、以下のMap Setノードの実装を忘れていたのが原因でした。

今度は以下のようにAccumulate External Forces ModuleのAttributeが表示されるようになりました。

以下の値をSetしました。

Sample Codeの値をそのままSetしましたが、教科書の値とも同じである事を確認しました。

ここで「16.5 外力の計算」が終わっています。

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

4.Materialの勉強

4.1 Animated Flag - Advanced Materials - Episode 26 [4]の実装の問題を直す

先週はAnimated Flag - Advanced Materials - Episode 26 [4]の実装を行ったんですが、上手く出来ませんでした。

これを直します。

カクカクしている問題はMeshの数が少ないからだと思います。

以下のRectangleを新しく作成しました。

これで試してみます。

Pivotの位置も直しました。

結果です。

うーん。

Materialの値を調整します。

滑らかにはなりました。

以下の値を変更しました。

Multiplyノードの値を1にしました。

Defaultの-1にすると波が逆方向に進むようになります。

次に以下のDivideノードの値です。

このNodeは元々は無かったNodeです。

1にしたので無いのと同じになりました。

次にSineノードの設定です。

Periodの値を少しだけ大きくしました。

Default値である1を入れた場合です。

Flagが全く波打ちません。

2にすると以下のように波打ち過ぎます。

1.5にしましたがあまり変化はありません。

1.1にしました。

うーん。

もう少し小さかったら綺麗にはためきそうです。

これ以上ないくらい綺麗にはためくようになりました。

正し上から見ると分かりますが、綺麗なSin波にはなっていません。

先週、以下の問題を述べました。

これは元の実装は綺麗なSin波になっているのかが分からないですね。

厳密にExcel使って計算して確認しようかと思ったんですが、もう時間がなくなってしまいました。

このTutorialの検証はここで終わりにします。

5.Gaeaの勉強

5.1 Tutorialの作成

5.1.1 Maskについての内容を整理する

3つの工程の2つ目の工程であるColoringの2番目のTutorialです。

まず一般的なMaskingの解説をします。

Maskをした部分だけ色が塗られません。という事を説明します。

ここは適切な資料が見つかって無いです。

今はSkipして先をやります。

MaskingするためにTerrainを作成します。

結果です。

Colorを追加します。

結果です。

これにMaskingをして新たに色を塗ります。

MaskingをするためのNodeのGroupが以下のData Groupです。

ここにはMaskingをするためのNodeともうひとつSatMapノードという色をつけるためのNodeを使用するための2つの目的のNodeが混在しています。

今回はこのGroupにあるMaskingをするためのNodeから一番簡単なHeightノードを使用します。

HeightノードのInputにTerrainの結果を繋げます。

結果です。

ここでHeightノードのPropertiesについて簡単に解説します。

Falloffを0%にします。

灰色の部分が無くなりました。

Falloffは灰色の部分を作成します。

Maskingなので灰色があると初心者にはこの機能を理解するのが難しくなります。

ので灰色の部分だけ排除します。

これがMaskingになります。

黒い部分がMaskingされます。白い部分は新しい色で塗る事になります。

この場合は山の山頂が別な色で塗られる事になります。

ではMaskingの方法を説明します。

Combineノードを使用します。

CombineノードはAdjustment GroupのNodeです。

UEにおけるLerpノードのような役割をします。

その機能は2つのNodeを混合します。

その混合ですが色々な方法で混合する事が出来ます。

今回はMaskingをするためにこのNodeを利用するのでそのための設定をここで示してしまいます。

そして以下のように組みます。

一番目のInputに今までの結果を繋げます。

二番目のInputにMaskingした後に塗る色を指定します。

色を指定するためのNodeで今の時点で使用方法が分っているのはConstantノードだけです。

のでConstantノードで色を指定します。

今回は緑を指定しました。

三番目のInputでMaskする場所を指定します。

ここに先程のHeightノードを使用します。

Heightノードの設定は以下のようになっています。

この黒い部分がMaskingされました。

白い部分だけ新しい色で上塗りされます。

結果です。

この後にHeightノードの使用方法についても解説しますか。

後、Maskingがとてつもない武器になる証拠としてこの後にどんどんMaskingを追加出来る事も紹介します。

5.1.2 MaskについてのPowerPointを作成する

とりあえずここまでの内容をPowerPointにまとめます。

以下のようにまとめました。

Coloringで勉強する2つの技術について簡単な説明を追加しました。

HeightノードとCombineノードの使用方法については次のTutorialで説明する事にしました。

Data GroupにあるHeightノード以外のNodeの解説も次のTutorialでやる事にしました。

Coloringで知っておくべき技術は今回勉強するMaskingとSatMapsノードの2つです。

SatMapsノードの機能はUEでは使用出来ない事もここで説明しています。

Maskingについて簡単に説明しています。

プラモデルのMaskingとまったく同じ機能である事をここで説明しています。

MaskingはPhoto RealisticなLandscapeを作成するにはNARUTOにおける螺旋丸ぐらい強力である。と解説しています。

ただし何故そんなに強力なのかについては今週は説明しない。とも書いています。

今週はGaeaのMaskingのやり方を覚える事に全集中するから。と説明しています。

Maskingの手順を簡単に説明しています。

Heightノードを使用してMaskを作成する事だけ説明しました。

Heightノードを使用するとどうなるのかを解説しました。

Gradation(灰色の部分)があると、初心者にはMaskの効果が分かりにくくなるので、Falloffの値を0にする事で灰色の部分を無くしました。

ここまでPowerPointで解説したらGaeaで実際にやってみせます。

今度はMaskした後に塗る色を決定します。

先週勉強したConstantノードでしか、色を指定するNodeの使用方法は教えてないのでConstantノードで色を指定します。

それぞれをCombineノードに繋ぎます。

つなぎ方について解説しています。

Combineノードの設定方法について解説しています。

ここでまたGaeaにおける実習を行います。

最後に以下のようにまとめました。

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

5.2 Klaus氏のGaeaのTutorialを勉強する

これからTutorialを作成するに当たって、忘れている内容が無いかをKlaus氏のGaeaのTutorialを見る事で確認します。

今週はGaea Beginner Tutorial Series : Part 3 - Basic Texturing [7]を見る事にします。

5.2.1 Gaea Beginner Tutorial Series : Part 3 - Basic Texturing [7]を復習する

<Introduction>

特になしです。

<Preparing for texturing>

先週まとめたFxノードの解説をしていました。

ここで説明された内容は私が先週まとめた内容と大体同じでした。

以下の実装を作成して

何かをパッとやってこれらのNodeを一瞬で別なGraphに移動させました。

Gaeaで確認したら何をやったのかが分かりました。

移動させたいNodeを選択した状態で以下の下向きの傘を選択して

Move Selected NodesそしてNew Graphを選択します。

すると別なGraphに選択したNodeが移動します。

後はRiverノードやSnowfallノードに沢山のPortalを追加しています。

この辺は何が目的なのかまだよく理解出来てないです。

以下のようにそれぞれの結果にFxノードを追加しています。

これって必要なんでしょうか?

Riverノードの後にLakeノードを追加しているのでRiverが消えてしまっています。

赤線部分にRiverがありました。

<Base Texture>

ここは私が言う所のSatMapsノードの使用方法に属する内容でした。

Textureノードを追加してTerrainにGradientを追加しています。

その後でSatMapsノードを追加しています。

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

この後にFxノードを使用しようとしてなんかの問題に直面していました。

色を使用した場合はColor FXノードを使用する必要があるそうです。

<Snow Texture>

Snowの色の実装方法を説明しています。

このやり方をあえて採用する意味があるんでしょうか。

普通にSnowfallの結果をMaskとして使用してCombineノードで色を追加したらいい気がします。

と思ったら最終的にはCombineノードを使用したMaskになっていました。

<Water>

River Depthの結果を表示するために

Post ProcessingのLVを使用していました。

この機能についても説明する必要があるのか。

ここでもMaskとして実装していました。

Lakeの実装です。

Lakeの実装では色の指定ではLakeノードのDepthを使用します。

MaskにはLakeノードのLakesを使用します。

<Outro>

特になしです。

<勉強した感想>

Snowfallノード、Riverノード、そしてLakeノードの使用方法の確認が出来ました。

これらのNodeは基礎編では使用しませんが、その後の中級編で使い方を教えようと思います。

Fxノードをやたら追加していましたが、これらの全てのTextureをMaskとしてBuildするんでしょうか?

この辺は後でCheckする必要があります。

6.Houdiniの勉強

6.1 Houdini - Wall Tool 07 [8]を実装する

<Intro>

よく分からないですが、一回可視化を止めて、左上のBlockが表示されるようになりました。

Foreach_begin2_metadata1ノードを作成しました。

間違えて別なNodeに繋いでしまいました。

線をDisconnectする方法、忘れてしまいました。

調べたら分かりました。

線を選択して右ClickしDisconnectを選択します。

元に戻りました。

先週のBlogを読むとAttribwrangleが使用されていました。

このNodeは私のProjectにはまだ加えていません。

何時このNodeを追加したんでしょうか?

Tutorialを見て確認します。

一番最初に追加していました。

Attribwrangleを追加しforeach_begin2_metadata1の結果をそのAttribwrangleの2番目のPinに繋げました。

Attribwrangleの名前をAttribwrangle_CrackRatioに変更しました。

Run Overの値をPrimitivesに変更します。

Attribwrangle_CrackRatioの実装をします。

まずRandom Numberを作成します。

<An Integer Attribute>

IntegerのAttributeを作成するそうです。

これの意味がよく分からないんです。

Perplexityで質問してみました。

要はIntの変数をこうやって作成するという事です。

これは分かり易いです。

ただPerplexityはMicrosoftのCopilotより性能が良いと聞いたんですが、同じ位の性能な感じもします。

同様の質問をCopilotでもしてみました。

これは間違っています。

しかもこの答え何の役にも立ちません。

これはPerplexityの方が正しい解答です。

うーん。

成程。

たった一回の知見ですが、確かにPerplexityの方がCopilotよりも性能良さそうです。

If節を作成します。

更にi@crackedの値を1にセットしました。

ここでTutorialではGeometry SheetからそれぞれのPrimitivesのi@crackedの値が1である事を確認しています。

Geometry Sheetを開きました。

i@crackedがありません。

何で?

分かりました。

以下のIconからPrimitivesを選択する必要がありました。

すると以下のようにCrackedが表示されました。

Crack Probabilityを作成します。

Crack Probabilityの値を0.5に変更します。

Splitノードを追加します。

<Split Node>

Attribwrangle_crackRatioノードの結果をSplit1ノードに繋ぎます。

結果です。

Brickの底だけ表示するようになりました。

これってあってるのか?

Tutorialを見て確認しましたが、この結果は表示されていませんでした。

<Cutting Geometry>

Voronoi Fractureノードを追加します。

Split1から繋いだらErrorになりました。

理由は先週のBlogにまとめられていました。

そのためにScatter1ノードを追加しました。

Scatter1ノードの結果を可視化します。

やっぱしオカシイ。

Tutorialの結果は以下のようになっていました。

ほとんど諦めかけてたんですが、以下のCommentがありました。

Breakpointに変えてみました。

確かにBoxが現れましたがi@crackedはPrimitiveに作成したのでこれでは意味がないです。

という事はAttribwrangle_crackRatioノードで作成したi@crackedがおかしいのかもしれません。

Cut & Pastedで確認しましたが結果は同じでした。

Attribwrangle_crackRatioノードでは以下の6個のPrimitiveがあります。

SplitノードのGeometry Spreadsheetを見ると

Primitiveが一個しか表示されません。

Invert Selectionを選択して選択されていないPrimitivesを表示すると

残りの5個のPrimitivesが表示されます。

しかし選択されていない残り5個のcrackedの値も1になっています。

これはSplitノードがGroupしか認識できないからな気がして来ました。

前にGroupを作成したはずです。

調べます。

ありました。

これです。

これはPointでGroupを作成していますね。

これをPrimitiveでやればいいはずです。

調べたら以下のSetprimgroup()関数がPrimitivesのGroupを作成するみたいです。

それぞれのParameterは以下のようになっていました。

ここでsetPointGroup()関数と比較します。

違うのは三番目のParameterにPrim_numを追加しろとなっているところです。

Prim_num は@primnumで取得出来るみたいです。

以下のように実装しました。

Valueは@crackedをセットするのが正しいのかもしれませんが、結果は同じです。1にしました。

名前はCrackMaskにしました。適当です。

次にSplitノードを選択してGroupに先程作成したcrackMaskを選択しました。

後、念のためにGroup TypeはPrimitivesに変更しました。

結果です。

Geometry Spreadsheetを確認します。

Crackedの値が1であるPrimitiveが全部選ばれています。

Brickが表示されています。

Scatterノードを可視化します。

今度はきれいなPointが生成されました。

Force Total Countの値を1000から3に変更します。

Pointが3つになりました。

Voronoifractureノードの右側のInputに繋げます。

結果です。

おお、出来ていますね。

ここでScatterノードのGlobal Seedの値を変更しました。

Tutorialの言う通り、Crackの形状が変化しました。

今度はMergeノードを使用してSplitノードで分けたFractureの無いBrickを追加します。

更にSplit1ではじかれたPrimitiveを追加します。

Merge1ノードに警告が出ています。

これはTutorialでも出ていたので無視します。

Merge1ノードの結果をforeach_end2ノードの左側のPinに繋ぎます。

結果です。

全部のBlockにひび割れが生じていますね。

Attribwrangle_CrackRatioノードのCrackprobabilityの値が0.5になってなかったです。

直すと

CrackのあるBrockと無いBrockが生成されるようになりました。

<Crack Ratio>

Attribwrangle_CrackRatioノード内の実装で<の向きが間違っていたと直していました。

Crack Probabilityの値が0の時です。

Crackが無くなりました。

Crack Probabilityの値が1の時です。

全部のBrockにCrackが入りました。

うん。

納得。

<Poly Bevel

Polybevel1ノードを追加します。

Distanceの値を0.02に変更しました。

結果です。

Brickの見た目が膨らんで見えるのはBrickのNormalがおかしいからだそうです。なのでNormalノードを追加してそこを直します。

Weighting Methodの値をBy Face Areaに変更しました。

結果です。

ここでTutorialは終わっていました。

一応、出来きました。

7.UEFNの勉強

7.1 CUSTOM CAMERA IN FORTNITE - UEFN / Creative 2.0 Tutorial [9]を勉強する

今週はこのTutorialを勉強します。

<Intro>

以下のTop Down Camera Viewを作成するそうです。

UEならProjectのTemplateを選択する時点でTop Down Camera Viewを作成する事が出来ますが、UEFNは出来ないから、こういうTutorialも必要になる訳ですね。

<Creative Prop / Camera Perspective Setup>

Cameraを持つBPを作成します。

BP作成から以下のBuilding Propを選択して

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

このBPを開いてComponentsにCine Cameraを追加します。

そしてこのCameraをLevel上に配置しました。

ここではじめて気が付いたんですが、このTutorialは新しいProjectでやっていますね。

うーん。

通常ViewとTop-Down MenuのSwitchをKeyboardの操作で出来るようにすれば今までのProjectを使用してもOKな気もします。

以下の方法でCine Camera Actorを作成します。

???

2個、Cameraを作成するって事?

直ぐ後で、以下のように述べているので

そうなんでしょう。

やっぱりそうでした。2個、Cameraが配置されています。

何とこの後で、BPの方のCameraを消しています。

で代わりにSphereを追加しています。

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

以下のようにCameraの位置を変更しました。

一体何をしているのか不明だったんですが、これでやっと理解しました。Top Down Viewを撮影するためのCameraの位置を探していたんです。

以下のようなViewになる位置にCameraを移動させます。

<Create Cinematic Sequence>

Cameraを選択してAttach ToからCameraContainerを選択します。

新しいLevel Sequenceを作成します。

Tutorialでの名前は分からん。

Top Cameraと言っている気がしますが、そう書いてないように見えます。

何とここでCamera ContainerにAttachしたCine Cameraの名前をTop Cameraに変更しています。

Level SequenceのTop Cameraと区別がつくのか?

このTopCameraをLevel Sequenceの方のTopCamraのSequenceに追加しました。

新しいVerseのFileを作成しました。

名前はtop_camera_deviceでした。

<Creating Reference to Camera Prop in Verse>

開始した時点で以下のModuleが使用出来るようになっています。

Defaultで含まれてないModuleもこの中にありそうです。

BP用の変数を作成しています。

この変数の作成方法にもなれました。

今度はPlayer型のArrayを作成しています。

これは何に使用するんでしょうか?

このArrayをOnBegin()関数内で初期化しています。

<Creating Move Camera Function>

ここで以下のChannelでRotationの問題を解決出来たので紹介しておきます。と突然他のChannelの紹介を始めました。

一応、登録だけはしておきます。

宣伝が終わったら、何と以下の関数を作り始めていました。

MoveCamera()関数ですね。

SuspendsはLoop関数を使用する時につけるSpecifierです。

中にLoop関数を使用するんでしょうね。

<Getting Position Vectors>

MoveCamera()関数の実装をしています。

やっぱりこれか。

これPlayerが操作するFortniteのCharacterを取得しているだけです。

なんか他の方法でもっと簡単に取得出来そうな気がしていますが、どうなんでしょう?

Multi-Playerの場合も考慮しているのかもしれません。ので実装する時はこのやり方でやる事にします。

PlayerのPositionを取得しました。

以下のSemantic Errorを直していました。

今度はCameraのPositionを取得しました。

今度はCameraの向きを決定するためのVectorを取得します。

当然、この計算ですね。

<Getting Angle / Creating Rotation>

今度はAngleを取得します。

次はRotationを計算します。

Tutorialではここで左回転の軸を採用しているからので云々と、この式をどうやって導いたのかを解説していますが、この辺は無視します。

<Calling Move To Function>

以下のConstantを作成しました。

これは何を保持してるんでしょうか?

更に以下の実装に繋がっています。

Move_to_resultというObjectは作成してないですよね。

やりたい事は理解出来ますが、これで動くの?

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

最後にMoveCamera()関数を呼んでいます。

関数内で、自身を読んでいるのでLoopになりますね。

このためにSuspendsを最初に追加したのか。

この部分は納得です。

これでMoveCamera()関数の実装が完成しました。

OnBegin()関数内からMoveCamera()関数を呼び出します。

<Setting up Device in UEFN>

Level内の設定をやります。

DeviceのCameraContainerにBPのCameraContainerをセットします。

これをするためにはtop_camera_deviceをLevel上に配置する必要がありますが、それをやっている様子がありません。

あ、Deviceは配置されていました。

<Setting up Cinematic Sequence Device>

今度はCinematic Sequence Deviceを配置します。

そしてSequenceにLevel SequenceのTopCameraをセットし

更にLoop PlaybackをEnableします。

更にAuto PlayもEnableします。

こっちはCameraの位置を指定しているのか?

付属のSphereはどうなちゃったの?

<Final Result>

結果です。

うーん。

このTutorialをサラッと勉強しただけだと本当にこの結果になるのか一寸疑問です。

まあ、来週実装したらどうなるのかは判明するでしょう。

今週のUEFNの勉強はここまです。

7.2 UE5のAnimationの勉強について

先週、UEのAnimationの機能をあんまりよく知らないので以下のTutorialを勉強すると書きましたが

時間がありません。

これは一寸Pendingします。

8.DirectX12の勉強

8.1 Lötwig Fusel氏のD3D12 Beginners Tutorialを勉強する

8.1.1 Device & Command Queue | D3D12 Beginners Tutorial [D3D12Ez] [10]を実装する

先週勉強したDeviceを生成する所を実装します。

まず以下のようにD3DのFolderを作成します。

そこにDXContext Classを作成します。

実装はSample CodeをそのままCopyしました。

うーん。

全然違う。

これらか増やしていくのかもしれません。

まあでも最終的にはこの実装になるのだからこれでいきます。

8.1.2 Device & Command Queue | D3D12 Beginners Tutorial [D3D12Ez] [10]の続きを勉強する

Main.cppに戻ってDXContext.hをIncludeします。

そして以下の実装を追加します。

これでDXContextが正常に機能するのかを試しています。

この次に作成したDeviceを使用してRender()関数やDraw()関数を呼び出す事が出来ない事を見せています。

これはDirectX12がAsynchronousな設計だからだそうです。

うーん。

深い。

この後、GPUとCommandQueue、そしてCommandListについてとそれぞれの関係性について簡単に解説していました。

この辺は散々勉強したので大体は理解しています。

CommandQueue型の変数を作成しました。

DXContext.cpp内のInit()関数内でDeviceを使用してCommandQueueを初期化します。

CommandQueueの初期化にはCreateCommandQueue()関数を使用していました。

前よりもDirectX12の構造が見えるようになって来ました。

DeviceはCommandQueueやCommandListのようなCPU側からGPU側にDataを伝えるためのObjectを生成するためにあるんです。

先程Sample CodeからCopyして作成したDXContext.cpp内の実装を見ると

以下のようにDeviceが使用されています。

CommandQueue、Fence、CommandAllocator、そしてCommandList、DirectX12でCPUとGPUのやり取りに使用するObjectの全てがDeviceから作成されていました。

うーん。

こういうのを理解するのがDirectX12の勉強で重要なんです。

今週のこれを理解したんでD3D12 Beginners Tutorialの勉強はここまでにします。

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

8.2.1 「4.8 Graphic Pipeline Stateの作成」を勉強する Part 1

「4.8 Graphic Pipeline Stateの作成」は非常に長い節なので何回かに分けて勉強します。

<「4.8.1 Graphics Pipeline Stateとは?」を読む>

Graphics Pipeline(先週勉強した以下の図の事)

の設定を定義するためのObjectの事をGraphics Pipeline Stateと呼ぶそうです。

このObjectはD3D12_GRAPHICS_PIPELINE_STATE_DESC型で作成するそうです。

公式SiteのD3D12_GRAPHICS_PIPELINE_STATE_DESC structure (d3d12.h)[11]を見てみます。

こんなに指定すべき事があるの?

教科書をよく読んだら間違って解釈してました。

Graphics Pipelineの設定を定義するためのObjectは以下のGraphics Pipeline Stateが担当していました。

このGraphics Pipeline StateにGraphics Pipelineの設定を指定するために使用されるのがD3D12_GRAPHICS_PIPELINE_STATE_DESCでした。

そしてこのGraphics Pipeline Stateを初期化するのに使用されるのが以下のCreateGraphicsPipelineState ()関数です。

これもDeviceを使用して作成されています。

ああ、もうDirectX12の根本の部分が理解出来ました。

CPUとGPUのやり取りこそが3D Graphics Programmingであると仮定します。

そして会社に例えて表現すると以下のようになります。

DirectX12ではCPUとGPUのそれぞれのやり取りを管理する子会社を作成して、それぞれの子会社に自由にやらせるんです。しかし資本だけは親会社が持っていて人事や方針だけはきっちり管理している感じです。

この親会社にあたるのがDeviceです。

そして今回のGraphicsPipelineStateは子会社にあたります。

なんでこんな複雑な形態にしたのかですが、全くの推測ですがMulti-Threadに対応するためだと思います。

それぞれのCPUとGPUのやり取りを最適化するには、今の会社に例えた場合、裁量権を与えて自由にやらせるのが一番効率が良いです。

多分、日本の商社とか財閥も同じような形態になっているはずです。

CreateGraphicsPipelineState ()関数の勉強に戻ります。

公式SiteのID3D12Device::CreateGraphicsPipelineState method (d3d12.h)[12]です。

ここにPassするParameterの一つが先程のD3D12_GRAPHICS_PIPELINE_STATE_DESC型で作成されたObjectでした。

<「4.8.2 D3D12_GRAPHICS_PIPELINE_STATE_DESC構造体」を読む>

4.8節はここから最後の節(4.8.9 Graphics Pipelineの生成)でCreateGraphicsPipelineState ()関数の話をする以外はずっと、D3D12_GRAPHICS_PIPELINE_STATE_DESC構造体のそれぞれのMemberについて解説しています。

結構長いので3週位かけて勉強する事になると思われます。

以下の3つに分けました。

  • 「8.4 Sample MaskとRasterizer Stateの設定」まで
  • 「8.5 Blend Stateの設定」
  • 残り

今週は「4.8.4 Sample MaskとRasterizer Stateの設定」まで勉強します。

「4.8.2 D3D12_GRAPHICS_PIPELINE_STATE_DESC構造体」ではD3D12_GRAPHICS_PIPELINE_STATE_DESCのMemberの中で絶対に指定しないといけないMemberが紹介されていました。

以下にそれらをまとめます。

  • Vertex Shader(作成済み)
  • Pixel Shader(作成済み)
  • Blend Parameter: Blend State
  • Rasterizerの設定: Rasterizer State
  • Vertex layout: Input Layout(作成済み)
  • Topology Type: Primitive Topology Type
  • Root Signature: pRootSignature

だそうです。

先程の公式Siteにあった図と関連づけると以下の赤線を引いたMemberの指定は必須だそうです。

Root Signature: pRootSignatureが無い。

と思ったら一番最初にありました。

<「4.8.3 Shaderのセット」を読む>

以下のようにセットされていました。

公式SiteのD3D12_SHADER_BYTECODE structure (d3d12.h) [13]には以下のようになっていました。

このpShaderBytecodeとBytecodeLengthをGetBufferPointer()関数とGetBufferSize()関数のそれぞれが指定しているようです。

<「4.8.4 Sample MaskとRasterizerの設定」を読む>

まずSample Codeの設定を確認します。

Sample Maskの設定です。

Rasterizerは以下の設定をしていました。

ただし教科書では最初の4つの指定に関してだけ解説しています。

Rasterizerに関しては大体理解出来ますね。

Anti-aliasingを使用しない事はMultisampleEnableで指定しています。

これはAnti-aliasingをするためにSamplingを幾つかの場所で行う必要があるからでしょう。

Cullingはしないと指定していて、教科書もその事について簡単に解説しています。

それについては納得したんですが、CullingはSoft側で使用するかしないかの選択が出来るようになっているのが普通な気がします。

ここでCullingについて指定しても後から変更出来るんでしょうか?

いや出来るのは分かっているですが、その方法はこの教科書で教えてくれるんでしょうか?

Sample Codeは何を指定しているのか全く分かりません。

公式SiteのD3D12_GRAPHICS_PIPELINE_STATE_DESC structure (d3d12.h)[11]には以下の説明が書かれていました。

Blend Stateについて理解したらSample Maskが何を指定しているのかも理解出来そうですね。

以上です。

9. まとめと感想

今週は数学的に厳密な理解をすべき箇所(NiagaraとかMaterialの勉強の辺り)をさぼってやらなかったですが、その結果、DirectX12の全体像が理解出来るという超お得な副産物を得る事が出来ました。

やっぱり戦力には限りがあるので、全部に全力を尽くすのは無理があります。

どっかをサボるとその浮いた戦力をもっと大切な戦局の投入出来るようになって、その結果大勝利に繋がる訳です。

話は変わりますが、Googleから

「お前、数年前にGoogle PlayでAppを作成してずっとほったらかしだから、来月DeveloperのAccountを消すわ。

消してほしくなかったらこのAppを最新版にUpdateするか新しいAppを公開してね。」

と通達が来てました。

もう消されてもいいと思っていたんですが、よく考えたらこのAccountを作成するのに25ドルぐらいお金を払っていました。

そう考えると急にこのAccountが無くなるのが惜しくなりました。

問題はこのAppの元のProgrammingが入ったPCが壊れてしまったのでDataが取れない事です。

ので来週は急遽、予定を変更してGoogle Play用のGameを一個作成して公開します。

10. 参照(Reference)

[1] Castle Wall Tool. (n.d.). https://www.youtube.com/playlist?list=PLNbgmFvU__fiPhyUWHHzZ2Nv5ieM_bOdB

[2] Urban Decoders. (2023, November 18). How to 3D Gaussian splat from Aerials to Unreal 5 (Free plugin) [Video]. YouTube. https://www.youtube.com/watch?v=SDO1XdFXl8M

[3] Gediminas Kirdeikis. (2023, April 30). Unreal Engine 5 for Architecture - 2023 Full Beginner Course [Video]. YouTube. https://www.youtube.com/watch?v=bT8aSTkpkDY

[4] pinkpocketTV. (2023, December 4). Step-by-Step Unreal Engine 5 tutorial: 3D Gaussian Splatting for Beginners [Video]. YouTube. https://www.youtube.com/watch?v=xdDzChfFY_A

[5] Gediminas Kirdeikis. (2023, April 30). Unreal Engine 5 for Architecture - 2023 Full Beginner Course [Video]. YouTube. https://www.youtube.com/watch?v=bT8aSTkpkDY

[6] Creative Tech Digest. (2023, November 25). 10 things you can do with 3D Gaussian splatting & reality Capture [Video]. YouTube. https://www.youtube.com/watch?v=RG_1OybkeRU

[7] Klaus. (2022, January 18). GAEA Beginner Tutorial Series : Part 3 - Basic Texturing [Video]. YouTube. https://www.youtube.com/watch?v=I_XbMsL24AI

[8] Rick Banks. (2022, June 20). Houdini - Wall Tool 07 [Video]. YouTube. https://www.youtube.com/watch?v=3DWk73lgB6Q

[9] Pi Equals Three. (2023, April 27). CUSTOM CAMERA IN FORTNITE - UEFN / Creative 2.0 tutorial [Video]. YouTube. https://www.youtube.com/watch?v=s-8UsjPk-MI

[10] Lötwig Fusel. (2023, May 15). Device & Command Queue | D3D12 Beginners Tutorial [D3D12EZ] [Video]. YouTube. https://www.youtube.com/watch?v=nQzALY8nX1c

[11] Stevewhims. (2022, September 1). D3D12_GRAPHICS_PIPELINE_STATE_DESC (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ns-d3d12-d3d12_graphics_pipeline_state_desc

[12] Stevewhims. (2021, October 13). ID3D12Device::CreateGraphicsPipelineState (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-id3d12device-creategraphicspipelinestate

[13] Stevewhims. (2022, July 27). D3D12_SHADER_BYTECODE (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ns-d3d12-d3d12_shader_bytecode

 

UE5の勉強 -映像作品としてのLandscapeを作成する-

1.今週の予定

<映像作品としてのLandscapeの作成>

建築用のLevelの作成の勉強の続きをやります。

更に映像用のTutorialを何個かCheckします。

Niagara の勉強>

Unreal Engine 5で学ぶビジュアルエフェクト実装 基本機能からNiagara、シミュレーションまで」の実装の続きをやります。

<Materialの勉強>

Ben Cloward先生のTutorialを勉強します。

<Gaeaの勉強>

GaeaのTutorialを作成します。

<Houdiniの勉強>

Castle Wall Tool [1]の勉強をやります。

<UEFNの勉強>

Pi Equals Three氏のTutorialをやります。

<DirectX12の勉強>

DirectX 12の魔導書」の勉強をやります。

更にLötwig Fusel氏のDirectX12のTutorialをやります。

2.Landscapeの作成

2.1 今週の課題

先週、目の周りを切開して片目で作業していたので、実装する部分は全く出来ませんでした。

ので今週は実装する部分を重点的にやる事にします。

先週と先々週に勉強した内容が既に先週のBlogにまとめられていました。

これらの実装をやっていきます。

2.2 How to 3D Gaussian splat from Aerials to Unreal 5 (Free plugin)[2]を実装する

2024-01-29のBlogHow to 3D Gaussian splat from Aerials to Unreal 5 (Free plugin)[2]の内容を勉強しています。

それを元に実装してみます。

<Intro & What is a Gaussian Splat?>

特にやる事ないです。

<Video Recording>

ここも特に何もする必要はなかったです。

Tutorialでは自分で撮影した映像を元に3D Gaussian SplattingのDataを作成しています。

そのためのVideoの撮影についての話でした。

<Gaussian model creations>

撮影したVideoを3D Gaussian SplattingのDataに変換する方法について解説しています。

次の節で元々用意されている3D Gaussian SplattingのDataを使用する方法が説明されているのでそれを使用します。

<Luma Unreal Engine plugin>

ここから実際の作業が必要になります。

Tutorialでは以下のSiteから

以下のPluginをDownloadしていましたが、

今、このSiteを読むと

Plug-inはUEのMarketplaceにある事と書かれていました。

多分、2週間の間に内容が変化したんでしょう。

MarketplaceからこのPlug-inをInstallします。

これですね。

Freeとなっています。

UE5.3にInstallします。

しました。

Projectを起動させLuma AI Pluginが使用出来るようにします。

Projectは今、建物を作成しているMyArchitectureを使用する事にしました。

今度はUE様に3D Gaussian SplattingのDataをDownloadします。

Tutorialに以下のSiteからDownload出来るとありました。

このSiteを開くと以下のようになっていました。

全部試してみたいですが、取りあえずは一番左のDataをDownloadして試してみます。

以下のDataをDownloadしました。

DownloadしたFileのExtensionはlumaになっていました。

これは2024-01-29のBlogの予測とは違っていましたね。

先程のPluginをDownloadしたSiteに詳しい説明がありました。

このPluginはExtensionがlumaでもplyでもどっちでも開けるそうです。

うーん。

何となくですがGaussian Splatting専用のExtensionであるplyの方がUEの負担が少なくすみそうです。

こっちをDownloadします。

しました。

これですね。

でもSizeを確認したらPly Fileの方が4倍位Sizeが大きいです。

うーん。

なんで?

Unreal baked Gaussian Splat scene>

ここからどうやってUEにDataをImportするのかが分かりません。

Tutorialにはこのやり方は書いていません。

以下のSiteに

と書かれていました。

このSiteはこの後も何回も引用しそうなのでしっかりとまとめておきます。

Luma Unreal Engine Plugin (0.41) [3]です。

うーん。

単にDrag & Dropするだけか。

あれProjectがFreezeした。

と思ったらなんか計算しています。

数秒間経ったら以下のFolderが生成されました。

中身です。

Blueprint内です。

Texture内です。

ふええ。

なんか凄いですね。

Luma Unreal Engine Plugin (0.41) [3]によると

BPをLevel上にDragすれば使用出来ると言っています。

更にそれぞれのBPの違いについても説明していました。

試してみます。

まずBP_Drawbridge_Bakedから試してみます。

Bakedの特長を読むと

となっていました。

UEのLightを含むEnvironmentの影響を受けないGaussian Splattingと理解しました。

結果です。

何これ?

中を見てみます。

うーん。

なんも見えない。

以下の2つと消してみます。

結果です。

おお。

見えた。

始めて3D Gaussian Splattingの結果をUEで見る事に成功しました。

Cameraを移動させると以下のようになります。

ならない箇所もありますが、

うーん。

これは実用に耐えれるLevelではないでしょう。

Tutorialではこの後にCropを使用しています。

Luma Unreal Engine Plugin (0.41) [3]によると

Gaussian SplattingのBPをLevel上にDragするとCropBoxは自動で生成されるそうですが、

私のLevel上にはCropBoxは生成されていませんね。

その代りなのか分かりませんが、Gaussian SplattingのBP内には以下のParameterがありました。

ひょっとするとこのSampleのSizeが小さいのでCropBoxは生成されなかったのかもしれません。

他のBPも試してみましょう。

Dynamicです。

DynamicはLuma Unreal Engine Plugin (0.41) [3]によると

と説明されています。

Lightの位置を変更しようとしたら何故かDirectional Lightがありませんでした。

どうもDefaultで空のあるLevelではDirectional Lightはついてないみたいです。

EmptyのLevelから作り直しました。

ここにDynamicのBPを配置した結果です。

Directional Lightを動かしてみます。

おお、確かに夕焼け感が出て来ました。

でもそれぞれのObjectに特有の影が追加されている訳ではないので、はっきり言うと写真のRGBの値を変更しただけの感じがします。

正直凄いとまでは言えませんね。

今度はCroppedを試します。

Luma Unreal Engine Plugin (0.41) [3]によると

となっていました。

今度はCropしたGaussian Splattingを試せそうです。

BP_Drawbridge_Baked_Croppedです。

結果です。

うん。成程ね。

これが

の意味する所のようです。

以下の設定のようになっていました。

UEの座標軸とは全く一致してないですね。

今度はEnvironmentをみます。

Luma Unreal Engine Plugin (0.41) [3]では

と説明されていました。

BakedしたBPのEnvironmentで試してみます。

結果です。

この時点では特別違いは見られません。

ここでSkylightやSky AtmosphereのParameterを変更してみたんですが

よく分かりません。

変化しているようにも見えますが、変化してないようにも見えます。

もっと色々試してみたいですが時間が無くなってしまいました。

今週の3D Gaussian Splattingの勉強はここまでとします。

来週、もう少し検証してみます。

2.3 How to 3D Gaussian splat from Aerials to Unreal 5 (Free plugin)[2]を実装した感想

やっと3D Gaussian SplattingをUEで試す事が出来ました。

その感想ですが、まだ一例しか見てませんので断言する事は出来ませんが、期待していたほど凄くは無かったな。と言うのが正直なところです。

以下の欠点を感じました。

  • 中心以外の場所では映像のどこかに歪みが生じている
  • Cameraを移動した時にブレが生じる
  • 写真を張り付けたみたい

それぞれについて簡単に説明します。

<中心以外の場所では映像のどこかに歪みが生じている>

例えば以下の場面ですが

一寸だけ横を向いてみました。

左端の建物やその周りが歪んで見えます。

これが実際の風景というより写真をBillboardに張り付けて配置しているかのような印象になっています。

<Cameraを移動した時にブレが生じる>

これ、これがある限りUE内のEnvironmentとして使用するのは無理です。

<写真を張り付けたみたい>

これはDirectional Lightの位置を変更してもそれぞれのObjectに影が形成されないためにそう見えるみたいです。

以下の画像がそれを表しています。

影の影響を見るために以下のAssetを配置してみました。

結果です。

うーん。

Static Meshの影をGaussian Splattingの上に投影する事は出来るのね。

これは凄い。

それは兎も角として上の画像で灯篭はDirectional Lightの角度に対してしっかりと影を形成していますが、Gaussian Splattingで生成されたObject、例えば橋の両端にある円柱や標識は影がまったく形成されていません。

これがなんか写真っぽく見える原因な気がします。

これらの欠点と感じている部分は操作方法に熟達したら解決する問題なのかもしれません

なんせ、まだ一日しか触ってないから、まだ赤子と同じです。

これも焦らずにじっくり勉強する事にします。

3.Niagara の勉強

今週は「16.3 Emitterの生成」の実装を行います。

3.1 「16.3 Emitterの生成」の実装をやる

<「16.3.1 Simulation以外の下準備」>

Niagara SystemにEmpty Emitterを追加して

新しいNiagara Systemを作成します。

名前はNS_FluidSimulationとしました。

以下のEmpty Emitterの設定を変更していきます。

まずPropertiesの設定からGPUに変更します。

Fixed Boundsの値はSample Codeが-10,000~10,000の範囲だったので同じ値をSetしました。

教科書を読み直したら、教科書にもFixed Boundsの範囲は-10,000~10,000としろと書かれていました。

更にLocal SpaceにもCheckを入れました。

次にUser Parameterの作成を行います。

User Parameterって何だったけ。と思ったら以下のやつでした。

はい。作成しました。

この節の教科書の解説はかなり親切で教科書に書かれている通りにやったら普通に再現出来ました。

Emitter Update SectionにSpawn Burst Instantaneous Moduleを追加し

Spawn Countに先程作成した[USER] ParticleNumを追加します。

Particle Spawn SectionにあるInitialize Particle Moduleの

Sprite Size Modeの値を以下のように変更しました。

更にShape Location Moduleを追加します。

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

ここは別に重要な設定ではないでしょう。

適当に決めたはずです。

あ、分かった。Sample Codeで見た最初の球がこれです。

次はPreviewの設定を変更しました。

DefaultでShow EnvironmentはOffになっていたのでEnvironment Colorの値だけ変更しました。

結果です。

本当に真っ黒にするとそれはそれで見にくいので黒に近い灰色にしました。

ここで「16.3.1 Simulation以外の下準備」の実装が終わりました。

教科書ではこの時点では以下の図のようになると述べられていました。

私の結果です。

全然違います。

うーん。

どこで間違えたんでしょうか?

ParticleのSizeが大きすぎるのかな。

ParticleのSizeは

Particle Spawn SectionにあるInitialize Particle Moduleで決まっています。

[USER] SpriteSizeのDefault値は0.6になっていました。

うーん。

あっていますね。

後、考えられるのはParticle Spawn SectionにあるShape Location Moduleが効いてない可能性、もしくは値が間違っている可能性です。

Sphere Radiusの値は2.214になっていました。

これは小さすぎる気もしますが、教科書が指定した値と同じです。

更に言うとSample Codeの値もこれでした。

試しにこの値を200に変更してみました。

結果です。

しっかりSphere上にParticleを生成していました。

という事はShape Location Moduleはしっかり効いているという事になります。

うーん。

多分、教科書の図の方が間違っています。

ここは無視して先に進む事にします。

<「16.3.2 Simulationに関するEmitterの作成」>

Propertiesの+StageのIconを押して

新しいSectionを追加し、その名前をSloveとしました。

成程、Emitter内でStageと呼んでいるのか、

うーん。

Sectionの方が分かり易いきがしますが、Stageの方が良いのかな?

もう3年以上は週一でNiagaraの勉強をしています。

その間ずっとSectionと呼んでいたので、今更Stageと呼び名を変更するのはかなり抵抗があります。

一寸だけ、調べたらSectionと呼んでいるSiteは見つからなくなっていますね。

最初にNiagaraを勉強し始めた時のBlogを確認して、どこでSectionと言う名称を知ったのかを調べます。

2021-04-26のBlogNiagaraの勉強を始めていました。

最初の頃はGroupと呼んでいますね。

何時頃からSectionと呼ぶようになったんでしょう。後、それには元になった文献が有ったと思うんですが、その元になった文献を確認したいです。

今、この当時のBlogを読み直すと結構面白いです。

EventについてのTutorialを読んで、CPUでしかEmitter間のやり取りが出来ないのならNSに複数のEmitterを使用するのは実務上不可能なのではないか?とか

とか述べていました。

結構、深い話をしています。

始めてSectionと言う言葉を使用したのは2021-09-06のBlogでした。

これ以前に全く説明もなく唐突にSectionと言っています。

オカシイ。

絶対のどこかの公式の文献でSectionまたはStageと呼んでいたのでSectionと呼ぶようになったんですが、その証拠となる文献が見つかりません。

うーん。

これからはStageと呼ぶようにしますか。

「君子は豹変する。」と言いますし、間違っていたら直ぐに直す方が賢明です。

Sectionという呼び方が見つからない以上、これからはStageと呼ぶ事にします。

兎に角、Solveと言う名称の新しいStageをParticle Update StageとRender Stageの間に追加しました。

次にParticle属性のParameterを追加するそうです。

ここで教科書は結構重要な事をサラッと言っていました。

武者 拓也. Unreal Engine 5で学ぶビジュアルエフェクト実装 基本機能からNiagara、シミュレーションまで (p.921). 株式会社翔泳社. Kindle 版.

変数の名前で最初に_があるのが結構あったんですが、理由が分からなかったです。

ここでは自分で作成した変数であると認識出来るように_を最初につけるとありました。

要するにMy○○と同じ意味で_を使用していたんです。

うーん。

これ知らんかった。

はい。

Particle Attributesに以下の3つの変数を追加しました。

Particle Spawn Stageにそれぞれの変数をSetします。

次にSolve Stageに3つのScratch Pad Moduleを追加します。

それぞれの名前も教科書通りに変更しました。

ここで丁度「16.3 Emitterの生成」が終わっています。

これだけだと一寸短いので何か別に新しい事をやります。

3.2 Niagaraの勉強を始めたばかりの頃のBlogを読み直す

前節の途中で、Stageの本当の名称はSectionである事を証明しようとして、Niagaraの勉強を始めた頃のBlogを読み直しました。

これが意外と勉強になったのでそれをここにまとめる事にします。

10個位読む事にします。

2021-09-06のBlog

ここでは、CGHOW氏のTutorialを勉強しても60%位しか理解出来ない。もっと別なTutorialで勉強する必要があるのではないか?と真剣に議論していました。

今、Niagaraをほぼ理解した状態でこの時に自分が抱えている疑問に対して答えるとすると

  • Niagaraを理解する基礎が出来るには週一回の勉強なら2年位かかる。

ので慌てて結果を求めても仕方ない。という事です。

しかし世間の要求はそうなってはいません。「3カ月位で使用出来るようになれ!」と言って来ます。

これは世間の要求の方が間違っているんです。

2021-09-12のBlog

まだCGHOW氏のTutorialを勉強すべきかどうかについて議論していました。

CGHOW氏のTutorialについて最終的に以下の評価に落ち着いています。

そして

と言っていました。

うーん。

これは言い得て妙です。

更に以下のような結果になった場合はどうすべきなのかについて検証すべきである。と述べていました。

これは、何事にも通じる教訓です。

虎穴に入らずんば虎子を得ず。は真理ですが、結果には

  • 虎子を得て生きて帰ってこれた。
  • 虎子を得たけど生きて帰ってこれなかった。
  • 虎子を得る事は出来なかったが生きて帰ってこれた。
  • 虎子を得る事も出来ず、更に生きて帰る事も出来なかった。

の4つがあるので、それぞれの場合において考えておく必要があるのは当然です。

今、私はNiagaraの仕組みをほぼ完全に理解出来ています。

その理解のほとんどはCGHOW氏のTutorialで勉強したお陰です。

結果的に言えば「生きて帰ってこれた上にダイヤも手に入れた」訳です。

しかも今CGHOW氏はそのTutorialをYouTubeで公開するのは止めてしまいました。

ので私の真似をする事も今となっては出来ない。という結果になり私の得たダイヤの価値は更に高くなっています。

うーん。

やっぱり3カ月で何かの結論を求めるのは性急かもしれません。

2021-09-19のBlog

CGHOW氏以外のTutorialを勉強した結果をまとめていました。

結局、CGHOW氏のTutorialを勉強する以外にNiagaraを理解する方法は無いと結論付ける事になるんですが、ここではまだ色々迷っていますね。

Cascadeの勉強を中止したのは慧眼でした。

こんなの今更出来るようになっても何の役にも立ちません。

2021-09-26のBlog

この週はCGHOW氏のTutorialで勉強しているだけでした。

2021-10-03のBlog

ScopeがTransientの変数について調査していました。

Transientなんて今使用していません。

こういうのが余計な時間がかかる原因なんですね。

私が作成するTutorialにはこういう初心者から中級者になるために必要ない事はどんどん省いていきます。

2021-10-10のBlog

以下のCharacterが消えるEffectについて勉強しています。

これと同じEffectを三年間の間に何回も実装していますが、いつもやり方を忘れています。

まあ必要になったら自力で実装出来るでしょう。

2021-10-17のBlog

先週の実装の続きをやっているだけでした。

この辺で復習は終わりにします。

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

4.Materialの勉強

4.1 Animated Flag - Advanced Materials - Episode 26 [4]の実装をする

先週勉強したAnimated Flag - Advanced Materials - Episode 26 [4]の実装をします。

まずMaterialを作成しました。

名前はM_AnimatedFlagとしました。

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

この時点でMaterialがどうなっているのかを知りたいです。

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

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

結果です。

微妙に動いています。

更に以下のNodeを追加しました。

これは上下の揺れだけ15倍にしているだけです。

結果です。

左右に動いています。

Tutorialと同じ結果になりませんね。

うーん。

SineノードのPeriodの値が違うのかもしれません。

まず使用しているPlaneの中心の位置が全然違っていました。

よし、もうこれは自分で考えて解く事にします。

取りあえずFlagが波打つところまで出来ました。

色々問題があったんですが、最大の問題はMeshでした。

World Position OffsetはそれぞれのVertexの位置をOffしているだけでした。

ので右のようなVertexが4つしかないPlaneはどうやってもはためかないんです。

後は向きの問題ですが、これは簡単でした。

以下のような向きの場合は

Local PositionはY軸、

最後に掛ける値はZ軸になります。

以下の2つの向きを考えるだけです。

後Local Positionの値をそのままPassしても波打たないので

3で割りました。

このLocal Positionについては後でもう少し深堀します。

端を固定するためにLocal PositionのGの値を掛けます。

結果です。

中心が波打たなくなりました。

Modeling ModeでPivotの位置を左端に移動しました。

以下のように左端は動かなくなりました。

ここまできて旗のはためく向きが間違っている事に気が付きました。

直しました。

結果です。

前後にはためくようになりました。

取りあえず色付けました。

今週はもう時間が無くなってしまったので残りは来週やる事にします。

<来週の課題>

以下の問題点があります。

  • カクカクしている
  • 波がsin波ではない。

この辺の問題は来週検討します。

後、計算と実際の現象の関係ももう少し深く追求します。

追加ですが、全く同じ方法で旗をなびかせているTutorialがありました。

Waving Flags in Unreal Engine | Unreal Engine Material Shader Tutorial [5]

このTutorialでは旗をBlenderで作成する所からやっていました。

使用するMeshについての問題はこのTutorialを見たら解決しそうです。

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

この位は簡単に解けるはずですが、こんな問題が起きるとは思っていなかったので、解決するための十分な時間を確保する事が出来ませんでした。

来週がんばります。

5.Gaeaの勉強

5.1 Tutorialの作成

先週作成したPowerPointにAnimationを追加しました。

一回だけ録画したら、PowerPointの内容がよく整理されてない部分がある事に気が付きました。

それを直しました。

以下変更した部分の内容をまとめます。

まずLecture内容を以下のように整理し直しました。

以下の2つが大きく変わっています。

新しいGraphを使用するに当たってPortalを使用する事をここで明言しています。

PortalはGaeaにおける重要な要素ですので、はっきりと示す事が重要と考えました。

Fxノードについても何の説明もしていませんでしたので新たに節を設けました。

最初にその節で何を勉強するかを簡単に説明する事にしました。

見た目は悪いですが、これで理解し易くなります。

Graphが何なのかについての説明を追加しています。

先週は、Graphで作成したNodeの結果をColorにあるNodeにPassする方法みたいな、いきなり読んだら何を言っているのか全く理解出来ない文章を書いていました。

のでそこだけ直しました。

Fxノードに関してのSlideは全部直しました。

ここでは2つの内容を説明しています。

まずPortalを使用した場合、こんな問題が発生すると言う説明をしています。

この問題を解決するためにFxノードを使用します。

そしてFxノードについて解説しています。

Fxノードを使用すると先程の問題がすぐに解決する事を説明しています。

最後にまとめです。

Fxノードについて追加しました。

5.2 Klaus氏のTutorialを復習する

Klaus氏のTutorialを見直して抜けが無いか確認します。

今週はGaea Beginner Tutorial Series : Part 2 - Terrain Creation [6]を見直しました。

Mountainノードと平地を作成するためのNodeをCombineする所で重要なTechniqueを使用していましたが、この方法全く覚えてなかったです。

のでそれをここにまとめておきます。

まず以下のようにCombineしています。

まずこのCombineノードの設定ですが、以下のようにしていました。

MaxでRatioは100%です。

ここで平地用のLandの基準が非常に高い位置にある問題について述べています。

のでそのままCombineしても山が見えなくなってしまいます。

平地を作成したNodeのPost ProcessからDrop to FloorをEnableします。

するとLandの基準が低くなりました。

こんな機能があるなんて全く知らなかったです。

自分で試してみます。

Defaultの状態です。

Drop to FloorをEnableしました。

結果です。

一番低い場所の高さが0に合わされました。

うーん。

まだKlaus氏のTutorialは勉強すべき内容が沢山あります。

次はMountainノードのPost ProcessにあるClampを使用してMountainの高さを調整しています。

Clamp Minの値を上げるとMountainノードの全体の位置が上に上がるようです。

Clamp Minを10%にしてみました。

Mountainの基礎面が高くなっています。

これは凄い。

6.Houdiniの勉強

6.1 Houdini - Wall Tool 07 [7]を勉強する

また目次が無くてKey Momentだけセットされています。

仕方ないのでこのKey Momentを元に節にわけてまとめます。

<Intro>

Crack、ひびを追加していくそうです。

Foreach_Begin2ノードを選択して

最初のBrickを表示しています。

左上のBrickが表示されています。

私のProjectでは右下のBrickが表示されたはずです。

この違い問題にならないなら無視しますが、どうなんでしょう?

Foreach_Begin2ノードのCreate Meta Import Nodeを押します。

すると以下に示した様にforeach_Begin2_metadata1が生成されます。

そのNodeのOutputをAttrbwrangle2の2番目のInputに繋げます。

うーん。

これは前に勉強した事あるやつです。

調べたら2024-01-14のBlogで勉強していました。

これを読むとMetaDataにはDetail Attributeがあり

これを利用して色々出来ると書いてありました。

以下に示した様にAttrbwrangle2内の実装で、foreach_Begin2_metadata1のDetail AttributesであるIterationを使用していました。

成程。

こうやってMetaDataを使用するのか。

完全に思い出しました。

Attrbwrangle2の名称をAttribwrangle_CrackRatioに変更しました。

Run Overの値をPrimitivesに変更します。

そしてAttribwrangle_CrackRatioノード内の実装を行います。

まずRandom Numberを作成します。

これは2024-01-14のBlogでRandom Numberを作成した時と全く同じ方法です。

<An Integer Attribute>

IntegerのAttributeを作成するそうです。

うん。

これで出来たの?

調べたんですが出て来ませんでした。

まだ調べ方もよく分かっていないのでこれは後々の課題にします。

次に以下のIf節を作成しました。

Crack Probabilityは後で作成するそうです。これはParameterになると思われます。

細かい点ですが、ProbabilityのSpellが間違っていますね。後、CrackRatioがCrackRationになっています。

If節内の実装を追加します。

Crackedの値を1にしています。

Geometry Sheetを見るとCrackedの値が以下のようになっていました。

以下のIconを押してCrack Probabilityを作成します。

出来ました。

そしてCrack Probabilityの値を0.5に変更しました。

次はここで作成した値に基づいてBrickをSplitするそうです。

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

<Split Node>

Attribwrangle_crackRatioノードの結果をSplit1ノードに繋ぎます。

そしてSplit1のGroupに以下の実装を追加します。

<Cutting Geometry>

色々な方法でCrackを作成出来るらしいです。

今回はVoronoi Fractureを使用して作成します。

Voronoi Fractureノードを追加しました。

更にSplit1ノードの結果をVoronoi Fracture1ノードの左側のPinに繋ぎました。

Voronoi Fracture1ノードはFractureを生成するためには右側のInputにGeometry上にあるPointをInputする必要があるそうです。

そのPointを生成するために

Scatterノードを使用します。

そして以下のようにSplit1ノードの結果をScatter1ノードに繋ぎます。

すると以下のようなPointをBrickの周りに生成します。

Tutorialではこの後、以下のIconをEnableして

Pointの色を青くしていました。

まあ、これはあんまり重要ではない気がしますが、一応記録には残しておきます。

こんなに沢山のPointは要らないのでSplitノードのForce Total Countの値を1000から3に変更します。

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

Scatter1ノードの結果をVoronoi Fracture1ノードの右側のInput Pinに繋ぎました。

Voronoi Fracture1ノードを可視化しました。

Scatter 1ノードのGlobal Seedの値を変えると

BrickのFractureの形状も変化します。

今度はMergeノードを使用して

Splitノードで分けたFractureの無いBrickを追加します。

まずMerge1ノードにVoronoi Fracture1ノードの結果を繋ぎます。

そしてFractureの無いBrickのDataはSplit1ノードの右側のOutput PinからMerge 1ノードのInputに繋ぐことで追加します。

Merge1の結果をForeach_end2ノードの左側のInputに繋ぎます。

Foreach_end2ノードを可視化した結果です。

以下の<の向きが間違っていたと直していました。

<Crack Ratio>

それは兎も角としてこれで、Crack Ratioの値を変更する事でFractureの数を調整出来るようになりました。

<Poly Bevel

この後何をするのか一寸理解出来なかったですが、兎に角Polybevel1ノードを追加しています。

Polybevel1ノードのDistanceの値を0.02に変更しました。

Polybevel1ノードを可視化した結果です。

それぞれのEdgeがBevelされているようですね。

近づくとBevelされているのがはっきり見えます。

これは分かったんですが、これを利用して何を作成するんでしょうか?

Brickの見た目が膨らんで見えるのはBrickのNormalがおかしいからだそうです。

なのでNormalノードを追加してそこを直します。

Normal1ノードのWeighting Methodの値をBy Face Areaに変更します。

Brickが平に戻りました。

この後はParameterを弄ってCrackがどう変化するかを確認しているだけでした。

これでこのTutorialは終わりでした。

いつもの通り実装は来週します。今週のHoudiniの勉強はここまです。

7.UEFNの勉強

7.1 MAKE JUMPSCARES IN FORTNITE With Cinematic Sequence Device - UEFN / Creative 2.0 Tutorial [8]を実装します

先週勉強した内容を実装します。

<Intro>

FeddyのSkeletal MeshをImportします。

まずFBX fileをDownloadしました。

UEFNにImportしました。

MaterialがImport出来ていません。

うーん。

何で?

Materialを開いたら以下の警告が表示されていました。

Substrateを使用出来るようにそれば良いみたいです。

UE5の公式SiteのSubstrate Materials Overview [9]でProject SettingからSubstrateをEnableする方法が説明されていました。

これを試してみます。

何とUEFNにはProject Settingの項目がありませんでした。

そりゃそうだ。

全てのProjectはFortnite上に公開されるんだから。

それは兎も角として色が全部灰色になっています。

ここに適当な色を追加して今回はお茶を濁してしまいましょう。

以下のように色付けしました。

こうなった理由も少しだけわかりました。

MaterialがImportされてないんです。

それでUEFNが自動でこのModelに対応したMaterialを作成していました。

このFeddyをLevel上に配置しました。

<Creating a Hollow, Black Cube for Scene>

Feddyの後ろの背景を黒くするために黒いCubeを配置します。

Modeling ModeはUE5でもあまり使用した事ないです。

のでここはしっかり勉強する事にします。

Modeling Modeに変更してBoxを選択しLevel上に配置しました。

以下のように表示されています。

ModelからExtrudeを選択して

Boxの内側に向かってExtrudeしました。

回転してScaleを変更しました。

Materialを変更しました。

結果です。

こんな感じです。

<Creating Cinematic Sequence>

新しいLevel Sequenceを作成します。

Freddyを追加しました。

このぬいぐるみ、FeddyじゃなくてFreddyが正しい名称なのか。

<The Basics of Editing Skeleton with FK Control Rig>

以下の機能があるBoxが表示されません。

Tutorialで確認します。

Tutorialを見たらLevel Sequence内からやっていました。

開きました。

うーん。

そんな選択肢はありませんね。

ないです。

ひょっとしてこのFraddy、Boneがついてないんじゃないでしょうか?

Skeletal Meshを開いて確認しましたがありました。

分かりました。

と言うか多分、同じ結果になる方法が分りました。

Pointはここです。

この手順が終わると以下のFKControlRigが追加されています。

以下のBake To Control RigからFK Control Rigが選択出来ます。

これを選択すると以下のBoxが表示されます。

このReduce Keysの部分がTutorialの次の工程の部分と全く同じです。

のでCreateを押します。

すると以下のようにFKControlRigが生成され

更に

でAnim Outlinerに以下のBoneが表示されるようになります。

ただし、FraddyにはBoneは表示されていません。

Anim OutlinerからBoneを選択して以下のPoseを作成しました。

Skeletal MeshからBoneが選択出来ないのでPoseを作成するのが大変でした。

以下のIconをEnableしたら

Boneの設定を変える度に自動でPoseをSaveしてくれました。

<Keyframes in Sequence Editor>

Key Frameを選択した状態でAltと左Clickを押したまま、DragするとKey FrameのCopyを別な場所に生成出来るそうです。

これも試してみました。

全く同じPoseを生成する事が出来ました。

<Modeling The Pose / Animation>

綺麗なAnimationを作るのが目的ではないので、これで完成とします。

<Adding the Sequence Camera / Camera Controls>

以下のIconを追加してCameraを追加しました。

こんな感じになっています。

Cameraは自動で記録してくれないので自分でFrameを指定しました。

<Making Model Move Closer to Camera>

一応Level Sequenceは完成したという事にして次をやります。

ここはLevel Sequenceの閉じ方とPolit Modeの終了の仕方を説明していました。

<Setting up Cinematic Sequence Device>

Cinematic Sequence DeviceをLevel上に配置します。

しました。

あれ?

Cameraが2つあります。

最初に作成したCameraは消したつもりでしたが消えてないみたいですね。

これはテストした後で検証します。

Cinematic Sequence DeviceのVisibilityは最初からEveryoneになっていました。

TriggerをLevel上に配置します。

これですね。

配置しました。

そしてこのTriggerをCinematic Sequence Deviceにセットします。

先週のBlogのまとめだとこの後すぐにTestしています。

Cinematic Sequence DeviceのSequenceに何もセットしていません。

はい。先程作成したSequenceをSetしました。

これで動くはずです。

<Jump scare Test Result>

テストします。

普通に指定した通りの動作をしました。

以下のTriggerの上に乗ったら

Level SequenceのAnimationが開始しました。

Animationの内容は私がCameraで指定した通りです。

<Adding Audio / Sound to Sequence>

最後にLevel Sequenceに音を追加します。

以下の方法でAudio Trackを追加しました。

動く事が確認出来れば良いので適当な音を追加しました。

<Final Result>

テストします。

普通に音がしました。

7.2 MAKE JUMPSCARES IN FORTNITE With Cinematic Sequence Device - UEFN / Creative 2.0 Tutorial [8]を実装した感想

今回の実装はUEでも私があんまり知らない分野を多用していました。

ので分からなかったところを簡単にまとめておきます。

<FBXのImport>

何故かMaterialがImport出来ませんでした。

<Modeling Mode>

ここは出来なかったところは無かったんですが、初めて使用したModeだったので一応記録に残しておきます。

<Animation ModeでBoneが表示されない>

これ多分、超基本的な事だと思うんですが、直し方が分かりません。

<Cameraを2つ追加していた>

これは一回試してやったんですがへんな挙動を示すようになったので追加したCameraを消して、新しいCameraを作成してやり直したんです。

その結果、2回目は上手くいったんですが、Level上に戻ってきたら、最初に追加したCameraもしっかり残っていました。

<まとめ>

まあ、Level SequenceやAnimationはUEでもほとんど触った事がない機能です。

この辺の使い方は映像作品を作成する過程でこれから勉強していくことにします。

UE5のAnimationを勉強するに当たって興味深いTutorial Seriesを見つけました。

How To Animate in Unreal Engine 5 | Part 1[10]です。

Round Table Animation氏が作成しているChannelでUEのAnimationに特化したTutorialを上げています。

このChannelのTutorialも勉強する事にします。

8.DirectX12の勉強

8.1 Lötwig Fusel氏のD3D12 Beginners Tutorialを勉強する

8.1.1  Debug Layer | D3D12 Beginners Tutorial [D3D12Ez] [11]の続きを勉強する

<ReportLiveObjects()関数について>

先週、ReportLiveObjects()関数について勉強する前で終わっています。

今週はここから勉強します。

Debug Layer | D3D12 Beginners Tutorial [D3D12Ez] [11]の13:04あたりからReportLiveObjects()関数について解説しています。

この関数はDirectX12とdxgi内にある全ての生きているCom Objectについて報告するそうです。

うん。

別に難しくないですね。

当然、この関数を使用すればその時点でReleaseされていない全てのCom Objectを知る事が出来ます。

更に以下のParameterについて解説していました。

これは先に公式SiteのIDXGIDebug::ReportLiveObjects method (dxgidebug.h)[12]のParameterの説明を見てから聞く事にします。

最初のParameterであるapiidはDCGI_DEBUG_IDの一つを使用するそうです。

公式SiteのDXGI_DEBUG_ID [13]を見ると

と書かれていました。

Private Appが何を指しているのかが分かりませんね。

まあでも全部のDataをよこせと言う事でDXGI_DEBUG_ALLを使用しているんでしょう。

次のParameterはFlagでどの程度の量の情報を報告するのかをここで指定するそうです。

こっちも公式SiteのDXGI_DEBUG_RLO_FLAGS enumeration (dxgidebug.h)[14]を見ると

となっていました。

TutorialではDXGI_DEBUG_RLO_DETAIL | DXGI_DEBUG_RLO_IGNORE_INTERNALを指定していましたが、|ってBitwiseでOrと言う意味ですよね。

実際は両方を採用するのかそれともどちらかを採用するのかが分かりません。

これくらい理解すれば今度はTutorialの説明を聞いても理解出来るでしょう。

うーん。

最初のParameterについてはあんまり分からなかったです。

2番目のArgumentですが、

DXGI_DEBUG_RLO_DETAIL | DXGI_DEBUG_RLO_IGNORE_INTERNAL

両方の命令を聞くみたいです。

後、Errorを消すために以下に示した

DXGI_DEBUG_RLO_FLAGSを追加する必要があるそうです。

この後はOutputDebugStringW()関数について解説していました。

前回、ここの説明聞いたときは何を言っているのか理解出来ませんでした。

X BoxとPCを繋いでDebugしたら云々と言っていて話を聞いている内に混乱してしまったんですが、今回よく聞いたら、別にこのTutorialを勉強している段階では全く必要のない知識の話でした。

次にMain()関数に戻って以下の実装をしてテストしています。

Testの結果です。

私のProjectのTest結果です。

まったく同じですね。

以上でした。

8.1.2 Device & Command Queue | D3D12 Beginners Tutorial [D3D12Ez] [15]を勉強する

ComPointer.hの実装について勉強しようかと思ったんですが止めます。

まずTemplate Classについての知識があんまりなく、更にC++をかなり長い間弄ってなかったので結構忘れています。

これらを復習しながらComPointer.hの実装について勉強するとなると結構時間が掛かります。

それは今は避けたいです。

ので次のTutorialであるDevice & Command Queue | D3D12 Beginners Tutorial [D3D12Ez] [15]を勉強する事にしました。

まずDeviceの説明から始まりました。

そして以下のようにComPointerを使用して

ID3D12Device10型のObjectであるdeviceを宣言しました。

次にD3D12CreateDevice()関数でdeviceを初期化しました。

これは今までのDirectX12の勉強でも散々勉強したんですが既にその勉強した内容に関しては忘れてしまっています。

一寸だけ復習します。

DirectX 12の魔導書」だけ見直しましたが、D3D12CreateDevice()関数のParameterについての解説がしてあるだけでした。

後、D3D12CreateDevice()関数のArgumentの設定もほとんど同じでした。

何と、このDeviceに関して独立したClassを作成するそうです。

うん。

そっちの方が分かり易いか。

新たにD3Dと言うFolderを作成してその中にDXContext.hを作成しました。

(後からよく見たらDXContext.cppも作成していました。)

DXContext.hの実装ですが、

ComPointer.hを丸Copyして名前だけ変更し、微調整をして完成としていました。

ここはSample Codeを参考にして作成する事にします。

DXContext.cppの実装です。

これは先程勉強したD3D12CreateDevice()関数を実装しているだけですね。

ここでDXContext Classの実装が終わっているので、今週のLötwig Fusel氏のD3D12 Beginners Tutorialの勉強はここまでとします。

焦って沢山やっても身に付きません。

ゆっくり進めます。

来週は、DXContext Classの実装をやる事にします。

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

もうDirectX12の勉強方法が分りました。

DirectX12は定型が決まっていて、それに沿って専門の関数を並べているだけなんです。

分かり易い例えで言うとLEGOで城とか盆栽を組むのがあるじゃないですか。

例えば城のLEGOって特殊な形状のBlockがあってそれを最初の土台として並べます。

次にその土台の上に並べるBlockも特殊な形状のBlockで、その場所でしか使用出来ません。

こういう特殊な形状のBlockの塊がLEGOの城シリーズとかでまとめられて売っているわけです。

DirectX12はこれとまったく同じ仕組みなんです。

単に特殊なBlockの代わりに特殊な関数があるだけです。

それらの特殊な関数は、端的に言えばその場所でしか使用出来ません。

ので、その場その場で常に新しい関数が出て来ます。

なのでこれらの新しい関数が出て来るたびにその関数の機能やParameterの設定方法を勉強する必要が出て来る訳です。

ここで問題なのは、その関数の機能やParameterだけを勉強してしまうと、その関数が全体のどこに使用されているのか、何故その関数だけがそこに使用出来るのか。などのもっと重要な内容がないがしろにされてしまうんです。

先程のLEGOの例で説明すると城を作成するのが目的でそのために特殊なBlockを使用しているのに、特殊なBlockの使い方を勉強する事が目的化してしまうんです。

そもそもDirectX12に使用される関数の数はとてつもなく沢山あります。それぞれの関数の機能を完璧に覚える事は不可能です。

それよりも全体の流れを理解するのが大切だったんです。

先程のLEGOの城の例でいえば、今は塀を作成している。塀にある小さな穴を再現するためにこの特殊な形状のBlockを使用している。という俯瞰的な視点の事です。

後、普通の関数のような汎用性の高さは無いのでどの程度勉強すべきなのかも全く違います。

その辺を心に止めながら、これからのDirectX12の勉強をしていきます。

8.2.1 「4.7 Vertex Layout」を勉強する

Vertex LayoutですがGPU側にこのDataはVertexの情報です。と教える役割をしているそうです。

その情報を渡すのにD312_INPUT_ELEMENT_DESC構造体を使用するそうです。

<「4.7.1 D312_INPUT_ELEMENT_DESC構造体」>

D312_INPUT_ELEMENT_DESC構造体を勉強します。

これですね。

Sample CodeのCodeは見にくいのでこれをCopyして私のProjectに張り付けて見やすく直します。

これを見るだけでもそれぞれの要素が何を指定しているのかは大体想像出来ますね。

PositionはこれらのDataがVertexのPositionを表している事を示しているはずです。

DXGI_FORMAT_R32G32B32_FLOATはこれらのDataがRGBの3つの32bit のFloatを持つVectorである事を示しています。

公式SiteのD3D12_INPUT_ELEMENT_DESC structure (d3d12.h)[16]を見ると

と書かれていました。

ここで重要なのはInput-Assembler Stageです。

今まではこの関数のParameterについて必死で勉強していましたが、それでは全体像が把握出来ません。

これからはこの関数が全体のどこに使用されているのかに注視して勉強します。

のでまずInput-Assembler Stageが何をしているのかを確認します。

公式SiteのPipelines and Shaders with Direct3D 12 [17]に以下の図がありました。

ここにInput Assemblerがありました。

あれ、この図どっかで見た事あります。

教科書の「2.1.1 Graphic Pipelineの概要」でこの図を勉強していました。

前にこの教科書の2章を勉強した時は、全くこの辺の内容に対して注意を払っていなかったです。

調べたら2022-11-14のBlogで2章を勉強していました。

今から数えると一年と2カ月前になりますね。一週間に一回しか勉強してないので、そういう意味ではあんまり昔でもないです。

これしか書いてなかったです。

これは「2.1.1 Graphic Pipelineの概要」の勉強をもう一回する必要がありますね。

8.2.2「2.1.2 Graphics Pipelineの各Stage」をもう一回勉強する

まず軽く読み直しました。

重い。

前読んだ時はその内容の重さが分らんかったですが、今読むとかなり重要な話がまとめられています。

まずGraphic PipelineがDirectX9の時から出来た。とあります。これはShaderを利用してSoft内でPipelineを組むと言う事でしょう。

今までHardで組んでいた部分をSoftで作成するようになった訳です。

Hardで組んだ方がより速く動きますが、自由度が限りなく0になってしまいます。それをSoftで作成出来るようにして、ある程度の速度は犠牲にする代わりに自由度を限りなく無限に近づけた訳です。

しかしこのSoft上で作成すると言う方式を採用した結果、今までHardで組んだ部品やその設計を個々のProgrammerがSoft上で個別に再現する必要が出て来ました。

このための設計図がGraphic Pipelineなんです。

もし個人でPCを組むとなったらCPU、Motherboard、電源、Video Cardなどは必ず必要になります。

どのCPUを使用するのかは個人で決定できますが、CPUは使用しません。という選択は出来ないんです。

この選択出来ない最低のLineを規定しているのがGraphic Pipelineです。

だからGraphic Pipelineは凄い重要なんです。

全部をまとめるととてつもなく長くなってしまうので今回はInput Assembly Stageだけまとめます。

<Input Assembly Stage>

ここはGPUがCPUからの情報を受け取るStageです。

以下の3つのDataを主に受け取ります。

  • Vertexの情報
  • Index情報
  • Vertex Layout

ここにしっかりとVertex Layoutについて書かれていました。

うーん。

因みにここではVertex LayoutはVertexについての情報を持っているとだけ書かれていました。

はい。

8.2.3 「4.7 Vertex Layout」の勉強の続きをやる

<「4.7.1 D312_INPUT_ELEMENT_DESC構造体」>

Vertex Layoutが DirectX12の全体像のどこに位置するのかが分かったので、今度はその中のD312_INPUT_ELEMENT_DESC構造体というBlockの機能の勉強に戻ります。

これです。

それぞれの要素を勉強します。

D3D12_INPUT_ELEMENT_DESC structure (d3d12.h)[16]では以下のようになっていました。

教科書の説明の方がこの公式Siteの解説よりはるかに分かり易いので教科書の説明をまとめます。

まずこれらの要素は以下の4つに分類出来るそうです。

  • Semantic名
  • Format
  • Slot関連
  • Instancing関連

それぞれについて解説していました。

<<Semantic名>>

SemanticNameが担当しています。

次の要素であるSemanticIndexもここに分類されるのかと思ったら、これについては全く述べられていませんでした。

ここはShaderの時のSemanticとまったく同じ役割で、このDataが何を表しているのかを文字で示すそうです。

<<Format>>

三番目の要素であるFormatだけが対象です。

Dataの形式を指定しています。

これは最初に以下のように推測しましたが、

この事からも明白です。

DXGI_FORMAT enumerationが使用されています。

教科書にはもっと詳しいFormatの指定方法が解説されていましたが、細部の話すぎるのでここにはまとめません。

<<Slot関連>>

ここは凄い解説(仮説?)が教科書に書かれていました。

SlotはGPUがVertex情報を一寸だけ見るための覗き穴だと考えると理解し易いそうです。

そういえばSlotの元々の意味は硬貨を入れるための細い穴を指していたと聞いたことがあります。

そういう意味では正しい解釈になります。

InputSlot、AlignedByteOffset、InputSlotClassがここに分類されていました。

Slotは一個である場合もありますが、複数ある場合もあるそうです。なのでそれぞれのSlotに番号がついているそうです。

その番号を管理するのがInputSlotだそうです。

今回はSlot番号の0しか使用しないので、0を指定しています。

あ、分かった。

これは覗き穴でもあるかもしれませんがDataをGPU側に入れるための穴としても機能しているはずです。

Coinの代わりにDataを入れる訳です。

一つのSlotから全部のDataを入れる事をインターリーブと呼ぶそうです。Interleaveで調べたんですが関連する説明は見つかりませんでした。

AlignedByteOffsetはそのDataの場所を指定しているそうです。

InputSlotClassはそのSlotにおけるInput Data Classを指定するために使用されるそうです。

<<Instancing関連>>

InstanceDataStepRateがここに分類されていました。

一度に使用するInstanceの数をここで指定するそうです。今回はInstanceは使用しないので0を指定するそうです。

ここでのInstanceが何のInstanceを指しているのか分からないので

この説明で納得するしかないです。

以上でした。

はい。

頭がこんがらがって来ましたので今週の「DirectX 12の魔導書」の勉強はこの辺で終わりにします。

9.まとめと感想

なしです。

10.参照(Reference)

[1] Castle Wall Tool. (n.d.). https://www.youtube.com/playlist?list=PLNbgmFvU__fiPhyUWHHzZ2Nv5ieM_bOdB

[2] Urban Decoders. (2023, November 18). How to 3D Gaussian splat from Aerials to Unreal 5 (Free plugin) [Video]. YouTube. https://www.youtube.com/watch?v=SDO1XdFXl8M

[3] Luma Unreal Engine Plugin (0.41). (n.d.). Luma AI. https://lumaai.notion.site/Luma-Unreal-Engine-Plugin-0-41-8005919d93444c008982346185e933a1

[4] Ben Cloward. (2023, October 19). Animated Flag - Advanced Materials - Episode 26 [Video]. YouTube. https://www.youtube.com/watch?v=ZV2YrrKzs9c

[5] RGBguy. (2021, May 11). Waving Flags in Unreal Engine | Unreal Engine Material Shader tutorial [Video]. YouTube. https://www.youtube.com/watch?v=L-CH_oYKD74

[6] Klaus. (2022, January 15). GAEA Beginner Tutorial Series : Part 2 - Terrain Creation [Video]. YouTube. https://www.youtube.com/watch?v=8smDHlNpoyg

[7] Rick Banks. (2022, June 20). Houdini - Wall Tool 07 [Video]. YouTube. https://www.youtube.com/watch?v=3DWk73lgB6Q

[8] Pi Equals Three. (2023, April 25). MAKE JUMPSCARES IN FORTNITE with Cinematic sequence device - UEFN / Creative 2.0 tutorial [Video]. YouTube. https://www.youtube.com/watch?v=Axxmn6wuwow

[9] Substrate Materials Overview. (n.d.). https://docs.unrealengine.com/5.3/en-US/overview-of-substrate-materials-in-unreal-engine/

[10] Round Table Animation. (2024, January 29). How to animate in Unreal Engine 5 | Part 1 [Video]. YouTube. https://www.youtube.com/watch?v=kxu6QHeEa0Y

[11] Lötwig Fusel. (2023, May 8). Debug Layer | D3D12 Beginners Tutorial [D3D12EZ] [Video]. YouTube. https://www.youtube.com/watch?v=FKTfuKB6LTc

[12] Stevewhims. (2021, October 5). IDXGIDebug::ReportLiveObjects (dxgidebug.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/dxgidebug/nf-dxgidebug-idxgidebug-reportliveobjects

[13] Stevewhims. (2021, January 6). DXGI_DEBUG_ID (DXGIDebug.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/direct3ddxgi/dxgi-debug-id

[14] Stevewhims. (2022, January 31). DXGI_DEBUG_RLO_FLAGS (dxgidebug.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/dxgidebug/ne-dxgidebug-dxgi_debug_rlo_flags

[15] Lötwig Fusel. (2023, May 15). Device & Command Queue | D3D12 Beginners Tutorial [D3D12EZ] [Video]. YouTube. https://www.youtube.com/watch?v=nQzALY8nX1c

[16] Stevewhims. (2022, July 27). D3D12_INPUT_ELEMENT_DESC (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ns-d3d12-d3d12_input_element_desc

[17] Stevewhims. (2021, December 30). Pipelines and Shaders with Direct3D 12 - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/direct3d12/pipelines-and-shaders-with-directx-12

UE5の勉強 -映像作品としてのLandscapeを作成する-

1.今週の予定

<映像作品としてのLandscapeの作成>

建築用のLevelの作成の勉強の続きをやります。

更に映像用のTutorialを何個かCheckします。

Niagara の勉強>

Unreal Engine 5で学ぶビジュアルエフェクト実装 基本機能からNiagara、シミュレーションまで」の実装の続きをやります。

<Materialの勉強>

Ben Cloward先生のTutorialを勉強します。

<Gaeaの勉強>

GaeaのTutorialを作成します。

<Houdiniの勉強>

Castle Wall Tool [1]の勉強をやります。

<UEFNの勉強>

Pi Equals Three氏のTutorialをやります。

<DirectX12の勉強>

DirectX 12の魔導書」の勉強をやります。

更にLötwig Fusel氏のDirectX12のTutorialをやります。

2.Landscapeの作成

今週は先週の続きを行います。

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

目の周りの簡単な手術をしたんですが、眼帯をつけられてしまいました。

モノの見え方が今までと全然違います。

ので今回は実装するのは止めておきます。

2.1 道路を追加する

今週は片目が見えないので調査だけします。

道路を追加するのにどんな方法が一般的なのかを調べます。

私が知っているのはSplineを使用する方法ですが質はどうなんでしょう。

単にasphaltのMaterialを追加するだけでもそれなりに良い質の道路が作成出来る気もしています。

まずYouTubeで以下の検索をしました。

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

最初のやつはSplineと表示されていませんね。

以下のTutorialはThumbnailを見る限りでは断トツの質です。

この2つのTutorialを軽く見る事にします。

2.2 EASY Road and Junction Tutorial for Unreal Engine 5 [+ FREE ROAD MESH!] [4]を勉強する

最初のTutorialはJzTz氏のTutorialです。

JzTz氏は初めて知りました。

Uploadしている動画を見たらこれしかありません。

これでYouTubeのお勧めの一番最初に表示されるのは非常に評価の高い動画という事何でしょう。

期待してみる事にします。

最初の一分だけ見ましたがもう結論出ました。

凄いです。

これは勉強する事にします。

<Intro>

以下のSiteから

以下のAssetをDownloadします。

<Road Material>

Materialを開きました。

画面が小さくて文字が読めません。

最初は以下のようになっているそうです。

文字が読めない理由が分かりました。

画質が最高で720pしかありません。

これでは文字を読むのがかなり厳しくなってしまいます。

しかも今、片目で見ていますし。

出来るだけ頑張ってまとめますが無理かもしれません。

Materialを組みました。

単に全部つなげただけです。

Roughnessだけ2倍にしていました。

Materialを2回Duplicateして以下の名称に変更しました。

Textureを以下のものに変更します。

2番目のMaterialは以下のTextureに変更していました。

<Creating a Road>

Landscape Modeに移動してSplinesを選択します。

Ctrl+左Clickで以下に示したControl Pointsを作成します。

Clickして以下のRoadを生成していました。

MeshにNewRoadを追加しました。

結果です。

Meshの向きがオカシイですね。

Forward Axisの値をxからyに変更しました。

結果です。

おお。

この時点でもかなり良い感じです。

Scaleの値を0.6に変更しました。

今度は道路の上に生えている草や土を消します。

以下のOnly Selectedを押します。

更にSplineのDetailのControl Pointsを選択し

Mesh Vertical Offsetに10をセットします。

結果です。

土が無くなって道路が見えるようになりました。

しかし道路の上に生えている草はそのままですね。

何と草は以下の方法で消していました。

Foliage無しのLayerを作成して、それをSplineの上からPaintしていました。

うーん。

これって正しい方法なのか疑問ですが、道路の草を消す事は確かに出来ますね。

結果です。

確かに道路の上の草は無くなりましたが、見た目は最悪です。

ここから交差点の作成方法の説明になります。

まず新しいControl Pointを追加します。

Mesh Vertical Offsetの値は0になっているので新たに設定し直す必要があるそうです。(ただしTutorialではそれは後でやると言っています。)

更に2つのPointを追加しました。

以下の赤丸のControl Pointを選択しCtrlを押したまま矢印のPointまで移動します。

そこに新しいControl Pointを追加します。

後、これをやる前に以下のUse Auto Rotate Control PointをDisableしておくと良いと言っていました。

次に以下の赤丸のControl Pointから矢印のControl Pointを選択します。

この部分、Mouseをどうしたのかが分かりません。

Ctrlを押したまま、次のControl Pointを選択したんでしょうか?

これは実装する時に自分で試して確認します。

結果です。

既に交差点のような形状にはなっています。

全てのControl Pointの高さを同じにすると言って

以下のLocationのZの値を10に変更しました。

全てと言ってもここで使用している3つのControl Pointだけを指していると思われますが、どうなんでしょうか?

更にRotationのYの値も0にしていました。

結果です。

成程、こうなったら正解なのか。

次に以下の全てのControl Pointsを選択します。

Mesh Vertical Offsetを10に直しました。

更にOnly Selectedも押しました。

これはLandscapeの形状をSplineに沿って調整しているそうです。

<Material Overrides>

また全部のControl Pointを選択して

Material OverridesにNewroadJuncを追加します。

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

こっちの方が見やすいですね。

<Just Line Texture>

今度はNewroadJunc1を使用してもっと見栄えを良くします。

一個だけ入れ替えました。

以下のようになっています。

Lineを逆向きにします。

ScaleのXの値をNegateしました。

結果です。

逆向きのLineが生成されました。

全部のControl Pointsに同様の処置をしました。

以上でした。

これだけだと一寸、映像作品としては完成とは呼べない気もします。

ただ基礎はこれで良いと思います。

<Outro>

完成の映像です。

うーん。

凄いアメリカ感があります。

アメリカだったら本当にこんな場所ありそうです。

日本の風景にするには更に改良が必要ですがこれでもかなり良い感じではありました。

片目で勉強するのはつらい。

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

3.Niagara の勉強

3.1 先週の復習

先週は「Chapter 15: Fluid Simulation(Logic)」を読みました。

どんな内容なのかあんまり覚えていません。

先週のBlogを読み直します。

大体以下のような内容でした。

まずSimulationの最も重要な基礎は最新の加速度を決定する事です。

流体の加速度は以下の4つの要素から構成されます。

そして最終的には以下の式が導出されました。

途中で、カーネル関数とか出て来ましたがこの辺はあんまり理解していません。

3.2 「Chapter 16: Fluid Simulationによる水面(実装編)」を読む

あんまり理論だけ勉強しても意味がないので実装を先にする事にします。

今週は「Chapter 16: Fluid Simulationによる水面(実装編)」を読みます。

<16.1 Fluid Simulationの概要>

教科書にはSimulationの結果が表示されています。

Sample Codeを動かして同じ結果になるか確認します。

こんなSimulationでした。

この流体Simulationの実装は実際には以下の2つのPhaseに分かれるそうです。

  1. Simulationを行う
  2. Renderingを行う

Simulationを行うための2つのPhaseの一つがSimulationという、一見すると訳分からない解説になっていますね。

<16.2 数式をCodeに落とし込む>

数式を見ながら疑似Codeに落とし込むそうです。

<16.2.1 カーネルの計算>

Poly6カーネル、SpikyカーネルのGradient、そしてViscosityカーネルのLaplacianの式を疑似Codeを作成しています。

Poly6カーネルの場合、以下の順序で疑似Codeを書いていました。

  1. DirectionのLength(仮にrとしている)を計算
  2. rがある値(仮にhとしている)より大きい場合は、0を返す、それ以下の場合はPoly6カーネルの計算結果を返す

これはまあ納得です。

SpikyカーネルのGradientです。

これはそのまま式の計算を疑似Codeで書き直しただけでした。

ViscosityカーネルのLaplacianの式の場合です。

これも式の計算をそのまま疑似Codeで書き直しただけでした。

<16.2.2 密度の計算>

今度は密度の計算方法の疑似Codeを作成しています。

Pressureによる加速度を求めるためは密度が必要だったはずです。

それは分かったんですが、その後がよく理解出来ません。

密度を計算するのに「近傍粒子との距離を密度の基準」としている点です。

流体でも非圧縮の流体の密度って変化するんでしょうか?

これって固有値だと思っていましたが、ここでは「近傍粒子との距離を密度の基準」として一々計算しています。

そうだ。

Poly6カーネルを検索したらこの辺の計算の理論について解説しているSiteが見つかるかもしれません。

検索してみます。

Poly6カーネルで引っかかったSiteに以下がありました。

Science.Tools 科学技術計算ツール[5]と言うSiteです。

このSiteの科学技術計算講座の中に

以下の講座があり

更にその下には

もありました。

凄い。

これで勉強したら流体の計算方法の理解が出来るようになりそうですね。

全部、読みたいですが今回は、今一番気になっている密度の計算についての解説だけ読む事にします。

内容が混乱してしまうので節を分けます。

3.3 Science.Tools 科学技術計算ツール[5]の科学技術計算講座の「科学技術計算講座5-粒子法(SPH法)で流体シミュレーション」を読む

今回は本当に急遽なので簡単に読んで、雰囲気だけ掴む事にします。

<「【科学技術計算講座5-7】SPH法の密度、圧力」を読む>

まずParticle Classを作成していました。

その中の変数にPressureもDensityもありました。

と言う事はやっぱり一個一個のParticleに対しての独立した密度やPressureの値があるという事になります。

うーん。

その下の密度の定式化に以下のように書かれていました。

ウルァァアー!

やっぱり私の疑問はそんなにおかしな事ではなかった。

このSiteの作者も非圧縮性のModelなんだけど圧縮性を考慮したModelを作成しているとその事についてしっかり注釈していました。

<「科学技術計算講座5-8】近傍粒子の探索」を読む>

ここは近接するParticleを見つけるための計算を全てのParticleに足して行うと計算Costがあまりにも大きくなってしまうのでその計算Costをどうやって減らすかについての解説がされていました。

興味深い内容ですが今勉強している教科書では使用しない技法なので読むのは中止します。

3.4 「Chapter 16: Fluid Simulationによる水面(実装編)」を読む(続き)

密度の計算については大体納得したので教科書の続きを読みます。

以下方法で計算しています。

  1. ある任意のPointを選ぶ
  2. そのPointからのそのPoint以外のPointの距離を計算する
  3. それぞれの距離がPoly6カーネルの範囲の場合は無視
  4. それぞれの距離がPoly6カーネルの範囲内の場合はPoly6カーネルの計算に沿って値を加算

うーん。

この辺はもう疑問に思う点はないですね。

<16.2.3 Pressureの計算>

これは以下の式で計算しているんですが、

Rhoの値が対象物全体の密度となっています。

これって定数なんでしょうか?

疑似Codeではこの式の計算をしているだけです。

16.2.4 Pressure Vectorの計算

これも式の計算を単に疑似Codeに落としているだけなんですが、

なんせ式が以下のように複雑です。

For Loop内でSigma内の計算をして最後に-m/Rhoを計算していました。

16.2.5 粘性Vectorの計算

これも以下に示した複雑な式を疑似Codeに落としていました。

<16.3 Emitterの生成>

Niagaraの作成についてです。

これは実装方法の説明だけなのでSkipします。

うん。

今週はここまでにして来週はここにある実装を行います。

4.Materialの勉強

4.1 Worn-Out LCD Screen Shader - Advanced Materials - Episode 25 [6]のBugを直します

先週、Worn-Out LCD Screen Shader - Advanced Materials - Episode 25 [6]を実装したんですが、動きませんでした。

今週はそのBugを直します。

一回本当に動かないのかを確認するためにLevel上にPlaneを配置してそこに先週作成したMaterialを貼り付けてみます。

結果です。

普通に動いていました。

うーん。

出来ていましたね。

4.2 Animated Flag - Advanced Materials - Episode 26 [7]の勉強をする

これだけだと短いのでBen Cloward先生の次のTutorialを勉強する事にします。

以下に示した旗が風でなびいているMaterialの作成をするそうです。

この週もUnityで説明してUEは最後に実装しているだけです。

実装方法だけまとめます。

まずLocalPositionノードを追加しました。

そして以下のように実装して

Local PositionのXの値が時間で変化するようにします。

更に以下の実装を追加します。

Sineノードで時間による変化を-1~1の値のRangeにします。

そしてWorld Position Offsetの値に繋ぐためにVector3を掛けます。

ただしY軸方向以外の値は変化しては困るので、Yにだけ値を入れてそれ以外の方向には0の値を掛けています。

結果です。

この時点で既に旗がはためいています。

ただし旗が棒に繋がれていて全く動く必要のない旗の起点の部分も動いてしまっています。

この解決策ですが以下のようにしていました。

Mask(R)の値をMultiplyノードのBに繋ぎます。

勿論、Multiplyノードの結果はWorld Position Offsetに繋ぎます。

結果です。

今度は旗の起点は動かなくなりました。

後は色を追加したり

Two SideをEnableしたりしていました。

結果です。

これだけでした。

うーん。

まあいいや。

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

実装は来週します。

5.Gaeaの勉強

今週もTutorialの作成の続きをやります。

今週から2つ目の工程であるColoringに入ります。

5.1 Coloringの内容についての検証

最初なので簡単にします。

以下の実装までは終わっている前提で始めます。

一番最初にする事はFXノードの追加です。

このNodeの存在がここで3つの工程の第一の工程が終わった事を示します。

Fxノードは左のGraph内には存在していないNodeなので別な方法で追加します。

と思ったらAdjustment Groupにありました。

Adjustment Groupか。

このGroupは調整するためのNodeがまとめられています。

AutoLevelノードとCombineノードというわりかし重要なNodeもこのGroupに属しています。

名前をFinal Terrainと変更しました。

そして色を追加します。

通常、色を追加するとなると以下のColor Groupを使用すると思われますが、

実は最も単純な色を表すNodeは以下のPrimitives GroupにあるConstantノードを使用します。

ここからConstantノードを追加します。

まずConstantノードの設定をDefaultのHeightからColorに変更します。

Colorの色も次いでに変更しました。

結果です。

赤くなりました。

ここで以下のGraphの追加について解説します。

Gaeaでは複数のGraphを使用する事が出来ます。

以下に示したGraphにある右上のPlusのButtonを押します。

すると以下のBoxが表示されます。

ColorとTypeしてCreate Graphを押します。

すると以下のようにColorと言う名前の新しいGraphが生成されます。

それではこのColorと言うGraph内で色を追加します。

まずGraphに戻ってFinal Terrainノードの後についているConstantを消します。

色はColor Graph内で指定するのでこのGraph内では要らないです。

そしたらFinal TerrainノードのOutputを左ClickしたままDragします。

すると以下のBoxが表示されますので

Make Portalを選択します。

するとFinal TerrainノードのOutput PinにPortalが形成されます。

こんどは新しく作成したGraph、Colorに移動します。

ここにConstantノードを配置します。

今度はこのConstantノードのInputを左ClickしてDrag & Dropします。

以下のBoxが表示されるのでPortalsを選択します。

すると先程作成したPortalのNodeであるFinal Terrainの名前が表示されています。

これを選択します。

すると以下のようになります。

これでFinal Terrainノードの結果とつながりました。

以下のようになっています。

今週は、Coloringの最初なので、この位で終わりにします。

5.2 PowerPointの作成

それではこのLecture用のPowerPointを作成します。

以下のSlideを作成しました。

Color Groupについて簡単に説明します。

Constantノードについて解説します。

Constantノードの説明の続きを解説しています。

新しいGraphとその使用方法について解説しています。

新しいGraphの作成方法について解説しています。

別なGraphにあるNodeにNodeの結果をPassする方法について解説しています。

ここでPortについて説明しています。

まとめです。

今回はLectureの内容が少なかったです。

しかしこれを勉強しておかないと次のMaskingの勉強が出来ませんのでまあ仕方ないです。

6.Houdiniの勉強

6.1 Houdini - Wall Tool 06 [8]を実装する

先週、Houdini - Wall Tool 06 [8]を勉強したので今週はこれを実装します。

<Intro>

特にやる事はないです。

<Attribute Noise>

Attribnoiseを追加します。

先週までの結果を繋げて可視化すると

可視化しました。

AttribnoiseのAttribute Name Vectorの値をPに変更します。

結果です。

凄い無茶苦茶です。

Amplitudeの値を小さくしました。

結果です。

上下のNoiseだけ残しました。

Attribute NamesのXYZの設定を以下のようにします。

結果です。

おお、上下のばらつきだけが追加されていますね。

今度はNoise PatternのElement Sizeの値を大きくしました。

結果です。

Element Sizeの値を大きくする事でNoizeのCurveが緩やかになるそうです。

うーん。

これは確認しますか。

Element Sizeが1の時です。

 

Element Sizeが10の時です。

成程。

これがNoiseのCurveがSmoothになるという事か。

Wallの底の歪みを直します。

Attribnoiseノードの上にAttribwrangleノードを追加します。

<Mask Noise>

Attribwrangleノードの名前をAttribwrangle_MaskNoiseに変更しました。

WallのParameterを追加するので色を黄色にしました。

<Color Mask>

Color Maskとは「色でどの場所には変更を追加しない。」と指定する方法です。

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

結果です。

Chanel Ramp>

次に以下の実装を追加します。

そして定価のIconを押してParameter、Rampを作成します。

以下のParameterが出来ました。

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

<Ramp Parameter>

RampのParameterを以下のようにしました。

結果です。

更にRampのParameterの設定を以下のように変形します。

これは新しいPointの追加方法が分らなかったんですが、Clickしたらその位置にPointが追加されました。

結果です。

そして以下の実装を追加します。

F1を押してSetpointgroupの関数のReferenceを表示します。

GeohandlwはこのNodeなので0を指定しているのか。

次のParameterであるnameはこのPoint Groupの名称ですね。

その次のPoint Numberは何を指しているんでしょうか?

これはそれぞれのPointで変わってくるという事になりますね。

Valueは全部1に指定していますね。

Modeのsetは以下の解説がありました。

最後に@Cdの値を1に戻します。

更にAttribnoise1のGroupに作成したGroupであるnoiseMaskをセットします。

これでWallの一番上と下以外だけがNoiseの影響を受ける事になります。

結果です。

うーん。

確かにWallの上と下は真っすぐなっています。

一番下のBrickだけ大きさが変ですね。

Parameterをいじって見た目を良くしました。

今度はひびを追加します。

Foreach Connected Pieceを追加しました。

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

Attribnoise1の結果をConnectivity1ノードに繋ぎます。

Foreach_begin2ノードを可視化します。

結果です。

ここまででした。

7.UEFNの勉強

7.1 MAKE JUMPSCARES IN FORTNITE With Cinematic Sequence Device - UEFN / Creative 2.0 Tutorial [9]を勉強します

面倒なので先週のTutorialの結果の検証は止めて次のTutorialの勉強をする事にします。

Jumpscaresとは画面に突然現れる怖い画像や映像の事です。

映像をLevel上に追加する方法はMake a UI Button Play A Sequence! UEFN / Creative 2.0 Custom UI Part 2 [10]で勉強しました。

今回のTutorialとはどう違うんでしょうか?

<Intro>

以下の映像を突然表示しています。

今回はこの作り方を勉強するそうです。

まずFeddyのSkeletal MeshをImportします。

Sketchfabの以下のAddressにあるそうです。

以下のようなAssetが表示されていました。

Level上に配置します。

<Creating a Hollow, Black Cube for Scene>

ここはやらなくても良いそうです。

Feddyの後ろの背景を黒くするために黒いCubeを配置するそうです。

Modeling ModeにセットしてBoxを選択します。

BoxをLevel上に配置します。

次にPoly Editを選択してPolyGroup Editを選択します。

以下に示した様にCubeのTopを選択します。

以下のようになります。

そしてFace EditsからExtrudeを選択します。

逆向きにExtrudeして以下に示した様にCubeに穴を作成します。

画面の下方に表示されているAccept Buttonを押して

この形状に決定します。

Sizeを大きくして更に回転します。

更にこのCubeのMaterialに以下のMaterialをセットします。

このMaterialはDefaultで存在してるんでしょうか?

まあ、適当に作成しても問題ないでしょう。

結果です。

このBoxの中にFaddyを配置しました。

この部分のTutorialは要らんわ。

こういう感じのを作成して下さい。と言えば自分で作れます。

とは言ってもUE初心者の人達もいるのでTutorialとしてはSkipする訳にはいかないですね。

<Creating Cinematic Sequence>

新しいLevel Sequenceを作成します。

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

中を開いて先程のFraddyをSequencerに追加しました。

<The Basics of Editing Skeleton with FK Control Rig>

Phantom Freddy FBXを右ClickしてBoxを表示させ

その中から以下のEdit With FK Control Rigを選択します。

以下のReduce KeysをEnableします。

Create Buttonを押します。

結果です。

Boneが少なくなったんでしょうか?

画面の右側にはBoneの名前が階層に沿って表示されています。

ここでKey Frameを使用してAnimationを作成するみたいです。

<Keyframes in Sequence Editor>

何とこのModel、IKがついていません。大Boneから順次動かす必要があるみたいです。

以下のIconを押しました。

これがEnableしているとModelの位置を動かした時点でKey Frameが生成されるそうです。

一個知らないTipを紹介していました。

Key Frameを選択した状態でAltと左Clickを押したまま、Dragすると

Key FrameのCopyを別な場所に生成出来るそうです。

これは実装する時に試します。

<Modeling The Pose / Animation>

以下のPoseを作成しました。

<Adding the Sequence Camera / Camera Controls>

以下のIconをClickして新しいCameraを追加します。

ここでCameraの位置を指定したりしていますが、あまりにも画面の下の方でやっていてよく見えません。

まあ、この辺は自分で勝手にやっても出来るでしょう。

<Making Model Move Closer to Camera>

画面を見るとPilot Activeとなっています。

この機能はUEFNにもあるようです。

この辺の設定方法だけは実装する時にしっかり確認する事にします。

CameraのAnimationの作成が終わったら

以下のIconを押してSaveして

Sequencerを閉じます。

Sequencerを閉じても

以下に示した様にまだSequencerで指定したCameraからの映像が表示されている場合は

左上のIconをClickします。

以下のように普段の画面に戻ります。

<Setting up Cinematic Sequence Device>

Cinematic Sequence DeviceをLevel上に配置します。

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

この辺からMake a UI Button Play A Sequence! UEFN / Creative 2.0 Custom UI Part 2 [10]で勉強した内容と同じになりそうです。

Make a UI Button Play A Sequence! UEFN / Creative 2.0 Custom UI Part 2 [10]は2023-11-05のBlogで勉強して2023-11-12のBlogで実装しています。

同じ内容を勉強させられたら時間の無駄です。

内容が被ってないか先に確認しておきます。

<<2023-11-05のBlogの内容>>

軽く復習しました。

Cinematic Sequence Deviceに関する内容を以下に示します。

まずVerseにおけるCinematic Sequenceの生成方法です。

生成されたCinematic SequenceにLevel上に配置したCinematic Sequence Deviceをセットします。

次にVerse上であるButtonが押されたら、このCinematic SequenceにセットされたAnimationをPlayするように実装しています。

まず以下の赤線のCodeでPlaySequence()関数を実行するようにします。

Play Sequence()関数は以下のようになっていました。

はい。

これでCinematic Sequenceにある映像がPlayされるようになりました。

<<2023-11-12のBlogの内容>>

特に付け足す内容は無かったです。

Make a UI Button Play A Sequence! UEFN / Creative 2.0 Custom UI Part 2 [10]ではButtonを押すとAnimationが開始しましたが、今回はButtonは使用出来ません。

多分、Trigger Boxでも使用して同様の実装を行うと思われます。

はい。

Tutorialに戻ります。

Cinematic Sequence DeviceのVisibilityをEveryoneに変更していました。

あれ。

これTutorialの残りの時間から推測するとVerseを使用しないで終わりそうです。

以下のTriggerをLevel上に配置しました。

何これ?

UEとは全然違う形状しています。

でもTrigger Boxの一種である事は間違いなさそうです。

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

そして以下のようにTriggerをCinematic Sequence Deviceにセットします。

うーん。

成程。

こうしたらNo Codeで実装出来るのか。

これはこれで勉強になりますね。

ただ、こういうやり方はFortniteを散々遊んで更にCreationの1.0でMapを作成している人達の方が絶対詳しいので、私が今更この辺を勉強しても付加価値を生む事はあまりなさそうです。

やっぱりVerseの専門家になる方が私の長所が光ります。

のでUEFNの勉強はVerse方面を重視する事にします。

<Jump scare Test Result>

実際にGameをPlayしてTestしていました。

Triggerを踏んだらAnimationが始まりました。

Pi Equals Three氏、滅茶苦茶ビビっていました。

<Adding Audio / Sound to Sequence>

Soundを追加するそうです。

Level Sequenceに戻ってAudio Trackを追加します。

以下のAudioを押すとCueを追加出来るそうです。

よく考えたらUEでもLevel Sequenceに音を追加した事はなかったです。

<Final Result>

最後に音ありの状態でTestしていましたが、Tutorialの映像では音は消されていました。

以上でした。

実装は来週やります。

8.DirectX12の勉強

8.1 Lötwig Fusel氏のD3D12 Beginners Tutorialを勉強する

先週は実装したDebug Layerの内容について勉強し直しました。ので今週はDebug Layer | D3D12 Beginners Tutorial [D3D12Ez] [11]の復習をします。

もし全部、終わっているならば次のTutorialの勉強をします。

8.1.1 2023-12-10のBlogを復習する

2023-12-10のBlogDebug Layer | D3D12 Beginners Tutorial [D3D12Ez] [11]の勉強をしています。

まずはこれを復習します。

まずDebug Folderを作成してその中にDXDebugLayer.hとDXDebugLayer.cppを作成しています。

以下のように作成しています。

DebugLayer.hを以下のように実装しました。

これは先週実装したHeaderの以下の部分、Singltonの実装と同じですね。

次に以下の実装を追加していました。

これは以下の部分と大体一緒です。

この後にPublicとPrivate以下の部分を実装すると思われます。

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

はい。

Private以下の実装は同じになりました。

ここで2023-12-10のBlogでは以下の内容が書かれていました。

これも復習しないといけないのか。

まあ、これは出来たらやります。

ここでPublicの下に以下の実装をしていました。

これで私のProjectのDebugLayer.hの実装とTutorialのDXDebugLayer.hの実装が同じになりました。

今度はcpp fileの実装について勉強しています。

以下のようになっています。

私のDebugLayer.cppの実装は以下のようになっています。

Init()関数とShutdown()関数の実装が無い点を除けば同じ実装ですね。

Debugの時だけ動くような実装を追加しています。

これも私のDebugLayer.cppに実装されています。

Init()関数内の#ifdef _Debug以下に以下の実装を追加しています。

その後に以下の実装を追加します。

これは以下の部分の実装と同じですね。

次はShutdown()関数の実装です。

#ifdef _DEBUG以下に実装を追加しています。

以下の部分の実装ですね。

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

以下の部分の実装と同じですね。

OutputDebugStringW()関数が追加されていますね。

Blogには以下のような記録がありました。

うーん。

やっぱりTutorialをもう一回勉強し直す必要はありそうですね。

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

これで私のProjectのDebugLayer.cppとTutorialのDebugLayer.cppの実装は全く同じになりました。

お、完璧に終わっているじゃないかと思ったら、2023-12-10のBlogでは更に続きがありました。

この後にMain.cppに戻りDebugLayerが使用出来るかどうかTestしていました。

これはやっていません。

8.1.2 2023-12-10のBlogでやってない部分を実装する

2023-12-10のBlogでMain.cppの部分を実装します。

Main.cppからDebugLayer.hを使用出来るようにします。

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

うーん。

この実装方法知らないです。

Class名::Get().関数名

ですか?

先にこの実装で本当にDebugLayerが動いているのかを確認します。

実行しました。

2023-12-10のBlogの結果と同じMessageが現れました。

更に以下の場所にBreakpointを追加してDebugLayerのObjectが存在しているのを確認しました。

DebugLayerが動いているのは間違いないですね。

8.1.3 Debug Layer | D3D12 Beginners Tutorial [D3D12Ez] [11]をもう一回勉強する

以下の実装についての情報もTutorialで解説しているかもしれません。

Class名::Get().関数名

のでまずTutorialをもう一回勉強する事にします。

まず以下のSingltonの実装について解説していました。

ここにGet()関数があったんでした。

Class名::Get().関数名

の意味が判明しました。

Get()関数内の実装を見ると

となっています。

StaticなのでDXDebugLayer型のInstanceであるinstanceは一個しか作成されません。

最初にこの関数が呼ばれた時だけinstanceが生成されると言う訳です。

理解しました。

次にCom Pointerで以下の2つの変数を宣言したところです。

ここではID3D12と言うPrefixがDirectX12のDirect 3DのInterfaceである事を示す事や、DebugのVersionは常に更新されているので、Versionが新しくなる毎にDebug1、Debug2と後ろの番号がどんどん増えていく事についても解説していました。

IDXGIというPrefixについての意味は解説してなかったです。

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

ここでは何故 Init()関数だけBoolを返すようにしたのかについての説明がありました。

後でAssertなどで使用する可能性があるからだそうです。

Debug Layerを使用するための実装です。

ここでもかなり専門的な解説をしていました。

Com Pointerを使用するのではなくD3D12の関数を読んで実装するのは何故かとかの解説です。

正直、説明聞いてもあんまり理解出来ません。

この実装は「DirectX 12の魔導書」の実装と同じだったので定型的にこうやるものだ。位の理解で先に行きます。

こっちは絶対にやる必要はないそうです。

ただこのDebugはCom PointerのLeakingを追跡するのに有用だそうです。

ので実装したそうです。

更にEnableLeakTrackingForThread()関数についての解説もしていました。

ComPointerのLeakingを監視するのが目的なのでこの関数を使用するそうです。

成程。

先週のBlogには以下のようにまとめていますが、

こっちはFactoryを使用していますので、これは全然違いますね。

DXGIGetDebugInterface1()関数とCreateDXGIFactory2()関数の違いですね。

公式SiteのDXGI functions [12]にはそれぞれの関数について以下の解説がありました。

CreateDXGIFactory2()関数についての解説です。

DXGIGetDebugInterface1()関数についての解説です。

これ読んだだけじゃ違いはよく分かりません。

両方使って違いを比較するしかなさそうですね。

これらの違いを理解するのは数年後になりそうです。

次です。

Shutdown()関数に以下の実装を追加していました。

Release()関数はPointerではなくDotで呼び出す必要があるそうです。

理由までは理解出来ませんでした。

次にShutdownする前にCom PointerのLeakについて調べるための実装を追加しました。

ここではm_dixgiDebugがTrueならばCom PointerのLeakがある事になります。

そしてどのObjectが生きているのかをReportLiveObjects()関数で調べるそうです。

ここの内容はかなり複雑なので来週、しっかり勉強する事にします。

今週のLötwig Fusel氏のD3D12 Beginners Tutorialの勉強はここまでとします。

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

8.2.1 先週の復習

先週何を勉強したのかを全く覚えていません。

先週のBlogを読んで復習します。

思い出しました。

以下に示したD3DCompileFromFileのそれぞれのArgumentの意味を調べたんでした。

以上でした。

となると今週は「4.6.3 D3DCompileFromFile()関数」の「Errorが起きた場合」を勉強する事になります。

8.2.2 「4.6.3 D3DCompileFromFile()関数」の「Errorが起きた場合」の勉強と実装

まずErrorの情報ですが以下のErrorBlobに入っています。

当然ですね。

ErrorのMessageは以下の方法で受け取るそうです。

まずGetBufferSize()関数はErrorBlobのSizeを返します。

これでString errstrのSizeをErrorBlobのMessageを全部受け取れる大きさに変更します。

その後はCopy_n()関数を使用してErrorBlobのMessageを受け取ります。

最後にOutputDebugStringA()関数を使用してErrstrの内容を表示します。

おまけでFile名が間違ってないのかのCheck方法も書かれていました。

こんなの自分で確認しろと思いましたが一応、記録しておきます。

File名が間違っている場合は、D3DCompileFromFileの結果が、

HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)

になるそうです。

Sample Codeには以下の様実装されていました。

最後にこの部分を自分のProjectで実装します。

しました。

Vertex Shaderの方の実装です。

Pixel Shaderの方です。

どちらもSample CodeをそのままCopyしただけです。

最後のExit(1)にCommentで行儀が悪いかもと書かれていましたが、理由が分かりません。

これもそのままCopyしておきます。

最後に実行して普通に動く事を確認しました。

あれ?

このMessageってDebugLayerからのMessageでこんなにObjectが生きていますよ。という警告ですよね。

うーん。

まあ、このMessageの意味が理解出来るようになったと言う事で今回は良しとします。

今週の「DirectX 12の魔導書」の勉強はここまでとします。

9.まとめと感想

今週は月曜日に目の周りの切開をしたので、Landscapeの勉強は全く進みませんでした。

Landscapeの勉強は来週、頑張る事にします。

10.参照(Reference)

[1] Castle Wall Tool. (n.d.). https://www.youtube.com/playlist?list=PLNbgmFvU__fiPhyUWHHzZ2Nv5ieM_bOdB

[2] Gediminas Kirdeikis. (2023, April 30). Unreal Engine 5 for Architecture - 2023 Full Beginner Course [Video]. YouTube. https://www.youtube.com/watch?v=bT8aSTkpkDY

[3] Urban Decoders. (2023, November 18). How to 3D Gaussian splat from Aerials to Unreal 5 (Free plugin) [Video]. YouTube. https://www.youtube.com/watch?v=SDO1XdFXl8M

[4] JzTz. (2023, July 1). EASY Road and junction tutorial for Unreal Engine 5 [+ FREE ROAD MESH!] [Video]. YouTube. https://www.youtube.com/watch?v=RCv3dFUjOf0

[5] CATTech.LAB Co., Ltd. (2019, September 9). 科学技術計算ツール. 科学技術計算ツール. https://cattech-lab.com/science-tools/

[6] Ben Cloward. (2023, October 12). Worn-Out LCD Screen Shader - Advanced Materials - Episode 25 [Video]. YouTube. https://www.youtube.com/watch?v=i4EXZdpVdT0

[7] Ben Cloward. (2023, October 19). Animated Flag - Advanced Materials - Episode 26 [Video]. YouTube. https://www.youtube.com/watch?v=ZV2YrrKzs9c

[8] Rick Banks. (2022, June 20). Houdini - Wall Tool 06 [Video]. YouTube. https://www.youtube.com/watch?v=o6Jfgv_FXWs

[9] Pi Equals Three. (2023, April 25). MAKE JUMPSCARES IN FORTNITE with Cinematic sequence device - UEFN / Creative 2.0 tutorial [Video]. YouTube. https://www.youtube.com/watch?v=Axxmn6wuwow

[10] Pi Equals Three. (2023, March 30). Make a custom UI with a clickable Button - UEFN/Creative2.0 [Video]. YouTube. https://www.youtube.com/watch?v=vB6vXZNgzkM

[11] Lötwig Fusel. (2023, May 8). Debug Layer | D3D12 Beginners Tutorial [D3D12EZ] [Video]. YouTube. https://www.youtube.com/watch?v=FKTfuKB6LTc

[12] Stevewhims. (2022, May 24). DXGI functions - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/direct3ddxgi/d3d10-graphics-reference-dxgi-functions

UE5の勉強 -映像作品としてのLandscapeを作成する-

1. 今週の予定

<映像作品としてのLandscapeの作成>

建築用のLevelの作成の勉強の続きをやります。

草を植えてみます。

更に映像用のTutorialを何個かCheckします。

Niagara の勉強>

Unreal Engine 5で学ぶビジュアルエフェクト実装 基本機能からNiagara、シミュレーションまで」の実装の続きをやります。

<Materialの勉強>

Ben Cloward先生のTutorialを勉強します。

<Gaeaの勉強>

GaeaのTutorialを作成します。

<Houdiniの勉強>

Castle Wall Tool [1]の勉強をやります。

<UEFNの勉強>

Pi Equals Three氏のTutorialをやります。

<DirectX12の勉強>

DirectX 12の魔導書」の勉強をやります。

更にLötwig Fusel氏のDirectX12のTutorialをやります。

2. Landscapeの作成

2.1 草を追加する

先週調べた以下の草を使用して家の周りに草を植えてみます。

以下の場所に草を配置しています。

結果です。

こんな適当に並べただけでもそれなりに本物っぽくなりました。

Foliageを使用してPaintしてみます。

結果です。

Bookmark1です。

かなりPhoto-Realisticになって来ました。

Bookmark3から見た風景です。

木が揺れすぎてる感がありますがそれでもかなり良くなっています。

Bookmark4です。

これはBookmarkした位置が悪い気がします。

配置したCameraから見た風景も確認します。

Camera1から見た風景です。

あれ。

地面が見えます。

もう少しだけPaintします。

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

Camera2からの映像です。

こっちは今の状態でも十分にPhoto-Realisticです。

2.2 Unreal Engine 5 for Architecture - 2023 Full Beginner Course [2]の勉強の続きをやる

<Light Source>

Light Sourceを勉強します。

UEでは3つのLight Sourceがあります。

  • Material(Emissive Color)
  • 実際のLight (Point Light、Directional Lightなど)
  • HDRI Lighting

だそうです。

HDRI Lightingは何の事は分かりません。

とりあえずTutorialの説明を聞きます。

HDRI LightingはImage全体から生成されるLightだそうです。

うーん。

意味分からん。

Imageって何を指しているんでしょうか?

画面の事でしょうか?

公式SiteにHDRI Backdrop [3]がありました。

TutorialのHDRI Lightingがこれと同じ事を言っているのかは不明ですが、少なくともこのHDRI Backdrop [3]の方法は最後に画面上に光と影を追加しています。

で、TutorialはPoint LightをLevel上に追加しました。

Lightがまぶしすぎます。

のでPoint LightのDetailを調整します。

まずLightの明るさを下げるために以下のIntensityの値を8から1に下げました。

Intensityの単位であるcdはCandelaとよむそうです。

Lightの明かりが眩しくなくなりました。

知らない話だけ記録します。

Source Radiusについてです。

以下のようにSource RadiusをAttenuation Radiusより小さくすると

このLightによって生成される影がSoftになります。

これは知らなかったです。

今度は影についてです。

以下にPoint Lightから作成されたBedの影を示します。

全然、Photo-Realisticではありませんね。

これを直します。

まずShadowには2種類あります。

Cascading Shadowと以下に示したCast Ray Traced Shadowsです。

Cast Ray Traced ShadowsをEnableします。

Shadowの計算はもっと厳密になります。

結果です。

この状態でSource Radiusを10に下げました。

結果です。

Bedの影の形状が正確になっているのが確認出来ます。

うーん。

成程。

なんで映像系のUE5のTutorialがRay Tracingを強行に進めて来るのか今一納得出来てなかったんですが、今のこの説明でやっと納得しました。

確かにこれはRay Tracingを使用した方が良いです。

今度はSpot Lightの説明です。

何とこのTutorialの作者、Bookmarkの使用方法を知りません。

視点をCinema Viewから通常のViewに切り替える度に全然違う場所に飛んでしまって、イライラしています。

結果です。

Point Lightで解説した内容以上の説明はなかったです。

今度はRectangle Lightの説明です。

以下の窓から入って来る光を作成するそうです。

Rectangular Lightの形状を窓にあわせるには

以下のSource WidthとSource Heightの値を変更します。

と説明していました。

これも今となっては常識となってしまいました。

2023-12-03のBlogでしっかり自分で解明していました。

もう一寸早く教えて欲しかったです。

今度はDirectional Lightの説明です。

以下の場所に来ました。

この状態でもかなり綺麗に見えます。

Cast Ray Traced ShadowsをEnableします。

結果です。

これは凄い。

こういう結果を見せられるとRay Tracingが絶対必要という意見も納得出来ます。

今度はMaterialのLightingについてです。

これも知らない事だけ記録します。

SphereにEmittingするMaterialを張り付けて以下のようにしました。

Shimmering(ちらちら光る事)が確認出来ます。

しかしMaterialのこの光をLight Sourceにする事は出来ないそうです。

それは以下の例を見るとわかるように

Sphereを小さくするとGrainy(粒粒)な影が生成されるようになってしまうからです。

設定をLumenに変更するとGrainy(粒粒)な影はもっと顕著になります。

これは流石におかしく見えます。

この問題の解決策も紹介されていました。

以下のようにPoint Lightを同じ場所にセットすれば良いそうです。

更にPoint LightのCast ShadowをDisableします。

結果です。

前よりはましになっていますが、それでもオカシイ部分があります。

これはMaterialの光は使用しない方が良い気がします。

うーん。

これは良い事知りました。

前にNiagaraの勉強でLight Rendererが何で必要なのかよく分からないと書きました。

2022-02-28のBlogの記録です。

これは新たな知見を得ました。

やっぱり映像関連のUEのTutorialはGameのTutorialと比較して質が高い部分があります。

最後の影の微調整の方法を説明しています。

Directional LightのSource Angleを変更して

以下のように影を非常にShapeにしたり

逆にSource Angleの値を大きくして

以下のように影をぼやかしたりしています。

こっちの方がPhoto-Realisticですね。

この画面が少しGrainyだと思ったら以下のScreen Percentageの値を増やす事で調整する事で直す事も出来るそうです。

Tutorialでは200 Percentにしていました。

しかしPCがその計算の負荷に耐えれなくて綺麗な画像は生成されませんでした。

これは最後に映像として出力する時に考慮すべきParameterのようです。

一応、記憶の片隅に留めておきましょう。

これでLightingの節が終わりました。

結構勉強になりました。

2.3 How to 3D Gaussian splat from Aerials to Unreal 5 (Free plugin)[4]を勉強する

先週、以下のように書きました。

のでこれを勉強します。

全部、勉強してやっぱり出来なかったとかになったら時間の無駄になります。

3D Gaussian SplattingのDataをどこから手に入れているのかだけ先に確認しておきます。

Luma Unreal Engine Sample Scenes [5]でDataを得ていました。

うーん。

試しに一個Clickしてみます。

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

うーん。

どれをDownloadしたらいいのか分からないですね。

まあ、でも2024-01-14のBlogで勉強した時のSiteとは違うので

UE用の3d Gaussian SplattingのDataも無料でDownload出来そうです。

とりあえず勉強してみます。

<Intro>

3D Gaussian Splattingの例を表示しているだけです。

<What is a Gaussian Splat?>

超基本的な3D Gaussian Splattingの説明をしていました。

<Luma AI>

Luma AIについて説明しています。いますがFreeで使用出来るという事しか説明していません。

2024-01-07のBlogで確認しましたが、前に使用したUEのPluginはLuma AIのではありませんでした。

<Video Recording>

3D Gaussian Splatting に使用するVideoの撮影方法について説明していました。

こんな所から自分でやらないといけないんでしょうか?

誰かが撮影したDataを使用出来ると思っていたんですが?

以下のWebsiteに行ってStart Now on Web for FreeをClickします。

<Gaussian model creations>

すると以下のBoxが表示されますので

撮影したVideoを以下のBoxにDragします。

次の画面でTitleやCameraのTypeを指定してUploadを押します。

30分ぐらいProcessingにかかるそうです。

以下の画面に代わりました。

Thumb nailをClickすると以下の画面が表示されます。

え。

こんなに簡単に3D Gaussian Splattingって出来るの?

この時点で右上の以下のIconを押すとDownloadが出来ると言っています。

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

おお、Gaussian Splatting & Unreal Engineの項目もありますね。

以下のGaussian SplatをDownloadすれば良いそうです。

でも先程のSiteのBoxにはそんな選択肢は表示されていませんね。

これは後で検証します。

<Luma Unreal Engine plugin>

今度はLuma Unreal Engine PluginのInstall方法の説明です。

以下のSiteに行きます。

このSiteのAddressはこのTutorialのDescriptionに書いてありました。

来週実装する時はここからこのSiteに行きます。

以下のPluginをDownloadしていました。

私の場合は5.3ですしCinematic Filmも試したいのでこのVersionはDownloadしません。

ここでやっと先程のSiteについての解説がありました。

もし自分で撮影したProjectが無い場合はここからSampleをDownload出来ると説明していました。

うーん。

親切。

以下のDataをDownloadしていました。

おお。

どうやらこのやり方なら3d Gaussian Splattingを完全にFreeで出来そうです。

Unreal baked Gaussian Splat scene>

あれ?

ここからいきなりUE5が始まっています。

既にPluginも入れてDownloadした3D Gaussian SplattingのDataも開いている状態です。

うーん。

これはどうやったのかの説明がいるでしょう。

もしかすると

がUE5のProject込みなのかもしれませんね。

それだと開くだけで済みそうです。

Post Processing以外のAssetを全部消すそうです。

そしてPy FileをContent DrawにDrag and Dropします。

すると以下のようにFolderが自動で形成されるそうです。

この辺はうまく撮影されていません。推測でこうやっているだろうとまとめています。

更にFolderの中には以下のようなFileが作成されてるそうです。

LightingがBakeされたものとされてないDynamic Lightingのもの別々に作成されているそうです。

TAAは質が低い代わりにPerformanceに優れているそうです。

BakedのFileをLevel上に配置しました。

凄い。

全部を表示するのはPCの負担が凄い事になるので一部のみを表示する方法を説明しています。

Cropboxを使用するそうです。

Enable Crop BoxをEnableします。

すると以下のようなCrop Boxが表示されます。

DefaultではCropBox1が表示されるようになっているそうです。

のでこれを移動して

表示したい場所を指定します。

この機能は前に勉強した3D Gaussian Splattingにもありましたね。

<Dynamic Lighting>

こっちではPoly camからSampleをDownloadしていました。

やり方は別なTutorialで教えると言っています。

うーん。

こっちも無料でDownload出来る方法があるでしょうか?

先程のPostProcessだけ残した状態から以下のSun and Skyを追加しました。

結果です。

こんなのLightingにあったかなと思ったら以下のPluginを使用する必要があると言っていました。

そしてLandscape ModeでLandscapeを作成しています。

正直、この辺の操作に関しては私の方が詳しいです。

だいたいこんな風にやると理解しておきます。

Lightが強すぎて何も画面に表示されません。

Post Processの以下のParameterを調整します。

結果です。

Exponential Height Fogを追加しました。

そしてSplatをDrag and Dropするそうです。

むむ。

このUEの設定は単に地面と空を作成しているだけですね。

いつもの方法でやった方が簡単でしょう。

もう少し適切なやり方がありそうです。

以下のようにSplatの新しいFolderが形成されました。

今度はDynamicをLevel上に配置します。

ナニコレ?

SizeとRotationが間違っているみたいです。

回転させて調整しています。

更にCrop Boxも使用して表示する箇所も限定しました。

この状態でSoler Timeの値を調整しました。

結果です。

うーん。

これじゃ3D Gaussian Splattingの質の確認は出来ないです。

<Combining models>

他のSplatのDataもUEにDrag and Dropしました。

そしてそれらをLevel上に配置しています。

うーん。あんまり意義を感じませんね。

<Outro>

なし

以上でした。

2.3 How to 3D Gaussian splat from Aerials to Unreal 5 (Free plugin)[4]を勉強した感想

このTutorialを作成した人は3D Gaussian Splat関連の専門家かもしれませんが、UEに関してはあまり知識があるようには思えませんね。

ただ3D Gaussian Splatを無料でDownloadする方法はこのTutorialで分かりました。

来週ためしてみます。

3. Niagara の勉強

3.1 先週の復習

先週は「Chapter 14 木の生成Simulation」の実装をやりました。

実装は完成したんですが、理解があんまりしてなくて今週はその理解を深める勉強をしたいと先週のBlogに書いてありました。

で、考えたんですがあんまり「Chapter 14 木の生成Simulation」の勉強をしたい気分じゃないので次の章を勉強する事にします。

3.2 「Chapter 15: Fluid Simulation(Logic)」を読む

この章ではSmoothed Particle Hydrodynamicsと言う流体Simulationの計算方法を勉強するそうです。

そしてVectorの簡単な復習をしています。GradientとかDivergenceとかの話です。

Laplacianを足すと画像がぼやけるのは知らなかったですが、画像処理の分野では基礎みたいです。

その次にSimulationの簡単な説明をしています。

ここでは兎に角、最新の加速度を決定する必要がある事が強調されていました。

最新の加速度が決定すれば、そのから最新の速度や最新の位置も計算で導く事が出来るからだそうです。

以下のように解説されていました。

加速度の値を保持する変数をA、速度の値を保持する変数をV、位置の値を保持する変数をPとすると

  • V = V + A
  • P = P + V

で求まると。

これは速度と加速度と位置は単位が違うので実際の計算はこの通りにはならないですが、考え方の方針としては納得です。

そして最新の加速度の求め方ですが以下の加速度を足した値になるそうです。

  • Pressureからくる加速度
  • Viscosity(粘度)からくる加速度
  • Gravityからくる加速度
  • Wallからくる加速度

うん。

分かり易い。

それぞれの値の求め方についても説明してありました。

まずGravityですが、これは地球上では一定ですのでそれを使用します。

次にWallの加速度ですが、これも一定です。

壁の向こう側には行けないので、この値は今の加速度の逆の方向にするだけでしょうか?

Pressureの計算ですが、これは複雑でした。

以下のように解釈しました。

以下のような川があるとします。

とその水の流れの一部を四角く区切ります。

P1には水が入って来てP2からは水が出ていきます。

このP1とP2で区切られた空間内のPressureによる加速度は

となります。

mが流体のMass、NablaのPressureはP1とP2の差、そしてrhoは密度を表しています。

うーん。

流体のSimulationを自作したくて今まで何度も流体力学の教科書を読んでいたんですが、この部分はいつもよく分からなかったです。

今回が一番理解した気がします。

最後にViscosityですが、これは速度から計算していました。

でこの速度の計算に先程のLaplacianのぼやかす効果の話が出て来ます。

正直に言うとここはもう一寸物理の立場から厳密な解説して欲しかったです。

結論としてViscosityの加速度は以下の式で表せる事が分かりました。

そして全ての加速度を合計すると

となります。

はい。

ここまではほぼ完ぺきに理解しました。

こういう事を今まで読んだ流体力学の本は言っていたのか。

うーん。

この作者はUE5のNiagaraの教科書よりComputing Simulationの教科書を書いた方が世間からの評価が高くなりそうな気がします。

説明が素人にも分かり易くて何というか言っている内容を可視化しやすいです。

ここから今までの流体の理論をSPHの理論に落とし込むそうです。

まずカーネル関数について解説しています。カーネルはKernelの事でしょうか?

ここはカーネル関数を変形してGradientやLaplacianの形に変形したりしています。

むー。

この変形した式を後で使用する訳ですね。

カーネル関数自体の意味がよく分かってない部分がありますが先に進みます。

いきなり密度の式が出て来ました。

うーん。

段々分からなくなってきた。

Wのところがカーネル関数になるはずです。それに対してNablaをしています。

この計算方法がまず分からないです。

Gradientの式は以下のようになっているので

カーネル関数の計算結果にxやyで微分するんでしょうか?

その場合、カーネル関数の計算結果がxやyの値を持つ式である必要がありますよね。

でも教科書で紹介されていたカーネル関数の式は以下のようになっています。

XもYもありません。

あれ、でもその次のGraphには

XとYの空間内に描かれていますね。

これもう少し深堀したら理解出来そうです。

が、

これを理解する事がどれだけ大切なのかと言う別な問題があります。

実際に実装する段階になったらすっきりした形の式が既に出来ていて、しかもその式の導出にこの辺の理解が必要なだけかもしれません。

先行きますか。

あ、分かりました。

教科書に「近い距離にParticleが沢山ある」と密度が高くなる。と説明してありました。

つまり以下の式は

それを表しているんです。

残りのPressureとViscosityの導出方法は軽く読むだけにしておきます。

今度はそれぞれのKernel関数の計算方法についての解説です。

ここでPoly6のKernel関数に咥えてSpikyとViscosityのKernel関数が紹介されていました。

そしてPoly6のKernel関数を用いたGradientの計算方法が紹介されていました。

この部分だけ一寸真面目に読む事にします。

になっていました。

あ、分かりました。

Poly6のKernel関数は以下の式で表せます。

このrはx+y+zに変換出来るんです。

うーん。

成程。

教科書にしっかりと

と書かれていました。

残りの計算は軽く見て終わりにします。

次にKernel関数の可視化を行っていました。

Spiky Kernelって何のことかと思ったら

文字通りSpikyなKernelの事でした。

こういうのが一発で理解出来るのが可視化の強みですね。

どのKernel関数を使用するのかについて検討しています。

Poly6のKernel関数のGradientはrの値が0の時に0になってしまいます。のでこれは使えません。

最後に以下の式になりました。

この式を元にして次章で実装していくそうです。

以上でした。

3.3 「Chapter 15: Fluid Simulation(Logic)」を読んだ感想

Smoothed Particle Hydrodynamicsを理解したとはとても言えませんが、その香りというかSmoothed Particle Hydrodynamicsがどんなものなのかを感覚的とは言え感じる事は出来ました。

本当に分かり易かったです。

今まで、何度も流体力学の本を読んで理解しようとして挫折していたんですが、ここに書かれている理論をしっかり理解したら、今度は流体力学の本も理解出来そうな気がします。

この教科書は色々文句を言いたい箇所がありますが、この章の内容に関しては、今まで読んだ科学関連やSimulation関連の本と比較しても最高の出来だと思いました。

 

私は前々から言っているんですが、Game産業って持っても後10年だと思っています。

Gameの技術が余りにも進化しすぎて、Gameを作る人とGameをPlayする人に接点が無くなってしまっています。

のでGameを作る人達はGameをPlayする人達が欲しているモノが分からなくなっています。これは致命的な問題なんですが、この乖離は永遠に埋まらないです。

ので後10年したらGameをPlayする人はいなくなってGame産業は壊滅すると予測しています。

しかしGameを作成するために発展した技術、特に3D Graphicsの技術はGame産業の終焉とともに終わるのではなく、逆に別な分野に応用されて更に発展して行くと思っています。

その中で、もっとも伸びると思っているの分野の一つがUEの世界最高峰のGraphicsを利用した科学Simulationの可視化です。

会社で最高権力を持っている役員の連中にSimulation結果の重大さを数式で見せても全く理解されません。

しかしUEのPhoto-RealisticなGraphicsでSimulation結果(例えば津波が町を破壊する様子)を見せると一発でその重大さを理解させる事が出来きます。

可視化したSimulation結果を見せると信じられない位、役員の人達も話を聞いてくれまし、それだけでなくこっちの話を納得してくれます。

この効果は経験した人でないと理解出来ない位、劇的でしかも好意的です。

 

この本の筆者はこっちの分野の先駆者になった方が良い気がします。

4. Materialの勉強

4.1 Worn-Out LCD Screen Shader - Advanced Materials - Episode 25 [6]を実装する

先週勉強したBen Cloward先生のTutorialを実装します。

以下のTextureを使用していますが

これを作成するのは大変なので、

以下のTextureを使用します。

FlipBookノードを実装します。

Animation Phaseの実装も追加します。

これは何を計算しているんでしょうか?

あ、SubUVのどのImageを表示するかの指定をしているのか。

Dot Gridの実装です。

次に以下の実装をしました。

これは何をしているんでしょうか?

それは分かりませんがInvLerpのValueに先程のDot Gridの計算結果を繋げました。

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

この2番目のLerpノードのAlphaにInvLerpノードの結果を繋げます。

次に最初のLerpノードのAlphaに以下の実装の結果を繋げます。

次はVignetteの実装をします。

更にOne MinusノードとMaskノードのInputにはTexCoord[0]ノードの結果を繋げました。

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

見事なVignetteになっています。

その結果を以下のMultiplyノードのAに繋ぎます。

次にBrightness Flickerを実装します。

ここでTutorialではSineノードのPeriodの値は6.2 になっていましたが、要は2Piの値なので6.28にセットしました。

Brightness Flickerの結果は以下のMultiplyノードのBに繋げました。

Sizzle Linesの実装をします。

MaskノードのInputはTexCoord[0]ノードです。

Sizzle Linesの結果をDot GridのAddノードのBに繋ぎます。

Sizzle Lines のNoiseノードの設定を変更しました。

Screen Onの実装をします。

最初のMultiplyノードのAの値です。

MaskノードはTexCoord[0]ノードの値でした。

このScreen Onの結果を以下のMultiplyノードのBに繋ぎました。

これで完成でしょうか?

Previewの結果ですが

こんなになっています。

まったく時間経過とか表示していません。

もう時間がないので結果の検証は来週やる事にします。

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

5. Gaeaの勉強

PowerPointを直して録画をしました。

更に録画した動画を編集してYouTubeにUpload出来る状態にしました。

今回のTutorialは今まで勉強した内容の総集編なので35分の長編になってしまいました。

内容を減らして動画の長さをもっと短くするか、このまま行くのか一寸考える必要があるかもしれません。

後、説明の言葉が聞き取りにくい箇所があちこちにありました。

私は内容を理解しているので特に困ったりはしませんが、初めて聞く人にはどうなんでしょう。

意味が不明な箇所もあるかもしれません。

6. Houdiniの勉強

先週のBlogを読み直したら特に問題もなく実装が終わっていたのでその次のTutorialを勉強します。

6.1 Houdini - Wall Tool 06 [7]を勉強する

また目次がありません。

ただ以下のKey Noteはありました。

これを元にして内容をまとめます。

<Intro>

今回はもっとNoiseを追加してBrickのばらつきを増やすそうです。特に上下のNoiseを追加するそうです。

<Attribute Noise>

以下のAttribnoiseを追加しました。

先週までの結果を繋げて可視化すると

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

AttribnoiseのAttribute Name Vectorの値をPに変更します。

PはPositionのPでしょうか?

結果です。

滅茶苦茶になりました。

今度はAmplitudeの値をかなり小さくしました。

結果です。

こっちはかなりマシですね。

XとZのNoiseはいりません。上下のNoiseだけが欲しいです。

先程値を変更したAttribute Namesの右端にあるXYZのIconのXZを外します。

結果です。

おお、上下のばらつきだけが追加されていますね。

今度はNoise PatternのElement Sizeの値をかなり大きくしました。

結果です。

Element Sizeの値を大きくする事でNoizeのCurveが緩やかになるそうです。

言われてみるとBrickの上下のばらつきは全体としてなだらかなCurveを描くようになっています。

次に直す必要があるのが、以下に示したWallの底の歪みです。

地面から盛り上がっています。

これを直すのにMask Awayする必要があると述べています。

このMask Awayの意味が分かりません。

単に隠して見えなくするって意味でしょうか?

ついでにWallの一番上の部分も平にするようにします。

そこでAttribnoiseノードの上にAttribwrangleノードを追加しました。

<Mask Noise>

追加したAttribwrangleノードの名前をAttribwrangle_MaskNoiseと変更しました。

更にWallの形状を管理するParameterを追加するので色を黄色に変更しました。

このNodeでColor Maskを作成するそうです。

<Color Mask>

Color Maskとは「色でどの場所には変更を追加しない。」と指定する方法のようです。

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

Relpointbbox()関数はBoxのBoundaryの値を返すそうです。

この値を利用して床とWallのTopにColor Maskを追加するみたいです。

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

Wallが以下のようになりました。

真っ黒ですね。

この黒い部分はMaskが掛かってない場所という事になるんでしょうか?

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

Chanel Ramp>

これでBoundaryのYを表す部分は赤くなるみたいです。

以下のIconを押してParameter、Rampを作成すると

Wallは以下のようになりました。

うーん。

これはYの値が1の場所つまりWallのTopは赤くなって、Yの値が0である床は黒いままです。

残りはGradientに変化しています。

<Ramp Parameter>

生成されたRampのParameterを弄ると

以下のようになります。

更にRampのParameterの設定を以下のように変形します。

結果、

となりました。

おお、これはWallの上と下をMaskしていますね。

後、凄いTipも言っていました。

このParameterの操作についてですが、追加したPointを消したい時は

Pointを選択したままGraph外にDragすると良いそうです。

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

この関数の機能については来週実装する時に調べます。

今、Tutorialの説明を聞いた範囲で理解した内容を書いておくと、rの値が0.5以下のPointをNoise Maskと言うGroupに追加するようです。

Parameterの最後のSetは何を指しているのかは不明です。

そしたらTutorialでFunctionの機能やParameterの設定が分からない時は、

その関数を選択した状態でF1を押せと言っていました。

F1を押すと以下のBoxが表示されました。

おお。

もうWallの色を変えておく必要は無いので

元に戻します。

Attribnoise1ノードに戻って

GroupにnoiseMaskをセットします。

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

これで完成かと思ったら、

次はBrickにヒビを追加するそうです。

For-Each Connected Pieceを追加します。

下のNodeが見切れて見えませんが、以下のNodeが追加されました。

今までの結果をConnectivityノードにつなげて、

Foreach_Beginノードを選択します。

更に可視化しました。

結果です。

これは最初のBlockだけが可視化されている状態でしょうか?

もう10分すぎてしまったので残りの実装は次のVideoで行うそうです。

はい。

今回のTutorialはここまででした。

6.2 Houdini - Wall Tool 06 [7]を勉強した感想

段々、Houdiniの使用方法が見えてきました。

Proceduralな建物の設定に関しては、このWallの設定を複雑にすれば出来そうです。

WallのTutorialをもう2~3回繰り返したら、全容がもっとはっきりしてもっとすっきりした形で整理出来るでしょう。

7.UEFNの勉強

7.1 How To Tell Who Damages You In Fortnite - UEFN / Creative 2.0 [7]を実装します

<Intro>

特になしです。

以下のUIを表示するそうです。

これは2つの情報を表示していますね。

一つ目はDamageの量、もう一つは誰からDamageを受けたかです。

それぞれの情報をどうやって取得したのかが今回のTutorialの肝になります。

先週は、その辺の理解が甘いまま勉強をしたので、どうやってそれらの情報を手に入れたのか理解していません。

今週はその辺の確認のかねて実装する事にします。

<Initialize Modules and Player List>

hit_detect_device.verseを作成します。

VS Codeで開きます。

Fortnite.com/GameとFortnite.com/Characters moduleを使用出来るようにします。

次にPlayer型のArrayを初期化します。名前はPlayersとしました。

うーん。

VerseのArrayの宣言の仕方を忘れてしまっています。

復習します。

公式SiteのArray [8]を見ると

と書かれていました。

でもこれは変数の宣言ではないですね。

後、TutorialのArrayは

となっていて

中身は何も無いですが、

公式SiteのArray [8]は

要素が最初から指定されています。

Arrayが変数の場合は以下の方法で中身を変更出来ると書いてありました。

Setを使用すれば良いみたいです。

Array全体の値を変更する場合と、Arrayの特定のIndexの値を変更する方法の両方が紹介されていますね。

はい。

理解しました。

<Create and Subscribing HandlePlayerHit Function>

Playerに値をセットします。

これはこの方法でGameに参加している全てのPlayerを得る事が出来ると覚えるしかないですね。

次にPlayerがHitされた時にどうするかを指定する関数を作成します。

HandlePlayerHitと言う名前にしていました。

そしてこの関数を呼ぶ実装を追加します。

<Testing out Function>

GameをPlayしてPlayerの操作するCharacterがDamageを受けたらこの関数が呼ばれるかどうか確認します。

どうやったらDamageをPlayerに与えられるのかが分かりません。

Tutorialでやっていたように高い所から飛び降りたんですが、Damageが入りませんでした。

Guard Spawnerを配置しました。

これで敵のNPCがSpawnされるはずです。

それに打たれたらDamageが入るでしょう。

これで試します。

Damage食らっていますが何も表示されません。

hit_detect_device.verseをLevel上に配置するのを忘れていました。

もう一回Testします。

今度は表示されました。

されたんですが、あまりにも一瞬過ぎてScreenshotには撮れませんでした。

先週のBlogにまとめた画像とまったく同じでした。とだけ記録しておきます。

<Using damage_result struct>

誰が誰にDamageを与えたのかを知りたい場合はどうすべきでしょうか?

DamageResultを使用するそうです。

公式Siteのdamage_result struct [9]です。

これを見るとDamage_ResultはStructでDamage Eventが発生する度に生成されるみたいです。

そのStructのMemberには以下のものがあり、

TargetはDamageを受けたObjectの情報を保持しています。

TargetのTypeはDamageableとなっていますが、これってどんなTypeなんでしょう?

まあ良いです。こんだけ理解出来たら十分です。

<Getting Target who was Damaged>

次にTargetの中のObjectがfort_characterであるかどうかを確認します。

以下の実装で確認します。

以下の部分はTarget型をfort_character型にCastしているんでしょうか?

この用法はよく分かりませんね。

<Getting Damage Amount>

今度は受けたDamageも取得します。

これは先程のDamage_ResultのStructのMemberにあるAmountを使用すればいいだけです。

しました。

更にDamage量を表示するために以下の実装を追加しました。

<Getting Instigator / Player who Caused Damage>

ここが先週、何をしているか理解出来なかった場所です。

先程のdamage_result struct [9]によるとInstigatorの機能は以下のようになっています。

CodeやEnvironmentなどでPlayerがDamageを負った場合はFalseになるそうです。

うん。

これは理解しました。

次に以下の実装でInstigatorからDamageを与えたObjectがfort_characterかどうかを確認しています。

この実装はそれだけじゃないですね。

先週のBlogに書いてあった

これについてもう一回Tutorialを見て何と言っていたのかを確認します。

見ました。

InstigatorはOptionalで実際にあるかどうかは不明だから?をつける必要があると言っていました。

damage_result struct [9]のInstigatorの解説を見てもそんな事は書かれていません。

これはFaultだった場合の事を言っているのだと思います。

はい。

でもまあこの部分の実装の意味は理解しました。

次に行きます。

<Skip Here if you don't Care About Optionals lol>

次に以下の実装を追加します。

これが何をやっているのか意味不明です。

先週は

とまとめましたがそうなんでしょうか?

公式Siteのfort_character interface [10]を見ると

Exposed Interfacesの中にDamageableがあります。

このDamageableの公式Siteのdamageable interface [10]を見ると

以下のDamageというFunctionがあります。

これを読むと、Damageを使用するとそのObjectにDamageを与える機能のようです。

となると先週の解釈は合っていたのか。

これ結果はどうなるんでしょうか?

Playerが高い所から落ちてDamageを受けた場合です。

  1. PlayerがDamageを受ける

これで終わりです。

次にPlayerが他のPlayerからDamageを受けた場合です。

  1. Playerが他のPlayerからDamageを受ける
  2. Damage関数が呼ばれて先程の2倍のDamageを受ける

こうなると思います。

あれ、GuardからDamageを受けた場合はどうなるのかな?

一応、GuardもFort_CharacterなのでDamage関数は呼ばれるはずです。

そしてDamage関数によるDamageはCodeによるDamageなので更なるDamage関数は呼ばれないはずです。

更に以下の実装も追加しました。

これで他のPlayer(NPCも含む)からDamageを受けた場合、更に分かり易くなりました。

<Second Result>

この状態でTestしています。

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

うーん?

これってTutorialの結果と違いますね。

何が起きているか分かりました。

Damageを与えたPlayer(NPCも)が与えたDamageの2倍のDamageを受けていました。

でもそれだと何故GuardのCharacterがDamageを受けた時は以下のCodeが実行されないんでしょうか?

あ、分かりました。

多分ですが、以下のCodeが実行された時はまだ

Guardは生成されていないんだと思います。

のでGuardがDamageを受けた時はHandlePlayerHit()関数が呼ばれないんだと思います。

となるとこれで完成しちゃいましたね。

もしかしたらもう少し直さないといけない部分もあるかもしれませんが、最初の目的は達してしまったのでここまでとします。

来週はもう少し深堀するかもしれませんし、しないで次のTutorialに行ってしまうかもしれません。

今週はここまでです。

8.DirectX12の勉強

8.1 Lötwig Fusel氏のD3D12 Beginners Tutorialを勉強する

8.1.1 先週の復習

先週で今までやっと所まで追いついたはずです。

先週のBlogを読んで何を勉強したのかを確認します。

分かりました。

先週はDebug Layerの実装まで終わったんですが、その実装が何をやっているのかが全く理解してないのでその勉強を今週やる事にしたんです。

なので今週は先週実装したDebug Layerの内容について勉強します。

8.1.2 先週実装したDebug Layerの内容についての勉強

まずDebugLayer.hの実装です。

Member Functionは以下の2つだけですね。

これは普通のClassでもよくあるMember Functionですね。

次のCodeです。

Debugの場合のみにID3D12Debug6型の変数であるm_d3d12Debugと

IDXGIDebug1型の変数であるm_dxgiDebugを宣言しています。

これは前に作成したComPointerを使用していますね。

こっちも勉強する必要がありますね。

次のCodeです。

これはConstructorですね。

でもSingletonと書かれています。

これPublicだから別にどこでも宣言出来ると思うんですがそれでもSingletonになるんでしょうか?

一寸その辺が分からないですね。

次の実装です。

これは単なるGetterですね。

SingltonなのでSetterはないのは当然ですね。

最後のCodeです。

これは関数を宣言しているのか?

でもPrivateですね。

うーん。

これはSingltonの書き方をもう一回勉強する必要がありますね。

2023-06-11のBlogでSingltonの勉強をしています。

この辺の復習からやって行きます。

2023-06-11のBlogを読んでいたら以下のCodeとほぼ同じCodeがありました。

これはSinglton用のSetterでした。

いやこれがConstructorになるのかも。

2023-06-11のBlogの例はStaticを使用してSingletonを作成しています。

この例とはかなり違います。

ただ以下の意味は分かりました。

これはSingltonなので複製を作れない様にするための実装でした。

以下のGetterの意味がよく分かりませんね。

この中でDXDebugLayer型の変数InstanceをStaticで作成しています。

Instanceが既に生成されている場合は前に生成されたInstanceが返るはずです。Staticですから。

Instanceが無い状態でこのGetterが呼ばれた場合、どうなるんでしょうか?

以下の関数が呼ばれるのか。

となるとこれはConstructorになるのか。

うん。

確かにこのやり方でもSingltonになりそうですね。

次にDebugLayer.cppを勉強します。

まずInit()関数の実装です。

Debugでは時はFalseが返って終わりですね。

Debug時はGetDebugInterface()関数で何かをしてその後にEnableDebugLayer()関数でDebugをEnableしています。

これはID3D12Debug6型やIDXGIDebug1型を使用するための一般的な方法だったはずです。

確認します。

2023-10-09のBlogで勉強していました。

読み直したら、こことまったく同じ方法でDebug Layerを使用していました。

ただしここにはDXGIのDebugに関してはここには何も書かれていません。

2023-10-15のBlogを見るとDXGIのDebugは以下のように実装していました。

む。

_dxgiFactoryの型を確認します。

これは全然違う型ですね。

いろんなやり方がある位の理解に留めておきます。

一寸短いですが今週はここまでとします。

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

8.2.1 先週の復習

「4.6.3 D3DCompileFromFile()関数」を勉強していました。

それぞれのParameterの機能について簡単にまとめています。

そして以下の実装したargumentについて

簡単にまとめておきたいが時間がないので来週する。と書いていました。

今週はこれからやりますか。

8.2.2 D3DCompileFromFileのArgumentの機能を確認する

まずVertex Shader用の設定からみます。

最初のL"BasicVertexShader.hlsl"です。

元々このParameterは

となっています。

ので当然、以下のFile名が入る事になります。

2番目のArgumentは

です。

2番目のParameterは以下の機能となっています。

何も指定する必要がないのでnullptrになっていると思われます。

三番目のArgumentです。

三番目のParameterの機能は以下のようになっているそうです。

D3D_COMPILE_STANDARD_FILE_INCLUDEの機能について以下の解説が表示されました。

うーん。

まずany APIという説明が曖昧でどんなAPIなのか具体的には全く理解出来ません。

教科書見たら簡潔に解説してありました。

D3D_COMPILE_STANDARD_FILE_INCLUDEはShader内に書かれたIncludeで指定されたFileの全てをCurrent Directoryから参照してくれる機能があるそうです。

うーん。

そう言う事なのか。

最後の文のpSourcefileが何なのかは分からないままです。

四番目のArgumentです。

このParameterは以下の指定をします。

一番目のParameterではFile名を指名してこの四番目のParameterではShader名を指名しているんですね。

Shader名は以下の名称の事ですね。

そう言えば以下のPropertyの設定を変更した時に

EntryPoint NameにBasicVSを指定していました。

五番目のArgumentです。

このParameterはpTargetと呼ばれて以下の役割を分担しています。

これはVertex Shader用なのでそのままvs_5_0を指定しただけですね。

六番目のArgumentです。

このParameterはFlag1と言う名称で呼ばれ以下の役割を担当しています。

Argumentの機能については公式siteのD3DCOMPILE Constants [10]に簡単な解説がありました。

です。

教科書にも簡単な解説が載っていました。

D3DCOMPILE_DEBUGはDebug用に使用され、D3DCOMPILE_SKIP_OPTIMIZATIONはShaderの最適化を行わないそうです。

そのままですね。

七番目のArgumentです。

これは以下の説明しかなかったです。

八番目のArgumentです。

このParameterに関しては先週のBlogでは以下のまとめしかしてなかったです。

教科書にもこのParameterに関しては何の解説も無かったです。

D3DCompileFromFile function (d3dcompiler.h) [11]には以下の解説がありました。

後で何かに使用するんでしょうね。

最後のArgumentです。

そのままですね。

はい。

Pixel Shaderに関してはほぼ同じなので省略します。

はい。

今週はここまで力尽きました。のでここで終わりにします。

9.まとめと感想

なしです。

来週は軽い手術をする予定なので、もしかしたら休むかもしれません。

10.参照(Reference)

[1] Castle Wall Tool. (n.d.). https://www.youtube.com/playlist?list=PLNbgmFvU__fiPhyUWHHzZ2Nv5ieM_bOdB

[2] Gediminas Kirdeikis. (2023, April 30). Unreal Engine 5 for Architecture - 2023 Full Beginner Course [Video]. YouTube. https://www.youtube.com/watch?v=bT8aSTkpkDY

[3] HDRI backdrop. (n.d.). Unreal Engine Documentation. https://docs.unrealengine.com/4.26/en-US/BuildingWorlds/LightingAndShadows/HDRIBackdrop/

[4] Urban Decoders. (2023, November 18). How to 3D Gaussian splat from Aerials to Unreal 5 (Free plugin) [Video]. YouTube. https://www.youtube.com/watch?v=SDO1XdFXl8M

[5] Notion – The all-in-one workspace for your notes, tasks, wikis, and databases. (n.d.). Notion. https://lumaai.notion.site/978320d3a9da4eec8b4f4590583a8282?v=cdf60ce52b6d4e1aa75eaa9bc7e75b43

[6] Ben Cloward. (2023, October 12). Worn-Out LCD Screen Shader - Advanced Materials - Episode 25 [Video]. YouTube. https://www.youtube.com/watch?v=i4EXZdpVdT0

[7] Rick Banks. (2022, June 20). Houdini - Wall Tool 06 [Video]. YouTube. https://www.youtube.com/watch?v=o6Jfgv_FXWs

[8] Array. (n.d.). Epic Developer Community. https://dev.epicgames.com/documentation/en-us/uefn/array-in-verse

[9] damage_result struct. (n.d.). Epic Developer Community. https://dev.epicgames.com/documentation/en-us/uefn/verse-api/fortnitedotcom/game/damage_result

[10] Stevewhims. (2022, February 13). D3DCOMPILE Constants (D3DCompiler.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/direct3dhlsl/d3dcompile-constants

[11] Stevewhims. (2022, July 27). D3DCompileFromFile function (d3dcompiler.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3dcompiler/nf-d3dcompiler-d3dcompilefromfile

 

UE5の勉強 -映像作品としてのLandscapeを作成する-

1. 今週の予定

<映像作品としてのLandscapeの作成>

建築用のLevelの作成の勉強の続きをやります。

建物の作成の続きをやります。

Niagara の勉強>

Unreal Engine 5で学ぶビジュアルエフェクト実装 基本機能からNiagara、シミュレーションまで」の実装の続きをやります。

<Materialの勉強>

Ben Cloward先生のTutorialを勉強します。

<Gaeaの勉強>

GaeaのTutorialを作成します。

<Houdiniの勉強>

Castle Wall Tool [1]の勉強をやります。

<UEFNの勉強>

Pi Equals Three氏のTutorialをやります。

<DirectX12の勉強>

DirectX 12の魔導書」の勉強をやります。

更にLötwig Fusel氏のDirectX12のTutorialをやります。

2. Landscapeの作成

2.1 今週の勉強内容を復習する

先週の勉強内容を復習して今週勉強する内容を確認します。

Unreal Engine 5 for Architecture - 2023 Full Beginner Course [2]の勉強内容を復習します。

まずLandscapeに配置する草を探していました。

以下のAssetから配置できそうな草を探します。

次に室内にCameraを配置して以下の調整をしていました。

Cameraはもう一個室内に配置する必要があります。

これも今週やります。

最後に現実の映像とUEを組み合わせる方法を勉強しています。

今週は具体的にどれかのTutorialを勉強します。

2.2 Unreal Engine 5 for Architecture - 2023 Full Beginner Course [2]の勉強の続きをやる

これらのAssetの草や岩で使用出来そうなのを調査します。

先週、夜の回線速度が規制されてない時間に全部のAssetをInstallしておいたんですが、間違って別のProjectにInstallしてしまいました。

まあいいです。

このProjectにあるLandscape用のMaterialを使用して以下のLandscapeをテスト用に作成しました。

<Procedural Biomes>

まずBush系のAssetでは以下の物がありました。

静止画ではよく分からないですが質はあまり良くないです。

後白過ぎます。これが直せるのかどうか不明です。

落ち葉系のAssetです。

そのままでは使用出来ないと思いました。質が悪すぎです。

木の根っこです。

このAssetの質はともかくとして木の根っこはPhoto-RealisticなLandscapeを作成するには必須のAssetと思いました。

草のAssetです。

使えそうなのだけ配置しました。

ほとんどの草は日本では見た事ない草です。

これをそのまま使用できるのかとなるうーんとなってしまいます。

更に全部色が白過ぎます。

<Procedural Nature Pack Vol.1>

こんなのしかなかったです。

ここにある草は日本では全く見ない草ですね。

<Realistic Forest Pack>

これはInstallするのを忘れていました。

<Nature Package>

以下のGrassがありました。

まずこれです。

これドっから見てもタンポポですよね。

これは使えます。

隣の花も道端によく咲いている花です。

後以下の草はススキの代わりに使用出来そうです。

<Scanned Poplar and Aspen Forest>

以下の草がありました。

チューリップとか野生で咲いてる訳ないです。

<Spring Landscape>

これは草のMeshとかは無かったです。

以下のようなLandscapeが形成されていました。

うーん。

凄い。

Landscapeに使用されているMaterialの実装を見てみます。

Layerは12個ありました。

最初のLayerを見てみます。

色々なMaterialを混ぜてLayerを構成していてどれが最初のLayerなのかははっきりとは言えない構成になっていました。

以下にその要素の一つを示します。

あれ、このF_Grass_01ってどんなNodeなんでしょう。

Material Function Callって書いてありました。Material Functionを呼び出しているみたいです。

以下のMaterial FunctionがSetされていました。

中身をみます。

これはMaterialをそのままMaterial Function化していますね。

うーん。

これはこれで勉強になりそうです。

後でじっくり見る事にします。

<Stone Pine Forest>

以下の草がありました。

結構、日本の草に似た形状の草がありました。

以下に個別に示します。

名前は分かりませんがこんな感じの草生えてた気がします。

ヨモギに似ています。

こんな感じの雑草もありますね。

ドクダミじゃないですが似た葉っぱの形状のやつです。

これもありますね。

長い草のやつです。

<Tropical Jungle Pack>

以下の草がありました。

うーん。

笹はここにもないのか。

でもそこそこ使用出来そうな草がありました。

これ里芋の葉っぱにそっくりです。

次がこれです。

こんな草もそこら中に生えてそうです。

2.3 日本の草を調べる

よく考えたら日本にどんな草が生えているのかよく知らなかったです。

調べる事にします。

色んなSiteを見てこの雑草は見覚えあるというのをここにPickupしました。

後、私の近所だと野生化したアブラナがそこら中に生えてたりします。

後、ススキがないですね。

何でススキは雑草じゃないんでしょうか?

それぞれのImageも調べておきます。

ススキです。

春のススキって以下のような形状だそうです。

タンポポ

この雑草を知らない人はいないでしょう。

一応、Google検索の結果を以下に示しておきます。

ドクダミ

ドクダミって日陰に生えてる気がします。

ヒメジョオン

ハルシオンって名前だと思っていました。

エノコログサ

猫じゃらしの事ですね。

ヨモギ

ヨモギです。

<スギナ>

スギナです。

<ヤブカラシ>

これも良く見る雑草です。

2.4 似た草のAssetを選択しています

タンポポです。

ヒメジョオンの代わりです。

ヨモギの代わりです。

ヤブガラシドクダミの代わりになりそうです。

ヤブガラシは蔓ですが、そんな事まできにしないでしょう。

春のススキです。

秋のススキの代わりです。

この辺で試してみます。

ただし実際に試すのは来週にします。

2.5 もう一個Cameraを室内に配置します

Cameraの配置の方をやる事にします。

寝室にセットしました。

以下の設定の調整をします。

<画面が狭かったらCurrent Focal Lengthの値を下げる>

これはこのままでいい気がしますが一応値を変更して確認します。

Current Focal Lengthの値を20に変更しました。

ベッドに人が寝そべっている場合はこの位の画面が丁度いいかもしれませんが、部屋全体を表す時は元の画面の方が情報量が多くて良い気がします。

今度は逆に

Current Focal Lengthの値を10に変更しました。

今度はベッドの両端に情報の無い空間が発生してしまいました。

やっぱり最初の状態が一番いいですね。

<画面が暗かったらExposure Compensationの値を上げる>

これは先週が試していませんね。

以下のParameterです。

試しにExposure Compensationの値を5にしてみます。

おお、真っ暗です。

今度はExposure Compensationの値を15にしてみます。

これはまぶしすぎます。

最初の値に戻します。

この機能はUE内ではなくて現実の空間で撮影する時に重要なParameterと言えそうです。

Lightを自由に配置出来るUEでは、この機能に頼らなくても適切な明るさで撮影出来るからです。

Spheresを画面内に配置して画面の暗さなどを確認>

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

何故か、この場所にセットしたCameraが別な場所に移動してしまいました。

Cameraの位置を元に戻します。

うーん。

完全に同じにはなりませんね。

これぐらいで我慢します。

<もう一回、Current Focal Lengthの値を調整>

Current Focal LengthはSphereを配置したからと言って変更する要素は特にないですね。

<もう一回、Exposure Compensationの値を上げる>

こっちは変更したらよくなる可能性があります。

黒のSphereの色がかなり明るい気がします。

Exposure Compensationの値を10から8.75に下げてみました。

うーん。

どっちも良い感じです。

ある条件だとどっちかが良いとかあるのかもしれません。

<Focus Distanceを調整>

これは忘れていました。

こんな感じで指定してみました。

結果です。

良くなっているのか不明です。

そもそも室内ではFocus Distanceの後ろの被写体もそんなに後ろに位置している訳ではありません。

それこそ誤差の範囲でしょう。

室内の撮影ではこの調整で見た目が変わるのか不明です。

2.6 現実の映像とUEを組み合わせる方法を勉強する

先程のBedに寝ている人でもCGで追加してみたいです。

その方法について調べてみます。

"Unreal Engine: Step-by-Step Green Screen Import Guide!" [3]でGreen ScreenをUE5で使用する方法が解説されていました。

この辺から勉強してみます。

最初の3分位は以下のMapの説明だけでした。

必要ないのでその部分はSkipします。

MediaからImage Media Sourceを作成します。

Test1と名付けました。

このFileを開いてSequence Pathに以下のImagesの最初のImageを指定します。

あれ?

こんなImagesの説明、いつしたんでしょうか?

そしてFrame Rate Overrideに

このImagesのFrame Rateをセットします。

Tutorialでは60 FPSをセットしていました。

今度はMedia Playerを作成します。

うーん。

画面が小さい。

ここで画面がZoom inしてくれました。

やっとBox内の文字がしっかり見えるようになりました。

Video output MediaTexture AssetをEnableします。

今度はTest1bと名付けていました。

これの名前を変更した瞬間に

Test1b_Videoが作成されています。

これって自動で作成されるものなんでしょうか?

何か編集で途中を間違って消してしまった感じにも見えます。

次にPlaneを配置しました。

ここにGreen Screenの映像を投影するんでしょうか?

先程、突然生成されたText1b_VideoをここにDragしました。

した瞬間に

以下のMaterial?が生成されました。

これ説明してほしいです。

そして以下の場所からLevel Sequenceを追加します。

以下に示したお馴染みの画面が表示されます。

まずFrame Rateを60 fpsに変更します。

+Trackを押してMedia Trackを追加します。

するとMediaが以下の場所に追加されます。

+Mediaを押してMedia Sourceを選択、そしてtest1を選択します。

以下のようになります。

Test1の辺りを右Clickして以下のBoxを表示させます。

Propertiesを選択してMedia Textureを選択し

Test1b_Videoを選択します。

すると以下のようなImageが表示されました。

これで完成だそうです。

この後はCameraをLevel Sequenceに追加する方法とか説明していました。

この先は別にまとめる必要ないかなと思っていたらCameraが動かないようにPinで止める方法を説明していました。

Cameraの画像が表示されている所の左下にPinがあるのでそれをClickするだけだそうです。

知らんかった。

試してみます。

Pin止めした後にPilot Actor ModeになってCameraを動かしてみました。

普通に動いています。

はい。

Pinが外れていました。

あ、分かりました。

このPinをしておくと

Cameraの選択を止めてもPreview画面がずっと表示されるようになります。

こんな感じです。

Tutorialを見直したら、このPreview画面をずっと表示したかったらPinで止めておけ。という意味で言ってるみたいです。

うーん。勘違いした。

Cameraの設定も色々弄っていました。

これも記録する必要ないかなと思ったら

Focus MethodでTrackingにセットしたりしていました。

後は特に記録しないといけない情報は無かったです。

うーん。

こんだけか。

まあUEにおけるGreen Screenの使用方法が分ったので良しとしましょう。

<追記>

How to 3D Gaussian splat from Aerials to Unreal 5 (Free plugin) [4]に無料で3D Gaussian Splattingをやる方法が載っているみたいです。

これも来週試してみます。

3. Niagara の勉強

3.1 先週の復習

先週、何を勉強したのかまったく覚えていません。先週のBlogを読み直して復習します。

「木の生成Simulations」の実装をやっていました。

思い出しました。

Custom HLSLノードの実装の手前までやったんです。

今週はCustom HLSLノードの実装をやります。

その前に木の生成のAlgorithmの復習をします。

これを実際に実装するため枝(幹)の始点と終点を管理してその間に線を引きます。

点は以下のようにそれぞれのIDが割り当てられています。

このIDはFloor((ID-1)/2)の計算でそれぞれの親のIDを求める事が出来ます。

つまりIDからそのPointからどのPointに線を引けば良いのかが判明します。

後は次の点の位置の決定方法です。

  • 親の進行方向のVectorを取得します。
  • その方向に前進します。
  • ある程度前進したらランダムな方向に移動します。

後、教科書ではこの点の始点についての解説は無かったですが、当然親の点の位置から開始しているはずです。と言う事は親の点の位置も取得しているはずです。これは実装する時に確認すると書いていました。

更に教科書には移動した後の位置を記録する話が書いてないです。これは絶対記録しているはずです。とも書いていました。

はい。

大体こんな感じでした。

うーん。まだ全体像がはっきりしてない部分がありますね。

まあ、最初なんでこれぐらいで簡単に済ませる事にします。

3.2 「14.3.5 HLSL Codeを追加する」を実装する

必要な変数を初期化します。

Boolean型の変数 _Validは初期値が無いですね。

教科書の説明によるとこの変数はAttribute Reader内でAttributeの取得に成功したかどうかを示すためのものだそうです。

次にRandom Numberを生成するための関数を実装しました。

これはSample CodeからそのままCopyしました。

教科書によるとこの関数の実装は4章で勉強したそうです。

4章は勉強してないので後で見る事にします。

次に自身のIndexとその親のIndexを取得します。

む、Indexなんて変数あったかな?

無いです。

実装を見ると

ResultがIndexの値を保持しているはずです。

Sample Codeで確認したら

ResultじゃなくてIndexが正しい変数名でした。

直します。

何故かこの変数だけ最初の文字がLower caseになっています。

次に親Pointの位置、親Pointの進んだ方向、そして親Pointが幹から枝分かれして何番目かを示す数を取得するための実装をします。

やっぱり親Pointの位置を取得していました。

次に枝の長さをDepthから計算するそうです。

これは初めて知りました。

たしかに深くなればなるほど枝の長さが短くなるのは当然です。

LengthFactorの値はMaxDepthからOutDepthを引いて決定しています。

これだと枝の先に行くほど数字が小さくなります。

簡単なTrickですが有効な方法です。

この実装で使用されている変数は全部確認しました。InputかOutputのどれかに該当しました。

そして終点の位置を計算します。

まずRandomな方向を計算します。

細かい計算については2度目の勉強で検討する事にします。

次にここで計算された値を使用してPositionを計算します。

OutForwardの計算を自身のPositionから親のPositionを引いて求めています。

これ何となくは理解出来るんですが厳密に正しいのかどうか検証しないと分からないです。

しかしそれは今はやりたくないのです。

合ってると仮定して先に進みます。

最後にIDが0の場合の計算を実装します。

うーん。

細かい計算や理論はともかくとして全体の流れは大体理解しました。

最初の勉強なのでこんなもんで良いでしょう。

Applyを押したらErrorになりました。

どうもDirectionMultiplyのSpellが間違っていたみたいです。

Lが抜けていました。

直したらErrorが消えました。

Niagara Systemに戻ってSolve Moduleの全てのParameterの値を代入しました。

Tutorialだと以下のようなPointがバラバラになったPreviewが表示されていますが、

私の結果は以下のようにPointが一個しか表示されていません。

うーん。

これはどっか間違えているみたいです。

Attribute Readerがないです。って言っていました。

Sample Codeを見ると以下のようにEmitter Spawn Sectionにある[EMITTER] Attribute Readerが無いです。

教科書を見直したら普通にAttribute Readerをこの位置にSetしていました。

先週のBlogを見直したらこの部分の作業を完全に抜かしていました。

Attribute ReaderをEmitter Spawn Sectionに追加します。

更に設定でEmitterの名前も追加しました。

これでCompileし直します。

またErrorになりました。

うーん。

理由が分かりませんね。

分かりました。

CustomHLSLノードのInputとOutputのTypeが何故か全部Niagara IDに代わっていました。

全部直しました。

結果です。

綺麗に出ました。

次に枝を作成します。

最初は枝を作るためのMaterialを作成します。

そしてRender SectionのSprite Renderer Moduleの

Materialにセットします。

更にAlignmentの値をCustom Alignmentに変更します。

教科書ではいつの間にかSprite Based Line ModuleがSolve Sectionに追加されていました。

追加します。

また教科書の図が間違っていました。

Sprite Based Line Moduleと書いていますが

これはRender SectionにあるSprite Renderer Moduleの設定のはずです。

確認のためにSample Codeを見たら

やっぱりそうでした。

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

結果です。

おお、凄い。

凄いけど色が一寸違いますね。

値を変更して以下の色にしました。

これなら一応木に見えます。

葉を追加します。

まず葉のためのMaterialを作成します。

Sample Codeで確認するとM_Lineと全く同じ実装でした。

葉の色を指定するためのParameterを作成しました。

User Parametersで作成しています。

ここで作成するとLevel上に配置した時にDetailで設定出来るようにようになるんでしたっけ。

葉のためのSprite Render Moduleを追加しました。

今はこんな感じです。

Color Bindingに先程作成したParameterであるLeafColorをセットしました。

結果です。

何故か葉が光っています。

でも綺麗ではあります。

Sample Codeの値を代入しました。

それでもでも光っていますね。

今度は葉を形成する位置を正しくします。

Depthの値が一定以下のPointには葉が形成されないようにします。

まずVector2D型の変数、LeafScaleを作成します。

うーん。

これでどうやってDepthの値を判別するんでしょうか?

まずこの変数をSolve Sectionに追加しました。

現状のParameterは以下のようになっています。

これを以下のように変更しました。

ここまで複雑だとProgrammingしているのと変わらないです。

Scratch Pad ModuleでCode書いた方が良い気もします。

どのくらいの複雑さまで許容すべきなんでしょうか?

最後に

Render Sectionの葉を形成する方のSprite Renderer Moduleの

Sprite Size Bindingに[PARTICLE] LeafScaleをセットします。

結果です。

綺麗に葉が生成されています。

枝の最後の部分だけ葉が形成されています。

はい出来ました。

今週はここまでにして、来週「木の生成Simulation」の総括をします。

もう少し理論的にもProgramming的にも深く理解したいので、もう一寸だけ勉強します。

4. Materialの勉強

4.1 Worn-Out LCD Screen Shader - Advanced Materials - Episode 25 [5]を勉強します

以下のような見た目のMaterialを作成するみたいです。

今回はUnity回みたいです。

Unrealでの実装は後の方にありました。

このAnimationを作成するために以下のTextureを作成していました。

これは結構大変です。

FlipBookノードを使用してこれらのTextureをAnimation化していました。

これはMaterialの設定を変えたらそのまま使用出来るはずですが、それを敢えてしないでこの方法で実装しているのか、それともBen Cloward先生がその設定方法を知らないのかは不明です。

Animation Phaseの実装は以下のようになっていました。

Animation Phaseは何を指定しているんでしょうか?

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

Dot Gridの実装です。

これ途中でLengthノードがあるのでその時点でVector2からFloatになっていると思うんですが、それがDot Gridの値なんでしょうか?

解説を聞くとやはり最初のNodeであるMultiplyノードのAの値はTexCoord[0]でした。

のでこの時点ではVector2です。

AddのBはSizzle Lineの実装結果をPassしているそうです。

これは後で説明するので今はSkipするそうです。

Flipbookノードの結果をLerpノードのAlphaに繋げます。

InvLerpノードのValueにDot Gridの実装を繋げます。

その結果を以下のLerpノードのAlphaに繋げます。

Dotの色を指定していると思われます。

最初のLerpノードのAlphaはどこで計算しているんでしょうか?

これはTutorialで直ぐに説明してくれました。

TexCoord[0]ノードの値に以下のMaskノードを追加して

Gの値を取り出したものだそうです。

ふーん。

だから横線がはっきりしているのか。

納得です。

次はVignetteの実装です。

Inputは全部、TexCoord[0]でした。

Vignetteって外枠がぼやっと黒くなるやつの事だったはずです。

Cameraの設定で何回も使用しています。

要はTexCoord[0]の値で0か1に近い所が黒く、つまり0に近い値になれば良い訳です。

そういう計算を実装している訳です。ここでは。

こんな結果になっていました。

その結果をMultiplyノードのAにつなげて更にBase Colorに繋げてました。

Brightness Flickerを実装してました。

これは画面の中央が白く光っているのを再現していると思われます。

ここのSineノードのPeriodの値は6.2に変更されていました。

結果はここに追加していました。

Sizzle Linesの実装です。

これは点滅するDotに僅かなばらつきを追加するための実装だそうです。

MaskノードはTexCoord[0]の値をInputしています。

当然、計算結果は最初に勉強したDot GridのAddノードのBに繋がっています。

ここで使用されているNoiseノードの設定です。

最後にScreen Onの実装です。

最初のMultiplyノードのAの値は以下の実装から持ってきていました。

Maskノードの方は予想どおりTexCoord[0]ノードの結果をPassしていました。

Screen Onの結果は以下のMultiplyノードのBに繋がっていました。

以上でした。

結構Volumeがありました。

来週実装しますが、どのくらい深堀するか、簡単にやって全部終わらせるか、それぞれの機能をしっかり勉強するかは来週実装する時に決めます。

5. Gaeaの勉強

今週は病院に行く予定が出来たのでPowerPointの作成だけやりました。

5.1 Tutorialの作成

先週で3つの工程の最初の工程である「地形(Terrain)の作成」が終わりました。

ので今週は今までのTutorialの総括編を作成します。

<3つの工程の復習>

Gaeaにおける地形の作成は以下の3つの工程によって構成されています。

  • 地形(Terrain)を作成
  • 色を付ける
  • Buildをする

前回までのTutorialで第一の段階である「地形(Terrain)を作成」が終了しました。

今回の総括編ではこの「地形(Terrain)を作成」の内容についてまとめました。

「地形(Terrain)を作成」は以下の3つで構成されています。

  • 粗削りな地形を作成
  • 表面に細部を追加
  • 時間経過(風や水による地形の変化)

<粗削りな地形を作成>

まずここでGaeaでは最初に配置出来るNodeはPrimitiveかGeo-Primitiveに属するNodeだけだという事を教えます。

その後で、全く訳が分からない初心者でもGeo-Primitive Groupに属するMountainノードを使用するとそれなりの地形が作成出来る事も教えます。

となるとまずMountainノードの使用方法を覚えるのが大切になる訳です。

そこでMountainノードのPropertiesの意味について解説します。

そのついでにProperty一般の操作方法についても解説しました。

<表面に細部を追加>

次に作成された地形に細部を追加します。

これはLook Dev Groupに属しているNodeが担当します。

ここでは地学的に重要な4つのNodeについて勉強します。

  • Fold,
  • Shear,
  • Stack,
  • Shatter

更にこれらと非常に関連の深い以下の2つのNodeについても勉強します。

  • Fault
  • Terrace

Gaeaには沢山のNodeがあり最初から全部のNodeの機能を覚えようとすると必ず失敗します。その結果一個もNodeを覚えられない結果になります。

のでこのようにGeologyの観点から重要な用語のNodeから使用方法を覚えると良いです。

更にこれらのNodeの使い方が分からない初心者に対してSurfaceノードの使用方法も解説しています。

<時間経過(風や水による地形の変化)>

最後に時間経過を地形に追加します。

これはErosion Groupのノードが担当しています。

ここはまず、Erosion Groupのノードの代表としてErosionノードについて勉強しています。

特に以下のPropertyについて勉強しました。

  • Apply Changes
  • Rock Softness
  • Strength
  • Downcutting
  • Inhibition

更にErosion GroupにあるGeologyに関連の深い用語を使用している以下の4つのNodeについても勉強しました。

  • Deposit
  • Sediment
  • Alluvium
  • Stratify

もう少し整理したかったんですが、ここまでしか出来なかったです。

残りは後でやります。

PowerPointのAnimationを直す>

直しました。

<まとめを作成する>

出来ました。

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

6. Houdiniの勉強

6.1 Houdini - Wall Tool 05 [6]を実装する

<Intro>

特にやる事は無しです。

<Meta Import>

Meta Import ノードを使用します。

ForEach_Begin1ノードを選択します。

ForEach_Begin1ノードのParameter Paneです。

ここにあるCreate Meta Import Nodeを押します。

以下のようにforeach_begin1_metadata1ノードが生成されました。

<Create Meta Import Node>

foreach_begin1_metadata1ノードのPropertyには以下に示した様に

Detail AttributesにIteration、numiterations、value、そしてivalueが表示されています。

Attribwrangleノードを追加します。

更にforeach_begin1ノードの結果を第一Pinに

foreach_begin1_metadata1ノードの結果を第二Pinに繋げます。

結果です。

それぞれのPointのNormal Vectorを表示しました。

ここからUp方向のVectorとCross Productsして内向きのVectorを作成します。

<Construct an Up Vector

Attribwrangle2ノード内のVEXpressionに以下の実装を追加しました。

ここでUp方向のVectorは{0,1,0}と表示します。

これはHoudiniにおいてY軸が上を向いているからです。

今度はこのv@sideを可視化します。

以下のIconを右Clickします。

すると以下のBoxが表示されます。

Sceneの+を押して以下のBoxを表示させます。

そしてMarkerを選択します。

すると以下のBoxが表示されます。

Lebelの値をsideに変更しました。

更にAttributeの値もsideに変更します。

Styleの値をVector Trailとしました。

Length Scaleの値を以下のように下げました。

結果です。

あれ?

何も表示されません。

Tutorialの結果は

となっています。

以下のIconがOffになっていました。

Enableすると

以下のように表示されました。

今度はRandom Valueを作成します。

“multi”を生成するために

を押します。

Multiが生成されました。

この生成されたRandom Valueに基づいてPointの位置を移動します。

AttribwrAngleノードの名前をAttribwrangle_BrickJitterに変更します。

最後にAttribwrangle_BrickJitterのNodeの色を黄色に変更しました。

これはAttribwrangle_BrickJitterノードが壁の形状を決定するためのParameterを持っているからです。

Attribwrangle_BrickJitterノードの結果をCopytoPoints2ノードのInput2に繋げます。

何故かDotで繋がっています。

Tutorialでは実線で繋がっています。

Foreach_end1ノードを選択し可視化します。

結果です。

Attribwrangle_brickJitterノードに戻り、Multiの値を変更します。

結果です。

おお。

Brickの位置がバラバラになりました。

今度はBrick同士の間に少しだけGapを追加します。

<Carve Node>

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

Attribwranble_brickJitterノードの結果をCarveノードのInputに繋ぎました。

Carveノードの可視化をします。

CarveノードのFirstUの値を変化させると

線の長さが変化しました。

Relative Channel Referenceを選択します。

ここでTutorialでは

となっていますがこのDrop Actionが表示されません。

Tutorialを見直したらFirstUの値をSecondUにDragしていました。

ここでSecondUの値を以下のようにしました。

ここで問題発生です。

Barが無くなって値を入れるBoxだけが表示されています。

分かりました。

FirstUをClickするとFirstUを囲んでいたBoxが消えます。

するとBarが表示されました。

これが原因でした。

結果です。

FirstUの値を変化させます。

線が伸びたり縮んだりしました。

0~0.5の間では線が縮みます。

0.5~1の間になるとPointの位置が逆になって線が伸びていきます。

Carveノードの名前をCarve_TweakBrickWidthノードと名前を変更しました。

更に壁の形状を指定するParameterがあるNodeなので色を黄色に変更しました。

Carve_TweakBrickWidthノードの結果をCopytopoint2ノードの2番目のInput Pinに接続しました。

Foreach_end1を選択して可視化します。

結果です。

おおBrick同士の隙間の生成されるようになりました。

前後左右の隙間が生成されたので

最後に上下の隙間を追加します。

Poly Extrude 1ノードの設定を少しだけ変更します。

最後に0.96を掛けました。

Foreach_end1を選択して可視化した結果です。

Brickの上下にも隙間が生成されました。

以上でした。

7. UEFNの勉強

7.1 How To Tell Who Damages You In Fortnite - UEFN / Creative 2.0 [7]を勉強する

今週はこれを勉強します。

<Intro>

以下のUIの表示方法を勉強するそうです。

<Initialize Modules and Player List>

突然以下の画面から始まっています。

Fortnite.com/GameとFortnite.com/Characters moduleをIncludeしました。

このVerseの名前はhit_detect_device.verseと言うみたいですね。

それだけ分かればこの画面まで行くのは簡単です。

次にPlayer型の変数を初期化しました。名前はPlayersです。

<Create and Subscribing HandlePlayerHit Function>

次にPlayerに値をセットします。

以下のようにしていました。

次にPlayerがHitされた時にどうするかを指定する関数を作成します。

HandlePlayerHitと言う名前にしていました。

そしてこの関数を呼ぶ実装を追加します。

<Testing out Function>

GameをPlayしてPlayerの操作するCharacterがDamageを受けたらこの関数が呼ばれるかどうか確認しています。

呼ばれていました。

<Using damage_result struct>

誰が誰にDamageを与えたのかを知りたい場合はどうすべきでしょうか?

TutorialによるとそれにはDamgaeResultを使用すると良いそうです。

その実装方法をここで勉強します。

以下の方法でDamageを与えた人が誰なのかを得る事が出来るそうです。

しかしTargetはCharacterではありません。

誰かを示している訳ではないです。

<Getting Target who was Damaged>

ここから以下の実装を追加します。

これで誰がDamageを与えたのかが分かります。

<Getting Damage Amount>

次のDamageの量を取得します。

これは以下のようにします。

そして以下の文をPrintする事でDamage量をUIに表示します。

<Getting Instigator / Player who Caused Damage>

今度は誰がDamageを負ったのかを示す実装をします。

ここではInstigatorに何で?をつけないといけないのかについて解説しています。

<Skip Here if you don't Care About Optionals lol>

以下の方法でそのPlayerにDamageを追加しています。

更に以下の方法でPlayerにDamageが有った時に文をPrintoutするようにしました。

<Second Result>

この状態でTestしています。

高所から落ちてDamageを受けたら、以下の文が表示されました。

別なPlayerからDamageを受けた場合です。

2倍のDamageを受けていますね。

<Fixing Infinite Damage Bug / Boss Mechanic>

以下の実装が呼ばれるたびに

Damageが追加されます。

そしてこの関数はここですべてのPlayerに呼ばれます。

つまり全てのPlayerのInstigatorにあるCharacterがDamageを受ける事になるそうです。

うーん。

これ、Tutorialを見ただけではこのような結果になっているのかどうかよく分かりません。

この辺、実装した後のPrintoutの結果を見ないとTutorialの言っている事が正しいのかどうか分かりません。

これは来週、実装する時に確認します。

Tutorialでは以下のように実装を変更する事でこの問題を回避していました。

これだとPlayerがDamageを受けた時だけHandlePlayerHit()関数が呼ばれるようになりますね。

<Final Result>

テストしています。

結果です。

うーん。

これで正しいのか?

この後、PlayerがOpponentを銃で撃っていました。

その時は何も表示されませんでした。

うーん。

これで完成のようです。

実装は来週やります。

一寸理解してない部分があるのでそのあたりは来週までに勉強しておきます。

8. DirectX12の勉強

8.1 Lötwig Fusel氏のD3D12 Beginners Tutorialを勉強する

8.1.1 先週の復習

先週から全部やり直す事にしたんです。

それで全部終わらせようとして結局無理で2023-11-12のBlogあたりまで終わらせた位で時間切れになってしまいました。

そうだ今週。PCのOSをWindows11に変更しました。

その影響があるかもしれません。

一応、Sample Codeと自分のProjectを実行してErrorにならないか確認します。

まず自分のProjectです。

普通に動いています。

Sample Codeです。

なんだこれ!

三角がグルグル回っているAnimationが始まりました。

ふーん。

Windows10だとこのSample Codeは完全には動いてなかったみたいですね。

8.1.2 2023-11-19のBlogあたりの実装を行う

DirectX 12が使用出来るのか以下の実装を追加して確認しています。

結果です。

Cursorの位置が取得出来ています。

DirectX12は機能しています。

今度はLötwig Fusel氏が作成したCom Pointer用のClassを追加します。

まずFileを作成します。

今度こそ間違いないでやります。

まずShow All Files Iconが選択されている事を確認して

Support Folderに新しいH Fileを作成します。

名前はComPointer.hとします。

そしてLötwig Fusel氏が作成したCom Pointer用のClassがGitHubにあるのでその実装部分をCopy & Pasteします。

前にやった時と同じようにIUnknownの場所にErrorが表示されています。

ここは無視してMain.cppに戻ります。

そこでComPointer.hを追加します。

ここでComPointer.hがMain.cppから使用出来るか確認します。

はい。

普通に呼び出す事が出来ました。

8.1.3 Debug Layerの実装

今度は2023-12-10のBlogの内容をやります。

まずDebugと言う名前のFolderを追加します。

その中にDebugLayer.hとDebugLayer.cpp fileを作成します。

DebugLayer.hの実装をします。

まず以下に示したSingletonの実装をしました。

更に以下の実装を追加します。

ここでもDirectX関連のLibraryやComPointerは使用するからです。

そして以下のCodeを追加しました。

これでHeader Fileの実装は出来ました。

次にCpp Fileの実装をします。

Init()関数の実装です。

Shutdown()関数の実装です。

うーん。

この辺は何をしているのか理解していませんね。

2023-12-10のBlogを読んだらこの辺はまだ勉強しただけで実装はしていませんでした。

のでこのDebug Layerの実装からしっかり勉強する事にします。

ただ、今から一寸買い物に行かなければならなくなったので、この部分は来週やる事にします。

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

8.2.1 先週の復習

Vertex ShaderとPixel Shaderを追加していました。

Shaderを使用するにはVisual Studioの設定を変更する必要がありました。

これってOpenGLを勉強した時もこうしたのか覚えていません。

なんせOpenGLを勉強したのは10年以上前です。憶えていなくてもしょうがないです。

その後で「4.6 Shaderの読み込みと生成」を勉強していました。

8.2.2 「4.6 Shaderの読み込みと生成」を実装する

<「4.6.1 ID3DBlob型」を実装する>

これ先週はID3DBlobについて調査しなかったのでその調査をやります。

公式のID3D10Blob interface (d3dcommon.h)[8]です。

と書かれていました。

Remarkには以下の説明がされていました。

これ読むとVertex ShaderやPixel Shaderが正しくCompileされたかどうかを示すMessageを返すのにも使用されると書かれていますね。

この説明読むと、そんだけ理解出来たら十分みたいですね。

実装します。

どこで実装すべきなのかが不明だったのでSample Codeと同じ箇所に実装しました。

<「4.6.2 必要なIncludeとLink指定」を実装する>

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

これは特に調べる事も無いので次に行きます。

<「4.6.3 D3DCompileFromFile()関数」を実装する>

まず、先週勉強しなかったD3DCompileFromFile()関数について勉強します。

公式のD3DCompileFromFile function (d3dcompiler.h)[9]です。

もう当たり前すぎて逆に納得ですね。

Parameterです。

ではそれぞれのParameterを見てみましょう。

最初のpFileNameはFileの名前の事でしょう。

次のpDefineは何の事でしょう?

Optionとかかれているのでとりあえず無視します。

次のParameterはpIncludeです。

これも何の事か全く想像出来ないです。

説明見たらこれもOptionalと書かれていました。

ので無視して次に行きます。

pEntrypointです。

Shaderの開始するAddressを示すPointerのようです。

どのようにそのAddressを取得するのかは不明です。

pTargetです。

これも先程のpEntrypointとほとんど同じ説明ですね。

違いはこっちがTargetを指している事です。

TargetとEntryPointの違いが分かりません。

Flags1とFlags2です。

この2つのParameterはShaderのCompileの方法について指定しているようです。

ppCodeです。

これは説明のままですね。

ppErrorMsgsです。

こっちはCompileが失敗した時のError Messageを見るための変数をPassするためのParameterですね。

大体理解しました。

もう一回、教科書のこの部分を読んでみます。

全然違っていました。

もう一回教科書の内容を参考にしてまとめ直します。

pFileNameです。

これはFile名をInputします。

このParameterの解釈だけは合っていました。

ただしここではワイド文字列を使用する必要があるそうです。

ワイド文字列ってなんでしたっけ?

調べます。

ワイド文字列の英語名はwide-character-string literalだそうです。

Multibyte and Wide Characters [10]に以下の説明がありました。

この説明を読んで大体こんな感じに理解しました。

文字の表示方法にはmultibyte CharacterとWide Characterがあります。

一つがWide Characterです。これは一つの文字を表すのに必ず2 Byte使用します。

それに対してMultibyte Characterと言う文字を表す方法では1 Byteが基本ですが以上を使用する場合もあります。

このWide Characterを使用した文字列の事をwide-character-string literalと呼びます。

多分、この解釈で合っているでしょう。

wide-character-string literalで書き込むためにはL“○○”と書く必要があるそうです。

はい。

pDefinesです。

これはHLSLにおけるC++でDefineと同じ機能だそうです。

DirectX 12の魔導書」におけるDirectX12のそれぞれの関数の説明は本当に分かり易いです。

ただしこの分かり易さを実感するためには、自分で先に関数を調べてその機能を一人で理解しようとして無理だと実感する体験が必要になります。

これ今、気が付きました。

これからは教科書に出て来た関数は前もって調べてから教科書の説明を読む事にします。

pIncludeです。

これはHLSLにおけるC++でIncludeと同じ機能だそうです。

pEntrypointです。

ここはShader名をパスします。

pTargetです。

これが間違って理解していました。

ここはShaderの種類とそのVersionを指定するところでした。

"vs_5_0"とか"ps_5_0"と指定しています。

Flags1です。

これはShaderのCompileの方法について指定します。

そういう意味では最初の解釈であっていました。

分かってなかったのはD3DCompileFromFile function (d3dcompiler.h)[9]の説明で以下のように

OR Operationを使用すると説明していた部分です。

これは以下のように

2つ以上のCompileの方法について指定する時にOR Operationを使用すると言う意味でした。

Flags2です。

Shader Fileの場合は0を指定するそうです。

ppCodeです。

先程実装して作成した

を使用します。

ppErrorMsgsです。

これはError Messageを受け取るPointerを指定します。このParameterの解釈はあっていました。

ただ、ここにパスするPointerはどんな型になるのかとは分かってないです。

Sample Codeみたら

ID3DBlob型でした。

それでは実装します。

Vertex Shaderからです。

実装内容はSample Codeと同じです。

次にPixel Shaderを実装します。

これも実装内容はSample Codeと同じです。

具体的にそれぞれのArgumentについて簡単に解説したいんですが時間が無くなってしまいました。

それは来週やる事にします。

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

9. まとめと感想

なしです。

10. 参照(Reference)

[1] Castle Wall Tool. (n.d.). https://www.youtube.com/playlist?list=PLNbgmFvU__fiPhyUWHHzZ2Nv5ieM_bOdB

[2] Gediminas Kirdeikis. (2023, April 30). Unreal Engine 5 for Architecture - 2023 Full Beginner Course [Video]. YouTube. https://www.youtube.com/watch?v=bT8aSTkpkDY

[3] WeShootFilms. (2023, September 10). “Unreal Engine: Step-by-Step Green Screen import guide!” [Video]. YouTube. https://www.youtube.com/watch?v=OIaEAAs2Tiw

[4] Urban Decoders. (2023, November 18). How to 3D Gaussian splat from Aerials to Unreal 5 (Free plugin) [Video]. YouTube. https://www.youtube.com/watch?v=SDO1XdFXl8M

[5] Ben Cloward. (2023, October 12). Worn-Out LCD Screen Shader - Advanced Materials - Episode 25 [Video]. YouTube. https://www.youtube.com/watch?v=i4EXZdpVdT0

[6] Rick Banks. (2022, June 20). Houdini - Wall Tool 05 [Video]. YouTube. https://www.youtube.com/watch?v=WE4xrUXnW0s

[7] Pi Equals Three. (2023, April 23). How to tell who damages you in Fortnite - UEFN / Creative 2.0 [Video]. YouTube. https://www.youtube.com/watch?v=Q73cYtoecfU

[8] Stevewhims. (2021, July 22). ID3D10Blob (d3dcommon.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3dcommon/nn-d3dcommon-id3d10blob

[9] Stevewhims. (2022, July 27). D3DCompileFromFile function (d3dcompiler.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3dcompiler/nf-d3dcompiler-d3dcompilefromfile

[10] TylerMSFT. (2021, August 3). Multibyte and wide characters. Microsoft Learn. https://learn.microsoft.com/en-us/cpp/c-language/multibyte-and-wide-characters?view=msvc-170

 

UE5の勉強 -映像作品としてのLandscapeを作成する-

1. 今週の予定

去年と同じ内容をやっていきます。

<映像作品としてのLandscapeの作成>

建築用のLevelの作成の勉強の続きをやります。

建物の作成の続きをやります。

Niagara の勉強>

Unreal Engine 5で学ぶビジュアルエフェクト実装 基本機能からNiagara、シミュレーションまで」の実装をやります。

<Materialの勉強>

Ben Cloward先生のTutorialを勉強します。

<Gaeaの勉強>

GaeaのTutorialを作成します。

<Houdiniの勉強>

Castle Wall Tool [1]の勉強をやります。

<UEFNの勉強>

Pi Equals Three氏のTutorialをやります。

<DirectX12の勉強>

DirectX 12の魔導書」の勉強をやります。

更にLötwig Fusel氏のDirectX12のTutorialをやります。

2. Landscapeの作成

2.1 Unreal Engine 5 for Architecture - 2023 Full Beginner Course [2]の勉強の続きをやる

先週は二個目のカメラを適切な位置にセットした後で、間違って移動させてしまい、直す前に3D酔いになってしまい、途中で終了したんでした。

まずCameraの位置を直しました。

Cameraから見た風景です。

地面の色が黒過ぎます。

直します。

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

もっと草が生えてたりとか岩が埋まってたりとかしないとオカシイですね。

草とか岩を追加しますか。

まずAssetを確認します。

この辺のAssetには使えそうな草や岩が結構ありそうです。

今週はこれらのAssetの中身を確認する事にします。

と思ったんですがDownloadの速度規制が掛かっているみたいで、全然Download出来ません。

これは来週までにDownloadしておいて来週やる事にします。

<Procedural Biomes>

<Procedural Nature Pack Vol.1>

<Realistic Forest Pack>

<Nature Package>

<Scanned Poplar and Aspen Forest>

<Spring Landscape>

<Stone Pine Forest>

<Tropical Jungle Pack>

せっかく久しぶりにBridgeを開いたので以下のAssetをDownloadしました。

 Unreal Engine 5 for Architecture - 2023 Full Beginner Course [2]の続きを勉強する

2023-10-22のBlogには以下のようにまとめられていました。

のでCamera Setupの3つ目のCameraの部分から以下にまとめます。

<<Camera Setup>>

配置されているCameraをDuplicateして家の中に配置しました。

ここまでは今までのCameraの配置と同じです。

Cameraからの映像です。

Current Focal Lengthの値を50に変更しました。

うーん。

こっちの方が人間の視覚に近いみたいですね。

更に

Current Focal Lengthの値を35.0に変更しました。

うーん。

これは行き過ぎな気がします。

画面が暗すぎるのでPost ProcessのLensにあるExposureのExposure Compensationの値を変更します。

結果です。

おお、明るくなるだけじゃなくて、画面に芸術性が追加されましたね。

まだ画面が狭いと言って、

Current Focal Lengthの値を更に下げました。

結果です。

うーん。

画面中央にある椅子やSofaが細く見える気がします。

このCurrent Focal Lengthの値の設定をこの値にする理由はよく分からないです。

Sphereを部屋の中に配置しました。

Sphereを配置すると画面がまだ暗いのが分かります。

Exposure Compensationの値を11.5に上げました。

結果です。

更にCameraをDuplicateして以下の画面を撮影しています。

画面が暗いのでExposure Compensationの値を16.0に変更しました。

結果です。

芸術的な画面かもしれませんが、Photo-Realistic感はなくなりましたね。

Current Focal Lengthを18.0にセットしました。

結果です。

Focus Distanceを

以下のLamp?に合わせました。

これでCamera Setupは終わりでした。

この画面のPhoto-Realistic感が無いのは次の節であるLight Sourcesで直すそうです。

 Unreal Engine 5 for Architecture - 2023 Full Beginner Course [2]のCamera Settingを実装する

室内のCameraの設定方法は大体理解したので実装します。

以下にCameraの設定方法をまとめます。

  1. 画面が狭かったらCurrent Focal Lengthの値を下げる
  2. 画面が暗かったらExposure Compensationの値を上げる
  3. Spheresを画面内に配置して画面の暗さなどを確認
  4. もう一回、Current Focal Lengthの値を調整
  5. もう一回、Exposure Compensationの値を上げる
  6. Focus Distanceを調整

こんな感じです。

それではやってみます。

一個目の室内Cameraからの画面です。

Current Focal Lengthの値を15.0にしました。

結果です。

おお、ぐっと情報量が増えました。

Exposure Compensationの値も変更してみます。

8.21だったのを10.0に変更しました。

結果です。

おお、少し明るすぎるかもしれませんね。

後、これだけ日光で明るいなら窓枠の影が床に写ってないと変です。

これはどうやって直せば良いのか分かりません。

これからの課題とします。

最後にFocus Distanceを以下の位置に変更しました。

結果です。

うーん。

良い感じです。

Spheresをここに移動させて更に細かい調整をします。

Sphereを配置しました。

うーん。

今のままでも良い気がします。

そもそもこのSpheresをどうやって活用すべきなのか知りませんでした。

黒い球は十分に黒く見えますし白い球はそれなりに白く見えます。

それそれの球のShaderもはっきり確認出来て球の凹凸ははっきり認識出来ます。

今週は3D Gaussian Splattingも試すのでUnreal Engine 5 for Architecture - 2023 Full Beginner Course [2]の勉強はここまでとします。

2.2 Step-by-Step Unreal Engine 5 Tutorial: 3D Gaussian Splatting for Beginners [3]を実装する

まず先週のBlogをしっかり読み直します。

読み直しました。

うーん。

やってみますか。

XV3DGS-v1.10-ue5.3をDownloadします。

しました。

解凍しました。

UE_5.3のPluginsの中に配置しました。

そしてUE5.3を起動させます。

起動させたらXV3dGSをEnableし

UE5Editorを再起動します。

再起動したらTool BarのPlatformsの脇に新しくXのIconが表示されるようになりました。

先週見た

とはIconの形状は違っていますが機能は多分同じでしょう。

Cursorを乗せると以下のような説明が現れました。

Clickしたら

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

ここに3D Gaussian SplattingのDataを入れるのか。

うーん。

PolycamのHomepageに来ました。

Splats->と書かれている箇所がありました。

これをClickしてみます。

ここにあるDataをDownloadする事が出来そうですね。

Tutorialを見ると

でDownload出来るDataを表示しています。

うーん。

これは分からない。

とりあえずDownloadしてみます。

Accountを作成しろと出て来ました。

はい。

名前なんかを登録したら以下の画面が出て来ました。

Albumを作成しろ。とありますがこれは必須なんでしょうか?

なんか課金されそうで嫌なんですが。

Albumを作成してDownload Model after SavingにCheckを入れて保存を押しました。

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

Export toにUnrealを選択してDownloadを押しました。

ずっとグルグルまわっているので一端中止します。

もっとSizeの小さいのをDownloadする事にします。

これをDownloadしましょう。

DataをExportするにはProのlicenseを得る必要があるみたいですね。

うーん。

GAUSSIAN SPLATを選択したらDOWNLOAD Buttonが押せるようになりました。

押したらまたグルグルが始まって何も起きません。

PolycamのDataのDownload方法を調べます。

Exportはお金を払わないと出来ないとありました。

うーん。

今週はここまで。

流石に課金してまで試す気にはなりません。

2.3 現実の映像とUEを組み合わせる方法を勉強する(追記)

3D Gaussian Splattingは実際に撮影した映像を元に3D Graphicsを作成します。

これとは別に実際に撮影した映像をそのまま3Dに組み込んでCGを作成する方法があります。

これについて少し調査します。

以下の二種類があります。

  • 背景を3Dで作成してGreen Screenで撮影した人物をその3Dに組み込む
  • 背景+人物も2Dで撮影したものにVFXとして3Dを追加する

それぞれについて調査します。

<背景を3Dで作成してGreen Screenで撮影した人物をその3Dに組み込む>

以下のTutorialが見つかりました。

これ見るとCinecom.net氏が沢山それ関連の動画を作成しているようです。

それに対して

<背景+人物も2Dで撮影したものにVFXとして3Dを追加する>

これはUEで出来るのかどうか分かりません。

しかしBlenderでは出来るのは以下のBlenderのTutorialで分かっています。

これと同じ事、もしくはこれと近い事をUEで出来るのかを調査します。

このTutorial内で動画を撮影したCameraの位置を計算している場面があるのですが、UE単独ではそれをやる機能はないみたいです。

なのでAfter Effectを活用してその効果を得る方法を取るみたいです。

多分ですが以下のTutorialでその方法について説明しているかもしれません。

一寸確認します。

After Effects to Unreal Engine 5 (THE EASY WAY) [8]を軽く見る>

やっぱりAfter Effectで3D CameraのMotion Trackerを使用していました。

最終的にUE内で以下の映像を作成していました。

これはBlenderで見たのと同じです。

After Effectを使用すれば2Dの映像とUEの3Dを組み合わせる事が可能で有る事が分かりました。

Blenderで作成したMotion TrackのDataをUE5にExportしたらAfter Effectでやっている事と同じ事が出来るじゃね。と

それについて調べました。

TRACK THIS! - Camera Tracking From Blender To Unreal Engine [9]で近い事をやっていました。

この動画もJoshua M Kerr氏が作成していました。

この人の動画は要Checkする必要がありそうです。

こんな感じでした。

3. Niagara の勉強

Unreal Engine 5で学ぶビジュアルエフェクト実装 基本機能からNiagara、シミュレーションまで」の続きを勉強します。

3.1 先週の復習をする

四章の「木の生成Simulations」の最初の3つの節を勉強していました。

「14.1 木の生成Simulationsの理論」では

まず木の生成のAlgorithmをまとめています。

ただしこれを実際に実装するためには、枝(幹)の始点と終点を管理してその間に線を引く必要があります。

それについてその後で具体的なやり方をまとめていました。

「14.2 Niagaraで線を書く」では

Niagaraを使用して2つのParticleの間の線を書く方法を解説していました。

「14.3 木の生成Simulationの実装」では実際の実装方法について解説していました。

3.2 「木の生成Simulations」の実装をやる

「14.3 木の生成Simulationの実装」で勉強した部分を実装します。

実装する前にEmitterのTemplateをどれにするのが良いのかを決定する必要があります。

Sample Codeを見て検証します。

以下のEmitterです。

うーん。

これだったらEmptyでも良い気がしますね。

とりあえずEmpty Emitterで実装する事にします。

Preview画面で完成した木の画像を見る事も出来ました。

こんな感じで枝が生えている木って確かに存在してますね。

まずNSを作成しました。

名前はNS_FractionalTreeとします。

Tutorialでの名前とは違いますがNiagara SystemはNSで統一したいのでこれで行きます。

Empty Emitterの名前を変更します。

こっちはTutorialと同じFractionalTreeにしました。

こっちはTutorialと同じ名前です。

EmitterのProperties Moduleを選択してSim TargetをGPUに変更しました。

更にいつもの設定の変更をしました。

更にEmitter Update SectionにSpawn Burst Instantaneous Moduleを追加し

Spawn Countに700をセットする事で

Particleを700生成します。

Tutorialの説明ではこれが枝の始点と終点になるとありました。

次にEmitter Update SectionにあるEmitter State System Moduleの設定を変更します。

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

これも発生したParticleをずっと表示するための定型的な設定ですね。

CGHOW氏のTutorialで散々やりました。

次にParticle Spawn SectionにあるInitialize Particle ModuleとParticle Update SectionにあるParticle State Moduleを消します。

教科書ではこの2つのModuleを消す理由をParticleの消滅をしないからと書いていますが、これってどうなんでしょう?

確かにInitialize Particle Moduleでは以下のようにLifetimeを指定していますし、

Particle State Moduleでは以下のように

実際にParticleをKillしています。

でもInitialize Particle Moduleに限って言うと、このModuleの機能って作成したParticleのLifetimeを指定するだけじゃないです。

今回はLifetimeを指定する必要が無いうえにParticleを消滅しないだけでなくParticleそのものの色やTransformなどのAttributeを指定する必要がないからInitialize Particle Moduleを消しても問題ない。というのがより正確な気がします。

消しました。

次に変数を作成します。

教科書の説明では[Particle] Positionは最初から存在しているのでそれをParticleの始点として利用すると言っています。

しかし私のNSのParameterを見ると

Particle Attributeに一個のParameterも表示されていません。

一応、Render SectionにあるSprite Renderer Moduleの

Bindingsを見るとPosition Bindingで[Particle] Positionを使用しているので

ある事はあるみたいです。

この状態でParticle Attributesに[Particle] Positionを追加します。

なんと名前が変更出来ません。

これはParticle Spawn SectionにあるInitialize Particle Moduleを消したからじゃないでしょうか?

復活させてみます。

Particle Attributesに以下のParameterが表示されるようになりました。

よしこれから新しいParameterを追加出来ると思ったら

またErrorになりました。

なんと[Emitter]側に強制的に移動されて作成されました。

うーん。

何となく理由が分かって来ました。

私は新しいPosition型のParameterを作成している気になっていたんですが、ここに表示されたParameterは[Particle]PositionというもとからあるParameterの様です。

Make NewからPositionを選択しても既にある[Particle]Positionに飛んでしまいます。

何で?

何回か試していたら突然、新しいPosition型のParameterを作成出来ました。

名前をEndPositionに変更しました。

うーん。

ここは深堀すべきところなのか?

そのまま無視して進んでも問題ない気もします。

うーん。

先に進みます。

今度はInt32型のDepthという変数を作成します。

これはそのParticleが最初のParticleから数えてどの深さなのかを記録するためのVariableだそうです。

こっちは何の問題もなく普通に作成出来ました。

次にVector型の変数を作成します。

Forwardと言う名前だそうです。

これも普通に出来ました。

次にAttribute Reader型の変数をEmitterに作成します。

Particle Attribute Reader型しかありません。

これで作成しました。

これで正しいのかSample Codeで確認します。

Particle Attribute Readerと表示されています。

以下のように表示されています。

あってるでしょう。

名前だけAttribute Readerに変更しました。

今度はGPU Simulation Stageを追加します。

名前はSolveとしました。

Solve Sectionに新しいScratch Pad Moduleを追加します。

名前はこれもSolveとします。

Map Getノードに以下のParameterを追加しました。

Custom HLSLノードを追加しました。

Map Getノードにある全てのInputをCustom HLSLノードにPassしました。

Custom HLSLノードのOutputを作成します。

次はMap setノードにParameterを追加します。

しました。

Custom HLSLノードのOutputとMap SetノードのInputを繋ぎました。

ここでApplyを押して一端、Scratch Pad Moduleの作成を終了します。

Solve SectionにあるSolve Moduleを選択し

Attribute Readerに[EMITTER] Attribute Readerをセットしました。

ここからCustom HLSLノードの実装になります。

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

4. Materialの勉強

先週勉強した Using Custom HLSL Code - Advanced Materials - Episode 24 [4]を実装します。

4.1  Using Custom HLSL Code - Advanced Materials - Episode 24 [4]実装する

こっちもCustom HLSLノードの使い方です。

以下のようなCodeを書きました。

Float3の値を色々変更しました。

Descriptionの値を変更しました。

結果です。

Customノードの名前が変更しました。

次はInputsの使用方法についてです。

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

Input Nameを追加して名前をColorにしました。

CustomノードのInputにColorが作成されました。

これだけだとInputした値が結果に全く反映されないので

Codeを以下のように書き換えました。

更にInput先にFloat3型の変数を繋げました。

Inputに関しては2つ問題があります。

それぞれ検証します。

まずCustomノードのInputに何も接続しないとErrorになる事です。

うーん。

Default値を設定出来ると思ったんですが、そんな設定はどこにもなかったです。

次の問題はInputに繋げられるNodeのTypeを指定する箇所が無い事です。

Float1のNodeを代わりに繋げてみます。

別にErrorにならないですね。

ただしCodeは以下のように変更しています。

<Lerp(A, B, T)>

今度はLerp()関数の使用方法についてです。

以下のように設定を変更しました。

更にInputも繋げました。

む、

Errorになっています。

Lerpじゃなくてlerpじゃない?

と書かれています。

直します。

以下のように直しました。

結果です。

今度は上手くいきました。

<Texture2DSample(Tex, TexSampler, UV)>

今度はTexture2DSample()関数の使用方法について実装して確認します。

以下のように設定を変更しました。

このTexSamplerが何を指定しているのかが不明です。

この件は先週散々調査したけど不明でした。

Inputに以下のNodeを接続しました。

結果です。

<For Loop>

今度はFor Loopを実際に使用してみます。

Material内ではLoop()関数を表すNodeは無かったはずです。

このCustomノードの使用方法はかなり利口です。ただしCostは凄い掛かるとは思いますが。

結果です。

うん出来てますね。

Materialを組むときにLoopが必要になったらこの方法でやる事にします。

<もう少し複雑なLoop>

今度は以下の実装をCustomノードに追加します。

まず実装部に以下のCodeを書き込みました。

うーん。

多分あってる。

流石にEditorの自動でTypoを指定してくれる機能なしで、しかもこんなに細かいSpaceにCodeを書くのは苦痛です。

更にInputに以下の値を追加しました。

そしてInputに以下の実装を追加しました。

Errorが出ています。

うーん。

Texture2DSample()関数のTextureの最初のTとSampleのSは大文字でした。

直します。

結果です。

うーん。

Textureを水玉模様に変更します。

結果です。

以下の値を変更してみます。

結果です。

おお、四角くなっています。

出来てますね。

<四角くならないための実装>

四角くならないための実装も試してみます。

そう言えば先週このCodeを読んで理解する事はやってなかったです。

まずCodeを読んで内容を理解します。

まずVariableがTex、UV、Directions、Quality、Size、そしてtexResがあります。

それぞれのTypeは

TexはTexture Object。UVはTexCoord[0]、Directions、Quality、SizeはFloat、そしてtexResはFloat2でした。

そしてPi2はFloatでPi×2=6.28です。

RadiusはFloat2でSize/texRes.xyです。

教科書ではSizeの値は8、TexRes.xyはそれぞれ512でした。のでRadiusは8/512 = 0.015625でした。

Radiusは半径と言う意味ですが何の半径なんでしょう?

あ、水玉の半径だ。

水玉の半径が8 PixelsだとするとTextureのSizeが512になるのでTextureに対する割合は8/512になります。

Directionsが何なのかが分からないですね。

Floatで値は16になっています。

方向を示すならVectorでFloat2である必要があります。

うーん。

分かりました。

16分割しているんです。

16の方向にずらして値を取っています。

次のQualityですが以下のFor Loopでiの値を出すために以下の実装で使用されています。

あ、分かりました。これは16方向にどれだけ伸ばすのかを決定しています。

それぞれのPixelから16方向に周りのSampleをとって更にQualityの数だけその方向を少しだけ拡張してSampleしている訳です。

もう理解しました。

後、Customノード内のSin(x)のxはRadian表示のようですね。2piで360度と同じになっていますから。

UEのSin(x)はDefaultでは1が360度と同じ値になるように調整されているので、一応確認のために書いておきます。

もう全部理解したので実装します。

以下のように打ちました。

合ってるはずです。

それぞれのParameterです。

結果です。

うーん。

ぼやけ過ぎて何だか全く分かりません。

Sizeの値を小さくしたら

以下のようにBlurなImageになりました。

うん。

できています。

5. Gaeaの勉強

5.1 先週作成したPower Pointで動画を作成する

音ズレが激しくて何回も直しました。

一応、これで完成とします。

前回の動画を確認したら5回しか再生されていません。

Tutorialの最初の動画は80回位再生されていますが、回を重ねる毎に再生回数が落ちています。

まあ、再生回数は気にしないで兎に角、Tutorialを完成させる事を第一に考えてやっていきます。

5.2 ErosionノードとSedimentノード

Sedimentノードが以外と使える事が判明しました。

のでそれをまとめておきます。

以下のような地形があるとします。

Sedimentノードを追加します。

Depositが追加されました。

ただし全体に均一に追加されるのではなく傾斜が激しい場所や高度が周りに比べて高い場所にはDepositは追加されていません。

その結果、Terrainの特長、例えばこの場合ならStackの特長が、しっかり確認出来ます。

これがAlluviumノードやDepositノードだと以下のように全体に均一にDepositが追加されTerrainの特長が完全に消えてしまいます。

更にDepositsの場合だと線状の盛り上がりが形成されてしまいます。

Erosionノードを追加した場合は以下のようになります。

Depositsは適度に追加されています。

がSedimentノードを追加した時のようなそれまでの地形の特長は消えてしまっています。

Erosionノードの結果をよく見るとDepositsの追加だけでなく水が流れた後のような溝が形成されています。

この溝の形成がそれまでの地形の特長が消えてしまう原因のようです。

同様の現象はStratifyノードで形成された地形でも起きています。

Sedimentノードを追加した結果です。

Stratifyノードの特長がしっかり確認出来ます。それでいてDepositが追加されているのも確認出来ます。

Erosionノードを追加した結果です。

Depositと溝が形成されています。

ただし、この場合は前の地形の特長が少しだけ残っていました。

前の地形の場合もErosionノードのParameterを変更したら元の地形が確認出来るかどうかの確認をします。

結果です。

うーん。

これだとかなり前の地形の特長が確認出来ますね。

やっぱりErosionノードが一番使いやすいですね。

5.3 これからのTutorialの予定

一応今回で以下の3つのNodeを組み合わせる事で、

以下に示した3つの工程の

  1. 地形(Terrain)を作成
  2. 色を付ける
  3. Buildをする

の一番最初の工程である「地形(Terrain)を作成」が終わりました。

ので次の工程である色を付けるを始めようと思います。

5.4 色の追加の仕方を検討する

ここで別のGraphを利用する方法も教えてしまいましょう。

まず一色で塗る場合の実装を示します。

Erosionノードの終わりでTerrainの作成は終わりです。

その後で、Fxノードを追加しています。

Fxノードを追加したのは、これはここでTerrainの作成が終わっているという印になります。

そしてBuildする時にこのFXの結果をExportする事になります。

次に色を追加します。

まず単色の色を追加します。

これはPrimitives GroupにあるConstantノードを追加する事で実行されます。

ConstantのPropertiesにあるOutputの値をColorに変更します。

そして色を変更します。

Defaultでは黒に設定してあるので赤くしました。

結果です。

赤一色でTerrainが塗られました。

右上にあるTool Barの+を押します。

新しいGraphが形成されました。

以下のようにFXからLineを引っ張って

Mouseの左Clickを離すと以下のBoxが表示されます。

そのBoxにはMake Portalと言う選択肢があります。

これを選択します。

こんな感じになります。

次にColorのGraphに移動します。

そこに先程のConstantのノードを追加しました。

InputからLineを引っ張ってBoxを表示します。

Portalsを選択します。

するとFxと言う名前のPortalが表示されるので

それを選択します。

これで前のGraphのFxの結果がConstantノードに繋げられました。

当然このConstantノードのPropertiesの設定は前の解説と同じように変更しています。

結果です。

赤一色ですがTerrainに色を塗る事に成功しました。

6. Houdiniの勉強

6.1 Houdini - Wall Tool 05 [5]を勉強する

先週、Houdini 19 - Wall Tool 04 [6]の実装が終わったので今週はその次のTutorialを勉強します。

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

今回のTutorialは目次がありません。

どうして無いんでしょうか?

Descriptionを見たら以下のKey Momentsがありました。

これって目次じゃないの?

うーん。

これに基づいてまとめます。

<Intro> 0:00

今回のTutorialでは先週加えたそれぞれのBrickのSizeのばらつきに更に少しだけNoiseを追加するそうです。

そのためにFor Each Loopの特性を利用するそうです。

<Meta Import> 0:39

そのためにMeta Import Nodeを使用するそうです。

まずForeach Beginノードを選択します。

以下のBoxがParameter Paneに表示されました。

<Create Meta Import Node> 0:45

Create Meta Import NodeをClickします。

以下に示した様に

Foreach Begin1 Metadata1ノードが作成されました。

このNodeには

ParameterにDetail Attributesがあります。

これを使って何かするみたいです。

ここで今回何をするのかが分かりました。

それぞれのBrickの位置を少しだけ凹ましたり、飛び出したりするそうです。

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

そしてforeach_Beginノードの結果を第一のInput Pinに繋げました。

更にforeach_Begin_Metadataノードの結果を第二のInput Pinに繋げました。

こんな結果になりました。

ここからそれぞれのPointのNormal Vectorを表示して

これらを利用してBrickを凸凹にします。と説明しています。

そしてそのためには少しだけVectorの数学を利用します。とも言いました。

以下の図で説明しています。

赤で囲んだ点がPointで青の矢印がそのPointのNormalです。

このNormal Vectorに対してUp Vectorを追加すると以下のようになります。

Up Vectorってなんでしょうか?

聞いたことないですが。

まあNormal Vectorに対して垂直なVectorを加えただけでしょう。

この2つのCross Productsを計算します。

すると以下の図で示した茶色のVectorのようなこの2つのVectorに対して垂直なVectorが現れます。

うーん。

成程。

このVectorにRandomな値をかけてその値をPointの値に足したらそれぞれのBrickが少しだけ凹んだり飛び出したりするようになります。

うーん。

これは勉強になった。

これをCodeに落とし込みます。

<Construct an Up Vector> 4:54

Up VectorはY軸に沿ったVectorなので{0,1,0}で表しています。

HoudiniはY軸が上を指しています。ここは注意が必要です。

今度はこのv@sideを可視化します。

以下のIconをClickします。

<Visualizers> 5:44

すると以下のBoxが表示されます。

Sceneの+をClickして以下のBoxを表示させます。

Markerを選択します。

以下のBoxが表示されます。

Labelの値をSideに変更します。

更にAttributeの値もsideに変更します。

そしてStyleの値をVector Trailに変更しました。

最後にLength Scaleの値を少しだけ下げました。

結果です。

黄色い線が追加されました。

今度はRandom Valueを作成します。

この辺は想像通りでした。

Rand()関数を使用してRandom Valueを作成するCodeを追加します。

最初のParameterはSeedを指定しますが、ここで一寸注意する必要があるそうです。

Primitive Numberを使用するとFor each Loop内では常に0になってしまうからだそうです。

そうなのか?

この辺は初めて聞く話ばっかりでそう説明されても???となってしまいます。

もっと勉強続けたら成程。と思えるようになるんでしょうか?

で、ここで先程作成したForeach Begin1 Metadata1ノードが活躍します。

Foreach Begin1 Metadata1ノードのAttributeにあるIterationを使用するそうです。

え、そんなのあったの?と思って確認したら

以下に示した様に

Detail Attributesの後ろにIterationで書いてありました。

うーん。

これってそういう風に見るものだったのか。

以下の実装でForeach Begin1 Metadata1ノードのAttributeにあるIterationの値を取り出します。

まずDetail()関数を使用します。

そして最初のParameterである1は

以下に示した様に

Foreach Begin1 Metadata1ノードの結果が、Attribwrangle2のInputの2番目に接続している事を示しているそうです。

これは0から数えているから当然ですね。

次のParameterである”iteration”はどのAttributeの値を取り出すのかを指定しています。

そして最後の0はIndexを指定するためのもので0で問題ないそうです。

これは初めて勉強する関数ですね。

一応、公式Siteのdetail expression function [7]の情報も確認しておきます。

あんまり詳しい解説ではないですね。

それぞれのParameterに関しての説明もほとんどないです。

最初のParameterの名称がSurface_Nodeになっていて

ExampleではNode名を指定しています。

あれ?

これTutorialの解説と違くない?

もう一回Tutorialの解説を確認します。

やっぱりここでまとめた説明をしています。

どっちの指定方法でも良いんでしょうね。

適当な数をかけてRand()関数を閉じます。

最後に0.5を引きます。

これはRandomな値の範囲を-0.5~0.5に変更するためです。

最後括弧で全部の式を閉じます。

この時この括弧の事をBracketと呼んでいました。私は括弧の事をParenthesesとしか読んだこと無いです。

と言う呼び方が一般的だと思うんですが、Canadaでは違うんでしょうか?

イギリスは違う呼び方をするって話は前に聞いたことがあるので、もしかしたらCanadaでも違うのかもしれません。

最後にMultiと言うAttributeの値を掛けました。

ナニコレ?

と思ったんですが、これParameterで壁をどのくらい凸凹にするかを調整するためのものですね。

このParameterを生成するために以下のIconをClickします。

このIconの機能については先週勉強したので覚えています。

作成したAttributeの値を指定するためのBoxを生成するんです。

Tutorialの動画を注意深く見ると、

以下のBoxが生成されていました。

これでRandom Valueが生成されたので、次の工程は、この生成されたRandom Valueに基づいてPointの位置を移動する事です。

それはどうやるんだ。

と思ったら以下の実装で簡単に済ましていました。

本当に+=って便利な機能ですね。

Attribwrangleノードの名前を変更し、Attribwrangle _brickJitterとしています。

更にParameterがあるNodeなので色を黄色に変更しました。

そしてその結果をCopytoPoints2ノードの2番目のInputに繋げました。

これでそれぞれのBrickの位置を凸凹にするための値がForeach Loop内にPassされました。

Foreach_end1ノードを選択し可視化します。

結果です。

Vectorを全部消します。

あれ、何も変化してないですね。

Attribwrangle_brickJitterノードに戻り、Multiの値を0から変更します。

結果です。

おお、Brickの位置が前後するようになりました。

これは大げさすぎるので以下の値に変更しました。

結果です。

おお、古い城の壁の感じが出て来ました。

今度はBrick同士の間にすこしだけGapを追加するそうです。

<Carve Node> 10:17

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

更にAttribwranble_brickJitterノードの結果をCarveノードのInputに繋ぎました。

Carveノードの結果を可視化すると以下のようになりました。

CarveノードのFirstUの値を変化させると

そしてRelative Channel Referenceを選択します。

すると以下の結果になります。

最初の値のRelative Channel ReferenceじゃなくてInverseな値が必要なので以下のように値を変更します。

結果です。

両方のPointが向きが反対ですが同じ量だけ移動するようになりました。

Carve_TweakBrickWidthノードと名前を変更しました。

更にParameterがあるNodeなので色を黄色に変更しました。

Carve_TweakBrickWidthノードの結果をCopytopoint2ノードの2番目のInput Pinに接続しました。

Foreach_end1ノードを選択し可視化します。

Brick同士の間に隙間が発生しました。

次にPoly Extrude 1ノードの設定を少しだけ変更するそうです。

Distanceの値に0.96を掛けました。

結果です。

上下のBrick同士の間にも少しだけ隙間が発生するようになりました。

ただこの隙間の幅は全部同じです。

これで終わりでした。

実装は来週やります。

7. UEFNの勉強

今週は先週勉強したPi Equals Three氏のMake a Book / UI Text In Fortnite - UEFN / Creative 2.0 Tutorial [10]を実装します。

UEFNはなんか私の想像していたのとは全く違った未来を歩んでいて、このままいくと先細りして消滅してしまいそうです。

Game系Influencerは嘘つきなんです。

彼らの言う事を信じてその通りにやっても絶対に成功しません。

しかしEpic Games社はこのUEFNで作成したProjectに対して収益の40%を還元するという、一寸とRiskyな決断を下してしまいました。

ただしUnreal Engine 6 = UE5 + Verse [11]によるとUE6にはVerseが標準搭載されるそうです。

のでUEFNの勉強はしておいて損はありません。

またミニゲームなんかを公開しておくのにUEFNは適しているのも事実ですので、そういう意味でも勉強しておくのは損ではないです。

7.1 Make a Book / UI Text In Fortnite - UEFN / Creative 2.0 Tutorial [10]を実装する

<Intro>

特に実装する内容は無いです。

次のStepに進みます。

<Setting up Pop-Up-Dialog Device>

Pop-Up-Dialog DeviceをLevel上に配置します。

これですね。

Pop-Up-Dialog Deviceだと検索にひっかからなくて

Pop-Up Dialog Deviceだと検索で出て来ます。

あ、Hyphenが余計にあった。

はい。

配置しました。

名前をPage1に変更しました。

Response Typeを3 Buttonsに変更します。

TutorialではDefault Back ButtonはButton2に変更していますが、

これは元からButton 2でした。

Button1 Text、Button2Text、Button3 Textの値も以下のように変更しました。

Duplicateして3つに増やします。

表示するTextを追加します。

Page 2とPage 3のTextの内容は指定されていないので以下のようにしました。

<Setting up Page Functionality>

ButtonをLevel上に追加します。

はい。

追加しました。

名前をOpen Book Btnに変更しました。

Page1のShowにこのButtonをBindさせます。

TutorialのImageと微妙に違いますね。

以下にTutorialのShowのScreenshotを示します。

うーん。

多分UIが変更されただけでしょう。

次をやります。

Page2を追加しました。

Page2にあるButton1が押されたらPage1が表示されると言う意味です。

次はPage2の設定を行います。

Page2にあるButton3を押すとPage1に戻ります。

Page2にあるButton1を押すとPage3に進みます。

Pop-Up-Dialog Deviceの設定は以下のようにしています。

Buttonが3つあって、二番目のButtonを押すとDefault画面に戻ります。

それぞれのButtonの名前はPrevious、Exit、そしてNextです。

この設定だとPrevious Buttonを押すと次のPageに移動してしまいます。

あれ?

うーん。

自分の考える正しい方法で実装してみます。

以下のように直しました。

こっちが正しいはずです。

テストして確認します。

<Final Result>

Buttonを押すと以下のUIが表示されました。

NEXT Buttonを押しました。

なんの変化もありません。

あれ?

Previous Buttonを押してみます。

Page2に戻って来ました。

あれ?

先程の設定が間違っていたの?

ああ。

分かりました。

勘違いしていました。

Page1の設定ですが、

OpenBookBtnのInteractを押すとPage1が開きます。

Page2のButton1を押すとPage1が開きます。という意味でした。

うーん。

勘違いしていました。

Testして確認するのは大切です。

Page2とPage3の設定も直します。

これで直ったはずです。

Push Changeを押して

間違いを直します。

もう一回Testします。

NEXTを押しました。

今度はPage2に移動しました。

他のButtonもTestしましたが全部、望んだ動きをしていました。

以上です。

7.2 Deviceの機能を勉強する

今週の勉強である重大な事に気が付きました。

UEFNのFortniteにあるDeviceが

色んな機能を持っていてそれぞれを組み合わせてProgrammingめいた事を実装する事が可能なんです。

というかProgrammingが書けない人達がGameを作成するにはそれしか方法が無いです。

という事はこれらのDeviceの機能を全部勉強してしまえば他のUEFNのCreatorに圧倒的な差をつける事が出来るようになります。

まず今まで勉強したDeviceを以下に整理します。

2023-04-10のBlog

Player Spawnerが登場しています。

Player SpawnerはしっかりDeviceの中にありました。

2023-05-15のBlog

Item Granterについて説明していました。

更に以下の方法で武器を実装出来る事も解説されていました。

Item GranterもDeviceにありました。

Buttonもここで出て来ました。

流石にこのDeviceの機能はもう理解しています。

更にEnd Game Deviceと言う名前のDeviceも出て来ました。

これもDeviceにありました。

Guard Spawnerも出て来ました。

敵をSpawnするDeviceです。

しかもここで以下の文章が書かれていました。

やっぱりCreative1.0ではProgrammingを知らない人達がDeviceを組み合わせてGameを作成していたんですね。

2023-07-16のBlog

ここでItem GranterやEnd Game Deviceの実装をしていました。

2023-07-23のBlog

Guard Spawnerの実装をしていました。

2023-08-14のBlog

Prop Moverを勉強していました。

こんなDeviceもありましたわ。

2023-08-21のBlog

Prop Moverを実際に使用しています。

2023-08-28のBlog

ここで初めてVerseを使用しています。

VerseのFileはLevel上では以下のDeviceで表示されます。

これも一応Deviceなのでここに記しておきます。

2023-10-22のBlog

UFO Spawnerを使用していました。

これですね。

2023-10-29のBlog

UFO Spawnerを実際に使用しています。

こんなのが展開されていました。

2023-11-05のBlog

Tutorialの勉強をしていますが、そこでCinematic Sequenceが使用されていました。

ここではAssetと書いていますが、Deviceですね。

これですね。

2023-11-12のBlog

Cinematic Sequenceの使用方法について簡単にまとめていました。

2023-12-03のBlog

Sports Car Spawnerの使用方法について勉強していました。

これですね。

更にExplosive Deviceの使用方法についても勉強していました。

2023-12-10のBlog

Sports Car Spawner とExplosive Deviceを実際に使用していました。

以上でした。

<今まで使用したDeviceのまとめ>

以下のDeviceを今まで使用していました。

  • Player Spawner
  • Item Granter
  • End Game Device
  • Guard Spawner
  • Prop Mover
  • UFO Spawner
  • Cinematic Sequence
  • Sports Car Spawner
  • Explosive Device

たった9個のDeviceしかまだ使用していませんでした。

うーん。

これもまたコツコツ勉強するしかありません。

17x11+7 = 194個のDeviceがありました。

更にEarly Accessの中には以下の3つのDeviceもありました。

となると197個のDeviceが存在している事になります。

これの使用方法もぼちぼち覚える必要があるという事ですね。

7.3 Deviceについて更に調査する

まず公式SiteのDevices [12]を見つけました。

軽く読みます。

はい。

Using Devices [13]をみます。

こういう画面があるんですね。

うーん。

どこからこの画面に移動出来るんでしょうか?

すぐ下にこの画面への行き方が説明されていました。

まず以下の編集Modeに行きます。

Tab Keyを押します。

おお、この画面ですね。

Deviceは仕掛けと訳されていますね。

これは普通に装置の方がしっくりくる気がしますね。

Player Spawnerを選択してみます。

右下にPlayer Spawnerの機能が説明されていました。

これだけしか説明されてないのか。

左端にある以下の分類が興味深いです。

開始時の仕掛けを選択したら以下のDeviceが表示されました。

武器の分類に近接が

がありました。

以下の武器がありました。

剣とかあります。

このUIは非常に見やすいですが、UEFNを使用出来るならこっちは触らなくても問題ない気もします。

今週はこれくらいにしておきます。

これらのSiteはこれから少しずつ勉強する事にします。

8. DirectX12の勉強

8.1 Lötwig Fusel氏のD3D12 Beginners Tutorialを勉強する

8.1.1 先週の復習

何をやったのか全く覚えていません。先週のBlogを読み直します。

思い出しました。

先週、Visual StudioのSettingで

というIconがある事が判明しました。

これを押すとTutorialと同じやり方をするだけでTutorialの表示と同じFolderの構成を作成出来そうだという事が判明したんです。

それで

となったんでした。

今週は量が多いですが、これを一気にやってしまいましょう。

8.1.2 Lötwig Fusel氏のD3D12 Beginners Tutorialをやり直す

 Project Setup & ComPointer | D3D12 Beginners Tutorial [D3D12Ez] [14]を実装する>

Blogを見直すと2023-10-29から勉強をしています。この辺を参考にして作り直す事にします。

まずProjectを作成します。Empty Projectを選択します。

この辺は2023-11-05のBlogのやり方と全く同じです。

それで問題ないはずです。

次の設定です。

名前はMyD3D12Ez_2としました。

Solutionが作成されました。

以下のような表示になっています。

げ。

ここまで作成したら2023-11-05のBlogではConsoleのTemplateで作り直していました。

うーん。

流石にここからProjectを作り直すのは面倒です。

Sample Codeを見ると以下のようなFileの設定になっています。

ので以下のようにMain.cppを追加して

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

これを実行すると

となりました。

このProjectで続きを作成しても大丈夫でしょう。

このまま続けます。

Project Settingを変更します。

PlatformをX64に変更します。

うーん。

最初からx64になっていました。

Output Directoryの設定を以下のように変更します。

これで合ってるはずです。

$(SolutionDir)build\$(PlatformShortName)-$(Configuration)\bin\

これをそのままPasteしました。

Editで確認すると

以下のAddressにOutputを作成します。

2023-11-05のBlogではhyphenの意味が分からないと調べていました。

はい。

結果が面白いので、ここにもう一回載せておきます。

Intermediate Directoryの設定を変更します。

以下のAddressをそのままCopyして

$(SolutionDir)build\$(PlatformShortName)-$(Configuration)\obj\$(ProjectName)\

Pasteしました。

Editorで実際のAddressを確認します。

あってそうです。

次にC++ Language Standardの設定を変更します。

しました。

ここで2023-11-05のBlogでは一端、TestしてFolderが指定した場所に作成されるのかどうかを確認しています。

同じようにTestします。

実装しました。

特に問題なく実行出来ました。それでは作成されたFolderを確認します。

まずOutputです。

以下のFolder内に作成されているはずです。

確認します。

がありました。

出来ていました。

Intermediateの方も確認します。

となっています。

に以下のFileが形成されていました。

はい。

出来ています。

この時点でSample CodeのFolderと比較してみます。

Sample CodeのFolderです。

私のProjectのFolderです。

Sample CodeにあるGithub関連のFolderやFileを消すと以下のようになります。

まず.vsは同じです。

Buildも同じです。

MyD3D12Ez_2とsrcはほぼ同じ内容でした。

私のProjectではx64というFolderがあります。

X64の中は以下のようになっていました。

これはOutput内のFileと同じです。

要らないので消します。

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

Sample Codeと比較すると

となります。

これを見るとMyD3D12Ez_2がsrcと同じという事になります。

中身を見てみます。

私のProjectです。

Sample Codeの中身です。

ここにあるFolderは後で追加するものなので今は消しておきます。

X64と言う名前のFolderは何を示しているんでしょうか?

中身を見てみます。

これは以下に示したIntermediateのFolderの中身と全く同じです。

Defaultの設定の時に実行したので、その時に作成されたFolderでしょう。

消します。

これで以下のようになりました。

私のProjectです。

Sample Codeです。

違いはFilters fileの存在だけになりました。

Sample Codeの方にはFilters fileは作成されていませんでした。

これについて少しだけ調べます。

BingのCopilotで聞きました。

XML Fileだそうです。

と言うとTextで開けるの?

開けました。

ああ、これか。

分かりました。

こっちのFilter Viewの管理をしているようです。

成程、Sample CodeはFilter Viewは使用してないので.filterは生成されてないみたいです。

Sample CodeのFilter Viewを見たら以下のようになっていました。

全く整理されていません。

以下の方法でFilter fileを消せると言っています。

これはVisual Studio 2019: use folder structure as filter [15]の解説をまとめていたんですが全く違う話でした。

このFilter fileは後々必要になるかもしれませんので残しておきます。

最後にSample Codeでは

以下に示した

Vcxproj fileやvcxproj.user file、そしてmain.cppがsrc folderに保存されいます。

私のProjectではProject名 Folder内に保存されています。

これの直し方を調べます。

わかりませんでした。

これもこのままで良いです。

Linkingの設定に行きます。

Sample Codeの設定をそのままCopyしました。

2023-11-05のBlogでは以下のようなCommentがありました。

これってDebug Layerと関係あるなんかじゃなかったでしたっけ?

<追記>

これは私の勘違いでした。私が思っていたのはDXGIの事でした。

<>

こんな回答しか得られませんでした。

Debug Layerと関係ありますか?と質問したら以下の回答でした。

あんまり関係なさそうですね。

VC++ DirectoriesのInclude Directoriesの値を変更します。

ここで$(ProjectDir)の値が

私のProjectでは

になっていますが、

Sample Codeでは

になっていました。

こっちはsrcを指定しています。

ここは無視します。

うん。

これで環境設定は完成とします。

一寸まだ不明な点はありましたが、このTutorialをやる分には問題ないでしょう。

次をやります。

Windows.hを追加しました。

ここから2023-11-05のBlogは壮大に勘違いしてFilter ViewでTutorialと同じFilterを作成使用としています。

ここは一からやり直します。

Support Folderを追加します。

今回はしっかりShow All FilesがCheckされた状態で新しいFolderを作成しました。

そのSupport Folder内にWinInclude.h Fileを作成しました。

WinInclude.hの実装です。

更にDebug Layerを使用するために

D3d12sdklayers.hとdxgidebug.hを追加しました。

これでWinInclude.hの実装は終わりだそうです。

Main.cppに戻ってWinInclude.hをIncludeしました。

今度は何の問題もなく実装出来ました。

うーん。

これは全部の実装を一回で終わらせることは無理でした。

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

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

8.2.1 先週の復習

先週のBlogを読み直します。

「4.5 はじめてのShader」を勉強しています。

Vertex ShaderとPixel Shaderの作成方法を勉強していますね。

正し具体的な方法はBlogにはまとめていませんでした。

ので教科書を見ながら実装していきます。

8.2.2 「4.5 はじめてのShader」を実装する

<「4.5.1 Vertex Shaderの記述」を実装する>

以下のようにしてVertex Shaderを追加しました。

以下のようなFileが作成されました。

関数名をBasicVSに変更しました。

<「Visual Studioの設定」を実装する>

BasicVSを右Clickして以下のBoxを表示します。

更にHLSL CompilerのGeneralを開いて

Entrypoint NameとShader Modelの値を変更しました。

最後にBuildしてErrorが無い事を確認しました。

<「4.5.2 Pixel Shaderの記述」も実装します>

今度はPixel Shaderを作成します。

Vertex Shaderを作成したのと同様にPixel Shaderを作成しました。

PixelShaderの実装もMain()関数をBasicPS()に変更しました。

更にPixel Shaderの設定も以下のように変更しました。

一応、Buildして確認しましたが問題なかったです。

これでShaderの実装は一応出来ました。

8.2.3 「4.6 Shaderの読み込みと生成」を読む

次の節を勉強します。

<「4.6.1 ID3DBlob型」を読む>

ID3DBlob型について解説しています。

ID3DBlob型はShader Objectを扱うための型だけでなく、他のObjectも扱うそうです。

以下のようにShaderのObjectを生成しています。

<「4.6.2 必要なIncludeとLink指定」を読む>

ShaderをCompileするのに必要なHeaderをIncludeします。

更にLibraryもLinkします。

<「4.6.3 D3DCompileFromFile()関数」を読む>

これが結構長い節です。

Shaderを読み込むための関数は、D3DCompileFromFile()関数だそうです。

この節がなんで長いのか分かりました。

このD3DCompileFromFile()関数のそれぞれのParameterについて解説しています。

この部分は今回はSkipします。

<<Errorが起きた場合>>

Vertex ShaderやPixel ShaderのReturn ValueがS_OK出なかった場合の対処方法について解説していました。

Shaderに書いたCodeにErrorがある場合は、ppErrorMsgを見ると良いそうです。

ppErrorMsgに詳細なErrorの情報が載っているそうです。

ただしppErrorMsgの情報を取り出すためには以下のID3DBlogの関数を使用する必要があるそうです。

  • GetBufferSize()関数
  • GetBufferPointer()関数

ただしこれらの関数はSample Codeでは使用されていませんでした。

うーん。

どうしよう。

一応、教科書には具体的に使用するためのCodeが書かれていました。

次にFile名が間違っている時の例が載っていました。

File名が間違っている場合はHRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)が返って来るそうです。

以上でした。

9. まとめと感想

なし。

10.参照(Reference)

[1] Castle Wall Tool. (n.d.). https://www.youtube.com/playlist?list=PLNbgmFvU__fiPhyUWHHzZ2Nv5ieM_bOdB

[2] Gediminas Kirdeikis. (2023, April 30). Unreal Engine 5 for Architecture - 2023 Full Beginner Course [Video]. YouTube. https://www.youtube.com/watch?v=bT8aSTkpkDY

[3] pinkpocketTV. (2023, December 4). Step-by-Step Unreal Engine 5 tutorial: 3D Gaussian Splatting for Beginners [Video]. YouTube. https://www.youtube.com/watch?v=xdDzChfFY_A

[4] Ben Cloward. (2023, May 4). Using custom HLSL code - Advanced Materials - Episode 24 [Video]. YouTube. https://www.youtube.com/watch?v=qaNPY4alhQs

[5] Rick Banks. (2022, June 20). Houdini - Wall Tool 05 [Video]. YouTube. https://www.youtube.com/watch?v=WE4xrUXnW0s

[6] Rick Banks. (2022b, June 20). Houdini 19 - Wall Tool 04 [Video]. YouTube. https://www.youtube.com/watch?v=AwRKrGL7DmQ

[7] sidefx.com. (n.d.). detail expression function. https://www.sidefx.com/docs/houdini/expressions/detail.html

[8] Joshua M Kerr. (2022, September 25). After effects to Unreal Engine 5 (THE EASY WAY) [Video]. YouTube. https://www.youtube.com/watch?v=r7IW5te_3ZI

[9] Joshua M Kerr. (2022, February 13). TRACK THIS! - Camera tracking from blender to Unreal engine [Video]. YouTube. https://www.youtube.com/watch?v=Ta0am2wC-SI

[10] Pi Equals Three. (2023, April 21). Make a book / UI text in Fortnite - UEFN / Creative 2.0 tutorial [Video]. YouTube. https://www.youtube.com/watch?v=9GPYbD6fnh8

[11] Gamefromscratch. (2024, January 9). Unreal Engine 6 = UE5 + Verse [Video]. YouTube. https://www.youtube.com/watch?v=y87M5ySVGJs

[12] Devices. (n.d.). Epic Developer Community. https://dev.epicgames.com/documentation/en-us/uefn/devices-in-unreal-editor-for-fortnite

[13] Using devices. (n.d.). Epic Developer Community. https://dev.epicgames.com/documentation/en-us/fortnite-creative/using-devices-in-fortnite-creative

[14] Lötwig Fusel. (2023, May 1). Project Setup & ComPointer | D3D12 Beginners Tutorial [D3D12EZ] [Video]. YouTube. https://www.youtube.com/watch?v=rF30qoUFDq8

[15] Visual Studio 2019: use folder structure as filter - Microsoft Q&A. (n.d.). https://learn.microsoft.com/en-us/answers/questions/139429/visual-studio-2019-use-folder-structure-as-filter

UE5の勉強 -映像作品としてのLandscapeを作成する-

今年の予定

2週間かけて去年の勉強内容をまとめました。その結果、今年は少なくとも今年の前半は去年の後半に決めた内容をそのまま継続する事にしました。

まだ半年しかやってないので結果を判断するにはまだ早いと結論づけました。

後、半年ほど同じ内容をやってから次のStepを考える事にします。

1.今週の予定

そう言う訳で去年と同じ内容をやっていきます。

<映像作品としてのLandscapeの作成>

建築用のLevelの作成の勉強の続きをやります。

建物の作成の続きをやります。

Niagara の勉強>

Unreal Engine 5で学ぶビジュアルエフェクト実装 基本機能からNiagara、シミュレーションまで」の実装をやります。

<Materialの勉強>

Ben Cloward先生のTutorialを勉強します。

<Gaeaの勉強>

GaeaのTutorialを作成します。

<Houdiniの勉強>

Castle Wall Tool [1]の勉強をやります。

<UEFNの勉強>

Pi Equals Three氏のTutorialをやります。

<DirectX12の勉強>

DirectX 12の魔導書」の勉強をやります。

更にLötwig Fusel氏のDirectX12のTutorialをやります。

2.Landscapeの作成

2.1 Lightの配置の続きをやる

こんな所に一個Square Lightが配置されていました。

消します。

他のWindowや天井にもLightを追加しておきます。

車庫の窓にLightを追加しました。

なんかLightに×がついています。

調べたら以下の警告が出ていました。

どうやらLightの光が重なっている箇所があるとこの警告が表示されるみたいです。

公式のForumであるFailed to allocate shadowmap channel for stationary light due to overlap [2]には以下のように解説していました。

別にStationaryである必要はありません。

Movableに変更しました。

直りました。

二階にもLightを配置していきます。

警告が表示されるのでLightのMobilityはMovableに変更します。

仕事部屋です。

寝室です。

別の寝室です。

子供部屋です。

2回のBathroomにもLightを追加しました。

これで全部の部屋にLightを配置しました。

一応、建物の作成は完成しました。

2.2 Unreal Engine 5 for Architecture - 2023 Full Beginner Course [3]の勉強に戻ります

2023-10-22のBlogで2つ目のCameraの設定を勉強していますが、この実装はまだしていません。

TutorialのCamera Setupの2:38:00のあたりの内容になります。

一つ目のCameraをDuplicateして2つ目のCameraを作成しました。

以下の位置に配置しました。

Cameraから見た映像です。

ピントが建物に合ってないです。

直します。

Manual Focus Distanceを使用して

Focusする距離を建物に合わせました。

結果です。

建物が浮いていますね。

何と、建物の下に土台をおいていたら、Cameraを別な場所に移動させてしまいました。

しかも3D酔いまでして来てしまいました。

今週はここまでにして残りは来週やります。

2.3 UE5でも無料で3D Gaussianが使用出来るみたい

休みの間、いろんなYouTubeを見てたんですがStep-by-Step Unreal Engine 5 Tutorial: 3D Gaussian Splatting for Beginners [4]に、無料でUE5内で3D Gaussianを実装する方法が説明されていた気がします。

これ一寸、確認します。

動画の最初に以下のSiteが紹介されていました。

Freeって書いてありますね。

実際のSiteも確認してみます。

Radiance Fields [5]です。

Freeとしっかり書いてありました。

正しApache 2.0 Licenseと書かれていました。

このLicenseよく知りません。

調べます。

MIT Licenseと比較して以下の点だけが違うと、このSite [6]に書かれていました。

こんだけ分かれば今は十分です。

2.4 Step-by-Step Unreal Engine 5 Tutorial: 3D Gaussian Splatting for Beginners [4]を勉強する

11月30日に公開された出来立てほやほやのPluginみたいですね。

これはなるだけ早く勉強して試してみたいですね。

一寸時間はないですが無理くり勉強してしまいます。

まず先程のSiteからReleaseをClickしてGitHubのPageに飛びます。

そして以下のFileをDownloadします。

解凍したらそのFolderを以下の場所にPasteします。

そしてUE5を開きます。

EmptyのLevelを作成して空だけ生成していました。

これはいつものLevelの作成方法と同じでしょう。

そして先程作成したPluginが使用出来るようにします。

今度はPolycamと言うSiteに行っています。

これどこのSiteなの。と思ったら下のDescriptionにこのSiteのURLが載っていました。

Clickしたら以下のSiteに飛びました。

うーん。

TutorialとはImageが違う。

これってひょっとして3D Gaussian SplattingのDataを買わないといけないの?

とりあえずTutorialだけ先に見る事にします。

TutorialではFreeでDownload出来ると言っていますね。

ここから本番です。

Downloadした3D Gaussian SplattingのDataをUE5にImportします。

以下のButtonを押していました。

これは使用した事ないです。

先程のPluginをEnableすると表示されるんでしょうか?

確認のための自分のUEを開いて見ました。

やっぱりこのButtonはないですね。

Tutorialを見るとこのButtonの機能が表示されている場面が一瞬だけ写っていました。

Load GS ply Modelと書いてあります。

3D Gaussian Splatting専用のIconである事は間違いないです。

先程のPluginをEnableしたら使用出来るようになるんでしょう。

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

CarSplat.plyをImportしました。

以下のFileがImportされました。

TutorialではそれぞれのFileについて簡単に説明していました。

最初のCarSplat1はBlueprintだそうです。

次のPositionはSplatのPositionの値が保持されているそうです。

次のQuat4はSplatのRotationの値、

その次のScaleAはSplatのScaleの値が保持されているそうです。

最後のSH_0はSplatの色の値が保持されているそうです。

Blueprintを開いています。

何これ?

何もしなくても既に出来てるの?

このBPをLevel上に配置すれば良い気がして来ました。

TutorialでもこのBPをLevel上に配置しています。

このTutorialの撮影ではUEはCrashしませんでしたが、前にこのBPを開いたときはUEがCrashしたそうです。

もしUEがCrashした場合は何回かTryすれば開けるようになるみたいです。

近づいて見た結果です。

うーん。

凄い。

これは自分で試してみたい。

今度は以下のParameterをEnableしてLightingの設定をUEから変更しています。

次は別な3D Gaussian SplattingのModelを試していました。

凄すぎ!

最後に3D Gaussian SplattingのCropのやり方を説明するそうです。

Cropって画像を編集する時に端を切って短くする事だと思うですがどうなんでしょう。

Tutorialの続きを見ればCropが何を指すのかは直ぐに分かるので気にしないで先に進みます。

Location Volumeを追加します。

こんな感じです。

この中だけRenderingされるそうです。

だからCropなのか。納得です。

先程のBPを選択してUser ControlのCrop Volumeを選択し、今作成したLocation Volumeをセットします。

そしてCrop TypeにKill Outside Volumeをセットします。

これだけでした。

結果です。

なんかBoxの外側にもRenderingされているように見えます。

目の錯覚でしょうか?

Ultra Dynamic Skyを追加して景色を更にPhoto-Realisticにしています。

空にGrayな影が存在していますね。

Ultra Dynamic Skyは持ってないのでこの部分は試せませんね。

以上でした。

流石に実装する時間までは取れません。

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

3.Niagara の勉強

Unreal Engine 5で学ぶビジュアルエフェクト実装 基本機能からNiagara、シミュレーションまで」の続きを勉強します

去年、三章の「Game of Life」まで実装が終わったんでした。

ので今週は次の「木の生成Simulations」を勉強します。

3.1 「14.1 木の生成Simulationsの理論」を読む

軽く読みました。

どのように木を生成するかの理論が説明されていました。

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

木の生成のAlgorithmを簡単にまとめると以下のようになります。

  1. 地面から枝が生え、幹になる
  2. その幹から枝が2つ生え、それぞれが幹になる
  3. 2を何回か繰り返す
  4. 最後に葉が生える

ただしこれを実際に実装するためには、枝(幹)の始点と終点を管理してその間に線を引く必要があります。

点はArrayで管理します。

するとそれぞれの点のIDは以下のようになります。

ここでそれぞれの点からその点の親の点に線が引ければ、枝(幹)の始点と終点の間に線を引いた事になります。

そのためには

それぞれの点の親の点のIDを知る必要があります。

Floor((ID-1)/2)

の計算でそれぞれの親のIDを求める事が出来ます。

<点の位置を決定する>

今度はそれぞれの点の位置の決定方法についてです。

親の進行方向のVectorを取得します。

その方向に前進します。

教科書ではこの点の始点についての解説は無かったですが、当然親の点の位置から開始しているはずです。と言う事は親の点の位置も取得しているはずです。

ある程度前進したらランダムな方向に移動するそうです。

また教科書には移動した後の位置を記録する話が書いてないです。これは絶対記録しているはずです。

これについては実装する時に確認します。

この移動した方向については、親の点から参照出来るようにする必要があるそうです。

以上でした。

3.2 「14.2 Niagaraで線を書く」を読む

前節だけ読んだんでは短すぎるので次の節も読む事にします。

Niagaraを使用して線を書く方法について解説していました。

Sprite Based Line Moduleを使用するそうです。

EmitterのどのSectionで使用するのかが分かりません。

よく読んだらParticle Update Sectionと書いてありました。

この後、Sprite Based Line Moduleの設定方法についての解説がありました。

これは実際に使用する時に詳しく読む事にします。

その後で、このSprite Based Line Moduleは追加しただけではLineは描画されず、更なる設定が必要と書かれていました。

まず前提条件としてParticleの回転を止めるそうです。

やり方については教科書に事細かくまとめられていたのでここで繰り返すのは止めます。

そしてRender SectionにあるSprite Renderer Moduleの設定を変更していました。

MaterialやAlignmentの設定を変更したりしていますが、その理由についての解説は無かったです。

こうやると線が表現出来るみたいなManualがあってそれに従って設定してるだけなのかもしれません。

この後で、やっとSprite Based Line Moduleの設定をSprite Renderer ModuleにPassする方法を解説していました。

以下のParameterにSprite Based Line ModuleにあるParameterをBindさせるそうです。

  • Position Binding ―>Position
  • Sprite Size Binding ―>Sprite Size
  • Sprite Alignment Binding ―> Sprite Alignment

これで原点からそのParticleの位置の線を描く事が出来るようなったそうです。

この後はSprite Based Line Moduleの実装内容についての解説が書かれています。

これは木の生成とは関係ないのでSkipします。

3.3 「14.3 木の生成Simulationの実装」を読む

来週から実装に入りたいので次の節も軽く読む事にします。

EmitterがどのTemplateを使用しているのかが書いてないですね。

この辺はSample Codeを参考にして推測するしかないですね。

GPUを使用しています。

木の生成に何万個のParticleは必要ない気もしますが、どうなんでしょう。500個くらいのParticleを生成するだけならCPUでやった方が楽な気もします。

図14.3.1は間違っていますね。全然別なImageが載っています。

文章の解説だけで何を行っているのかは理解出来るので問題ないです。

Spawn Burst Instantaneous Moduleの設定について解説しています。

やっぱり700個しかParticleを生成していません。

Emitter State Moduleの設定も変更しています。

CGHOW氏のTutorialでParticleは一回生成するのみで永遠に存在する場合と同じ設定にしていました。

CGHOW氏はもうYouTube上にNiagaraのTutorialを公開しなくなってしまったので残念です。

まああのLevelのTutorialを理解出来る人ってほとんどいないでしょうから、そんなに再生回数も稼げないでしょう。

仕方ないです。

で、このSimulationの勉強が終わったらNiagaraの勉強は一端終わりにします。

そしてDeep Learningの勉強をこの時間にする事にします。

Jeremy Howard氏の以下のTutorialを勉強する事にします。

なんかGame産業自体が今後10年の間に崩壊しそうなので、一応AIの勉強もしておこうと思っています。

Unityの時のような事件がUEに絶対起きないとは限りません。

保険をかけておくのは大切です。

話がそれました。

教科書の勉強に戻ります。

以下のVariableを作成しています。

  • Position型のEnd Position
  • Int32型のDepth
  • Vector型のForward

End Positionは終わりのPointの情報を保持するための変数だそうです。DepthはそのPointが幹から数えて何回枝分かれしたのかを示すための変数だそうです。これを使用して葉を生成するか更に枝分かれするかを決定するそうです。

ForwardはそのPointが伸びる方向を表しているそうです。

更にEmitterのName Spaceである変数も作成します。(今まで作成した変数のName Spaceは全部Particleでした。)

  • Attribute型のAttribute Reader

これ一個だけでした。

教科書にはこのAttribute ReaderをEmitter Spawn Sectionにセットして更にいろいろな設定も変更していました。

この辺は実装する時に勉強します。

次に新しいGPU Simulation Stage(Section)を作成しています。

この教科書では一貫してSectionの事をStageと呼んでいます。

Stageの方が時間の流れを認識出来るのでSectionよりも良い名称のような気もします。

もしかしたら私もこれからはSectionからStageに変更するかもしれません。

Sloveと名付けていました。

Slove Sectionが生成されたら、早速Scratch Pad Moduleを作成して新しいModuleを追加していました。

この新しく追加されたScratch Pad Moduleの名称もSolveになっていました。これはかなり紛らわしいです。

この後はこのSolveと言う名前のScratch Pad Moduleの実装方法の説明が延々と続いています。

一応、軽く全部読む事にします。

Custom HLSL内の実装はどうなっているのか不明ですがそれ以外は特に難しい部分はなさそうです。

教科書ではこの後、Custom HLSLの実装方法について解説していました。

かなり長くなるので今週はここまでとします。

来週はここまで実装して、再来週は残りを勉強し、その次の週に最後まで実装する事にします。

4.Materialの勉強

今年もBen Cloward先生のTutorialを勉強していきます。

こんなにたくさんのTutorialが追加されていました。

Ben Cloward先生は個人的な事情で今年は半分位、休んでいましたが復活したらこの勢いです。

英語圏の勉学に対する熱意はとんでもない部分があります。

4.1 Using Custom HLSL Code - Advanced Materials - Episode 24 [7]を勉強します

今回はCustom HLSLの使用方法の解説のようです。

以下の機能について解説するみたいです。

Customノードは以下のように実装されています。

Customノードの設定を以下のようにしました。

結果です。

流石にこの辺の理屈は知っています。

知ってますが、復習には丁度いいです。

DescriptionとInputsの使い方の説明をしています。

これも知っているのでSkipします。

<Lerp(A, B, T)>

今度はLerp()関数の使用方法についての解説です。

Customノードの設定です。

Inputする方のTypeの設定はしなくて良かったんでしたっけ。

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

こんな風に実装していました。

結果です。

<Texture2DSample(Tex, TexSampler, UV)>

今度はTexture2DSample()関数です。

Inputです。

TexSamplerは?

なんかTexSamplerは要らないみたいです。

以下のように実装して

以下のような結果が出ています。

Texture2DSample()関数はHLSLの関数だと思うんですが検索しても出て来ません。

無いみたいです。

<For Loop>

今度はFor Loopを作成します。

以下のように実装しています。

ここでは初めてHLSLを書く人に対してかなり丁寧な解説をしていますが、私には必要ない内容なのでSkipします。

次に以下のCodeを実装しています。

ぱっと見は複雑ですが、中身の構造は先程のLoopと同じです。

これも軽く見て終わりにします。

以下のように実装しました。

結果です。

水玉を拡大します。

RとDistの値を変更します。

結果です。

うん。

何が変わったの?

水玉の端が少しだけBlurryになったと言っています。

うーん。

あんまり変わってない気がします。

どうなんでしょう?

今度は値を以下のように変化させました。

結果です。

はは、

なんか変な形になりました。

まあ変化する事は確認出来ました。

以下の部分のCodeを見たら何をしてるのか判明しました。

ようなTextureの値を採取する場所を少しだけ左右上下にずらしているんです。

だから水玉模様が四角くなったんです。

Tutorialではこの後にこの実装部分の内容を非常に詳しく解説していました。

もう理解してしまったのでここにはまとめません。

これで終わりかと思ったら次に丸くBlurryにするためのCodeを紹介していました。

以下のように実装していました。

結果です。

こっちは水玉の境界がかなり均一にBlurryしています。

TutorialではこのCodeについてもかなり詳しい解説をしていました。

これは実装する時にもう一回検証する事にします。

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

来週実装します。

5.Gaeaの勉強

7番目のTutorialを作成しました。

Erosion GroupにあるNodeの内、Geology的な関連があるAlluvium、Deposits、Sediment、そしてStratifyについてPower Pointでまとめました。

以下にまとめたPower PointのSlideについて簡単に説明します。

<Geology的な解説>

Alluvium、Deposits、Sediment、そしてStratifyのGeology的な解説をまとめています。

DepositsはErosionで削られた土が川底などに貯まる現象を指します。

それに対してSedimentはその川底などに貯まった土そのものを指すそうです。

こういう解説がしてありましたが、実際の単語の運用はほぼ同じ意味で使用されている場合がほとんどでした。

きっちり意味を分けて使用している場合はほとんどなかったです。

Depositsの中で水によって削られた場合を指す言葉だそうです。

ただし、Depositsが水の中にある場合はこの名称は使用出来ないそうです。

上記の図にあるような河口に土が溜まっている状態か、以下のSlideにある

川の周りに土砂が堆積して川が蛇行している場合の川の周りの土を指します。

因みに、この川の周りの土砂は肥沃で農業に非常に適していて、最古の文明は全部川の周りで発生してるのはそのせいだそうです。

Stratifyは地層の事です。

堆積した土砂が層を形成してこういう形状になるそうです。

<Gaeaによる機能>

今度はGaeaにおけるこれら4つのNodeの機能について調査した結果をまとめます。

Depositsノードについてです。

何とDepositsノードの機能はAlluviumノードのDepositsモードとほとんど同じだそうです。

違いは

  • 高速
  • 細かいディテールは犠牲
  • より大きな土壌を作成

な点だけだそうです。

Alluviumノードについてです。

  • 地形全体にDepositを作成
  • 割れ目を埋める
  • 大きな地形を覆うような大きなDepositを作成

Geology的はAlluviumな機能は全く無いですね。

AlluviumのDeposit ModeとDepositsノードはどんな風に違うんでしょうか?

これは実装する時に比較して検証します。

Sedimentノードです。

なんと砂や雪を追加する時に使用するそうです。

Geologyの解説とは全然関係ない機能ですね。

これも実装してどんな感じが確認します。

地層を追加します。

公式のDocumentではいかのような解説がされていましたが、

  • 地形上に壊れた地層や岩層を作成
  • _は2つの壊れたプレートの間などの限られた局所的なゾーンに作成
  • 各層は他の層から独立して存在
  • 強固でリアルな地層を作成

Gaeaの結果を見ないとよく分からないですね。

これも実装して試すしかないです。

<Gaeaにおける実装の結果>

一応、Gaeaで試してみました。

正しこの部分は録画はしてないので、来週の撮影では変更するかもしれません。

まず以下のようにNodeを組みました。

この時点でも結果です。

ここに今回の4つのNodeを追加します。

<Alluvium>

まずAlluviumノードを追加しました。

GeologyにおけるAlluviumは川の周りしかDepositsが起きませんが、GaeaではTerrain全体にDepositsが起きています。

ModeをDepositsに変更してみます。

あんまり変化ない気がします。

もっと接近して確認します。

ModeをDefault値であるResidualの場合です。

Depositsの場合です。

うーん。

Depositの時の方が、Depositに厚みがありますね。

でもそんなに違いがあるとは思えませんね。

<Deposits>

Depositsノードを使用しました。

結果です。

何、これ?

出来損ないの3D Printのように

凸凹が追加されてしまっています。

Seedの値を変えてみましたがこの凸凹は無くなりませんでした。

Sedimentsの値を下げると

凸凹が消えました。

うーん。

計算はAlluviumノードと比較すると楽なのかもしれませんが、結果もその分雑です。

<Sediment>

Default値の結果です。

これもDepositsノード程ではないですが、四角四角しています。

Mountainノードのせいかもしれないですね。

MountainノードのSeedの値を変更してみます。

四角四角は無くなりましたね。

<Stratify>

これが

こうなりました。

近づいて見ると確かに地層っぽく見えます。

ただこれはErosionではないですね。

この後にErosion関連のNodeを追加する必要がありますね。

Stratifyノードの後にErosionノードを追加しました。

結果です。

近づいてみます。

うーん。

これはStratifyが残っている感じはありますね。

Stratifyノードが無い場合を見てみます。

Stratifyは無くなりましたね。

やっぱり微妙に効いていますね。

StratifyノードとLook Dev GroupのStackノードとの違いも確認します。

Stackノードの場合です。

うーん。

地層がTerrainで統一されていますね。

これにErosionノードを追加してみました。

StackノードをBypassした場合です。

あんまり変化ないですね。

ErosionノードのParameterを変更してErosionを弱くしてみました。

これならStackが確認出来ますね。

うーん。

まあ動画を作成するは来週なので、この辺は来週も検討する事にします。

6.Houdiniの勉強

去年の最後のHoudiniの勉強は2023-12-10のBlogHoudini 19 - Wall Tool 04 [8]の勉強をしていました。

ので今週はHoudini 19 - Wall Tool 04 [8]の実装をします。

6.1 Houdini 19 - Wall Tool 04 [8]の実装をする

久しぶりにHoudiniを開きましたが、普通に開けました。

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

<Intro>

このTutorialでは、リアル感を出すためにこのPointの位置を少しだけRandomにばらつかせるそうです。

特にやる事はないので次に行きます。

<Attribute Wrangle>

Attribwrangle_fixHalfBrickにAttribwrangle2を追加し名前をAttriwrangle_ShuffleBricksに変更しました。

<Random Shuffle>

Lineの上のPointsをShaffleするそうです。

まず以下の変数を作成し

値を計算しました。

これはどれくらいPointの位置を移動させるかをRandomに決定しているだけですね。

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

両端のPointは移動しないそうです。

ので上記の実装でそのPointが両端かどうかを査定しています。

ここでCh(“multi”)のParameterを作成します。

以下のButtonを押します。

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

あれ、新しいParameterは出来ていませんね。

VEXpressionの上に作成されていました。

Multiの値を変更してみます。

Multi=0の場合です。

Multi=1に変更しました。

おお、両端以外のPointの位置が移動しました。

結構バラバラになっていますね。

<Brick Geometry>

ここからBrickのGeometryを作成します。

まずLineをPoint間で切るそうです。

そのためにConvertlineノードを追加しました。

結果です。

Point間に新しくLineが誕生しています。

今度はFor-Each Primitiveを追加します。

これも始めて使用します。

Foreach_begin1ノードにDisplay Flagをつけます。

結果です。

Tutorialと同じ結果になっていますね。

<Brick Depth>

まずLineを追加します。

しました。

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

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

Lineノードの名前を変更しました。

更にNodeの色を黄色くしました。

Line_BrickDepthノードとForeach_Begin1ノードをCopytoPointノードに繋げました。

結果です。

うーん。

Copy to Pointノードは前に使用したのは覚えていましたが、すっかりその機能は忘れてしまっていました。

今度はSkinノードを追加しています。

結果です。

おお、Skinは追加されましたが、向きはこれで合っているんでしょうか?

うーん。

分からないので先をやります。

Polyextrudeノードを使用してこのSkinをExtrudeします。

Poly Extrudeノードを追加しました。

以下のように書いてありましたが、

Distanceを選択してAlt +Eを押してもBoxは現れません。

Tutorialで確認します。

選択しているのはDistanceの値が表示されているBoxの方でした。

このBoxを選択してAlt+Eを押しました。

今度は以下のBoxが表示されました。

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

ここで2023-12-10のBlogには以下の記載がありました。

これは単にNodeの中のAttributeから参照しているからだと思います。

このNodeから出るのに../を使用しているだと思います。

Applyを押しました。

結果です。

うーん。

下向きに伸びていますね。

これあってるの?

Tutorialで確認します。

全く同じでした。

Polyextrudeの値をForeach_Endに繋ぎました。

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

Wを押してWire Frameに変更しました。

Brickが地面を貫いています。

これを直します。

Poly ExtrudeノードのDistanceに-を追加しました。

結果です。

直りました。

2023-12-10のBlogに以下のように書かれていました。

うーん。

これは分からん。

一寸考えてみますか。

分かりました。

以下の方向にExtrudeしていたのが

逆の方向にExtrudeしたんです。

それだけでした。

底は穴が開いています。

Output BackをEnableします。

結果です。

直りました。

Brickの色がBlueなのはFaceが逆になっているからだそうです。

それを直すためにReverseノードを追加します。

結果です。

ここでそれぞれのParameterが正常に働いているかをCheckします。

Line_BrickDepthノードのLengthの値を変更しました。

結果です。

おお。

結構、感動しました。

更にResample_BrickSpacingノードの

Lengthの値を変化させました。

結果です。

Brickの横幅が変更しました。

ShuffleBricksノードのMultiの値を変更して

それぞれのBrickの大きさのばらつき具合を調整しました。

ばらつきを0にした場合です。

更にAttribwrangle_ShuffleBricksノードを黄色くしました。

ParameterがあるNodeは黄色くするそうです。

BrickRowノードのSegmentの値を変更してBrickの高さを調整します。

Segmentの数を増やすと以下のようになりました。

全体の高さは同じですが、Brick一個の高さが小さくなり、Brickの数が増えました。

うーん。

出来ていますね。

これでTutorialは終わりでした。

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

7.UEFNの勉強

今週はPi Equals Three氏のMake a Book / UI Text In Fortnite - UEFN / Creative 2.0 Tutorial [9]を勉強します。

7.1 Make a Book / UI Text In Fortnite - UEFN / Creative 2.0 Tutorial [9]を勉強する

<Intro>

本を作るって何を作成するのかと思ったら

以下のようなUIを作成して

NEXT Buttonを押すと

次のPageの内容が表示され

Previous Buttonを押すと前のPageの内容が表示されるUIを作成するそうです。

これPageをめくるEffectを追加したいですよね。

<Setting up Pop-Up-Dialog Device>

Pop-Up-Dialog DeviceをLevel上に配置します。

こんな感じです。

名前をPage1に変更しました。

設定も変更します。

Response Typeを3 Buttonsに変更します。

Default Back ButtonはButton2に変更しました。

以下の設定も変更しました。

Duplicateして3つに増やしました。

表示するTextを追加します。

3つ全部にTextを追加してました。

<Setting up Page Functionality>

ButtonをLevel上に追加します。

Open Book Btnと名前を変更してました。

いや、これここまで勉強してあれなんだけど、Verse使わないの?

あれ?

これ勉強する価値ある?

別の予定とかは考えてないので、今週は仕方ないのでこれをやる事にします。

Page1を選択して以下の箇所に先程設置したButtonをセットします。

今度はPage2を追加しました。

次はPage2の設定です。

次はPage3の設定です。

これで完成みたいです。

<Final Result>

テストしています。

Gameを起動させてButtonを押すと以下のUIが表示されました。

あ、これはVerseを使用しなくてもUIを作成できるAssetなのか。

そう考えると便利なAssetではあります。

Nextを押したら以下のUIが表示されました。

Nextを押したら以下のPageが表示されました。

うーん。

成程。

こういうAssetの使用方法についての勉強もする必要はありますね。

まあのんびりやっていきます。

実装は来週やります。

8.DirectX12の勉強

8.1 Lötwig Fusel氏のD3D12 Beginners Tutorialを勉強する

8.1.1 2023-12-10のBlogで何を勉強したのかを復習する

もうどこまで勉強したのか全く覚えていません。

Blogを読み直してしっかり復習します。

二番目のTutorialであるDebug Layer | D3D12 Beginners Tutorial [D3D12Ez] [10]を初めて勉強していました。

まずFolderを作成していますが、これって

どっちのExplorer Viewで作成しているんでしょうか?

自分のProjectで確認してみます。

Solution Viewです。

こっちで作っていますね。

となるとFolderではなくFilterを作成しているとなりますね。

うーん。

この作り方だと参照で呼べなかった気がします。

Folder Viewで作成してその後でSolution Viewに戻りそこでDebugと言う名前のFilterを作成してそこに追加しないと出来なかった気がします。

これは実装する時に要確認します。

次にComPointerを使用して変数を作成しています。

で、この方法で変数を作成出来るのは前に追加したComPointer.hのお陰なのかどうかが分かりません。

その辺を勉強すると書いていました。

これも今週やりましょう。

次はDebug Layerを実装しています。

TutorialではここでDirectX12以前のDebug Layer2とDirectX12のDebug Layerの違いについて解説していました。

しかしその部分はBlogにはまとめていませんでした。

これはまとめることにします。

その後はずっと実装方法について解説していました。

ReportLiveObjects()関数についての説明です。

この関数についてもTutorialでは詳しい解説をしていたみたいです。

これもまとめておく事にします。

OutputDebugStringW()関数についてです。

この関数のTipについてもBlogに書き起こしておきましょう。

以上でした。

8.1.2 Debug Layer | D3D12 Beginners Tutorial [D3D12Ez] [10]を実装する

<Debugと言う名前のFilterを追加する>

まずはこれからやっていきます。

でSample Codeではどうなっているのかを確認します。

Sample CodeのSolution viewです。

これはTutorialの説明と同じです。

Folder Viewに変更します。

はい。

Src Folder内にDebug Folderがあり、その中にDebugLayer fileが保存されています。

Solution ViewからDebugと言う名前のFilterを作成してその中にDebugLayerと言う名前のFileを作成してもこうならないはずです。

ただしTutorialではこれしかやってないんです。

おそらくですがProjectの設定のどこかでこれを自動でやってくれるような設定が出来る箇所があってTutorialではそれを録画してないところでやっているんだと思われます。

これと同じ設定にするには、

  1. Folder ViewでDebugと言う名前のFolderを作成する
  2. このFolder内にDebugLayerと言う名前のFileを作成する
  3. Solution Viewに戻りDebugと言う名前のFilterを作成する
  4. このDebugと言う名前のFilterに先程作成したDebugLayerのFileを紐づけする

というStepを取る必要があります。

一応、Tutorialではどうやっているかを確認します。

Solution Viewを開いています。

Solutionを右Clickして以下のBoxを開きました。

Addを選択して、New Folderを選択していました。

あれ?

Solution ViewからBoxを開いてAddを選択した場合、以下のBoxが表示されるはずです。

この場合はNew Filterとなるはずです。

New Folderと表示されるのは以下に示した様にFolder Viewの場合です。

でもこの表示とも一寸違いますね。

何とSample CodeのSolution Viewから以下のBoxを開いてみたら

New Folderになっていました。

うーん。

何にこれ?

この環境の設定方法が分りませんね。

Tutorialで確認したら一番最初にFolderを作成した時点で

以下のようなBoxを表示するようになっていました。

うーん。

分かりました。

TutorialとSample Codeでは以下のIconをEnableしていました。

Show All Filesというやつです。

これをEnableすると

Solution Viewの表示が以下のようになって

Addを選択した時に表示されるBoxも以下のように

Tutorialと同じになります。

うーん。

これは最初から作り直します。

今週はここまでにしますが、来週もう一回最初のTutorialに戻って実装をやり直します。

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

8.2.1 先週の復習

前にやった内容は全然分かりません。

のでまず2023-12-10のBlogで何を勉強したのかを復習します。

「4.4 Vertex情報のCopy(Map)」を読んでいますね。

まずその中の「4.4.1 ID3D12Resource::Map()Method」を読んでいました。

ここでは前の節で作成したVertex BufferがCPU側にあるのかGPU側にあるのかを議論していました。

そうだ。

今度はMap()関数を作成するでした。

これは実装も済んでいるでしょうか?

Blogを読んだ感じでは実装も終わってそうな書き方になっています。

確認します。

していませんでした。

今週はMap()関数の実装をします。

2023-12-10のBlogでは更に次の節である「4.4.2 Vertex Buffer Viewの作成」も勉強していました。

この節ではVertex Buffer Viewを作成しているだけで、その作成したVertex Buffer Viewをどうこうはしていませんでした。

このVertex Buffer Viewも実装はしていませんでした。

最後まで読んだら

と書かれていました。

8.2.2 「4.4 Vertex情報のCopy(Map)」の実装をする

それでは2023-12-10のBlogで勉強した内容を実装していきます。

まず「4.4.1 ID3D12Resource::Map()Method」の実装からやっていきます。

Mapの実装を行いました。

更にこのAddressにCPU側にあるVertexの情報をPassするために

を追加しました。

最後にMapを解放するために

を追加しました。

次に「4.4.2 Vertex Buffer Viewの作成」の実装をやります。

出来ました。

8.2.3 「4.5 はじめてのShader」を勉強する

やっとShaderについて勉強します。

そもそもDirectX12の勉強を始めた理由の一つがHLSLをしっかり勉強したいと言うものでした。

UE5のCustomノードに書くHLSLはHLSLの一部でしかないです。

これだけ勉強したのでは