UE4の勉強記録

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

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

1.今週の予定

今週から元のScheduleに戻ります。

Google Developer Accountがどうなるのかはまだ分かりませんが、出来る事は大体やりました。後は天に任せます。

<映像作品としての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 前回の復習

2024-02-19のBlogに前回の勉強の内容が書いてありました。

前々回にHow to 3D Gaussian splat from Aerials to Unreal 5 (Free plugin)[2]を試して3D Gaussian SplatがUE5で実装出来る事は確認しました。

しかしその結果ははっきり言って期待外れでした。

それは以下のようにCameraを移動した時にブレが生じるんです。

ただこれは初めて3D Gaussian Splattingを勉強したので方法がBestではなかったせいだと思います。との感想になっていました。

その中で、以下の種類があったんですが

この中のEnvironmentの使用方法が分らないと書いてありました。

Environmentの説明は以下のようになっています。

思い出してきました。

これある3D Gaussian SplattingのTutorialを見た時に、Sky LightのCubemapに

CubemapのImageを追加して何かをしていたんです。

それがこのEnvironmentの場合だった気がしていて、それでEnvironmentの使用方法が分からないと書き残したんです。

で前回の勉強ではそのEnvironmentの使用方法について勉強しています。

Sky LightのCubemapを使用した3D Gaussian Splattingの使用方法を調べるために色々なTutorialを当たっていましたが、

その中でStep-by-Step Unreal Engine 5 Tutorial: 3D Gaussian Splatting for Beginners [3]を見直していたら

PolyCamの3D Gaussian SplattingのDataはFreeでDownload出来ますよ。とありました。

前、Tryした時はDownload出来なくて諦めたので予定を変更して試してみる事にしました。

結果、

出来ました。

これが前回の結果です。

2.2 3D Gaussian SplattingとUE5について調査する

この2週間の間に何か劇的な進化が生まれてないかYouTubeの動画をCheckします。

こんなのが出て来ました。

適当に見てみます。

Experience combining a 3D Gaussian Splatting model from Postshot to Unreal Engine.[4]

Olli Huttunen氏の動画です。

ただしTutorialではありません。

UE5に3D Gaussian SplattingをImportした後のUE5内での調整を簡単に見せているだけです。

まずImportした直後の結果です。

これ。

明らかに3D Gaussianで作成したと分かります。

以下のCommentが書かれていました。

この意味はまだ分かりません。

Clip BoxでFloorのPointを消しています。

うーん。

こうやってPointを消すのか。

FloorのStatic Meshを追加します。

うーん。

途端にSmoothになりました。

でも写真と同じとはもう言えなくなりましたね。

だれが見てもCGだと分かります。

Lightの調節をしています。

具体的なやり方は分かりません。

結果です。

奥の明かりが光っているのが追加されたんでしょうか?

Sphereを置いてLightの確認をしています。

これも具体的に何を確認しているのかは不明です。

水たまりのDecalを追加しました。

床の本物感がぐっと増しました。

増しましたがCG感はなくなりません。

Haze感は完全に消えています。

3D Gaussian Splatting full tutorial, crop, transform, mesh, import into UE5 & Collision [5]

これを見てる途中で眠くなってしまいました。

この続きは来週やる事にします。

3.Niagara の勉強

3.1 前回の勉強

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

「16.4 Pressure VectorとViscosity Vectorの計算」と「16.5 外力の計算」を実装していました。

今週は次の節である「16.6 位置の更新」を勉強します。

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

以下の計算を追加するそうです。

今までの位置の更新とやり方は全く同じだと教科書に書かれていましたが、今までのやり方を既に忘れています。

まあ、この教科書はこれから何回も読み直す事になるでしょう。

そんなに焦って勉強する必要も無いです。

<「16.6.1 Scratch Pad Moduleの準備」>

Update Moduleの実装をしていくそうです。

そんなModuleを作成した事なんて全く覚えていません。

一応、自分のProjectを開いて確認しておきましょう。

Update Position Moduleでしてた。

