UE4の勉強記録

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

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

1.今週の予定

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

UEで作成したLandscape上で3D Gaussian Splattingを展開して混合してみます。

更にKiri Engineで作成したModelを3D Gaussian SplattingのままUEにImportする方法を調べます。

Niagara の勉強>

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

<Materialの勉強>

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

<Gaeaの勉強>

GaeaのTutorialを作成します。

<UE5.4の新しい機能について>

UE5.4の新しい機能を解説した動画がそれなりに出て来ました。

重要そうなやつを何個かまとめる事にします。

<Houdiniの勉強>

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

<UEFNの勉強>

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

<DirectX12の勉強>

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

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

2. 映像作品としてのLandscapeの作成

2.1 先週からの進捗

新たな動画を追加して以下の3D Gaussian Splattingを作成しました。

それぞれ色々な試みをしました。

結論から言うと、一寸今週中に桜を撮影するのは無理そうです。

ので、桜の撮影は一端諦めて、3D Gaussian Splattingはコツコツ勉強するようにします。

2.2 撮影して作成したGaussian SplattingをUEにImportする

以下の花の咲いたBushをUE5にImportしてみます。

この辺に追加してみたいです。

うーん。

こいつが開けない。

うーん。

やり方間違えているんでしょうか?

先週のBlogを読み直してみます。

こっちをDownloadするのか。

今度は上手く行きました。

これを展開して使用しますが。今回は全部は使いません。

Cubeで区切った範囲だけ使用します。

このCubeで区切るやり方が分かりません。

まず別なLevelを開いてそこにこのGaussian Splattingを展開します。

そこでCubeで区切るやり方をテストします。

その後で、先程のLevel内に配置します。

まずEmptyのLevelを作成しそこに

を配置しました。

以下の様になりました。

何と既に

がこのBushのまわりに配置されていました。

そうCubeじゃなくてCull Boxでした。

このCull Box内だけ表示するようにします。

2024-01-29のBlogにCull Boxの使用方法がまとめられていました。

これ読むとCrop Boxって書いてありますね。

先程、UEで展開したPly Fileで確認すると以下のようになっていました。

Crop BoxとCull Boxの両方がありました。

これを読むとこのCrop Box内だけが表示されるとなっていましたが、

以下に示した様にCrop BoxをBushの周りにセットしても

その外側も表示されたままになっています。

もとのTutorialであるHow to 3D Gaussian splat from Aerials to Unreal 5 (Free plugin)[2]を見て確認します。

分かりました。

まず最初にGSのAssetを選択して

Enable Crop BoxにCheckを入れます。

結果です。

一応出来てますね。

よし今度は元のLevelで試してみます。

うーん。

何も表示されません。

仕方ないです。

先程のGaussian Splattingを開いたLevelに色々追加する事で、何が駄目なのか確認します。

まず空を追加しました。

この時点では普通に出来ていますね。

Landscapeで地面を追加します。

信じられないくらい白いです。

遠くから見るとこんな感じになります。

それは兎も角としてここまでは正常に起動しています。

うーん。

LandscapeをNaniteにしてみます。

あれ。

変な影が出来ています。

一応、Naniteになっているか確認します。

この影はどうやって直すんでしょうか?

公式ForumにUE 5.3.1 Nanite Landscape Bug/Glitch [3]があり以下の質問をしていました。

NaniteをOffにした時にはこんな影は生成されないそうです。

ここでの解決策は

だそうです。

Naniteは外しました。

色が白過ぎるのは、後で考えます。

今度は木を配置してみます。

まずは普通に配置した場合です。

うん。これは特に問題ないですね。

今度はFoliageを使用して木を配置してみます。

別に何の問題もないです。

うーん。

白過ぎる。

Dynamicsの方を使用してみます。

こっちも白過ぎる。

角度によっては以下のようになりました。

こっちはイイ感じですね。

明るいGaussian Splattingと暗いUE5、本来のLandscapeが対照的になって芸術性を高めています。

以下のようなShotには使用出来そうです。

うーん。

でも先程のLevelでGaussian Splattingが表示出来ない理由が不明ですね。

もう一回試してみます。

駄目でした。

うーん。

まあ良いです。

2.3 Kiri EngineでGaussian SplattingのままExportする方法を調べる

