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