教科書を見直したらしっかりUpdate Position Moduleと書かれていました。

このUpdate Position Moduleを開いてMap Getノードに色々な変数を追加しています。

これはもうやってしまいます。

一応、確認のためにSample Codeをみます。

こうなっていました。

[PARTICLE]Position、[PARTICLE]Velocity、[PARTICLE]_Forceは既にあるParameterですね。

残りの[INPUT]Max Force、[INPUT]Max Velocity、[INPUT]Delta Timeは新しく作成したっぽいです。この3つのTypeはFloatですね。

はい。

出来ました。

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

成程、結局はPositionとVelocityの値を更新するだけなのか。

<「16.6.2 HLSLのCoding」を読む

以下のように書かれていました。

Maxより大きい値の時の計算が

Normalize(○○)xMax○○

となっていました。

この意味が分かりません。

普通にClampしてMax値に変更したら良いと思います。

うーん。

多分、教科書をきちんと読んだらどこかにしっかり説明しているんでしょうね。

まあ良いです。

次に勉強する時にこの辺は気をつけて読む事にします。

後の計算は前の節の説明そのままですね。

これも実装してしまいます。

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

Applyを押します。

特にError表示とかは無かったです。

<「16.6.3 Scratch Pad Moduleの入力(Parameter)の設定」を読む>

前節でUpdate Position Moduleに追加したParameter(いやこっちはAttributeか)に値を追加しているだけです。

後、この値を追加し終わったらParticleが動き出すそうです。

これは実装をやってしまいます。

結果です。

出来ているけどまぶしすぎます。

これはParticleのSizeが大きすぎて全部が重なっているからです。

その辺を直します。

3.3 Particleの重なりを防ぐ

調べたら以下の場所でSpriteのSizeを指定していました。

ここの値自体はSample Codeと同じでした。

うーん。

じゃ生成する場所が小さすぎるのかも。

Particle Spawn StageのShape Location Moduleの設定を確認します。

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

Sample Codeの値です。

うーん。

ここもあっていますね。

このNiagara SystemをLevel上に配置した後、Scaleを15倍にしました。

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

これで十分です。

というかかなり液体の感じがします。

この次の節から水面のRenderingについての勉強になります。

これもやっていきます。

3.4 「16.7 水面のRenderingの概要」を読む

これも勉強したかった内容です。

この技法はNvidiaのSimon Green氏によってScreen Space Fluid Rendering for Games]という題で発表されたものが最初だそうです。

Gray Scaleの深度のDataからNormal Vectorを計算するそうです。

隣接するPixel同士の値のずれをGradientとして捉えて、Normal Vectorを計算するそうです。

Normal Vectorをそのまま使用すると粒が目立つのでBlurをかけてぼやかした後に、計算するそうです。

得たNormal Vectorを元にDiffuse Lightを計算します。

更にSpecular Lightを計算します。

次に水面の厚みから水の色を計算します。

最後に、得たDiffuse Light、Specular Lightそして水の色をCompositeします。

以上だそうです。

うーん。凄い。

一応、参照にあったPowerPointも見ました。

以上です。

実装は来週やります。

3.5 「16.7 水面のRenderingの概要」を読んだ感想

これでParticleから水面を作成するRenderingのやり方が判明したんですが、答えを聞いてしまえば、なんだ、こんな簡単なことだったのかとがっかりした気分です。

なんか手品の種を教わった感じに似ています。

まあ実装してからもう一回考察する事にします。

4.Materialの勉強

久しぶりにBen Cloward先生のTutorialを勉強します。

2024-02-19のBlogを見ると

Flagを作成していたんでした。

もう旗は良いです。

次のTutorialをやります。

うそー。

またFlagなの。

おえー。

吐き気がしてきた。

まあ良いです。

今週は単に勉強するだけです。

4.1 Animated Flag Part 2 - Advanced Materials - Episode 27 [6]を勉強する

<Intro>

前回作成した旗を更によくする3つのTechniqueについて勉強するそうです。

<Flag Mesh>