こっちをやります。

うーん。

調べたけど、UE5にImportする方法は無いみたいですね。

となるとLuma AIでやる方が良いかもしれません。

3. Niagara の勉強

先週勉強した「16.8.4 diffuse Specularの作成」の「深度をNormal(法線)に変換する」を実装します。その後で、次の小節である「深度をぼかす」を勉強します。

3.1 「16.8.4 diffuse Specularの作成」の「深度をNormal(法線)に変換する」を実装する

まず新しいMaterialを作成します。

名前はPP_DiffuseAndSpecularとしました。

Material DomainにPost Processをセットします。

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

名前はDepthToNormalにします。

Input Pinを4つ、dr、dl、du、そしてddを作成します。

Output TypeにCMOT Float4をセットします。

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

Sample Codeにまるまる同じ実装があるのに全部自分で打ってしまいました。

時間を無駄にした。

この部分の実装で先週のBlogでは以下のように書かれていました。

うーん。

これはInputする値をどうやって計算するのかが分からないと、検討しようがないですね。

次の実装ですが、教科書とSample Codeで違っています。

一応教科書のやり方で実装していきます。

Drの値を計算するための実装です。

一寸だけ右にずれた場所の値を取ります。

Dlの計算結果です。

今度は-1をかけて一寸だけ左の値を得ています。

今度はDuの値です。

上に一寸だけずらしています。

最後にDdの値です。

下に一寸だけずらしています。

以下のScene DepthのColorって何を返すんでしょうか?

SecneDepthを可視化すると以下のようになります。

Colorって色はついてないですよね。

ここで教科書ではPreviewを表示しているのでResultノードに繋いでみます。

Errorになりました。

Custom HLSLノードのCodeが間違っているみたいです。

うーん。

面倒なのでSample CodeのCustom HLSLノードのCodeをコピペしてしまいます。

結果です。

うーん。

まだなんか違います。

ずらす量が一か所だけ10倍になっていました。

直しました。

結果です。

Previewの設定を変更すると

と教科書と同じようになりました。

PP_DiffuseAndSpecularのMaterial Instanceを作成します。

SceneCapture2D_DiffuseAndSpecularを選択して

生成したMaterial Instanceをセットします。

Scene CaptureのCapture Sourceの設定を変更します。

教科書を見ると

Render TargetにはNormal VectorのTextureが生成されているはずです。と書かれていました。

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

これで先週勉強した内容は終わりです。

3.2 「深度をぼかす」を勉強する

今度は粒をつなげるために深度をぼかす処理をしていきます。

この処理は前後左右の4つ行うので、Material Functionを作成して行うそうです。

これやな。

Material Functionを生成して名前をMF_DepthBlurにします。

Expose to LibraryをEnableします。

Preview Blend Modeの値をAlphaHoldoutにします。

そして以下の3つのInputを作成します。

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

Custom HLSLノードの設定です。

Inputの設定です。

実装です。

この実装の内容については教科書では全く説明していません。

ここは後で見る事にします。

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

完成したMaterial FunctionであるMF_DepthBlurを以下のように使用します。

それぞれの結果をDepthToNormalノードに繋ぎます。

ここでScene Textureノードを繋いでいる理由が説明されていました。

UE5ではScene Textureノードを一回も使用しないとErrorになるそうです。

うーん。

そんな事はないと思いますが、

Material DomainがPost Processの時はそうなのかもしれません。

ここで、教科書ではRender Targetの結果を示しています。

たしかにぼやけて、水面のようにしています。

この後、Compositeを行いやすくするために背景を黒くするそうです。

以下の実装で背景を黒くしていました。

以上でした。

3.3 MF_DepthBlurのCustomノードの実装を読む

以下のCustom HLSLノードを読みます。

最初のCodeですが、

UVの座標をViewportからScene Textureに変換しています。

うーん。

ViewSizeAndInvSizeの機能が分かりません。

Copilotに聞いたらすぐに答えてくれました。

しかも実装方法まで紹介していました。

つまりこのCodeではInverseのSizeにBlurのSizeを掛けていたという事です。

BlurScaleはInputで値を指定しています。

因みにGoogleの検索ではViewSizeAndInvSizeの機能に関しては一個も引っかかりませんでした。

次世代のITの競争はMicrosoftの大勝利になりそうです。

