UE4の勉強記録

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

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

1.今週の予定

先週、AndroidのAppを作成しましたが終わりませんでした。

今週はその続きをやります。

1.1 Pause画面を作成する

Pause画面には

を追加します。

1.2 Main画面を作成する

Gameを開始する時の画面も作成します。

  • Gameの開始
  • Gameの終了

があればいいと思っています。

1.3 Packagingを行う

最適化してPackagingします。

1.4 Google Play Storeに登録する方法を勉強する

これのやり方を忘れてしまっています。

Tutorialを見て復習します。

1.5 Google Play Storeに登録する

Tutorialの方法に沿ってGoogle Play Storeに登録します。

2.Pause画面を作成する

Windows 11にVersionをUpしてから更新Dataが送られて来ても更新出来なくなってしまいました。

97%まで更新したら更新に失敗しました。と出て来ます。

設定からWindows Updateを確認すると

Install出来ませんでしたと、出て来ます。

原因の一つに外付けHDDがありました。

で思い出したんですが、3カ月に一回はImage Backupしようと思って外付けHDDを買ってPCに繋いでいたんです。

Windows11にVersionをUpしてから一回もImage Backup取っていません。

一応、取っておくか。

と始めたら10時間位かかりました。

うえーん。

その間、作業していいのかいけないのか分からないし、間違えて途中で止めてしまったら今まで書けた時間が全部無駄になってしまうんで、PCに触らないでいました。

Image Backupを作成している間、寝ていた時間もあるので実際に取られた時間は3時間位ですが、それでもかなりの時間を無駄にしてしまいました。

Widget画面を作成しました。

それぞれの機能を追加しました。

Test WidgetのP Buttonを押すとこのWidgetが開くようにします。

P Buttonの実装です。

ここにGame Playを中断する実装なんかも追加する必要があります。

がやり方を覚えていないのでここまでで取りあえずテストします。

BGM以外は全部想定通りに動きました。

それではGameを中断するための実装を追加します。

2020-12-06のBlogに以下のNodeが使用されていました。

うーん。

このNodeだったかな?

取りあえず試してみます。

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

テストします。

おお、車が走っているのに止まりました。

戻るを押してみました。

普通に走り始めました。

出来ています。

早速Bugが一個見つかりました。

Pause画面を何個も開く事が出来ます。

以下の方法で直します。

Pause画面が開いている時はw_test Widgetを閉じてしまいます。

Pause画面が閉じる時に、新たにw_test Widgetを生成し直します。

Testします。

Pause画面です。

P buttonとB buttonが消えています。

戻るButtonを押しました。

普通にGame画面に戻りました。

P ButtonやB Buttonが機能しているのも確認しました。

一応、携帯でも確認します。

出来ました。

「車をResetする」の意味がよく分かりません。

転覆直しにしました。

よく見ると漢字が中国語?になっています。

読みにくいので

としました。

3. Main画面を作る

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

Buttonの機能を追加しました。

新しいLevelを作成します。

新しいLevelは完全なEmptyです。

そのLevel BPからこのWidgetを作成します。

テストしてみます。

普通に出来ました。

後はBGMか。

4.BGMや効果音を追加する

BGMだけ追加しました。

Vechicle Adv Pawnに

以下のEventを追加しました。

このEventを自身のEvent BeginPlayの時と

W_Pause Widget

BGM Buttonが押された時に呼び出すようにします。

これで普段はBGMが聞こえて、PauseでBGM Buttonを押したらBGMが消えたりついたりするようになるはずです。

テストします。

その通りになりました。

これで完成にします。

5.Packagingをする

5.1 Packagingのやり方を復習する

もうPackagingの設定方法なんて忘れてしまっています。

その復習からやって行きます。

まず適当なTutorialを見つけてそれを勉強します。

Package your Android game for Playstore in UE5 [1]が検索に引っかかりました。

軽く見ましたがかなりしっかりしたTutorialのようです。

これで勉強する事にします。

Package your Android game for Playstore in UE5 [1]を勉強する>

いきなり衝撃の情報です。

Google Play StoreにはもうAPKやOBB FileでUploadする事は出来ないそうです。

ひえー。

AAB FileでUploadする必要があるそうです。

そのためにまず以下のGooglePADをEnableする必要があるそうです。

そしてProject SettingのPluginからGooglePADの設定を以下のようにします。

今度はProjectのPackagingに行ってGenerate ChunksをEnableしました。

次にCook only mapsをEnableしました。

これはPC用のGameをPackagingする時に勉強した設定です。

これでPackagingしたいMapを指定する事で余計なAssetをPackagingしないで済むようになるはずです。

以下の場所でPackagingに含むLevelを指定します。

Build Configurationの設定をShippingに変更します。

次にFull RebuildとFor DistributionをCheckします。

Google PlayにUploadするにはFor DistributionもCheckする必要があるそうです。

今度はPlatformsのAndroidの設定です。

Android Package Nameの設定を変更します。

ここは既に変更しました。

Application Display Nameがあったらここで指定するそうです。

次にMinimum SDK VersionとTarget SDK Versionの設定についてです。

UE5は33までしかSupportしてないんじゃなかったけ。とか言っていました。

うーん。

マジか?

これ結構、きちんと調べないと後で詰みそうです。

当然ですが、以下のPackage game data inside .apkはDisableします。

次はForce small OBB filesについてです。

ここではOBB fileの話じゃなくてAAB fileの話を始めました。

まず1GB以上のAAB fileをGoogle Play StoreにUploadする事は出来ないそうです。

もしGameのSizeが1GB以上の場合は、自分でChunkを作成してUploadしないといけないそうです。

この話自体が、初めて聞く内容なのに、OBB fileとの関係が全く理解出来なくて???です。

ただこの辺の詳しい話が知りたい人は

とTypeして検索したら、その辺を詳しく解説したTutorialが沢山出て来ると言っていました。

これは後で調べる事にします。

そもそも私のGameのSizeがどれくらいになるか、まだ分かっていません。

多分1GB以下でしょう。

ここでForce small OBB filesの話に戻って来ました。ここがCheckされているとAAB fileのSizeが2GB以上になった場合、Buildを停止して警告してくれるそうです。

以下の設定もEnableします。

次の設定です。

ここは前の動画で既に説明済みだから、ここでは説明しません。と言っていました。

えー。です。

Generate Bundle(AAB)をEnableします。

ふーん。

まだまだ沢山やらないといけない事がありそうです。

次はBuildの設定です。

このTutorialの作者はOpenGL ES3.2はDisableしてしまうそうです。

この辺の設定はどうしよう。

流石に自分の携帯でPlay出来ない設定にはしたくありません。

とは言えVulkanで動くなら敢えてOpenGL ESまで含める必要もないです。

うーん。

次にDistribution Signingについてです。

これの値の取得方法を調べないといけません。

前にやったやり方と同じなんでしょうか?

Tutorialでは、

「Distribution Signing for UE5」で検索すると公式Siteでこのやり方を解説している所が出て来るのでそれに従って作成すれば良い。

と言っていました。

うーん。

これも調べる必要がありますね。

このTutorialを作成した人は以下のGoogle Play Serviceは使用しないので、ここはSkipするそうです。

そんな事が可能なんでしょうか?

と言うか、そもそもGoogle Play Serviceが何なのか。しらないです。

もうこの部分はconfigureしてしまいました。

Iconを作成する必要があった。

でもこれは簡単です。

Launch Imageも作成する必要がありました。

これでPlatforms-Androidの設定は終わりです。

次にAndroid Material Quality – ES31に移ります。

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

ここでの設定は一言、何もするな!です。

今度はAndroid SDKの設定です。

これってBlankでも良かったんじゃないの?

これも後で確認します。

Tutorialの説明ではUE5.1ではNDKは25.1を使用している。と言っていました。

他のVersionについても解説していましたが、何をいっているのか聞き取れませんでした。

Project Settingの設定はこれで終わりです。

UE5 Editorに戻って来ました。

PlatformからPackagingを行います。

Vulkanを使用する場合は、Android(ASTC)を選択する必要があるそうです。

この部分を調べる必要もありました。

うえーん。

これも後で調べる事にします。

ASTCがVulkanならETC2はOpenGL ESなのかもしれません。

するとDXTはDirectX

まあ、後で調べたら分かるでしょう。

Use Project Setting(Shipping)を選択します。

以上でした。

5.2 Package your Android game for Playstore in UE5 [1]をやる

とりあえずこのTutorialで言われている内容のうち今すぐ出来る設定をやってみます。

Google PADですが、DefaultでOnになっていました。

今度はProject Settingを開きます。

PluginsからGoogle PADを選択して

以下の設定を全部Enableにしました。

ProjectのPackagingに行ってGenerate ChunksをEnableします。

このChunksを生成するってどういう意味なんでしょう。

ABB fileのSizeが1GB以上だった場合、2つ以上のFileに分割されるって意味なんでしょうか?

Cursorを乗せたら以下の説明が出て来ました。

うーん。

これは何処かでしっかり勉強しないとよく理解出来ないですね。

次にCook only mapsをEnableしました。

ここに行くまでにかなり重要な設定があったような。

これとかです。

どうせ公開するなら全世界に公開したいです。

でもGame内のTextが全部日本語でした。

うーん。

今回は日本国内に限定しておくか。

今度はPackagingに含むMapをここで指定します。

ここは今やってしまいます。

出来ました。

これをやっている時に気が付いたんですが、

Project-Maps & ModesのDefault Mapsの設定を変更する必要もありました。

ProjectのBuild Configurationの設定をShippingに変更します。

Full RebuildとFor DistributionをCheckします。

PlatformsのAndroidの設定です。

Android Package Nameの設定は前から変更しています。

Application Display Nameの設定です。

以下のように設定しました。

Minimum SDK VersionとTarget SDK Versionの設定です。

Minimum SDK VersionはTutorialでは26になっています。

うーん。26にした方が良いのかな。

今の時点では、Minimum SDK Versionは26にしておきます。

Package game data inside .apkはDisableします。

これはDefaultでDisableされていました。

Force small OBB filesはEnableしました。

TutorialではここでChunkについて詳しい説明をしていますが、ここは後で調べます。

以下の設定もEnableしました。

Maximum Supported Aspect Ratioです。

Tutorialでは2,8になっていましたが、Defaultでは2.1でした。

ここは2.1のままにしておきます。

Generate Bundle(AAB)をEnableします。

AAB fileについては後で調べます。

Buildの設定に行きます。

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

このままにしておきます。

Distribution Signingについてです。

ここはまだKeyを得ていないのでSkipします。

Google Play Serviceについてです。

うーん。

ここもまだよく分からないです。

Skipします。

Iconです。

うーん。

これを作成する必要があります。

それぞれのSizeだけ調べておきます。

96x96、72x72、48x48、36x36でした。

これは後で作成します。

Launch Imageです。

これはHorizontal Imageだけ作成します。

Download Background Horizontal Imageです。

Sizeは1280x720でした。

Launch Landscapeです。

Sizeは640x380でした。

今度はAndroid SDKの設定です。

ここはBlankにしておきます。

PackagingしてErrorになったら考えます。

それではこの状態でPackagingしてみます。