前回の結果を正確に出すためには以下に示した様に

Static MeshのPivot PointをMeshの端に移動させる必要があります。と説明していました。

うん。

それは知っています。

けどそれが今回のTutorialの内容なの?

第二の条件として以下に示した様に

Static Meshが十分に分割されている必要があります。

これも知っています。

今度は旗を回転させました。

すると旗は風でなびいてるんじゃなくて伸縮するようになりました。

これを直すには以下の箇所にTransformVectorノードを追加する事です。

この現象が起きる原因は最初の値はLocal Spaceで計算しているのにWorld Position Offsetはその名前の通りWorld Spaceで計算しているからです。

のでTransformVectorノードを使用してLocal Spaceの値をWorld Spaceに変換してその後にWorld Position Offsetに繋ぎます。

結果です。

とんでもない事になっています。

これは以下の計算が

Local Spaceに対応した値になっているからです。

ここは以下のように直します。

これは実装する時に考えます。

そんなに難しい問題では無いでしょう。

結果です。

綺麗になびいています。

そして今度は旗の向きを変えても同じようになびくようになりました。

<Normals>

この旗のNormalを表示すると以下のように

一色になっていて、旗のいかなる位置のNormalも全く変化していない事がわかります。

これを直します。

まず実装を以下のように変更して時間を止めます。

Screenshotでは分かりませんが、旗のはためきがなくなりました。

<Derivative>

この旗のはためきにあったNormalを計算するには、この旗のSlopを計算する必要があるそうです。

つまりそのPointのDerivativeを計算する必要があります。

で肝心のDerivativeの計算方法ですが、ある点のDerivativeを計算するにはその隣の点の値を引けば良いだけです。

そして向きを確認するために90度回転させます。

はい。

しかし今回の場合はSineを使用しているので

Cosineを代わりに使用したら、この波のDerivativeになります。

うーん。

天才。

以下の実装を追加してNormalを変化させます。

まずSineノードにつないでいた計算結果を分岐してここのCosineノードに繋ぎます。

NormalはTangent Spaceなのでこの計算結果をTangent Spaceに変換する必要があります。

その方法は一般的なTangent Spaceの値である(0,0,1)を作成して、そのXの値にこのCosineノードの計算結果を繋ぐ事です。

結果です。

これはNormalの向きが逆になっているそうです。

<Checking Results>

Sphereを配置してそのSphereのNormalの色と比較すると逆になっているのが分かります。

これを直すために

Cosineノードの後にOne Minusノードを追加します。

結果です。

結果が反対になっています。

この結果にはまだ問題があって以下の

左の矢印の部分より右の矢印の部分の方が激しく揺れているにも拘らず、Normalは同じ結果になっています。

この結果を直すためには、以下に示した様に

Local PositionのRの値をCosineのOne Minusの結果に掛けます。

すると以下のように

旗のなびく角度によってNormalが変化します。

数学的に正しくするためには以下のように最後にNormalizeノードを追加する必要があるそうです。

結果は変わりません。

少なくとも見た目的には。

<Normalize>

特に重要な内容はなかったです。

以上でした。

5.Gaeaの勉強

先週、AndroidのAppの制作ばっかりしていたので、何もやっていません。

来週の日曜日には次のTutorialを上げる予定になっています。

ので一寸気合を入れて作成する必要があります。

5.1 前回の復習

前回、何をTutorialで教えたのか忘れてしまっています。

まず復習します。

思い出しました。

Maskingを勉強したんでした。

以下の実装の仕方を勉強しました。

今週は、この実装に使用したHeightノードやCombineノードの機能を勉強します。

5.2 PowerPointを作成する

以下の3つについてまとめました。

まずHeight Nodeについてです。

次はCombineノードについてです。

最後にMaskingが何故強力なのかについての解説をしています。

6.Googleから審査の結果が来ました

承認されませんでした。

のおおおー。

何で?

どうもAppはInstall出来たんですが起動しなかったみたいです

うーん。

更にGoogleに質問していた解答も得られました。