次のCodeです。

これはColumnの略でしょうか?

なんかの計算に使用するのかもしれません。

次のCodeですがCommentで既に何をやっているのかを説明していました。

Pixelの周りのPixelの値の合計値を計算していました。

Iterationの値はInputで指定していました。

Sample Codeでは4が使用されていました。

-4から4までの値を足すみたいですね。

Colにその値を足していました。

ここでもRGBの値を足していますね。

うーん。

これはNormal Vectorの値になるからRGB出ないと駄目なのか。

次の値です。

平均値を計算しています。

最後にその値を返します。

以上でした。

うん。

近傍Pixelのそれぞれの重さの計算はしてなかったですね。

4. Materialの勉強

4.1 Procedural Brick Color Shader - Advanced Materials - Episode 29 [4]を実装する

今週は先週作成したBrickに色を追加します。

まずはLerpノードを使用して以下のような実装を組みます。

先週までの結果はLerpノードのAlphaに繋ぎます。

結果です。

これはまあ当たり前ですね。

ここから更にそれぞれのBrickの色を少しだけ変更します。

Floorノードを追加します。

Floorノードの結果です。

0.1を掛けます。

Floorノードの結果を、前に作成したMaterial FunctionであるHash23に繋ぎます。

ああ、Hash23ノードを作成する必要がありました。

2022-11-28のBlogを読むとこのPCでHash23を一回作成していました。

これを探してみます。

実装も記録していたんですが、図が小さすぎて文字が読めません。

Random Noise - Shader Graph Basics - Episode 35 [5]で作成したみたいです。

こっちの動画を見るとどんな実装なのか直ぐに分かりますね。

そして以下の実装をつなげています。

最後にFracノードを追加して終わりです。

これなら作った方が速いかと思ったら、最初に開いたProjectにありました。

普通にMigrateする事が出来たのでこれを使用します。

Floorノードの結果を繋ぎます。

結果です。

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

Randomな値は一個だけで十分なのでComponent MaskノードでRの値だけ取り出します。

そして以下のようにLerpノードを組み

その結果を最初のLerpノードのBにつなぎます。

Brickの色を決定するためのところです。

結果です。

Level上に配置した場合の結果です。

全体的に色が薄い気がしますね。

今度はHSVの値に変換した上でRandomな色を付けます。

まずHash23の結果を-1~1の間に変換します。

この値のまま色を変化したらBrickらしい色は全部消えてしまうので、以下の値をかけて変化を小さくします。

この結果を以下の計算に足します。

この結果をLerpのBに繋ぎます。

結果です。

Level上の結果です。

うーん。

こっちの方がBrickらしい色が出てる気もします。

がRGBに対して2つも色のParameterを増やしています。

このせいでBrickの色がもっとRealになった可能性があります。

なんとも言えないです。

一応、先週のBlogでは以下のように述べていますが

実際のところは分かりませんね。

更に以下のConstantの値を調整しました。

結果です。

Level上の結果です。

うーん。

やっぱりこっちの方がRealな気もします。

もう片方のParameterの値も調整しました。

結果です。

Level上の結果です。

ここまで来ると完全にこっちの方がBrickっぼいです。

5. Gaeaの勉強

5.1 GaeaのTutorialを作成する

先週は連絡に関しての動画を作成しました。

なんかTutorialを止めるのかと勘違いされたらしく、再生回数が断トツに上がりました。

前々回の猫ミームの時とは真逆です。

ミームの時の方がもっと再生されると思ったんですが全然されなかったです。

今週は、Tutorialの動画は上げないのでここはお休みします。

6. UE5.4の新しい機能について

今週もMotion Designについて勉強します。

6.1 Unreal Engine 5.4: Create STUNNING Product Commercials with Motion Design [6]を勉強する

Tutorialがいきなり始まってどんな映像を作成するのか最後まで分かりません。

最後の部分を見たら以下の動画が生成されていました。

この缶の反射が凄い。

こういうMaterialの作成方法を勉強するのが本当は大切なんです。

<Creating a Level>

Empty Levelを生成しています。

残りの作業は前のTutorialでやったのと同じです。

<Enabling Motion Design Mode>

Motion Designを押してMotion Design Modeに入ります。

Create Defaultsを押して