Flavor SelectionはAndroid(Multi…を選択しました。

これでAAB FileのSizeが1GB以下だったら、この辺の設定は考えなくても良くなるから、Android(Multi…を最初に試します。

Errorになってしまいました。

うーん。

Sound WaveのChunk Sizeが大きすぎたんでしょうか?

それとも他の要因でしょうか?

もう一回試してみます。

今度はMultiではなくETC2にしました。

またErrorになりました。

直ぐ上には以下のように書かれていました。

うーん。

分かりません。

5.3 公式SiteのPackaging Android Projects [2]を読む

以下のSiteを読んでみます。

これを読むと最初にApk fileを作成しています。

その後に以下の場所の設定を変更して

AAB fileを作成しています。

うーん。

このやり方で試すか。

Package your Android game for Playstore in UE5 [1]でやった設定は一端、元に戻します。

Plugin – Google PADの設定です。

これがDefaultでどうなっていたのか、書いていません。

確か全部Offだったと思います。

全部外します。

ProjectのPackagingに行きます。

Generate Chunksを外します。

Cook only mapsはそのままにしておきます。

Packagingに含むMapもそのままにしておきます。

Project-Maps & ModesのDefault Mapsの設定の設定もそのままです。

ProjectのBuild Configurationの設定をDevelopmentに戻します。

更にFor DistributionのCheckも外します。

PlatformsのAndroidの設定です。

Android Package Nameの設定は前から変更していたのでそのままにします。

Application Display Nameの設定です。

これもそのままにしておきます。

Minimum SDK VersionとTarget SDK Versionの設定です。

ここはMinimum SDK Versionの値は30に戻しました。

うーん。

ここが問題だったりして。

Package game data inside .apkはDefaultでOffになっていたのでそのままにしておきます。

Force small OBB filesはDisableにしました。

以下の2つの設定はDefaultでどうなっていたのか覚えていません。

とりあえずOffにしておきます。

Maximum Supported Aspect RatioはDefaultのままなのでそのままにしておきます。

Generate Bundle(AAB)をDisableします。

Buildの設定です。

ここはDefaultのままのはずです。

そのままで次に行きます。

Distribution Signingもそのままです。

Google Play Serviceもそのままです。

Iconもそのままです。

Launch Imageもそのままです。

Android SDKの設定もそのままです。

これで、いくつかの例外を除いて元の設定に戻ったはずです。

もう一回Packagingしてみます。

この状態でもPackagingに失敗しました。

うーん。

5.4 新しいProjectを作成してテストする

仕方ありません。

こうなったら新しいProjectを作成してそれで試します。

VehicleのTemplateを選択しAndroid用の設定でProjectを作成しました。

Project名はMyCarGame2としました。

Project Settingを開きPlatformsのAndroidを選択します。

まずAPK Packagingを行います。

Android Package Nameを変更します。

Minimum SDK VersionとTarget SDK Versionを以下のように変更します。

Google Play ServiceもConfigurateします。

これでProject Settingの設定は終わりです。

UE5 Editorに戻って携帯から起動出来るか確認します。

出来ませんでした。

あれ?

何回やっても出来ません。

うーん。

Packagingを試してみます。

こっちは普通に出来ました。

Install_MyCarGame2-arm64.batを起動してみます。

こっちは普通に起動しました。

携帯からGameをする事も出来るようになりました。

うーん。

どうなっているんでしょうか?

この状態でもう一回携帯からPlayしてみます。

どうも携帯のFile ServerにAccess出来ないみたいです。

一回携帯を再起動します。

携帯からPlayしてみます。

今度は普通に起動しました。

はい。

確認のための携帯のAppからMyCarGame2をUninstallします。

そしてもう一回UE5からPlayを実行します。

今度も普通に実行出来ました。

成程、携帯が問題でPlay出来ない時もあるんですね。

その時は携帯を再起動すると直る訳です。

うーん。

納得。

次にPackagingでASTCを試します。

出来ました。

このInstall_MyCarGame2-arm64.batを起動して携帯からAppを動かせるか試してみます。

つまり私の携帯がVulkanに対応しているのか確認したいんです。

携帯のMyCarGame2をUninstallしました。

Install_MyCarGame2-arm64.batを起動します。

普通に出来ました。

CashのSizeが899MBになっていました。確かMultiの方は1.3GBだったと思います。

そういう意味ではかなり小さくなっています。

ただ画像は全然綺麗ではないです。

VulkanはDirectX12と同等の性能があると思っていたので一寸残念です。

ETC2も試してみます。

こっちも普通に出来ました。

CashのSizeは896MBでした。

やっとStart地点に立てました。

ここからAAB Fileのテストをします。

公式SiteのPackaging Android Projects [2]のやり方でやってみます。

Project Settingで以下の箇所のCheckを入れるだけです。

これでPackagingしてみます。

うん。出来た?

おお。

AAB Fileが出来ています。

5.5 新しいProjectに移植する

前のProjectのLevelを新しいProjectに移植してPackaging出来るか確認します。

<Main Mapの移植>

まず問題なさそうなMain Mapの移植からやります。

MigrateでMain MapをこのProjectにCopyしました。

PC上で起動させました。

普通に動いています。

今度は携帯から動かしてみます。

こっちも普通に動いています。

それではPackagingを試してみます。

その前にProject Settingの設定を一個だけ変更します。

Project DescriptionのDefault Mapの設定を以下のように変更します。

以下の設定で試してみます。

出来ました。

Install….bat fileを試してみます。

携帯のAppを消して、Install….bat fileでInstallしてみました。

普通に出来ました。

ただしAppのSizeは1.25GBですね。

これは後で小さくする事が出来るんでしょうか?

<Vehicle Example Mapの移植>

そのまま移植しました。

同じ名前のLevelがあるけど、上書きしますか?

と聞いて来たので、

ハイ。

にしました。

これで動かなくなったらこのLevelに問題がある事が判明します。

まずPC上からテストします。

普通に動いています。

BGMも聞こえます。

Pauseも正常に作動しています。

今度は携帯で動かしてみます。

何と携帯だと「Gameを始める」Buttonを押してもGameが始まりません。

うーん。

携帯を再起動してもう一回試してみます。

駄目でした。

うーん。

あ、携帯に繋いだ時は同じLevelでしかPlay出来なかったのかも。

えい。

Packagingを試してしまえ!

出来た!

このInstall….bat fileを試してみます。

普通にInstall出来ました。

Appを開くと今度は「Gameを始める」Buttonを押してGameを始める事が出来るようになりました。

うーん。

出来た?

一応、AAB Fileもあるし。

Multiだけでなく他の条件も試します。

ASTCです。

出来ました。

こっちはOBB FileのSizeが半分位になっています。

ETC2も試します。

出来ました。

確かAAB fileのMaxのSizeが1GBだったはずです。余裕でPassしています。

これでABB Fileの作成も一応完成したんですが、

Mapの設定だけ変えてもう一度試してみます。

MultiでPackagingします。

出来ました。

何と必要なMapだけPackagingした場合はOBB FileのSizeが半分以下になっています。

本当にこのFileからGameのPlayが出来るのかを確認します。

Install….batを起動させてAppをInstallします。

普通にPlay出来ました。

6.Distribution Signingをやる

以下の部分の設定をやります。

6.1 公式SiteのSigning Projects for Release [3]を勉強する

もう悟りました。

兎に角、公式のやり方に沿ってやって行けば問題が起きないです。

では以下に公式SiteのSigning Projects for Release [3]の内容をまとめます。

Google Play一般的な問題について知りたい場合は、以下のSiteを参考にして。と書かれていました。

<Generating Key>

まずKeystoreの生成方法についてです。

Command Promptを開きます。

Directoryの位置をkeytool.exeのある場所に移動します。

Keytool.exeは

\jre\bin

の場所にあるそうです。

無いです。

検索したらjbrのBinの中にありました。

Command PromptでDirectoryを移動する方法も調べる必要があります。

以下の方法で出来るそうです。

そうなの?

FolderをDrag & DropするとそのFolderの位置に移動するの?

これ試してみます。

にあるIllustration Folderを

Command PromptにDrag & Dropしてみました。

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

うん。出来てないよ。

あ、Cdを打った後にやらないといけないのか。

出来ないですね。

直接、行けるFolderじゃないとだめなのかもしれません。

あ、分かりましたDriveが違うから機能しなかったんです。

C DriveからD Driveに移動するのにd:と打つ必要がありました。

D Driveに移動したら直接IllustrationのFolderに移動しています。

今度は移動出来ました。

はい。

以下のCommandをTypeするそうです。

すると以下のようにPasswordを聞いてきます。

前に作成した時の記録を確認したら、Passwordは本当に適当に作成していました。

次に名前を聞いてきます。

次に会社のUnitを聞いてきます。

これは会社の部門と言う意味ですね。

次に会社名を聞いてきます。

次に市の名前です。

県の名前です。

国のUnit名を聞いてきます。

前の記録を見るとJPと打っていました。

次に確認用の質問が出て来ます。

合っている場合はYだけ打てばよいそうです。

今度はMyKeyのPasswordを聞いてきます。

ここはKeystoreのPasswordと同じで良いのでReturn(Enter?)を押す事にします。

以下のCommandが表示されたら全部上手く行った証拠だそうです。

Keytool.exeがあるFolder内にExampleKey.keystoreが生成されているそうです。

<Placing the Key>

この後もまだまだ続きます。

生成されたExampleKey.keystoreを以下の場所に移します。

<Applying the Key>

以下の箇所にTypeして下さい。としか書いてないです。

何をTypeすればいいの?

Key Store PasswordとKey Passwordは分かります。

Key StoreはFile名なんでしょうか?

Key Aliasは何をTypeすれば良いの?

ここは後で調べます。

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

次のところでDistribution Signingに実際に打ち込む内容を見せていました。

Packagingの以下の設定を変更していました。

<Deploying to the Google Play Store>

これは別のTutorialでやるそうです。

以上でした。

6.2 公式SiteのSigning Projects for Release [3]を実行する

それではやっていきます。

Command Promptを開いてkeytool.exeのあるFolderに移動しました。

以下のCommandをPasteして実行します。

keytool -genkey -v -keystore ExampleKey.keystore -alias MyKey -keyalg RSA -keysize 2048 -validity 10000

以下の質問が来ました。

ここは忘れないようにノードに記録しておきます。

しました。

全部の質問に答えました。

すると

と出て来ました。

うーん。

多分、このFolderにアクセスするには管理者権限が必要なんでしょう。

管理者権限のあるCommand Promptで同様の事をやりました。

ExampleKey.keystoreが生成されました。

これを以下の場所にPasteしました。

Store Versionは既に1になっていました。

Distribution Signingに以下のように入力しました。

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

これで終わりです。

とりあえずこの状態でPackagingが可能か試します。

Multiで試しました。

出来ました。

6.3 OBB fileはどうなるの?

これがよく分かりません。AAB fileは出来ましたのでAPK Fileは使用しないのは分かります。

しかしOBB Fileはどうなんでしょう?

Do I have to upload the .obb file to the Google Play Console? [5]に簡単な解説がありました。

ここに書かれている内容を簡単にまとめると

Google PADのPluginをEnableするとOBB Fileは自動的にABB Fileに含まれる事になります。

今の私の設定を見ると

PluginのGoogle PADはEnableになっています。

Project SettingのGoogle PADはEnableされていません。

つまりOBB fileはAAB fileに含まれてはいません。となります。

もう少し詳しい話は公式SiteのGoogle Play Asset Delivery Reference [6]を勉強したら分かりそうです。

軽く読みました。

Package your Android game for Playstore in UE5 [1]で勉強した内容と公式SiteのPackagingの設定が違っている部分はこのOBB fileをAAB fileに含むために必要な手順だったようです。

うーん。

成程。

6.4 Google Play Asset Delivery Reference [6]を勉強する

これとPackage your Android game for Playstore in UE5 [1]の情報を合わせれば、どんな設定をすれば良いのかが大体理解出来ると思います。

<Enabling the GooglePAD Plugin>

ここは以下のPluginをEnableすれば良いだけ。しかもDefaultでEnableされていると書かれていました。

ただしGoogle PADを使用するにはPackageのFormatとしてAndroid App Bundlesを使用する必要があるとも書かれていました。

これがどのかの設定の話なのかそれともGoogle Play StoreにUploadする時の話なのかはよく分かりません。

次にPluginのGooglePADでは以下の設定にしろと書かれていました。

Package your Android game for Playstore in UE5 [1]では以下のようにOnly ShippingにもCheckを入れていました。

Platform Androidになる以下のPackage Game Data Inside .apk?をDisableしろ。と書かれていました。

これはPackage your Android game for Playstore in UE5 [1]でも同じ事が書かれていました。

<Creating Asset Packs>

Asset Packの作成方法についてです。

ここからがよく分からない。

Asset PackってMarketで売っている

こういうやつの事でしょう。

これがPackagingとどう関係するんでしょうか?

<<Asset Pack Delivery Modes>>

まずChunkについて解説していました。

Chunkは、外部Assetを整理するためのUnreal EngineのFormatだそうです。

Chunk 0はGameのBaseのInstallを表すそうです。(Game開始時にInstallされるAssetの事?)

その他のChunkはGameのMain Install以外のAssetを含むものだそうです。これらのChunkのFileのTypeは.pakになるそうです。

うーん。

何となくしか分からない。

次のLineでやっと何を言っているのか判明しました。

要するにUE5内で自分でGameのAssetをChunkに選別する必要があるんです。

うーん。

これのやり方が分らん。

これが分れば、ここでの説明ももっと簡単に理解出来るようになりそうです。

作成したChunkを以下の3種類のどれかに分類するそうです。

この3つがAsset Packになるそうです。

一つのProjectに対して50 asset packsを作成する事が出来るそうです。

ただしInstall-Time Asset PackとFast-Follow asset packは一つのProjectに対してそれぞれ一個ずつしか作成出来ないそうです。

要するにOn-Demand Asset Packは48個作成出来ると言う事ですね。

<<Creating Chunks>>

おお、ここでChunkの作成方法を解説してくれるのか。

と思ったら以下の設定にCheckを入れただけでした。

いや、これは本当にChunkを生成するかどうかの指定だけです。

この前にUE5内でそれぞれのAssetをどのChunkに入れるかの指定をやる必要があるって事じゃないの?

それは兎も角、Package your Android game for Playstore in UE5 [1]でも同じ事が書かれていました。

これでAsset ManagerかPrimary Asset Labelsを使用してAssetをChunkとして整理出来ると書かれていました。

む。

この2つがUE5内でAssetを選別するための機能っぽいです。

ここからCooking and Chunking [7]が紹介されていました。

こっちにAssetをChunkに指定する方法が詳しく解説されているみたいです。

軽く見たんですがまず以下の箇所でMapを指定したり、

Configs内で以下のようにして指定したり、

Primary Asset Labelsを使用して以下のようにして指定していたりします。

この辺は見ただけなのでまだ理解していませんが、これを自分で作成した後に、このPackagingをしないといけないみたいです。

ChunkはPackagingした後は以下のような.PAK Fileとして生成されるそうです。

ふーん。

ですが私の今回のProjectのようなSizeの小さいProjectも必ずChunkを形成してこのようなPak Fileを生成する必要があるんでしょうか?

<<Including Chunks in your App Bundle Build>>

以下に示したDelivery Modeの3つの種類によってこれらのPAK Fileは保管するFolderを変更する必要があるそうです。

Install-Time Asset Packは何もする必要がないそうです。

それ以外の2つのAsset Packは以下に示した場所に移動する必要があるそうです。

この後、

Asset Packの名前を決めるのにこんな条件がありますと語っていました。

最後にAsset Pack Folderに、以下のbuild.gradle Fileを追加する。とありました。

これって自分で書く必要があるの?

自動で生成してはくれないの?

いや、それ以前にAsset Pack Folderがどれなのかがよく分かりません。

以下に示したのはAssetpacks Folderですが、これの事でしょうか?

最後に以下の注釈がありました。

嫌、もうすでに5.3なんですけど。

このDocumentは5.3のDocumentなのになんで、4.26以降は更に合理化される作りになる予定です。って書かれているの?

この資料って、もしかして昔のやり方がそのまま残ってしまっているだけなの?

<Excluding Chunks From the OBB File>

DefaultではOBB FileはPAK Fileの内容を含んでします。PAK fileの内容をOBB Fileから省くにはDefaultEngine.iniに以下のCodeを追加する必要があるそうです。

うーん。

理解はしましたが、これって必要な事なの?

この後はAPI Referenceの話になってしまっているのでSkipします。

6.5 Google Play Asset Delivery Reference [6]を勉強した感想

Google Play Asset Delivery Reference [6]に書かれていた内容は大体は理解しましたが、一々Chunkを作成する必要があるのかはまだ分かりません。

多分、今のProjectのSizeならChunkを指定しなくても何とかなりそうな気がしています。

Package your Android game for Playstore in UE5 [1]をもう一回見直してみます。

今なら、前よりのChunkに関しての知識が増えたので、Tutorialが説明している事をもっと深く理解出来るはずです。

以下の部分の説明で

今のGoogle Play StoreではAAB FileのSizeが1GB(2GB?)を超えるものはUpload出来ないそうです。

もしAAB FileのSizeが1GB(2GB?)を超える場合は、Chunkを自分で作成する必要があると言っていました。

このForce Small OBB FileはAAB FileのSizeが2GB以上の場合、Errorを起こしてAAB Fileを生成出来なくするそうです。

うーん。

成程。

まずChunkを作成しないでPackagingしてErrorになったらChunkを作成して再挑戦するのが正攻法ですかね。

大体何をすれば良いのかが見えてきました。

7. もう一回Packagingをする

7.1 Package your Android game for Playstore in UE5 [1]の設定をもう一回する

Google PADの設定を以下のように変更しました。

Only ShippingのCheckは取りあえず入れておく事にします。

ProjectのPackagingに行ってGenerate ChunksをEnableしました。

今度はPlatformのAndroidに移動します。

Package Data Inside .apk?のCheckは元から外れていました。

次のこれです。

これは今はCheckしておきます。

以下の設定もEnableしました。

この辺の設定の意味は今もって理解していません。

問題ない事を祈ります。

Generate Bundle(AAB)は既にEnableされていました。

Buildの設定です。

ここはVulkan Onlyにしました。

Android SDKの設定です。

これは前のままです。

これでProject Settingの設定は終わりました。

以下の設定でPackagingしてみます。

Packingは成功しました。

おお。

一安心です。

完成したPackingの内容を見てみます。

APK Fileは作成されていますね。

OBB Fileも生成されています。

しかしAAB Fileも生成されています。

Pak Fileは生成されていませんが、AAB FileのSizeは280MBで1GBの上限のはるか下なので、そもそも生成する必要がなかったのかもしれません。

これはGoogle Play Storeからテストしてみないと分かりません。

一応、完成したとします。

8.Iconなどを作成する

8.1 Iconを作成する

しました。

8.2 Background Imageを作成する

しました。

8.3 他のImageで変換が必要な箇所を探す

以下のProject-Descriptionの記述を全くしていません。

うーん。

無くてもいけるなら、今回はBlankにしておきます。

以上でした。

9.Google StoreにUpする

出来たAAB Fileがきちんと作用するか確認するためには兎に角、Google Play StoreにUpする必要があります。

しかしやり方が分かりません。

How to Publish App on Google Play Store 2023 [Common Guide] [4]で勉強します。

9.1 How to Publish App on Google Play Store 2023 [Common Guide] [4]を勉強する

凄い細かく説明していますのでそのまま以下にまとめます。

Uploadする前に以下のものが必要だそうです。

  • AAB File
  • Google Developer Account

はい。

両方あります。

正しGoogle Developer Accountの方が無くなってしまいそうになっています。

そしたら以下のAddressに行きます。

以下のような表示がされますので

Developer accountを選択します。

すると以下のようなPageに移動します。

この辺は昨日確認しました。

軽く流します。

新しいAppのListを作成します。

右上にあるCreate AppをClickします。

このAppについての質問に回答します。

この質問が知りたかった。

以下の2つは絶対にCheckしないといけないやつです。

そして右下にあるCreate App Buttonを押します。

すると以下のPageに行きます。

Dashboardが選択されていなかったら選択します。

以下に示したようなAppを登録するために必要な手順が示されています。

まずPrivacy Policyです。

TutorialではここにはどこかのURLをコピペしていました。

これってどうしよう。

いきなり難問です。

と言っていたので、18歳以上を対象としたらここには何も入れなくても大丈夫かもしれません。

以下のところからもっと詳しい情報を得る事が出来るそうです。

次はApp Accessについてです。

私のGameは全ての機能に誰でもAccess出来るので、All Functionality..を選択して終わりです。

Adsについてです。

無いです。

No, my app does not contain adsを選択して終わりです。

Content Ratingです。

これはStart Questionnaireを押せば良いのか。

以下の画面に移動しました。

E mailを入れる必要があるみたいですね。

そしてCategoryです。

Gameを選択します。

残りの具体的な質問に関しての説明はありませんでした。

Target Audienceです。

まずTarget ageです。

18歳以上を選べと言っていました。

13歳以下を選んだ場合、更に余計な質問に答える必要が出て来るそうです。

次にAppeal to Childrenです。

うーん。

これはYesと答えた方が無難かもしれません。

次はNews Appsについてです。

違います。

次はCOVID-19の追跡に関するAppかどうかです。

違います。

Data Safetyに関する質問です。

そもそも何のDataも集めていません。

Noで終わりです。

このTutorialではAccountを作成しない場合でもYesを選択しています。

うーん。

私のこのAppの場合は本当に何もDataを集めてないのでNoで良いと思うんですがどうなんでしょう。

UE5が何かのDataを隠れて集めている場合もあるんでしょうか。

この後もずっと質問に答えています。

がそれらの解答が必要なのか分からないのでここにまとめる事は止めておきます。

最後のPreviewまで行きました。

そしたら右下の3つの点でSaveしました。

最後に政府関連のAppかどうかを聞いていました。

Financial Functionについての質問です。

そもそもFreeのAppなのでこの質問自体が無いかもしれません。

以下の場所にCheckすれば良いそうです。

AppのCategoryに関しての質問です。

Email AddressとWebsiteが必要なのか。

External Marketingに関してです。

広告もないので無しです。

Listing Assetsに関しての情報です。

この説明文も考えておく必要があるのか。

更にAppのIconや

以下のようにAppの様子を示したものや

Videoもです。

携帯のScreenshotもUpしていました。

Dashboardに戻ります。

Create and Publish a releaseのView Taskを選択します。

以下のBoxが開きます。

Select countries and regionsを選択します。

ここからTargetの国を選択します。

これは全部の国を選択しても問題ないでしょう。

いや文字が読めないか。

今回は日本だけにしておきます。

ここでやっとAAB fileのUploadになります。

右上のCreate New Releaseを選択します。

すると以下の画面に移動します。

Choosing a Signing Keyを選択します。

以下のBoxが表示されるそうです。

Use a Google-generated keyを選択します。

以下の箇所からAAB fileをuploadします。

Uploadが終わると以下のような表示が出て来るそうです。

そして右下にあるNext Buttonを押していました。

以下の画面に切り替わります。

今度は以下のSave Buttonを押します。

この部分は少し間違っているかもしれません。

Tutorialは物凄いSpeedでやってしまって正直、よく分かりません。

以下のBoxが表示されます。

Publishing Overview画面に移動しました。

Send 1 change for reviewをClickします。

以下のBoxが表示されます。

Send changes for reviewをClickします。

以下の画面になります。

これでPublishingが完成したそうです。

え。

いや、試しにテストをして自分だけで確認したいんですが。

たしかそういう機能があったはずですが。

と思ったら今度はTestingの話になりました。

どうやらここでそれについての話をするようです。

Closed TestingやInternal Testingで限られた人の間でテストします。

ここの使い方は説明してませんでした。

ここの使い方が知りたかったのに。

All appsに移動しました。

うーん。

特に何もやっていません。

これで終わりみたいです。

Dashboardに戻りました。

View on Google PlayをClickして

Google Playに公開されている事を確認していました。

げ、コメント欄に以下の内容がありました。

無理じゃん。これ

そういうServiceしてくれる会社とかないのかな?

検索してたら

「Google Play、個人開発者がアプリを公開する前に「20人以上のテスターを集め、14日以上連続でクローズドテストすること」が条件に追加。11/13以降に作られたデベロッパーアカウントが対象」[8]と言う記事が出て来ました。

うおー。

2023年11月13日以降に作成したAccountが対象。って書かれています。

20人集めなくてもOKだわ。

9.2 How to Publish App on Google Play Store 2023 [Common Guide] [4]をやってみます

それではGoogle Play Storeに登録していきます。

以下のように記録しました。

全部日本語ですね。

申告(Declarations)はPlay App Signingが増えていました。

これらはCheckしないとそもそも公開出来ないのでCheckして先に進みます。

Dashboardに来ました。

AppのSet Upをやっていきます。

Privacy Policyです。

ここはURLのあるSiteとか無いのでとりあえずBlankにしておきます。

AppのAccessについてです。

そもそもAccess制限がないのでこれで終わりです。

Adsです。

無しで終わりです。

Content Ratingsです。

質問に回答する。を選択します。

質問に答えたら概要で全年齢対象になってしまいました。

これをすると最初のPrivacy Policyが面倒になると聞いたんですがどう直せが良いのか不明です。

取りあえず保存しました。

Target Userです。

これは18歳以上にしました。

次はAppeal to Childrenです。

ここは「はい。」と答えておきました。

このままどんどんやってしまいます。

Data Safetyの項で

Privacy PolicyにURLが入ってないために

Previewが出来ません。

以下の未公開として保存を押しました。

やっぱりPrivacy PolicyのURLが必要なのか。

このBlogで書いてこのAddressに引っ張て来るしかないですね。

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

Privacy PolicyのURLの設定が必要です。

それ以外は全部出来ました。

Iconの設定ですが、512x512でした。

取りあえず昨日作成したIconを引き延ばして入れておきました。

以下のものはこれから作成する必要があります。

これも後で作成する必要があります。

それよりこんな項目がある事に気が付きました。

ここで昨日作成したAAB fileが正常に機能するか確認出来るじゃないですか。

こっちを先にやります。

これはどっちが楽なんでしょうか?

何となくですが「整合性保護を有効にする」を選択したら何もしなくて良い気がします。

でも一応、調べたら「署名鍵を指定する」を選択した人はいても「整合性保護を有効にする」を選択した人はいませんでした。

うーん。

「署名鍵を選択」を押しました。

App BundleをDrop出来るようになりました。

しました。

なんか凄い時間がかかっています。

あ、これは無理だ。

と思ったんですが、とりあえずお茶でも飲んで落ち着こうと台所でお湯を沸かして戻ってきたら

なんか読み込めてました。

以下のように表示されています。

Release Noteには何を書くべきか。

とりあえずこんな事を書いておきました。

保存を押したら次のPageが表示されました。

Errorがありました。

Play Billing Libraryってなんだ?

調べます。

UE5 Please upgrade to Billing Library version 3 [9]に全く同じ質問がありました。

3つの解答がありました。

一つ目はこれです。

Android Play BillingというPluginをDownloadしてProjectに追加します。

更にProject SettingからこのPluginをEnableします。

それだけだそうです。

次の解答です。

このLink先のYouTubeに直し方が載っているそうです。

Link先が無くなっていました。

三番目の解答です。

このCodeをAndroidEngine.iniに追加して

“Project”/Config/Android/のFolder内に追加するだけだそうです。

うん。

これから試してみます。

ProjectのConfig Folderを開きました。

AndroidというFolderはありません。

作成します。

このFolder内にAndroidEngine.iniというFileを作成します。

以下のCodeを追加しました。

これでPackagingしてみます。

出来ました。

これをApp BundleにUploadします。

ぬぐぐ。

Store Versionを2に変更しました。

これでもう一回Packagingします。

App BundleにUploadします。

出来ました。

同じErrorが表示されました。

うーん。

確認しましたがやり方合ってるはずです。

しかたありません。

こっちを試します。

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

他のCommentを読むとUE5.3.2では使用出来ないようです。

うーん。

これは困った。

調べたらこっちは対応しているそうです。

でも有料じゃん。

Upgrade Unreal engine Billing Version to 6 | Fix google play billing version requirement UE 4.27 [10]にやり方がUE4.27ですがやり方が書いてありました。

そのComment欄に

と書かれていました。

うーん。

かなり調べましたが5.3で直した人の話は載ってなかったです。

UE5.2で作り直すべきか?

作り直してしまいます。

これだからUE5でAndroidのAppを作る人がいないのか。

いや一寸待てよ。

UE5.2を使用するとこの問題が発生するのか

うーん。

更に以下の動画が見つかりました。

Upgrade Unreal engine Billing Version to 6 UE 5 2 [11]です。

うーん。

これだとUE5.2でも同様の問題が発生しているみたいです。

良し。

まずUE5.2でAndroid用のProjectを作成してみます。

それが普通にPackaging出来たらそのままAAB fileまで作成してGoogle PlayにUpしてみます。

うーん。出来ない。

UE5.2ではAndroidのPackagingが出来ません。

いや、焦っているのか。

どうやらAndroidのInstallからやり直さないといけないみたいです。

うーん。

これは明日やります。

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

10. Play Billing LibraryのVersionのErrorに対しての対策

10.1 今までのまとめ

一晩、寝て考えたんですが、以下の結論に達しました。

UE5.2でやり直すにはAndroid Studioの設定から作り直す必要が有る可能性が高い。その場合、UE5.3で起動しなくなる可能性が高い。

JDKだけ別にInstallしたら起動する可能性もある。

UE5.3でPlay Billing Libraryの問題を直した記述が見つからない。

唯一あったのが以下の有料版のPlugin。

もうこれを買って試しても良い気がしています。

これ以上時間をかけてこの部分をやる意義を感じません。

UE5.3でUpgrade Unreal engine Billing Version to 6 UE 5 2 [11]を試してみるのもありかもしれません。

ただこの動画どこまで信用していいのか分かりません。

UE5.2では何もしなくてもPlay Billing LibraryのVersionのErrorが起きないとの報告が複数あります。

で、以下の順序で試すのが良いと考えました。

  1. JDKを個別にDownloadして2でもう一回、Packagingする。
  2. Library Updateを買って3でPackaging
  3. Upgrade Unreal engine Billing Version to 6 | Fix google play billing version requirement UE 4.27 [10]Upgrade Unreal engine Billing Version to 6 UE 5 2 [11]を勉強して自身でPlay Billing LibraryのVersionのErrorを直す(3)
  4. Android StudioをUninstallして2で最初から組み直す。
  5. 2でLibrary Updateを試す
  6. 2でUpgrade Unreal engine Billing Version to 6 | Fix google play billing version requirement UE 4.27 [10]Upgrade Unreal engine Billing Version to 6 UE 5 2 [11]を試す。

この順序でやって行くことにします。

10.2 Upgrade Unreal engine Billing Version to 6 | Fix google play billing version requirement UE 4.27 [10]を見て理解した事

Upgrade Unreal engine Billing Version to 6 | Fix google play billing version requirement UE 4.27 [10]を見ながら、食事してたらPlay Billing Libraryが何なのか大体理解出来ました。

まず以下のFolder内にある

以下のFileを開き

以下の部分を見ると

このVersionのUEのPlay Billing LibraryのVersionが6.0.0である事が分かります。

Errorの表示を見ると

Play Billing LibraryのVersion を6.0.1以上にして下さい。となっています。

つまり基準に満たしてない訳です。

そして以下の3つのFolderを入れ替えています。

つまりこの3つのFolderがPlay Billing Libraryの実物なんです。

となるとこの3つのFolderのVersionが6.0.1以上の物が必要になって来ます。

そしてUpgrade Unreal engine Billing Version to 6 UE 5 2 [11]で提供されているPlay Billing Libraryの

を開くと

となっています。

つまりこのDownload FileのPlay Billing LibraryのVersionは6.0.1なんです。

これそのままUE5.3にも使用出来そうな気がします。

厳重にBackupを取って試してみます。

10.3 Upgrade Unreal engine Billing Version to 6 | Fix google play billing version requirement UE 4.27 [10]Upgrade Unreal engine Billing Version to 6 UE 5 2 [11]をしっかり勉強する

一応、この2つの動画をしっかり勉強しておく事にします。

Upgrade Unreal engine Billing Version to 6 | Fix google play billing version requirement UE 4.27 [10]

まず以下のFolderに移動して

以下のFileを開きます。

BillingのVersionを確認します。

3.0.0になっています。

FolderをDownloadしました。

UEBillingV6.zipを解凍すると以下の3つのFolderがあるそうです。

これらと同じ名前のFolderが以下の場所にあるので

それをReplaceします。

やっている事は以上です。

Packagingした後、android Studioを開いて

AppのManifestsを選択して

Versionが3.0.0から6.0.0にUpgradeした事を確認していました。

以上です。

Upgrade Unreal engine Billing Version to 6 UE 5 2 [11]

以下の条件でやっている事を話しています。

これはあんまり関係ない気がしますが、どうなんでしょう。

次に行きます。

DownloadしたFileです。

UEBillingV6の中身を以下のFolder内にCopy&Pasteします。

UEBillingV6の中身は

となっています。

Upgrade Unreal engine Billing Version to 6 | Fix google play billing version requirement UE 4.27 [10]と全く同じです。

これらは前もってBackupを作成してからやる事にします。

この後が、Upgrade Unreal engine Billing Version to 6 | Fix google play billing version requirement UE 4.27 [10]と一寸だけ違います。

Android内のOnlineSubsystemGooglePlay_URL.xmlをReplaceしています。

そもそもAndroid Folder全体を取り換えているんだから、この部分は最初から変えておいてほしいです。

うーん。

と言うかこれUEBillingV6の中身は変更する必要ないのかもしれません。

この3つのFileだけ交換したら上手くいくような気もします。

更に、GooglePlayStoreHelper.javaも変更します。

これもAndroid内のFileです。

以下のFolderを消します。

うん。

やり方は一寸、不安な場所もありますが、どのFolderをBackupしておかないといけないのかは分かりました。

10.4 ReplaceするFolderやFileをBackupします

まず以下の3つです。

そして以下のFileです。

一応以下の3つのFileのCopyも取っておきました。

なんかこの3つのFileだけ変更したら出来そうな気がして来ました。

以下の3つのFolderの交換って重複してるだけだと思います。

後、ReplaceするためのFolderの内容が実際のFolderより量が少ないんです。

Mergeするならいいですが、Replaceすると別の問題が出て来そうです。

10.5 Replaceしてテストする

とりあえず以下の3つのFileだけReplaceしてみます。

しました。

Projectを開きます。

Store Versionを3に変更しました。

これでPackagingします。

出来ました。

Android StudioでPlay Billing LibraryのVersionを確認する方法は分かりません。

直接、Google Play ConsoleにUploadして確認します。

出来た。

Errorが消えました。

やった。

1500円浮きました。

4時間位既に格闘しているんで時給換算で350円位になってしまっていますが。

11 内部テストを実施してAAB fileを確認する

11.1 AAB fileが機能しているのを確認します

私の携帯にこのGameをInstallしようとしたんですが、Google PlayにこのGameが表示されません。

色々調べたんですが、どうやら私の携帯のOSがAndroid 12だからみたいです。

OSをAndroid 13にUp Grade出来ないのか調べてたらAndroid 12にUp Gradeしたやり方で出来るとありました。

まずOSをUp Gradeします。

しました。

やっとAndroidのOSが13になりました。

試します

やっぱりGoogle Play Storeに表示されません。

うーん。

Privacy Policyの作成を先にやってしまいます。

12. Privacy Policyの作成

12.1 Privacy policy for your game? No problem! (generate and publish)[12]を勉強する

このSiteにやり方が全部載っていました。

これをまとめます。

まずこの動画にあるLinkから以下のSiteに移動します。

これですね。

以下の質問に答えます。

次の質問です。

Google Play ServiceはOKにしましたが、これが何なのかまだ理解していません。

一応、これだけCheckしておきますか。

Privacy PolicyをClickします。

以下の文章が生成されます。

全部をCopyします。

そしてSite.google.comに行きます。

をClickします。

以下のSiteに飛ぶので、Site NameをPrivacy Policyに変更します。

Site NameにAppの名前を入れます。

Text Boxを追加して

Copyした内容を貼り付けます。

左上のPublishを押します。

以下のBoxが表示されるので

Web Addressを変更します。

そしてPublishを押します。

右上のPublishからView Published siteを選択します。

以下のようにWebsiteとして表示されます。

このSiteのURLをCopyして

以下のPrivacy PolicyのURLに貼れば終わりです。

これは簡単過ぎる。

念のために日本語のTutorialもCheckしておきます。

調べたけどこれしか出て来ませんでした。

【雛形付き】アプリのプライバシーポリシーに必要な10項目を解説![13]

このSiteは弁護士の人が作成したもので、ものすごく厳密です。

Privacy Policyに書かなければならない内容をそれぞれ詳しく解説しています。

これは作成した後のCheckに参考にする事にします。

12.2 Privacy policy for your game? No problem! (generate and publish)[12]をやってみる

何処まで出来るか分かりませんが、やってみます。

一瞬で作成してくれました。

凄いです。

今度はSite Google Comに移動します。

以下のように作成しました。

一応、日本語訳も追加しておきましょう。

Deep Lで翻訳したのを貼り付けます。

出来ました。

https://sites.google.com/view/drive-game-privacy-policy/%E3%83%9B%E3%83%BC%E3%83%A0

に載っています。

凄すぎます。

僅か30分で完成してしまいました。

何が凄いって私が何が書かれているのか全く知らない事です。

内容に関しては次の節でCheckします。

12.3 Privacy Policyの内容を確認する

全部、読みました。日本語訳が完全におかしい箇所が一か所だけありました。そこだけ直しました。

後は当社とか言っている箇所が何個かありましたが、一応会社でもあるのでOKとしました。

13.「Storeの掲載情報を設定する」をやる

以下の設定をやる事にします。

Feature Graphicsです。

携帯電話でのScreenshotです。

これでAppの設定は大体終わりました。

14.ABB Fileが正常に働いているか確認する

Internal TestingにこのGameを公開したのに自分のGoogle Play Storeに表示されません。

何故なの?

もし表示されないならLocalな方法でこのABB Fileが正常に作成された事を確認する必要があります。

どんな手段を用いてもABB Fileが正常に作動している事を確認する必要があります。

14.1 内部テストからPlay Google内で生成されたAPKをDownloadしてみた

内部テストを選択して

以下の画面からApp Bundleの右端にある矢印を押します。

しかもこのSite、以下のところから私の携帯にこのSiteのAddressを送れるようになっています。

ここからこのSiteのAddressをこの携帯に送って

この署名済みのUniversal APKを起動させてみます。

Downloadしました。

DownloadしたFileはChromeの右端にある3つの点のIconを押し、Boxを開きDownloadを押したらDownloadしたAPKをInstallするかと聞いてきました。

はい。

を押したら、元からInstallされている同じGameとConflictするからInstall出来ない。

と出ました。

しまった。

前のAPPを消します。

もう一度Installしました。

普通に出来たみたいです。

AppをClickしてGameを開始しました。

以下にScreenshotを貼っておきます。

出来ました。

普通にGameがPlay出来るようになっていました。

一寸感動しています。

APK FileやOBB FileはPlay Google ConsoleにはUploadしていません。

Play Google ConsoleにUploadしたのはABB Fileだけです

ABB Fileは正常に作成されていたようです。

もう公開まで一気にやってしまいます。

15. Appを公開する

15.1 How to upload the Android app for Internal testing in Google Play Console. Setup Internal Testing. [14]を勉強する

このTutorialはAndroid Appの作成方法に特化したChannelの動画です。それなのでUEの問題に関してはまったく触れていませんが、AndroidのAppをどうやってGoogle Play Storeに公開するのかについてはしっかり解説しています。

まずこれを勉強します。

これで公開に必要な内容が全部理解出来るようになるでしょう。

<Intro>

特にないです。

<Closed Testing>

それぞれのTestの特長が書かれていました。

Internal Testingは非常に早くTesterに公開されるそうです。早いと数10分で公開してくれるそうです。

うーん。じゃ何で私はGoogle Play Storeから見る事出来ないんでしょうか?

更に以下のところから

以下のような問題も報告してくれるそうです。

こんなのがあるの。

自分のを見てみます。

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

一個警告がありました。

テストの種類がTutorialと違いますね。

Accessibilityがユーザー補助機能なんでしょうか?

と書かれています。

意味不明です。

詳細を見てみます。

と書かれていました。

何が問題なのか不明です。

一意とはUniqueの意味だそうです。

つまりコンテンツラベルが一つしかない。と警告しているという事みたいです。

うーん。

これは別に問題ではないです。

後は以下のようにFirebase Test Labが使用出来るとありました。

Tutorialに戻ります。

Testerの説明です。

Internal Testerに選択されると

Google Play Storeに以下のように表示されるとありました。

Internal Testerと表示されていますね。

うーん。

何で私のGameは表示されないんでしょうか?

それぞれのTestについて解説していました。

Closed TestingやOpen TestingはGoogleからの承認に24時間かかる場合があるのか。

ここからInternal Testingのやり方を説明しています。

まずApp Bundleを作成します。

Android StudioからAPK Fileを作成していました。

うん。

このTutorialって古いの?

右上にAAB Fileの作成方法のTutorialが追加で紹介されていました。

最終的にはAAB Fileを作成していました。

<Create Internal Testing>

TestingからInternal Testingを選択します。

以下の画面が表示されます。

ここはTesterのListを作成しています。

別に知らない内容は無かったです。

うん。

知っている内容だらけです。

もう自分のAAB fileが動く事を確認出来た今、こんな事を一々やってる必要はないです。

一気に公開する方法を勉強する事にします。

15.2 How to publish app in Google Play Store | 2024 update [15]を勉強する

いきなりこっちを勉強して実行する事にします。

もし公開するには20人以上でTestしてからにして下さい。とか出てきたらその時はその時です。

<Introduction>

去年の11月13日以降にAccountを作成した人は、必ずTestをする必要が有ると言っていました。

私のAccountはこの時よりはるか前に作成しているので、これは問題ないはずです。

やっぱり20人以上でClosed Testingをやる必要があると述べていました。

しかも14日間、連続でテストする必要があるそうです。

うーん。

厳しい要件ですね。

Google Play Console Developer Accountの作成方法から説明していました。

この辺はSkipします。

<Step 1: Release prerequisites>

以下の10の要求を満たす必要があるそうです。

うん。

これはもうやったはずです。

「9.2 How to Publish App on Google Play Store 2023 [Common Guide] [4]をやってみます」でこれをやっていました。

<Step 2: Create and setup the app in play console>

以下のPageから先程の情報を入力していました。

「9.2 How to Publish App on Google Play Store 2023 [Common Guide] [4]をやってみます」を読み直したら、この中でABB FileをuploadしたらPlay Billing LibraryのVersionが古くてErrorになったと書かれていました。

あ、そう言う事だったのか。

Dashboardに移動しています。

ここにPublishingするため必要な手順が一通り紹介されていました。

自分のGameのこのPageを見ると以下のようにClosed Testingの登録の途中になっていました。

これを最後までやると以下のApply for Productionが押せるようになり、このAppを公開出来るようになるそうです。

うーん。

成程。

じゃこれを終わらせたら良い訳か。

TutorialではInternal Testingから説明していました。

これはやらなくても良いそうです。

次はFinish Setting Up Your Appです。

以下の情報を入力します。

これをやっていたのか。

この後、具体的にそれぞれの項目の入力方法が説明されています。

ここはSkipします。

入力が終わると以下のようにFinish Setting Up Your Appの項目が無くなります。

ここで入力した内容はいつでも以下の場所から変更出来るそうです。

確認します。

一部の情報しか載ってなかったです。

例えばPrivate Policyが掲載されているWebsiteのAddressとかは載ってなかったです。

ここで入力情報を変更した場合は以下のApp Contentに行って

何かをする必要があるみたいです。

ところがTutorialでは、このPageに移動したら以下のようになっていて

更にDeclarationをする必要がある。となっていてこっちの問題に先に取り掛かるようになってしまいました。

これ、私のAppでも同じようになっていました。

いたんですが、何で全部きちんと入力したのに、こんな問題が起きているのかが、理解出来なくて宙ぶらりんになっていました。

ここでこの問題をどう解決するのがBestなのかについても勉強していまいましょう。

Actioned Tabを見ると

今までに申告した全ての内容がここに表示されているそうです。

自分のAppで確認します。

おお、Privacy PolicyのSiteもありました。

Need Attention Tabに戻りました。

Declarationを変更したい場合は以下のStart DeclarationをClickします。

以下のPageに移動しました。

広告がのっているかどうかをここで答えるみたいです。

うん。

今までの登録した内容を変更出来るんじゃなかったの?

まあいいです。

こっちはこっちで必要な情報です。

これは今やってしまいましょう。

しました。

Saveもします。

公開の概要Pageに飛びました。

ここはTutorialとは違う反応ですね。

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

うーん。

App Contentsに戻って確認してみます。

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

同じですね。

ここは申請した内容が駄目だった時に変更するための項目のようです。

<Step 3: Publish the app to Closed testing>

今度はClosed Testingです。

Tutorialでは以下のように述べています。

という事は私の場合はやらなくても良いという事です。

私のAppのPageをよく見ると以下のような項目がありました。

優先順位から考えたらこれを一番最初にやるべきです。

この部分の勉強を先にします。

21:18までSkipしました。

Closed Testingの設定が終わった状態です。

Dashboardに戻ると以下の設定だけが残っているそうです。

うーん。

成程。

この状態でInboxを開くと

以下のような連絡が来ているそうです。

3日かかっているのか。

私のAccountをKeepするためには、このAppを3月15日までに公開する必要がありますが、そうなるとなるだけ早く公開の申請をしておく必要があります。

結構焦って来ました。

<Step 4: Share the closed test link to the testers>

今度はTestersとのApp LinkのShareの仕方についてです。

以下の項目から

Closed Testingを選択し

以下のPageに移動します。

Manage Trackを押します。

以下のPageに飛びます。

Testers Tabを選択して

以下のLinkをTesterに送るそうです。

Webを送った場合は、Testerは以下のPageに飛ぶそうです。

まじで。

これでAccessする必要があるのかも。

私のAppの内部テストのこの場所を見るとWebでしか参加出来ません。

このLinkを私の携帯に送ったらこのSiteが表示されて終わりだったんですが。

後で、もう一回試してみます。

TutorialはJoin Androidの方からも試していました。

以下のように表示されていました。

これはひょっとすると私のAccountは裏では既に消されているのかもしれません。

うーん。

何とかして元に戻したい。

でもここまで見て分かりました。

私の場合は以下の手順をやる必要があるんです。

そしてこのTutorialはこのやり方は説明していません。

のでこのTutorialの勉強はここまでとします。

15.3 「リリースを作成して公開する」を実行する

それでは最後の「リリースを作成して公開する」をやってしまいます。

まず「国や地域を指定する」をやります。

これは日本だけで良いです。

保存しました。

「新しいリリースを作成する」をやります。

App Bundleには内部テストに使用したものをそのまま上げました。

リリースの詳細も同じです。

保存を押して次のPageに移動しました。

エラーじゃなくて警告でしょう。

このままやっていきます。

保存を押しました。

以下の表示になりました。

Dashboardに戻って来ました。

もう次の手順は表示されていません。

以下のPlay Gamesサービスだけが残っていました。

これで終わりか?

と思ったんですが、公開の概要を見ると

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

これはやらないといけない気がします。

やっておきましょう。

11件の変更を審査に送信しました。

7日間以上かかる場合もあると出て来ました。

なるだけ早く公開してほしいです。

リリースの概要を見ると

審査中となっています。

これでやる事は全部やったはずです。

しかしG-Mailを確認しましたが何のMailも送られていませんでした。

うーん。

駄目かもしれません。

Dash boardに「Google Playで表示」がありました。

Link先に飛ぶと

と表示されます。

やっぱり私のAppはGoogle Playには内部テスト用としてもセットされていません。

さあ、どうなるでしょう。

後はGoogle次第です。

天に祈って朗報を待つ事にします。

16.まとめと感想

2週間、Google Appの作成でつぶしてしまいました。

来週から元のScheduleに戻します。

17.参照(Reference)

[1] Surin. (2023, December 13). Package your Android game for Playstore in UE5 [Video]. YouTube. https://www.youtube.com/watch?v=sdZkIe9KHxM

[2] Packaging Android Projects. (n.d.). https://docs.unrealengine.com/5.3/en-US/packaging-android-projects-in-unreal-engine/

[3] Signing projects for release. (n.d.). https://docs.unrealengine.com/5.3/en-US/signing-android-projects-for-release-on-the-google-play-store-with-unreal-engine/

[4] Swing2App. (2023, August 16). How to publish app on Google Play Store 2023 [Common Guide] [Video]. YouTube. https://www.youtube.com/watch?v=Jk4X3EDXi7s

[5] Do I have to upload the .obb file to the Google Play Console? (2020, September 23). Epic Developer Community Forums. https://forums.unrealengine.com/t/do-i-have-to-upload-the-obb-file-to-the-google-play-console/151073

[6] Google Play Asset Delivery Reference. (n.d.). https://docs.unrealengine.com/5.3/en-US/using-google-play-asset-delivery-in-unreal-engine/

[7] Cooking and chunking. (n.d.). https://docs.unrealengine.com/5.3/en-US/cooking-content-and-creating-chunks-in-unreal-engine/

[8] Google Play、個人開発者がアプリを公開する前に「20人以上のテスターを集め、14日以上連続でクローズドテストすること」が条件に追加。11/13以降に作られたデベロッパーアカウントが対象. (n.d.). https://gamemakers.jp/article/2023_11_13_54780/

[9] UE5 Please upgrade to Billing Library version 3. (2021, November 17). Epic Developer Community Forums. https://forums.unrealengine.com/t/ue5-please-upgrade-to-billing-library-version-3/491012/1

[10] SparrowARK UE tutorials. (2023, August 27). Upgrade Unreal engine Billing Version to 6 | Fix google play billing version requirement UE 4.27 [Video]. YouTube. https://www.youtube.com/watch?v=b4zcM9AsRek

[11] Nililiya. (2023, October 28). Upgrade Unreal engine Billing Version to 6 UE 5 2 [Video]. YouTube. https://www.youtube.com/watch?v=91il4s1UM0I

[12] Coco Code. (2023, January 3). Privacy policy for your game? No problem! (generate and publish) [Video]. YouTube. https://www.youtube.com/watch?v=BfIWE172jj0

[13] 【雛形付き】アプリのプライバシーポリシーに必要な10項目を解説! (n.d.). topcourt-law.com. https://topcourt-law.com/terms_of_service/privacy-policy-for-app

[14] iRekha Tech Solutions. (2023, February 3). How to upload the Android app for Internal testing in Google Play Console. Setup Internal Testing. [Video]. YouTube. https://www.youtube.com/watch?v=AqFocbUV810

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

1. 今週の予定

突然ですがAndroidのAppを一週間で作成してGoogle Playに公開する事にしました。

(先週のBlogの最後)

以下の計画でやる事にします。

1.1 Tutorialの勉強

UEでAndroidのAppを作る設定とか全くおぼえていません。

この辺を優しく説明してあるTutorialを探してそれでささっと勉強してしまいます。

1.2 Tutorial通りにProjectを作成してみる

Android用のProjectをUE5で作成して自分のAndroidで起動するか確認します。

1.3 前に作成したGameをAndroid用に調整出来ないか試してみる

これです。

これをそのままAndroid用に変換出来れば、Google Playも文句言わないでしょう。

1.4 (出来なかった場合)新しいGameを作成します

<Idea1:脱出ゲーム>

前に作成した以下のLandscapeを使用して無人島脱出ゲームを作成します。

以下のAssetを追加して山をそれっぽく登れるようにします。

高い所から落ちたら死にます。

後は野生の狼とかを徘徊させて捕まったら食われる事にします。

どうやったら脱出出来るようにしますか?

島のどこかに無線機を配置してそれを発見したら迎えのヘリが来る事にでもします。

<Idea2:Top down View Game>

Top Down ViewでPlay出来る簡単なGameを作成してもいいかなと思っています。

原始的なパチンコみたいなGameでも作成してもいいかなと思いました。

<Idea3:テトリス風ゲーム>

16x16のますに色のついた板が並べられていて、ひっくり返す事が出来ます。同じ色が3つ以上そろったらそれらの板は爆発して消えます。

板が無くなった場所は上の板が落ちてその隙間を埋めます。

全部消せたら勝です。

1.5 Google Playで公開します

もうやり方忘れました。Tutorialで勉強します。

2. Tutorialの勉強

2.1 UE5からAndroid Appを作成するためのTutorialを探す

これを見つけました。

UE5. 3 Android Mobile Project Setup![1]から見てみます。

まずProjectの設定です。

後は普段と同じです。

Project Settingを開きます。

PlatformからWindowsを選択します。

そしてCompiler VersionをVisual Studio 2022にセットします。

今度はAndroidを選択します。

以下のConfigure Nowを押します。

緑色になりました。

そういやこんなのやってたわ。

以下の箇所に製品版の名前を打ち込みます。

Com.製品名

と打ち込むそうです。

次にGame名を以下の場所に打ち込みます。

ここは日本語でも大丈夫なんでしょうか?

作成する時に試します。

次にSDKのVersionを指定しています。

ああ、今のSDKのVersionは幾つなんでしょう。

後、前にこれやった時、Android StudioをInstallしてSDKを手に入れた気がします。

今はここをセットするだけでいいんでしょうか?

次にAllow large OBB FileをCheckしました。

うーん。

OBB fileって何だっけ?

なんか追加のFileでしたっけ。

そしてUse ExternalFilesDir for UnrealGame FileをEnableしました。

これは何をやっているのか不明です。

後、以下のもCheckしていました。

次にShow Launch ImageをDisableしていました。

この辺はどっちでもいいです。

と思ったらこの機能はSupportされてないそうです。

今度はEditor Preferenceを開きます。

Source Codeを選択して

Source Code Editorにvisual Studio 2022を選択します。

今度はPluginからios関連のPluginを外します。

ふーん。

これすると製品版が軽くなるんでしょうか?

前に作成した時はこれはしませんでした。

以上でした。

うーん。

これだけで動くようになるのかな。

そうだ。

公式Siteで確認してみます。

Android [2]がありました。

こっちを勉強すれば間違いないです。

SDKの最低条件が書かれていました。

ふえ。

やっぱりAndroid StudioをInstallしないと駄目っぽいです。

UEで作成するAndroidのGameは以下の条件以上のものだけだそうです。

こっちは多分大丈夫でしょう。

Getting Startedに以下の3つのTutorialが用意されていました。

そうだ。

やっぱり以下の3つをやる必要があるんだ。

  • Android SDKとNDKをセット
  • Android Quick StartでUE側の設定をする
  • AndroidとPCを繋いで作成したGameがどう動くのかを試す

先程のTutorialはこの2番目だけをやっているみたいです。

サラッと全部読んでみましょう。

2.2 Setting Up Android SDK and NDK [3]を読む

<Recommended Setup>

Unreal Editor とEpic Games Launcherは閉じた状態で行う必要があるそうです。

Unreal Engine 5.3 では JDK installationにjbr (OpenJDK 17)を使用するそうです。

この設定が前のVersionまでとはかなり違っているらしく、そればっかり説明しています。

<Install Android Studio

やっぱし。

Android StudioをInstallする必要がありました。

微かですが前もAndroid StudioをInstallした記憶があります。

Android Studio Archiveに行って

をDownloadする必要があるそうです。

このVersionよりも新しいのが在りそうですが、どうしましょう。新しい方を入れた方が良いんでしょうか?

Downloadした後のInstallの方法も丁寧に説明してありました。

InstallするFolderですが、Defaultのままにしておいた方が無難みたいです。

うーん。C Driveにはなるだけ入れたくないですが今回は仕方ないです。

<Set Up Android Studio for First-Time Use>

Android Studioを初めて開くとData Sharingと書かれたBoxが表示されるそうです。

ここは好きなように選択して良いそうです。

次のWelcome to Android Studio画面です。

More Actionから

SDK Managerを選択します。

Android SDK system settings画面が表示されるので

以下のAndroid SDK LocationのEditを押します。

ここが一寸よく分からないんですが、

SDK Components Setup画面がここで開くみたいです。

この設定は完璧なのでNextを押すだけだそうです。

これでSDKのInstallが始まるみたいです。

Nextの上にSDKのLocationが書かれていました。

この場所にInstallしてればUEは自動的にSDKを認識出来るようになるみたいです。

Settings menu画面に戻っています。

おそらくInstallが終わったら自動でSetting画面に戻るんでしょう。

今度はSDK Toolsを選択します。

Show Package Details boxをCheckします。

これはこのTutorialではImageが紹介されていませんでした。

と思ったら図の右下にありました。

Android SDK Command-line Tools (latest)をCheckします。

そしてApply Buttonを押してDownloadを開始します。

<Finalize the Android Studio Installation on Your OS>

Windowsを再起動します。

<Reset or Verify Your Environment Variables>

ここはUE5.2以前のVersionを使用していた人だけがする必要があるそうです。

私の場合はAndroid StudioをこのPCで使用するのは初めてですが、UEは5.0から使用しています。

一応勉強しておきます。

System Propertiesって何?

調べたら[Windows 11] [システムのプロパティ] 画面を表示する方法 [4]に開く方法が載っていました。

以下の箇所にあるやつのようです。

そして

を消します。

残りの以下のVariableはResetします。

名前から推測するとこれらは全部Android関連です。

多分私のPCではこれはやらなくても問題ないでしょう。

更に以下の事をやる必要があるそうです。

と思ったら以下のTipがありました。

こっちの方が簡単ですね。

<Run the SetupAndroid Script>

これでSDKのInstallが完成したので今度は、SetupAndroid scriptを使用してNDKをInstallするそうです。

以下の手順でするそうです。

NDKは以下の箇所にInstallされているはずだ。と書かれていました。

<Manually Target SDK Paths>

何らかの原因でUEがSDKらの場所を認識出来ない場合は以下の箇所から手動で指定する必要があるそうです。

以上でした。

大体理解しました。

次にいきます。

2.3 Android Quick Start [5]を読む

イキナリ以下のように書かれていました。

じゃ次のSetting Up Your Android Device For Development [6]を先に勉強します。

2.4 Setting Up Your Android Device For Development [6]を読む

<1. Installing Android USB Drivers to Your Computer>

そうだ。前に使用したCableを探さないと。

ありました。

誇りまみれだけどこれが使えれば、新しいCableを買わなくて済みます。

ただ、前に作成した時から既に2回位携帯買い換えています。

使える可能性はかなり低い。

前にCableを買った時も純正品じゃないとPCとのやり取り出来ませんみたいな結果になって、2回位買い換えてやっとPCと繋げた記憶があります。

躓くとここは結構時間かかりそうです。

<2. Enabling Developer Mode on Your Android Device>

これは携帯の機種から検索して調べた方が無難かもしれません。

一応、ここの内容は以下にまとめておきます。

  • Settings menuを開けます。
  • Build Numberを7回押します。

だけでした。

<3. Enabling USB Debugging>

またSettings menuを開きます。

Developer Optionsを開きます。

USB debuggingを開きます。

以上です。

<4. Verifying That Your Device is Connected>

AndroidがPCと正しく繋がっているかを確認します。

Windows Command Promptを開きます。

adb devicesと打ちます。

するとつながっているDeviceが表示されるそうです。

Unauthorizedと表示された場合は、

と書かれていました。

これ言ってる意味は分かりますが、どうやってAcceptするんでしょうか?

それが分からないとこの問題が起きた場合、解決出来ないですよね。

Deviceが表示されなかった場合は、Android Debug Bridgeを再起動させるために以下のCommandを順番に打ち込むそうです。

うん。

これくらいなら意味分かります。

単にAndroid Debug Bridgeを停止して新しく起動しているだけです。

最後にAndroidをMedia Device (MTP)として繋ぐと表示されない場合があると言っていました。その場合はCamera (PTP)として繋ぐと良いそうです。

うん。

大体理解した。

2.5 Android Quick Start [5]をもう一回読む

ここでは以下の内容を勉強するそうです。

はい。

じゃやっていきましょう。

<1 - Android Development Prerequisites>

Setting Up Android SDK and NDK [3]とSetting Up Your Android Device For Development [6]の内容を先にやっておけ。と書いてありました。

はい。

<2 - Creating Your Project>

以下の設定でProjectを作成します。

名前は

にしていました。

<3 - Setting Up Unreal Editor for Android

Android Packaging Nameを指定していました。

更にSDKのVersionを指定していました。

この辺はUE5. 3 Android Mobile Project Setup![1]で勉強した内容と被っています。

SDKは最新のしかInstallしなかった場合Minimum VersionもTarget Versionも同じものを指定する事になるんでしょうか?

UE5. 3 Android Mobile Project Setup![1]では34を指定しています。このTutorialは28を指定しています。のでこのTutorialが作成されたのはかなり昔みたいです。

以下のConfigure Nowを押せ。と書かれていました。

その後でAccept SDK Licenseも押せと。

これはUE5. 3 Android Mobile Project Setup![1]では書いてなかったです。

更に今度はGoogle Play ServicesのConfigure Nowを押します。

これもUE5. 3 Android Mobile Project Setup![1]では書いてないですね。

<4 - Configuring Editor and PIE for Mobile Previews

Play-In-Editor (PIE) modeをAndroidの画面と同じにします。

以下のSettingsからPreview Rendering Levelを選択し、更にAndroid ES 3.1を選択します。

うーん。

これ合ってんのかな?

ずいぶん古いVersionのSettingのような気がします。

そして以下のPlayのDropdown MenuからMobile Preview ES3.1(PIE)を選択します。

うーん。

直接、Androidでテストした方がよさそう。

<5 - Launching on an Android Device>

Platformから繋がっているAndroidを選択するだけみたいです。

<6 - Packaging Android Builds>

これは今日勉強しなくて良い気がしますが、一応やっておきます。

PlatformからAndroidを選択してAndorid(multi…)を選択しPackage Projectを行います。

以下のようなAPK、OBBそしてそれぞれのBat fileが形成されるそうです。

<7 - On Your Own>

ここはそれ以上勉強したい時に参考になるSiteの情報が載っていました。

こんな感じです。

なんかまだ必要な情報が足りない気がします。

例えばGoogle PlayのAppのAPKの最大のSizeとかです。

Shipping with Androidを見たら載ってそうです。

見てみます。

Packaging and Publishing [7]です。

ひええ。

こんなにまだ勉強しないといけない事があるのか。

まず一番端のこのTutorialから見てみます。

Signing Projects for Release [8]を見ると

Google Play storeに表示するためのKeystoreの作成方法について解説していました。

そうだ。

AndroidのAppが出来てもその後で、今度はGoogle Play Storeに出展するための手続きが必要でした。

うーん。

しかもここで

名前とか会社名とかInputしています。

前にAppを出展した時、何をInputしたのかまったく覚えていません。

UEの記録用のノードを確認したら前の設定が載っていました。

それぞれのAppによってかなり違っていました。

VersionをUpdateする時にここは同じにする必要があるみたいですが、違うAppでは内容が違っても問題ないみたいです。

うーん。

ここは明日勉強します。

3. Tutorial通りにProjectを作成してみる

それではTutorial通りに実装していきます。

3.1 UE5.3 Android Mobile Export & SDK NDK JDK Set-up ! [9]を軽く見る

Setting Up Android SDK and NDK [3]をやる前にUE5.3 Android Mobile Export & SDK NDK JDK Set-up ! [9]を軽く見ておきます。

どうやらSetting Up Android SDK and NDK [3]でやる内容はここで説明されていたようです。

以下のAndroid Studioを使用しています。

こっちはGiraffeを使用しています。Setting Up Android SDK and NDK [3]ではFlamingoでした。

PerplexityにGiraffeとFlamingoの違いを聞いてみました。

これ読むとVersionが違うだけみたいです。

がどっちが最新のVersionなのかは不明です。

Giraffeの画面です。

Setting Up Android SDK and NDK [3]でのAndroidの画面と全く同じです。

これは最新版をDownloadした方が良い気がします。

More ActionからSDK Managerを選択しています。

ここはSetting Up Android SDK and NDK [3]と全く同じです。

Setting Up Android SDK and NDK [3]では以下の場所でEditを押せ。と書かれていましたが、このTutorialでは既にSDKの場所が選択されていました。

実際にやる時はどっちかに従えば間違いないでしょう。

このTutorialではSDK Platformsの設定からやっています。

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

Setting Up Android SDK and NDK [3]ではSDK Platformの設定はしていません。

おそらくですが、以下のSDK Components Setupで同じような事を設定しているんだと思います。

逆に言うとこのTutorialではこのSDK Components Setupについては何も解説していません。

次にSDK Toolsについてです。

以下の設定にしていました。

Setting Up Android SDK and NDK [3]では以下の設定になっていました。

そもそも表示されている内容が全然違います。

本来ならこれらの違いから本質的にはここで何を指定しているのかを汲み取るべきなんですが、そんな余裕はありません。

どっちかのやり方でやるしかないです。

<追記>

因みにMeet Google Play's target API level requirement [10]では

と書かれていました。

<>

更にここでNDKの指定もしています。

そして以下のAndroid SDKにCheckしていました。

ここでやっとSetting Up Android SDK and NDK [3]の設定と似た事をやっています。

Setting Up Android SDK and NDK [3]では

にCheckを入れていました。

今度はJDK11をDownloadする必要があると言っています。

Setting Up Android SDK and NDK [3]ではJDKは以下の部分で解説しているだけです。

これ見るとOpenJDK 17、通称Jbrが勝手にJDKをDownloadしてくれるみたいですね。

このTutorialでは自分でDownloadしてそのFolderを以下のように表示しています。

そして以下のように設定しています。

Setting Up Android SDK and NDK [3]ではDefault通りの設定なら以下の場所はBrankで良いと書いてはありました。

JDKってそもそも何なんでしょう?

Perplexityに聞いてみました。

ふええ。

そう言えばJavaで開発する時に入れた記憶があります。

これってAndroid StudioをInstallした時に自動でInstallされると思うんですが違うでしょうか?

後、OracleのHomepageに行ったら今のJDKのVersionは21と17になっていました。

あえてJDK-11を使用する必要があるとは思えません。

残りはUEの方の設定で前のVideoでやった内容と同じだと言っていました。

3.2 Setting Up Android SDK and NDK [3]をやる

まずはAndroid StudioをDownloadします。

Android Studio のダウンロード アーカイブ [11]に移動しました。

「規約に同意する」を押すと以下のPageに移動しました。

どれをDownloadすればいいの?

最新の安定板をClickしてみました。

Hedgehogが最新の安定板のようです。

こいつをDownloadしてみます。

Exe Fileを開くと以下のBoxが表示されました。

これはNextを選択します。

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

これもDefaultのままにしろと書かれているのでそのままでNextを押します。

ここは絶対にDefaultのままにしろ。って書かれています。

うーん。

どうせUEの設定でSDKの場所を指定し直せば良いだけでしょう。とは思っているんですが、今回だけはDefaultでやります。

ここはInstallを押せと言っています。

はい。

Installが終わりました。

Nextを押します。

Finishを押します。

簡単じゃん。と思ったら以下のBoxが現れました。

OKでいいです。

またBoxが現れました。

これはData Sharingと言うやつか。

まあ良いでしょう。Send Usage Statics to Googleを選択しました。

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

こんな画面が出て来るとは、どっちのTutorialにも書かれてなかったです。

Nestを押します。

まだ知らない画面が出て来ました。

DefaultのままでNextを押します。

次の画面です。

この設定でDownloadするけど良いかと聞いてきました。

うーん。

これで良いのか、あるいは後から追加するのかよく分からないです。

しかし他の選択肢はありません。

Nextを押します。

次の画面です。

Android-sdk-licenseとAndroid-skd-arm-dbt-licenseをそれぞれAcceptに変更してFinishを押します。

Downloadが始まりました。

結構時間がかかります。

小用を済まして戻ってきたら終わっていました。

と書かれていました。

Android Emulator Hypervisor DriverのInstallは失敗したようです。

他のErrorは表示されていません。

Finishを押します。

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

やっとこの画面に辿り着けました。

More ActionsからSDK Managerを選択します。

以下の画面が出て来ました。

む。

Android SDK LocationsにSDKの入っているFolderの場所が表示されています。

Tutorialはここが空でComponent Setupからなんかやっていました。

あ、分かった。

TutorialはSDKが無い状態でAndroid Studioを開いたんです。

だからその後でSDKをDownloadしているんです。

UE5.3 Android Mobile Export & SDK NDK JDK Set-up ! [9]では以下の設定になっていました。

Google AppのRequirementの設定が

Android 14のUpsidedown CakeのSDKのVersionは34みたいです。

ならこれが入っていれば何とかなるでしょう。Minimum Requirementも34にしてしまえば良いだけです。

はい。

次に行きます。

SDK Toolsです。

これは取りあえずは34.0.0だけで良いです。

おそらくここは先程のPlatformsのVersionと関連しているはずです。

次はNDKなんですが、

Setting Up Android SDK and NDK [3]ではNDKはSetupAndroid Scriptを使用してInstallしていますが、ここからInstallした方が簡単な気がします。

と言うかここからInstallしても裏でSetupAndroid Scriptが使用されている気がします。

Google PlayのRequirementはr25bだそうです。

最新の26.2.11…を選択しておけば問題なさそうです。

UE5.3 Android Mobile Export & SDK NDK JDK Set-up ! [9]の方では

となっていました。

こっちのTutorialではSetupAndroid Scriptは使用していません。

うーん。

もしかしてSetupAndroid ScriptってJDKもInstallしてくれるんじゃ。

だからSetting Up Android SDK and NDK [3]ではJDKに関して何も述べてないんじゃ。

ここはSetupAndroid Scriptを使用する事にしますか。

NDKは何もCheckしないで次にいきます。

Android SDK Command-line Tools(latest)です。

Setting Up Android SDK and NDK [3]ではAndroid SDK Command-line Tools(latest)にCheckを入れました。

同じようにしたら以下の全部が選択されました。

UE5.3 Android Mobile Export & SDK NDK JDK Set-up ! [9]の方では

最新のやつだけです。

これは最新のだけでいいでしょう。

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

これで完成。

Applyを押します。

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

OKを押します。

Installが終わりました。

Finishを押します。

OKを押します。

以下の画面に戻って来ました。

ここでWindowsを再起動しろ。と言っています。

します。

「Reset or Verify Your Environment Variables」はやる必要が無いはずなのでSkipします。

以下の箇所にSetupAndroid.batがありました。

SetupAndroid.batを起動します。

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

NDKがInstallされているか確認します。

ありましたがVersionが25.1でした。

JDKも何処にあるのか不明です。

以下の箇所にありました。

でもVersionが分かりませんね。

3.3 Setting Up Your Android Device For Development [6]をやる

とりあえず昔使用したCableでAndroidとPCを繋げてみました。

「USBの設定」画面が表示されたので「ファイル転送」を選択しました。

PCから見ると携帯を認識している事が分かります。

うん。

繋がっていますね。

今度はDeveloper ModeをEnableします。

AQUOS R6 オンラインマニュアル[12]にこの機種の開発者ModeをOnにする方法が説明されていました。

Tutorialの説明と同じですね。

やってみます。

出来ました。

USB Debuggingが出来るように設定を変更しました。

最後にAndroidがPCと正しく繋がっているかを確認します。

Command Promptから確認しました。

うーん。

繋がってない?

以下に紹介されているCaseのようです。

でもPCからこの携帯のDataが見れるんだから繋がってない訳はないと思いますが、どうなんでしょう?

一応、このCommandをやってみますか?

うーん。

こんなCommand知らないって出て来ました。

Cableがよく繋がってないのかもと思ってもう一回繋げ直しました。

今度はしっかり認識されました。

3.4 Android Quick Start [5]をやる

うーん。

やるか

まずProjectを作成します。

名前はMy Android Projectにしました。

<3 - Setting Up Unreal Editor for Android

Projectを開いて更にSettingを開きました。

これを一番最初にやるのかと思ったんですが書いてないです。

以下のPackage Nameを直しました。

次がこれです。

ここは両方34にしました。

SDKのversionは34しかInstallしてないからです。

そしてConfigureをやりました。

Accept SDK Licenseは最初からGrayです。

これは既にSDK Licenseに同意しているからだそうです。

今度はGoogle Play ServiceのConfiguredをします。

しました。

なんか他にも設定しないといけないところは沢山ありそうですが、この節はこれで終わりです。

<4 - Configuring Editor and PIE for Mobile Previews

やっぱりTutorialは古かった。

Settingを開きましたがPreview Rendering Levelなんて選択肢は無いです。

Preview Platformならあります。

うーん。

ここは本当に何を選択したら良いのか不明です。

一寸Passしておきます。

当然Playの3つの点のIconにMobile Previewの表示はありません。

うーん。

Preview Platformの設定をAndroid OpenGL Mobileに変更してみました。

画面が暗くなっただけでした。

元に戻しました。

それよりA101SHって何の事なんでしょう。

私の携帯はAQUOS R6です。なんか別の機種として認識されてしまっているみたいです。

調べたらAQUOS R6の事でした。

<5 - Launching on an Android Device>

AndroidからUEのProjectをPlay出来るかどうかをテストします。

Androidで私のGameがどう映っているのかが確認出来るので、正直これさえ出来ればOKです。

結構時間が掛かっています。

最初だからでしょうか?

気長に待つことにします。

30分ぐらい掛かって失敗しました。

うーん。

もう一回やってみます。

駄目でした。

Logを見たら

と書かれていました。

あれ?

じゃSDKのVersionを30に変更して

テストします。

今度はAndroidからPlay出来るようになりました。

Androidから見る映像ですがPCとは全然違いました。

色のContrastがかなり強めです。

そして影が結構汚いです。

軽く操作して思ったんですがJumpの仕方が分かりません。

うーん。

SDKのVersionは最低でも33にしないとGoogle Playの審査はパスしないはずです。

以下の場所で直接指定したら直るんでしょうか?

これは後でやる事にします。

<6 - Packaging Android Builds>

最後にPackagingを試します。

以下の条件で試します。

出来た。

サイズはこんなもんでした。

まあ一応出来たのでこのTutorialも出来た事にします。

3.5 課題

SDKのVersionがGoogle PlayのRequirementを満たしていません。

NDKやJDKに関してもほぼ同じ状況であると思われます。

これはUEの設定をSetupAndroid.batを使用してやったからだと思います。

要するにUEも本音ではAndroidの市場なんかどうでも良いと思っているんでしょう。

それぞれの最新のVersionをInstallして以下の場所から

Fileの位置を指定すれば、最新のVersionを使用出来るはずです。

もしくは私の携帯のOSが古いのかもしれません。

調べました。

私の携帯のOSはAndroid 11でした。

Level 30でした。

成程。

じゃ、Minimum Requirementを30にします。

でも、私携帯買い換えたの確か一昨年の始め位だったはず。

せめてAndroid 12のOSのやつを売って欲しかった。

と思って調べたらどうやら最新のOSに無料でUpgrade出来るみたいです。

普段、携帯を全く使用しないため、Androidの最新情報に関しては浦島太郎状態です。

これは後で試します。

NDKのVersionは26になっています。

と前に書いていますが、これの情報元のSiteのAddressを記録するのを忘れていました。

今、検索しても出て来ません。

NDKに関しては一応、大丈夫と判断しました。

JDKに関しては全く分かりません。

これはGoogle Playに登録する時に調べる事にします。

<作成したAPK Fileを自分の携帯から見る方法>

これ確か出来たはずです。

というか製品版がきちんと動くのを確認するためにはこれをやる必要があったはずです。

実機(Android端末)へのインストールと動作確認【Androidアプリ開発】[13]にやり方が載っていました。

これ読んだら思い出してきました。

昔もこのやり方でやったはずです。

4.GaeaのTutorialの作成

Android用のAppはそう簡単には作成出来そうもありません。

GaeaのTutorialの作成だけは今週もやる事にしました。

先週作成したPowerPointがあるのでそれを元に録画を作成します。

5.Android用Projectの設定の直しの続き

5.1 AndroidのOSのUpgrade

AQUOS R6をご利用中のお客さまへ [14]を見ると、私の携帯のOSも最新のVersionにUpgrade出来るみたいです。

Android OS12にはVersion Up出来ました。

何で13には出来ないの?

因みにAndroid OS12のSDKのVersionは31でした。OS12Lが32でした。

もう一回Updateしたら13になったりしないでしょうか?

Updateは出来るみたいです。

試してみます。

13にはならなかったです。

でも12になったのでまあいいです。

5.2 UE ProjectのSDKのVersionの設定を変更する

SDKの設定を以下のように変更しました。

これでOSが新しくなったAndroid上でPlayが出来るのか確認します。

Playは出来ましたがPlayerのCharacterのMaterialがおかしく表示されています。

うーん。

後、影の見た目がおかしいです。

これは変わっていません。

Android OS 12ってVulkanなのかOpenGL ESで動いているのかすら知らないです。

以下のFileをAndroid内にCopyして

PC内からBat fileを起動したら携帯にAppとして認識されるようになりました。

これで携帯からGameとしてPlay出来るようになりました。

これで最低限の環境設定は出来たって事でしょうか?

いや、後UE5からPIEでPlayした時に携帯の条件で開く設定に変更する方法が分りません。

調べたけど少なくともYouTube上ではこの問題について語ってそうな動画はなかったです。

以下の箇所からAndroid OpenGL Mobileを選択しました。

結果です。

角度によってはPlayerが黒く見えます。

Vulkanに変更してみました。

うーん。

こっちも黒くみえなくもないです。

これで環境構築は出来たことにします。

環境構築に三日もかかってしまった。

予定の3倍の時間です。

という事はこのAppが完成するのも予定の3倍かかるという事になります。

6.Gameを作るための構想

6.1 前に作成したGameをAndroid用に調整出来ないか試してみる

やっとこれを試す事が出来ます。

やり方としては

  1. Android用のEmptyなProjectを作成
  2. そこに前に作成したProjectのGameのLevelをMigrate
  3. 動くかどうか確認
  4. 動かない部分を直す

となります。

うーん。

半年ぐらいかかりそう。

あのGameを没にするのは勿体ないんですが、だからと言って今直すのは現実的は無理な気がします。

限られた戦力をどこに投入するのかを決定するのは最も重要な選択です。

今回の目的はGoogle PlayのAccountをKeepしておく事なので、ここは撤退します。

6.2 脱出ゲームを作成する

こっちを作成しましょう。

こっちなら一週間位で完成出来るはずです。

なんと、Advanced Locomotion Systemは5.0までのVersionしかありません。

Advanced Locomotion System - Community Version [15]に5.3で動くPluginがあるみたいです。

ただしこのpluginを使用するためにはC++でProjectを作成する必要があります。

うーん。

それもまた時間がかかりそうです。

6.3 車で走るGameを作成する

VehicleのTemplateがあります。

ここにGaeaで作成したLandscapeを追加して島を一周するGameにします。

それなら一週間以内に作成出来ると思います。

試してみます。

まずVehicleのTemplateでProjectを作成しました。

そもそもVehicleのProjectを使用した事自体ありません。

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

もうこれにGaeaで作成したLandscapeを追加したら十分でしょう。

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

Google Play ServiceのConfigureもしました。

Cableで繋いで携帯からこのGameがPlay出来るか確認します。

以下の場所からPlayします。

後、携帯の機種の後に並んでいる番号が何なのかは知らないんですが、YouTubeの動画でこの部分にモザイクを掛けているのを見たので一応消しておきます。

Errorになりました。

何で?

と思ったら

と書かれていました。

これはPCを全く動かさないでいたからPCが携帯との接続を勝手に切っちゃたみたいです。

もう一回試してみます。

駄目でした。

何で?

ひょっとしてOSをUpgradeしたから?

7先にPackaging Android Buildsこっちを試してみます。

出来たんですが一時間位かかりました。

その間動画を見てたんですが、Unreal Android 5.3 setup [15]にAndroid Quick Start [5]あたりに書かれた内容をしっかりやっている動画がありました。

何故、こっちの動画をお勧めで表示してくれなかったの。

更にこの動画でPackagingするのに

ASTCしか選択していませんでした。

それは兎も角、

携帯に

をCopyしてBatを起動させました。

うーん。

動かない。

前回はこれで携帯のGameが起動したはずです。

それよりもUSBで形態とPCを繋ぐたびに表示される以下の画面ですが、

前回はMIDIを選択しなかった気がします。

UE5を起動させてもう一回以下の

を試してみます。

おお、今度は出来ました。

でも操作は出来ません。

うーん。

この操作を直すのは結構大変ですね。

Unreal Engine Mobile Vehicle Control Mobile Touch Input Set-up For Mobile Vehicle Game in UE5 #UE5[16]にそれらしきヒントはありますね。

面倒くさ。

一寸Car GameはPendingします。

以下のApkを直接携帯で起動する方法が分りました。

まず携帯とPCを繋ぐときに

を選択します。

そして

のInstall….batをPCから起動させます。

すると携帯にこのAppが追加されます。

これらのFileを携帯に直接Copyする必要はなかったみたいです。

はい。

7.車の操作にTouch Panelを追加する

もう腹くくりました。

車のGameにします。

しかしどうやったらTouch Panelで車の操作が出来るようになるのか分かりません。

7.1 Unreal Engine Mobile Vehicle Control Mobile Touch Input Set-up For Mobile Vehicle Game in UE5 [17]を勉強する

これ勉強したらTouch Inputの作成方法が分るのかは分かりませんが、何らかのヒントは得る事が出来るはずです。

まず以下のTextureを作成していました。

Sizeが599x599になっています。

以下の箇所からSlate Widget Styleを作成しました。

このWidgetは使用した事ないです。

Touch Panel専用のWidgetなんでしょうか?

UI_Cnと名付けています。

中を開いてWidgetを作成しています。

まずButtonを追加しました。

この辺は自由にやります。

それよりも私が知りたいのはこのButtonとInputのつなぎ方です。

先程のTextureを追加して以下のようになりました。

このButtonと以下のIMC_Defaultの

以下のWやSとのつなぎ方が分れば良いんです。

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

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

WidgetからVehicleのReferenceは以下の方法で取得していました。

これ

IMC_Defaultは関係ないですね。

でもこれなら理解出来ます。

VehicleのTemplateの

のBPを開いたら以下の実装がありました。

このEnhanced Input Action IA_Throttleノードはおそらく

の以下の場所で

Wなどを押したら反応するように指定されているはずです。

でもここにWidgetのButtonをセットする事は出来なさそうです。

ので以下の実装で

直接、Set Throttle InputにButtonを押した結果をPassしてしまうと言う訳です。

うーん。

成程。

こっちのProjectではどうやって携帯のWidget

IMC_Defaultを繋いでいるのかを確認します。

IA_JumpにはTouch1がセットされていますが、

IA_Moveには何もセットされていません。

Third PersonのAdd Movement Inputで操作されているのかと思ったんですが、

以下に示した通り

Add Movement Inputでは何も追加されていませんでした。

Third PersonがどうやってMobileのWidgetから操作されているのか全く分かりません。

全体の実装を見て大体理解したんですが、

そうなるとなぜ車の時はこのWidgetから操作出来ないのかが分からなくなりました。

7.2 Unreal Engine Mobile Vehicle Control Mobile Touch Input Set-up For Mobile Vehicle Game in UE5 [17]の方法で携帯から車を動かせるか確認する

あんまりこのやり方は好きではないんですが、今回は仕方ないです。

まず新しいWidgetを作成して

以下のButtonを追加しました。

Tutorialで使用していたSlate Widget Styleは使い方が分からないのでこっちで試します。

以下の実装でVehicleのReferenceを取得します。

今度はVehicleAdvPawnの実装を変更します。

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

Event Car Pushが呼ばれたらSet Throttle Input()関数が発動します。

このSet Throttle Input()関数は以下に示した様に

IA_Throttleが呼ばれたら発動するように実装されています。

そしてIA_ThrottleはWを押した時に呼ばれるような設定になっています。

Play画面でWを押すと車が加速するので、同じ効果を期待して作成しました。

Widget BPに戻ってButtonが押された時にVehicleAdvPawnのEventであるCar Pushが呼ばれるようにしました。

最後にLevel BPで以下の実装を追加して

WidgetがPlay画面に表示されるようにしました。

これでPlay中に画面にButtonが表示されそのButtonを触ると、車が加速して動き出すはずです。

Testします。

動きました。

携帯でも確認しましたが動きました。

ただし、一端加速したらButtonを離しても止まりません。

まあ、でも動く事は確認出来たので成功とします。

<Acceleratorを離したら速度が落ちるように実装を改良する>

ここまで来てあれですが、Acceleratorが正しいSpellでした。

直します。

直しました。

の以下の実装のPlay中の挙動を調べたら

Completedした時にThrottleに0の値を送っていました。

これが加速を止めていると思われます。

以下のように新しいEvent、Car Push Endを追加して

このEventが呼ばれたらSet Throttle Input()関数のThrottleに0を追加するようにします。

そしてWidgetの実装も以下のように変更しました。

Buttonを押すのを止めるとCar Push End Eventが呼ばれます。

これでButtonを離したら車が加速するのを止めるはずです。

Testして確認します。

Buttonを押すのを止めたら車の速度が徐々にゆっくりとなり最後には止まりました。

出来ています。

7.3 Brakeを追加する

今度はBrakeを追加します。

Vehicle Adv Pawnの

Braking Controlsの設定は以下のようになっています。

Triggered、Started、Completedの3つがあります。

IA_Brakeを見ると

以下の設定になっています。

設定は大体理解しました。

今度はWidgetにBrakingのButtonを作成します。

次にVehicle Adv Pawn内に

以下のEventを追加します。

だいぶ元々の実装とは変わった内容になってしまいましたが、原理はあっているはずです。

最後にWidgetのB Buttonを押した時に以下のVehicle Adv PawnのEventが呼ばれるように実装しました。

これでBrakeが効くようになったはずです。

テストします。

何と、速度が0の時にBrakeを押すと後ろ向きに進みます。

Defaultの設定でもそうなっていて、BrakingというよりBackに進むと同じです。

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

Brakingというより後ろ向きに速度を追加する機能になります。

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

7.4 Steeringを追加する

Vehicle Adv Pawnの実装です。

IMC_Default内の

IA_Steeringへの実装です。

AはNegateしています。

仕組みは理解しましたが、Vehicle Adv PawnのAction Valueの実際の値は分かりません。

調べます。

以下の実装でまずTriggeredの場合を調べます。

Aが-1、Dが1でした。

同様の手段でCompletedも調べました。AもDも0でした。

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

実装内容はかなり変わっていますが、理論的にはこれでいけるはずです。

Widgetです。

L、R Buttonを追加しました。

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

これで左右のTurnも出来るようになったはずです。

テストします。

まず想定下通りには完璧に動きました。

更に操作してかなり楽しかったです。

唯一気になる点は、Aを押したままLやRを押す事が出来なかった点です。

実際に携帯で操作してみました。

ボタンの位置は変更しました。

Aを押しながらRを押すと、Aが解除されてしまいます。

まあこれは仕様という事にします。

やっとGameっぽくなって来ました。

7.5 他のInputを見る

以下のInputがありました。

IA_Handbakeはどんな機能なんでしょうか?

これ見るとこっちがBrakingの機能のような気がして来ました。

こっちは止まっている時に押しても後ろに下がったりはしません。

携帯のDefault画面にある以下の2つの丸ですが、

右の丸は効いています。

画面の位置が移動します。

これはIMC_Defaultの

以下のIA_LookAroundが管理していると考えられます。

となるとGamepad Right Thumbstick X-Axisが担当しているという事でしょうか?

IA_Throtteを見ても

Gamepad Left Thumbstickは無いです。

IA_SteeringにはGamepad Left Thumstick X-Axisがあります。

もしかしたら左の丸も左右は反応しているのかもしれません。

他のInputも見ていきます。

これはCameraの位置をToggleさせるInputのようです。

試してみます。

First Person風のCamera配置になりました。

最後にIA_Resetです。

これは最初の位置に戻るんでしょうか?

試しました。

車がひっくり返った時に元に戻します。車の位置はそのままです。

<追加する必要があるInput>

IA_Handbake、IA_Resetは携帯でPlayするGameでも必要になります。

これは後で追加します。

<携帯の左側の丸で車の右左折をControl出来るか確認する>

思いっきり動きました。

という事は、IA_ThrottleにGamepad Left Thumb Stick Y-Axisを追加したら

丸ボタンで操作出来るって事になります。

あ、ならないや。

Gamepad Left Thumb Stick Y-AxisはWとSの両方の役割を担当しています。

するとこっちか

そしてIA_Brakeの場合は

Gamepad Left Thumb Stick Downになりますね。

これを試してみます。

駄目でした。

成程、だからTemplateでもこれを外していたのか。

ただし、Gamepad Left Thumb Stick Y-Axisは動きました。

のでIA_Brakeの方を以下の設定にしました。

これで試してみます。

動きました。

Brake Lightが常に光っていますが動く事は動きます。

ただかなり直感とは違う動きになります。

はっきり言って4つのButtonで操作する方が分かり易いです。

他の人に試して貰ったらThumb Stickの方が断然操作しやすいって言われました。

Thum Stickで統一します。

7.6 以下の機能を追加、改良します

  • Brake Lightを消す
  • 4つのButtonの機能を消す
  • Hand Brake Buttonを追加する
  • Resetを追加する

<Brake Lightを消す>

以下のような実装になっています。

そもそもこの機能はBackで走るものでBrakeとは関係ないです。

Brake Lightを外してしまいます。

テストします。

Brake Lightが消えました。

<4つのButtonの機能を消す>

以下のようなWidgetに変更しました。

後、このButtonの機能は全部消しました。

左のButtonはHand Brake用、右のButtonはReset用にします。

<Hand Brake Buttonを追加する>

Vehicle Adv Pawn内の実装です。

Widgetの実装です。

テストします。

普通にBrakeが効きました。

このBrakeを押した時はBrake Lightがつきます。

<Resetを追加する>

Vehicle Adv Pawn内のReset Buttonの設定は難しすぎるので理解するのは中止して以下のように繋ぎました。

そしてこのEventをWidgetのR ButtonをClickした時に呼び出すようにします。

テストします。

出来ていました。

7.7 Widgetを整理します

以下のようなWidgetになっています。

Speed MeterとGearの位置を変更します。

かなり良い感じになって来ました。

7.8 これからのWidgetの改良について

右のResetはあんまり使用しません。

PにしてPose Buttonにします。

Pを押すと別なWidgetがあって

  • Gameの終了
  • Reset(ひっくり返った車を戻す)
  • BGM(有り無し)
  • 戻る

の4つが選択出来るようにします。

でもこれは後にします。

この節は長くなりすぎました。

一端終了して次の節で続きをやります。

8.新しいLevelを作成する

8.1 Levelの作成

流石にこのTemplateをそのまま使用する訳には行きません。

別なLevelを作成します。

新しいLevelにSky Atmosphereを追加したら以下の警告が現れました

調べたんですがよく意味が分かりません。

以下のSM_SkySphereを追加で使用したら良いんでしょうか?

DefaultのLevelをCopyして別なLevelを作成しました。

こっちにLandscapeを追加してやる事にします。

Importしました。

これは陸地が少なすぎる。

新しくGaeaで作成し直します。

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

これをUEに移植します。

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

既存のLandscape用のMaterialを使用したので色は滅茶苦茶です。

雪の部分だけでも直します。

今度はここに道路を追加します。

8.2 Splineで道路を作成する

でこれのやり方が分かりません。

調べます。

大体理解しました。

OpenGL ESではどのように見えるのか確認しようとPreview画面を変更したら以下のようになってずっと計算しています。

1時間位ほっておきましたがまだ計算途中です。

これは道路を作成する前に、このLandscapeが携帯できちんと機能するのか確認する必要がありそうです。

駄目でした。

これは諦めます。

前のMapに戻って、それにAssetを追加して完成させる事にします。

以下のように組みました。

携帯でも動く事を確認しました。

これで完成とします。

9. Pause画面を作成する

ここで時間切れです。

残りは来週やる事にします。

10. 参照(Reference)

[1] Tec Dev Studio. (2023, August 23). UE5. 3 Android Mobile Project Setup! [Video]. YouTube. https://www.youtube.com/watch?v=GOAnlVndFNo

[2] Android. (n.d.). https://docs.unrealengine.com/5.3/en-US/android-support-for-unreal-engine/

[3] Setting up Android SDK and NDK. (n.d.). https://docs.unrealengine.com/5.3/en-US/how-to-set-up-android-sdk-and-ndk-for-your-unreal-engine-development-environment/

[4] Corporation V. (2023, August 4). [Windows 11] [システムのプロパティ] 画面を表示する方法 - VAIO サポート FAQ / よくあるご質問. https://solutions.vaio.com/4681

[5] Android Quick Start. (n.d.). https://docs.unrealengine.com/5.3/en-US/setting-up-unreal-engine-projects-for-android-development/

[6] Setting up your Android device for development. (n.d.). https://docs.unrealengine.com/5.3/en-US/setting-up-your-android-device-for-developing-applications-in-unreal-engine/

[7] Packaging and publishing. (n.d.). https://docs.unrealengine.com/5.3/en-US/packaging-and-publishing-android-projects-in-unreal-engine/

[8] Signing projects for release. (n.d.). https://docs.unrealengine.com/5.3/en-US/signing-android-projects-for-release-on-the-google-play-store-with-unreal-engine/

[9] Tec Dev Studio. (2023, August 26). UE5.3 Android Mobile Export & SDK NDK JDK Set-up ! [Video]. YouTube. https://www.youtube.com/watch?v=-55BjAnB0ig

[10] Meet Google Play's target API level requirement. (n.d.). Android Developers. https://developer.android.com/google/play/requirements/target-sdk

[11] Android Studio のダウンロード アーカイブ. (n.d.). Android Developers. https://developer.android.com/studio/archive?hl=ja

[12] システムの設定 | AQUOS R6 オンラインマニュアル(取扱説明書) | ソフトバンク. (n.d.). ソフトバンク. https://www.softbank.jp/mobile/support/manual/smartphone/aquos-r6/detail/42550/

[13] Akihiro-Takeda. (2022, February 20). 実機(Android端末)へのインストールと動作確認【Androidアプリ開発】. プログラミング・開発の備忘録. https://pg.akihiro-takeda.com/android-install-apk/

[14] AQUOS R6をご利用中のお客さまへ(2023年4月3日) | スマートフォン・携帯電話 | ソフトバンク. (n.d.). ソフトバンク. https://www.softbank.jp/mobile/info/personal/software/20230403-01/#:~:text=AQUOS%20R6%E3%82%92%E3%81%94%E5%88%A9%E7%94%A8,%7C%20%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%B3%E3%83%BB%E6%90%BA%E5%B8%AF%E9%9B%BB%E8%A9%B1%20%7C%20%E3%82%BD%E3%83%95%E3%83%88%E3%83%90%E3%83%B3%E3%82%AF

[15] Owl_UA_Unreal. (2023, November 1). Unreal Android 5.3 setup [Video]. YouTube. https://www.youtube.com/watch?v=ypR_YsnJaJo

[16] Tec Dev Studio. (2021, August 16). Unreal Engine Mobile Vehicle Control Mobile Touch Input set-up for mobile vehicle game in UE5 #UE5 [Video]. YouTube. https://www.youtube.com/watch?v=2IjgQTGvtCM

[17] Tec Dev Studio. (2021, August 16). Unreal Engine Mobile Vehicle Control Mobile Touch Input set-up for mobile vehicle game in UE5 #UE5 [Video]. YouTube. https://www.youtube.com/watch?v=2IjgQTGvtCM

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