内部テストで公開したはずなのにGoogle Playから確認出来ないです。と質問を送ってありました。

ここから内部テストに飛べるそうです。

以下のSiteに飛びました。

あれ、Download it on Google PlayというLinkがあります。

うーん。

Google Playにアプリが表示されている!

なんか、怪しい。

携帯にこのアプリをDownloadしてみます。

普通に動きました。

やっぱり普通に動いています。

うーん。

なんで審査ではInstall出来たけど起動しなかったんでしょう。

他のAndroidの機種で試すしかないですね。

でも知り合いでAndroid使っている人がいません。

ネットで探したら以下のServiceを提供している人がいました。

メールで聞いたら3000円で対応してくれました。

お金はかけないでやる予定だったんですが、人にものを頼むんですからこれは別枠と考えます。

テスト結果ですが、OpenGL ES用の設定が無いので動きません。と出て来ました。

これが原因だったのか。

直します。

直しました。

もう一回テストしてもらったら、同じErrorが表示されました。

???

分かりました。

何と対応出来るOpenGL ESが3.0からに指定されています。

調べるとUEはOpenGL ES 3.2から対応します。

何故、3.0となっているんでしょう?

分かりました。

Project Settingの以下の設定です。

これはCheckを入れるとOpenGL ESは3.2以上しかSupportしませんよ。とGoogleに告げる役割を担当していたんです。

これにCheckを入れてもう一回Packagingします。

ほら今度はOpenGL ESのVersionの要求が3.2以上に設定されました。

正し今度はリリース前リポートで以下のErrorが報告されています。

詳細について来たVideoを見ると、

Gameを止めるためのButtonを押した場合に起きるErrorでした。

うーん。

How to exit Android game [6]を読むと、Exit Buttonをつける事自体、Androidは推奨してないみたいです。

正し

をEnableする事で強制的にGameを終了する事は可能だそうです。

リリース前リポートで以下のTest結果が表示されていました。

この4つのテストはどうやらAIが行ったようですが、一個以外はGameを開始する前に「Gameを終了する」Buttonを押してしまい、それでテストを終了してしまっています。

のでMain Menuから「Gameを終了する」Buttonを消してしまいました。

これで更に5個の携帯でテストしてもらえることになりました。

もう一回Packagingします。

かなり正解に近づいて来ているのを感じます。

Googleのリリース前テストで以下のVersionで正常に動いている事を確認しました。

うん。

今度こそPassするやろ。

ただScreenshotのところで以下の表示があります。

これはScreenshotが利用できないDeviceが2個あった。と言う意味と解釈しました。

更に次の日に外部の人から

「もう一回テストしたら今度はきちんと動きました。」

と連絡がありました。

これでOKでしょう。

もう一回審査を申請しました。

たった一時間で非承認が返って来ました。

うーん。

どうしよう。

これ以上はお金をかけてテストするしかありません。

しかし無限にお金をかけるには行きません。

どこかで諦める必要があります。

一寸考えます。

一応、メールで再審査のお願いだけは出しました。

色々調べたんですが、これ以上のテストを行うとなると本格的にお金がかかってしまします。

海外のClosed Test代行も調査しましたが、Android 11~14でテストしてくれそうなところは見つかりませんでした。

これは諦めます。

以下の勉強は時間が無くて出来ませんでした。

7.Houdiniの勉強

8.UEFNの勉強

9.DirectX12の勉強

10.まとめと感想

なしです。

11. 参照(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] Olli Huttunen. (2024, February 26). Experience combining a 3D Gaussian Splatting model from Postshot to Unreal Engine. [Video]. YouTube. https://www.youtube.com/watch?v=DXU38EJ_sL4

[5] Kams1. (2024, February 2). 3D Gaussian Splatting full tutorial, crop, transform, mesh, import into UE5 & Collision [Video]. YouTube. https://www.youtube.com/watch?v=fCtOUtUCSmM

[6] How to exit Android game. (2014, May 13). Epic Developer Community Forums. https://forums.unrealengine.com/t/how-to-exit-android-game/4259