以下のAssetを追加します。

ここは前回のTutorialでもやりましたが、まだ完全には覚えていないので記録に残しておきます。

Tutorialでは以下のようにFolderを作成していました。

このやり方だと毎回、Projectを作成する必要があります。

これには従いません。

<Importing our Supporting Files>

以下の3D Modelを使用するそうです。

これはあんまりRealではないですね。

いや造形は十分Realですが、Textureはどうなんでしょう?

Unreal EngineにImportする時に表示されるBoxでCombine MeshesにCheckをつけます。

2つのMeshで構成されているのでこれをCheckする必要があるそうです。

SM_Infinity WallもImportしました。

これはEngineかどっかから持ってきただけみたいです。

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

MaterialはImportしなかったみたいですね。

TextureもImportしました。

Textureは以下の箇所からDownload出来るみたいです。

<Applying Textures>

Canの3D ModelをImportした時に生成されたMaterialを開きます。

先程ImportしたTextureを繋げます。

Textureを貼った状態のCanです。

うーん。

凄いPhoto-Realisticです。

<Materials>

今度は後ろの壁用のMaterialを作成します。

Base ColorのVを0.8にセットします。

こんな色になりました。

<Emissive Master>

まだ新しいMaterialを作成しました。

名前はM_Emissiveと名付けました。

Shading ModelをUnlitに変更しました。

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

2つのConstantノードをParameterノードに変換しました。

それぞれの名前をEmissive Color、Emissive Multiplierとしています。

<Making an Instance>

このMaterialのInstanceを作成しました。

名前はMI_Emissive_Yellowとしました。

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

同様の手順で以下の2つのMIを更に作成しました。

<Unlocking the Camera>

CamaraのLockを解除しました。

そんだけです。

<Placing Props>

Infinity Wallを原点に配置します。

SkylightとPost Process Volumeを消します。

Unlitに変更します。

Canを配置します。

CanのScaleの値を以下のように下げます。

<Emissive Lighting>

Planeを両端に並べて

それぞれに先程作成したMIをセットします。

左側は青、右側はオレンジをセットしました。

更に天井にもPlaneを追加します。

個々には白のMIをセットしました。

<Setting up the Camera>

Cameraからの映像が以下のようになるようにCameraの位置を移動させました。

Cinematic Viewportを選択して

Gridを選択します。

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

この機能を利用してCanをCameraの中央に合わせます。

Cameraの位置が決定したらBookmarkも追加します。

Lens Settingsの値を以下のようにします。

Cameraの位置を変えて以下のような映像が見れる場所に移動します。

Focus MethodをTrackingに変更します。

Actor to TrackにはこのCanをセットします。

<Using Light Actors>

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

形状を変化させ以下のように配置しました。

勿論、Light Colorは水色に変換しています。

同様に反対側にもLightを追加しました。

天井も同じです。

Cameraから見た状態を確認しています。

LightのIntensityを1.0cdまで下げました。

この辺の設定がよく分からないです。

<Post Process Volume>

Post Process Volumeを追加しました。

Infinite ExtentをEnableします。

Exposureの設定をManualに変更します。更に値も10に変更します。

<Positioning and Movement of Can>

缶のRotationを弄って少しだけ缶が反り返るようにしました。

最終的には30度位傾けていました。

更に以下のように横向きにもしています。

Tutorialの説明によると影の部分に水色が現れて、光の部分にOrange色が現れているようにするそうです。

次の手順ですが、これは今までやった事がない事をやっています。

ので丁寧にまとめていきます。

まずMotion Design OutlinerからCanを選択します。

その状態で以下のIconを押します。

すると以下のようにNull Actorが追加され、その下にCanのMeshが追加される形になります。

うーん。Null Actorか。

始めて使用します。

Null Actorの名前をCTRL_Canと名付けました。

そしてSequencerに追加しました。

更にCanを追加しました。

そしてCTRLの方にTransformを追加しました。

缶のStatic Meshの方は最初からTransformがついているからなんでしょうか?

そもそもこのTransformが何をするのかが分かりません。

こんな結果になっています。

SequenceのFPSの値を60に変更します。

 

59.94とあんまり変らないと思いますがどうなんでしょう?

今度は以下の赤で囲ったIconを押して、以下のBoxを開き

そしてEndの値を300にしました。

300 Frameだから一秒60 frameの場合なので5秒になるという訳ですか。

この設定は以下の部分でも出来るそうです。

もしくは以下の白いBarを300の位置に移動して、右Click?で以下のBoxを表示しSet End Timeを選択しても

同様の結果になるそうです。

うーん。

この辺は勉強になります。

Frameを60にセットしました。

CTRLのTransformを開きます。

Transformって何の事かと思ったらこれでした。

空のActorはRootが無いんでしょうね。だからTransformも無い。

なのでSequenceで追加する必要がある。わけです。

Locationの赤で囲ったIconを押して

Key Frameを追加しました。

以下に示した箇所の値を0にしました。

以下に示した様に白いBarの位置が0の場所に移動しています。

この辺の操作方法は全然分かりません。

勉強になります。

CTRLの位置を下に移動して

以下のようにCameraにCanが写っていないようにしました。

この状態でKey Frameをまた追加しました。

〇で囲ったKey Frameを選択すると

以下のBoxが表示されました。

Exponentialを選択します。

この状態で再生するとCanが下から飛び出して来ました。

なんとここで右のKey Frameの位置を60から90に移動させてしまいました。

どうやるの?これ?

今度はRotationのFrameを追加します。

まず0の位置にDefaultの値のKey Frameを追加しました。

Frameの位置を300に移動します。

そしてここにもKey Frameを追加しました。

Rotationを開き、XYを選択します。

そして消します。

Frameが0のところでRotationのZの値を360に変更しました。

Canがくるくる回るようになりました。

TVのCommercialってこんな面倒な事して撮影してたのか。

確かに言われてみればこんな精密な回転、普通に投げただけではする訳ないです。

この回転ですが、最初は速くて後はゆっくりにしたいそうです。

最初のKey Frameを選択して

以下のIconをClickします。

すると以下のWindowが開きます。

CTRLを開きYawを選択します。

こんな感じになっています。

最初のFrameをClickして以下のBoxを開きます。

Weighted Tangentsを選択します。

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

このLineの端を以下のように移動させました。

結果です。

最初の回転は凄く速いです。

段々ゆっくりになって最後はほとんど止まっています。

ここでもう時間が無くなってしまいました。

以下の節は来週勉強します。

<Adding Background Text>

<Animating Background Text>

<Rendering>

<Outro>

7. Houdiniの勉強

7.1 Houdini - Wall Tool 10 [7]を勉強する

何とこの動画の再生数、1000回超えていません。

もうHoudiniのブームは終わってしまったみたいです。

今回のTutorialは節事に分かれてないので、こっちで適当に分ける事にします。

<Intro>

今回はUV Coordinateを直す事とChipped Areaの色を修正するそうです。

以下のBooleanノードから開始するそうです。

A Inside Bを選択します。

Splitノードを追加します。

当然、先程のBoolean1ノードと繋ぎます。

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

うーん。

先週作成したBrickのChippedした部分だけが消えています。

Invert SelectionをEnableします。

結果です。

今度はChippedされたAreaだけ表示されました。

これはInvert Selectionの機能を紹介するためにやっただけみたいです。

直ぐに外してしまいました。

UV Unwrapノードを追加しました。

UV Unwrapノードを可視化しました。

おお、Textureが貼られています。

UV Unwrapノードをもう一個追加します。

こっちの結果です。

成程、こっちはChippedした方が表示されるのか。

拡大して見ると以下のようにTextureがグシャグシャになっています。

Uvflattenノードを代わりに使用します。

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

左の図がUV図になっていますね。

うーん。

これで終わり?

今度は以下のようにColorノードを追加しています。

これでBrickのChippedした部分に色を追加するみたいです。

名前をColor_BrickChipに変更しました。

色も変更しています。

Mergeノードを追加して2つの結果を合成しています。

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

Spaceと5を押すと以下のようなUV Mapが表示されるそうです。

このUV Mapを少し調整するそうです。

そのために以下に示したUV Layoutノードを追加します。

こんな結果になっています。

Axis Alignmentの値をBy Island Position in 3Dとしました。

結果です。

こっちの方がましなのか。

UV Mapはよく分からないです。

Space と1を押すと以下の画面に戻ります。

そしてScale Islands to Match Their Surface AreasをEnableします。

結果です。

Tutorialではこれでかなり良くなったと言っています。

何が良くなったのかの基準が分かりません。

こうなっているとTextureを貼るときに綺麗に貼れるんでしょうか?

次にこの結果をForeach_End3に繋ぎます。

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

何だこれは!

と驚いたんですが、これUV Mapを表示してただけみたいです。

画面が切り替わって以下のような結果になりました。

ここでUV Mapをこのようにした事のMeritについて簡単な説明がありました。

まずさっきのChipした部分のUV Mapがグシャグシャだった場合、精密なTextureを貼ってもその部分がグシャグシャになってしまいます。

ので綺麗にUV Mapを貼り直す必要があります。

はい。

これは言われてみればその通りです。

次にこのようにChippedされた部分とされてない部分のUV Mapを分けた事によりそれぞれに別々なTextureを貼る事が可能になったそうです。

そしてそのための実装をこれから追加するそうです。

以下の箇所にGroupノードを追加しました。

Groupノードを可視化した結果です。

Group Nameの値をBrick Faceに変更しました。

このGroup2ノードをCopyして以下の場所に追加しました。

名前はGroup3になっています。

こっちのGroup NameはBrick Chipsにしていました。

これで終わりだそうです。

え、そうなの?

次は以下に示したBrickのGroutを無くすための実装を追加するそうです。

Groutって腺って意味だった気がしますが、隙間って意味もあったんでしょうか?

調べたら全然違っていました。

以下のようなBrickの隙間に塗るセメントの事でした。

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

今回のTutorialはここまででした。

8. UEFNの勉強

8.1 HOW TO ANIMATE YOUR CUSTOM PET - Fortnite UEFN / Creative 2.0 Tutorial [8]を実装します

今週はこれを実装します。

ただこれ色々問題のあるTutorialなので完成しない可能性もあります。

その辺は適宜対応します。

<Intro>

何と使用する3D ModelのDownload先が記されていません。

Sketchfabから検索して見つけました。

代わりにDescriptionには今回のVerseの実装がついていました。

これがあったら実装は出来そうですね。

このCodeを参考にして作成する事にします。

Downloadして展開しました。

Animationはついてないです。

うーん。

どこでAnimationを手に入れたんでしょう?

まあ良いです。

とりあえずDownloadしたModelをImportしてみます。

色がないです。

うーん。

どうしよう。

このModelは使用出来ないですね。

うーん。

仕方ない。

今回はSketch Labから3D ModelのImport方法を勉強します。

検索したら以下の2つのTutorialでSketchfabからUEFNに3D ModelをImportする方法とそのModelにMixamoのAnimationを追加してUEFNで使用する方法が解説されていました。

最初のModelのImportの仕方を簡単に見ましたが、これなら見ないでも出来そうです。

こっちは勝手にやってしまいます。

あれ?

これって前Importしなかったけ?

ほら探したらありました。

こっちを使用するならTextureの貼り付けはしないで済みます。

このModelの元のFBXもありました。

では、How to Animate Your Character in UEFN - Creative 2.0 Fortnite [10]でAnimationの追加方法を勉強します。

8.2 How to Animate Your Character in UEFN - Creative 2.0 Fortnite [10]を勉強する

<Intro>

それではTutorialを見ていきます。

<Animation>

MixamoのHomepageに行きます。

右端にある以下のButtonをClickして

以下のBoxを開きます。

以下のようにFBXやOBJでUpload出来ますがOBJは止めた方が良いそうです。

OBJ Fileしかない場合はBlenderでFBX Fileに変換します。

既にFBX Fileが手元にあるので、今回はこのやり方は記録しません。

FBXをUploadすると以下のようになるそうです。

うん。

ひょっとしてBoneの設定からやり直すのか?

うーん。

まあいいや。

こういう勉強もたまには必要です。

<Tutorial>

こんな感じで設定していました。

すると以下のようにAnimationに沿って動き出します。

こんなに簡単にBoneの設定が出来るの?

いや既にBoneがあるCharacterの調整をここでしているだけみたいです。

にしても凄いです。

そして以下のAnimationを選択します。

以下のようにUploadしたCharacterが写っています。

左のAnimationを選択するとDanceを始めました。

こんなに簡単にこの質のMotionが手に入るの?

これでDanceが出来る事が確認出来たのでまずこのCharacterをDownloadします。

以下のX Buttonを押してAnimationを外します。

そしてDownload Buttonを押していかのBoxを表示させます。

ここでFBX Binaryを選択するそうです。

次にAnimationが付属の状態でDownload Buttonを押します。

Frames per secondは60を選択し、SkinはWithout Skinを選択しています。

Downloadが終わったらUEFNに移動します。

まず更にUEFNをImportしています。

設定はDefaultのままでした。

もし設定がDefault出ない場合は以下のButtonを押すと元に戻るそうです。

以下のようにTextureの一緒に生成されていました。

うーん。

Tutorialによるとこれは極めて運がいい場合で、Materialに正しくTextureが追加されてない場合は手動で直す必要があるそうです。

そのやり方は前のTutorialで説明していると言っていました。

確かに!

今度はAnimationの方のFBXをImportします。

こっちも設定はDefaultで良いみたいですね。

Tutorialでは何も言っていませんでした。

これでこのSkeletal MeshのAnimationがImportされました。

うええ。

Animation Sequenceになっています。

こんな簡単だったとは。

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

うーん。

これはずっと昔に知っておくべき知識でした。

CharacterのAnimationはあんまり好きでない分野だったので後回しにしていました。

<Result>

LevelにこのAnimation Sequenceを配置してきちんと動くのかを確認していました。

普通にDanceしています。

まあこれは当然ですが。

凄い。

うーん。

もう時間が無くなってしまいました。

実際に試すのは来週ですね。

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

9. DirectX12の勉強

9.1 Lötwig Fusel氏のD3D12 Beginners Tutorial [D3D12Ez]を勉強する

9.1.1 先週の復習をする

完全に先週の勉強内容をわすれてしまっています。

先週のBlogを読み直して思い出します。

 Fence & Command List | D3D12 Beginners Tutorial [D3D12Ez] [11]の次の10分を勉強したみたいです。

そうだ、Command Listについて勉強したんでした。

Command ListとCommand Queue、そしてCommand Allocatorについて勉強していました。

Command ListとCommand Queueは以下の図が、もっとも分かり易く説明しています。

そしてCommand AllocatorはCommand ListのMemoryを確保するためのものという理解でした。

更に先週、最後に勉強したReset()関数について

過去のBlogで非常に沢山の記述がされていたので、この部分は来週、復習してまとめ直します。と書いていました。

うん。

これからやります。

9.1.2 Command AllocatorとCommand ListのReset()関数について

2023-10-22のBlogには以下のようにまとめられていました。

うーん。

これ以上の解説はないですね。

先週、見た時はもっと色々な所で勉強してたと思ったんですが、今週改めて見直すとこの週しかReset()関数について述べている所は見つからなかったです。

まあ、これだけ理解したら十分でしょう。

9.1.3 Fence & Command List | D3D12 Beginners Tutorial [D3D12Ez] [11]の次の10分を実装する

それでは先週勉強した内容を実装します。

と言ってもおそらく前にSample Codeを全部コピペしたので既に実装さてれいるはずです。

それらを確認します。

まずCommand QueueやCommand Allocator用のObjectを宣言しています。

自分のProjectを見るとこの3つは既に宣言してありました。

これらを初期化するための関数を追加しています。

以下のようにCommand Queueに関してはTutorialの方でも既に初期化するための関数を実装していました。

自分のProjectでも確認しておきます。

ありました。

ここで使用されているD3D12_COMMAND_QUEUE_DESC構造体型のObjectであるcmdQueueDescの設定もしっかりやっていました。

Tutorialではこの次にCreateFence()関数の実装方法を大幅に変更しています。

これは今の私のProjectの実装と同じはずです。

確認してみます。

うん。

同じでした。

のでこの部分も何もする必要はありませんね。

次に行きます。

Command Allocatorを初期化しています。

私のProjectでも確認しておきます。

していました。

Argumentも全く同じです。

Command Listも初期化しています。

私のProjectの方を確認します。

してました。

使用してあるArgumentも全く同じです。

Shutdown()関数内に、Command ListとCommand AllocatorのRelease()関数を追加しています。

私のProjectの方も確認をします。

していました。

後、先週のBlogで

と書いていましたが、私のProjectの方ではReleaseしていました。

私のProjectの実装はSample Codeの丸CopyなのでSample CodeではFenceをReleaseしていたという事になります。

という事はやっぱりFenceもここでReleaseする必要があったという事です。

次にTutorialではCommand Listを使用するための関数を作成しています。

名前はInitCommandList()としていました。

これも私のProjectでは既に実装されていると思いますが確認します。

していました。

この関数の実装をします。

ただし今回はCommand AllocatorとCommand ListのReset()関数を追加しただけです。

これも自分のProjectの実装を確認します。

してました。

してましたが、ここの実装、これからもっと沢山書き込むと思っていました。

勉強してないのはReturn Value だけみたいです。

以上でした。

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

9.2.1 前回の復習

「4.9 Root Signature」を勉強していました。

まずRoot Signatureが何なのかという事ですが、

だそうです。

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

あ、思い出した。

今週は実装しまくる回だ。

Root Signatureの実装の手順がまとめれていました。

9.2.2 「4.9 Root Signature」を実装する

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

まずSample Codeを実行して

こうなるか確認します。

なりません。

普通に開けました。

Outputを見ても何も書かれていません。

うーん。

分からん。

取りあえず今週はこのまま実装を続けます。

<「4.9.1 Root Signatureとは」を実装する>

ここは何も実装していません。

<「4.9.2 (空の)Root Signatureを生成する」を実装する>

<<「D3D12_Root_Signature_Descの設定」を実装する>>

以下の実装をしています。

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

<<「Binary Codeの生成」を実装する>>

以下の方法で実装されていました。

更に3つ目のArgumentは以下のように生成されていました。

同様の方法で実装します。

これもSample CodeのCodeをそのままCopyしました。

<<「Root Signature Objectの生成」を実装する>>

先週のBlogには以下のように書かれていました。

同様に実装します。

<<「Graphics Pipeline Stateに設定する」を実装する>>

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

これも同様に実装しました。

これで完成です。

テストします。

教科書によるとCreateRootSignature()関数がS_OKを返したら成功だそうです。

まず以下のような黄色の画面が表示されて

Errorとか何も起きないのは前と同じです。

CreateRootSignature()関数の前にBreak Pointを置いてS_OKが返っているか確認します。

返っていました。

一応出来たという事にします。

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

10.  まとめと感想

特になしです。

11. 参照(Reference)

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

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

[3] UE 5.3.1 Nanite Landscape Bug/Glitch. (2023, October 2). Epic Developer Community Forums. https://forums.unrealengine.com/t/ue-5-3-1-nanite-landscape-bug-glitch/1320037

[4] Ben Cloward. (2023, November 9). Procedural Brick Color Shader - Advanced Materials - Episode 29 [Video]. YouTube. https://www.youtube.com/watch?v=sQB8VfN_EZY

[5] Ben Cloward. (2022, February 24). Random Noise - Shader Graph Basics - Episode 35. YouTube. https://www.youtube.com/watch?v=5v6tvkb63XU

[6] Reality Forge. (2024, March 29). Unreal Engine 5.4: Create STUNNING Product Commercials with Motion Design [Video]. YouTube. https://www.youtube.com/watch?v=yWQIz5yzTrw

[7] Rick Banks. (2022, June 21). Houdini - Wall Tool 10 [Video]. YouTube. https://www.youtube.com/watch?v=Oxf7BoRS_v4

[8] Pi Equals Three. (2023, May 30). HOW TO ANIMATE YOUR CUSTOM PET - Fortnite UEFN / Creative 2.0 Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=VTHH4S9VjAA

[9] Fortnite Events. (2023, March 23). How to import 3D Models into UEFN - Creative 2.0 Fortnite [Video]. YouTube. https://www.youtube.com/watch?v=ADgBHnRwwPk

[10] Fortnite Events. (2023, March 23). How to animate your character in UEFN - Creative 2.0 Fortnite [Video]. YouTube. https://www.youtube.com/watch?v=dGzF_kuXtcU

[11] Lötwig Fusel. (2023, May 22). Fence & Command List | D3D12 Beginners Tutorial [D3D12EZ] [Video]. YouTube. https://www.youtube.com/watch?v=KsCZDeJDXDQ