UE4の勉強記録

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

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

1.今週の予定

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

今週はまだ3D Gaussian Splatting用の撮影が出来てないので、何か別な事をします。

Niagara の勉強>

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

<Materialの勉強>

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

<Gaeaの勉強>

GaeaのTutorialを作成します。

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

Motion Designの勉強をします。

<Houdiniの勉強>

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

<UEFNの勉強>

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

<DirectX12の勉強>

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

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

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

2.1 先週Importした3D Gaussian SplattingのModelが白過ぎる件について

これをPost Process VolumeのExposureの値を弄ったら、改善出来るのではないかと考えています。

以下のように設定を変えてみました。

結果です。

あれ、かなり良い感じです。

値を少しだけ上げてみました。

この3D Gaussian Splattingはもう少し遠くから見た方が細部まで綺麗に表現されるみたいです。

これだったらもう他の3D Modelと区別つかないですね。

3D Gaussian SplattingのCrop BoxのSizeを広げてみました。

撮影があまり上手く出来てないので、Cameraが動くとへんな部分が出て来てしまいます。

しかし上記のように固定して撮影した場合、ほぼ写真と同じ精度になっています。

これなら十分使用出来ます。

2.2 「3D Gaussian Splattingで生成したModel内でCameraを動かしたい」

今の時点では、3D Gaussian Splattingで生成したModel内でCameraを動かすとどこかが破綻してしまいます。

YouTubeの動画で、3D Gaussian Splattingで生成したModel内で自由に動き回っているものを探し、その撮影方法を検証します。

3D Gaussian Splatting + Insta360 RS 1" - Impasse Saint-Eustache, Paris [2]です。

Droneと360度Cameraを組み合わせて撮影したみたいです。

以下にその映像のScreenshotを示します。

この小道をずっと歩いていきますが、実物を撮影したのと全く変わりません。

空も映しています。

左上に若干のブレがあります。

もう一個同じ人の動画がありました。

3D Gaussian Splatting + Insta360 RS 1" - Waterlily House, Kew Gardens [3]です。

Insta360ってなんだ。と思ったら360度Cameraの名前でした。

うーん。

成程、これで撮影するのか。値段を見たら大体6万円前後でした。

うーん。

このためだけにこれを購入するのは無理です。

第一、Cameraに興味がないです。

買って一回しか使わないとかありそうです。

やっぱり身の丈にあった範囲で試します。

他にやる事がないので一寸短いですがこれで今週のLandscapeの作成は終わりです。

3Niagara の勉強 

先週勉強した「16.8.4 diffuse Specularの作成」の「深度をぼかす」の実装をします。その後に「diffuseの計算」の勉強をします。

3.1 「16.8.4 diffuse Specularの作成」の「深度をぼかす」を実装する

ここではMaterial Function、MF_DepthBlurを作成しています。

まずMaterial Functionを作成して名前をMF_DepthBlurと名付けます。

Expose to LibraryをEnableします。

このParameterは使用した事が無いです。

どんな機能なのでしょう。

成程、

今まで作成したMaterial Functionを検索から探しても見つからなかったのはこれにCheckを入れてなかったからなのか。

MFを選択してDirectにDrag and Dropしてら、ここにCheckしなくても使用出来るはずです。

これは後で確認します。

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

これも意味が分かりません。

CursorをHoveringさせると以下の説明が表示されました。

Alpha CompositeというBlendの方式があるのか。

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

教科書にある通りです。

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

Custom HLSLノードのInputにはどんなTypeのInputなのかを指定する箇所が無いんですね。

一寸驚きです。

実装しました。

CodeはSample CodeのCodeをそのままコピペしました。

この実装の内容については先週、勉強したのでここではやりません。

OutputのTypeをCMOT Float4に変更しました。

これでMF_DepthBlurは完成です。

それではPP_DiffuseAndSpecularに戻ってMF_DepthBlurを使用してみます。

早速検索でMF_DepthBlurを探してみます。

おお、出て来ました。

Expose LibraryをDisableしてみます。

今度は出て来ません。

この状態でMF_DepthBlurをPP_DiffuseAndSpecular 内にDrag and Dropしてみます。

出来ました。

はい。

これで先程の発言があっている事の確認がとれました。

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

Errorになっています。

うーん。

教科書でもここでErrorを避けるためにDummyのScene TextureノードをDepthToNomralノードに繋ぐ必要があると述べていました。

試してみます。

繋いだけどErrorが消えません。

これは別な理由でErrorになっているみたいです。

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

うーん。

分からん。

ああ痛恨のミス、

Output ResultノードにCustom HLSLノードの結果をPassするのを忘れていました。

Errorが消えました。

残り3つも同様に実装します。

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

うーん。あってんのかな?

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

RT_WaterDiffuseAndSpecularを開いてみます。

おお、出来ています。

液体になっています。

これがBlurの力なのか。

今度はCompositeを行いやすくするために背景を黒くします。

しました。

またRT_WaterDiffuseAndSpecularで確認すると以下のようになっていました。

おお、奥が黒くなっています。

以上でした。

3.2 「16.8.4 diffuse Specularの作成」の「Diffuseの計算」を勉強する

最初にDiffuse Lightの計算方法を説明しています。

これはDiffuse Light一般の計算方法なのでここでは省略します。

以下にSample Codeの実装を示します。

あれ、Direct Lightの値を適当に入れています。

そうかそもそもDirect Lightは消してしまっていました。

教科書にはDiffuse Lightの計算結果が載っていました。

そう言えばDirectional Lightの値を受け取るNodeがありました。

有りましたが名前を忘れてしまいました。このBlogのどこかに記録されているはずです。

それを調べます。

2023-01-08のBlogに書かれていました。

今のUnreal Engineでもありました。

以下の説明が出て来ました。

ただしこの先にあるDocumentを開いたら別なNodeの説明が出て来ました。

2023-01-08のBlogの説明を読むとこれ以外にもCustom HLSLでもDirectional Lightの値を得る方法があるそうです。

そう言えばこんなのも勉強しました。

こっちのやり方も復習しておきます。

これは2022-11-20のBlogに載っていました。

2022-11-20のBlogではこの値をDebug Float3 Valueノードを使用してLevel上に表示させて

実際のDirectional Lightの値と比較していました。

うーん。

一応、値は合っていたみたいですが、こっちはかなりHacking的な手法です。

3.3 「16.8.4 diffuse Specularの作成」の「Specular Lightの計算」を勉強する

これだけだと短すぎるので次の「Specular Lightの計算」も勉強します。

最初にSpecular Lightについての説明とその式、更にその計算方法が書かれていました。

本当にこの本の作者はこういう事を説明させると分かり易い。

ここまで分かり易い説明、英語でも日本語でも今までに読んだことないです。

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

Normal Vectorの値は最初にNormalizeしていますね。

その結果、Custom HLSL内の実装が以下のようになっています。

はい。

今週はここまでとして来週この部分を実装します。

4. Materialの勉強 

4.1 https://www.youtube.com/watch?v=hil3qfliTFo [4]を勉強する

今週はNormalを追加して、Brickに凹凸を追加するそうです。

今回はUnityが主でUnrealはUnityの説明の後で実装だけ表示されていました。

Unrealの部分だけまとめます。

まずRectangleノードをRectangle SDFノードに交換します。

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

白い部分にGradienceが追加されています。

その結果にInvLerpノードを追加します。

Bump Map用の実装です。

まずInvLerpノードに使用している値が変更されています。

そしてPreprePertubeNormalHQノードとPerturbNormalHQノードでHeight MapをNormal Mapに変換します。

この2つのNodeは初めて見ました。

UEにHeight Mapというか白黒のTextureからNormal Mapを生成する機能がある事は今まで知りませんでした。

生成されたNormal MapはWorld SpaceなのでTangent SpaceにTransform Vectorノードで変換します。

もしくはResultノードを選択して以下に示したTangent Space NormalのCheckを外します。

Tutorialによるとこっちの方がCostが低いそうです。

結果です。

うーん。

一寸短いけどこれで今週のMaterialの勉強は終わりにします。

5.Gaeaの勉強 

5.1 GaeaのTutorialを作成する

私は何か新しい事を生徒に教えるためには3回繰り返して説明する必要がある。と思っています。

これは実際に教えてみれば分かります。

一回目は生徒はどこで何を理解すれば良いのか分からないし、どこが重要なのかも知りません。

ので精一杯ノートを取っても、重要でない所を一生懸命書いてたりします。話に集中しないでぼっと聞いている人もいます。

そこで、生徒たちに教えた事を実際に実習してもらいます。

ここで生徒たちは初めて、教わった事を理解してない事に気が付きます。

慌てて、ノートを見直したり、友達にどうやったら良いのかを聞いたりします。

ここで困っている所で、2回目の説明をします。

すると、生徒たちは一回困った経験をしているので説明のどこが大切なのかを理解しています。ノートもほとんどの生徒はしっかり取るようになります。

そして説明を聞きながらなんとか最後までなんとかやり遂げます。

そしてもう一回、今度は自分だけでやってもらいます。

そうするとノートを見たり、友達と相談したりして何とか自分達でやり遂げようとします。

ここでは今までのように自分で説明はしませんが、生徒が自分達だけで正解に辿り着けるようにヒントだけは出したりします。

これが三回目の説明です。

こんな哲学に基づいて、3回ぐらい同じ事を繰り返し言っているんですが、よく考えたらVideoなんで、分からなかったら自分で、戻って何回も見直せば良いだけと言う気もして来ました。

うーん。

今、悩んでいます。

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

題です。

今週のLectureの内容です。

ここまでで、今回のLectureの内容を三回は繰り返しています。

うーん。

これは一寸くどい気もして来ました。

Slopノードの解説です。

Slopノードの機能やPropertiesについて解説しています。

ここではSlopノードのPropertiesがHeightノードとほとんど同じ事について説明しています。

UE5のMaterialにあるNode、World Aligned Blendノードと同じ結果になる事。

Gaeaによって作成されたTextureを使用する実装は、World Aligned Blendノードの実装と比較して簡単である事。

しかしUE5内部では設定の変更が出来ない事などを説明しています。

Flowノードの説明です。

Propertiesについての説明です。

このPower Pointを作成している時はまだ、FlowノードのPropertiesについてあまり知りませんでした。

この後で勉強したらまあ意味は判明したので、どうまとめるかの問題ですが、あまり上手くまとまっていません。

Enhancementについてです。

Qualityについての説明です。

この後にShatterノードを追加する方法についての説明です。

Soilノードについての説明です。

Erosionで積もったDepositをあまり白くしない事について解説しています。

SoilノードのPropertiesについての解説です。

Gradedについての解説です。

まとめです。

5.2 Videoの撮影

2回撮影しましたが上手く行きませんでした。

明日、また撮影します。

撮影しました。

今度は上手く行ったと思ったんですが、編集している時点で、録音の音声の質が凄い悪い事に気が付きました。

更に、音のズレも発生しています。

どうやらGaeaを操作しながら録音するとこうなってしまうみたいです。

色々考えた結果、Gaeaの実習の部分は録画した動画を見ながら、後付けで解説の音声を追加する事にしました。

この結果でも音連れは発生しますが、音そのものは凄い綺麗になりました。

これで作り直す事にします。

5.3 最終結

何とか完成しました。

また動画が長くなってしまいました。全部で35分位になっています。

まあしょうがないです。

勉強ですので、ある程度の時間を取ってしまうのは仕方ないです。

5.4 編集に間違いがありました

次の日になって、動画を見て確認してたら、PowerPointでFlowノードの説明をする箇所にSoilノードの説明が入っている事が判明しました。

しかもその後のGaeaを用いて実際にFlowノードの使用方法を説明するところの音声も少しずれている事が判明しました。

これを直すのに2時間位取られてしまいました。

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

こんなの予定に組んでいたの忘れていました。

うーん。やるしかないか。

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

6.1 Unreal Engine 5.4: Create STUNNING Product Commercials with Motion Design [5]の続きを勉強する

このTutorial、先週途中で終わってしまっています。

ので今週はその続きを勉強します。

<Adding Background Text>

ActorからText Actorを追加します。

Text Actorの位置を変更します。

Textの内容を変更します。

Enforce Upper CaseにCheckを入れます。

Fontを以下のFontに変更しました。

Layoutの設定をCenter Alignedに変更しました。

そしてTextをCanの後ろに配置しました。

そして以下の箇所からCameraをPin止めしました。

以下に示した様にCameraから見てTextが画面一杯に映るようにします。

ここまで出来たらCameraをTime Sequenceに追加します。

+を押して以下に示したBoxを表示し

Actor Hidden in Gameを追加します。

以下の箇所に120を代入してFrameが120のところに移動します。

そこで赤で囲ったひし形を押してKey Frameを追加します。

今度はFrameが119のところに移動します。

そして以下の赤で囲った部分のCheckを外します。

ここでもFrameを記録すると思ったんですが、Tutorialを見る限りでは何もしていませんね。

Frameが119のところまでTextが表示されなくなりました。

Time Lineはこんなになっていました。

<Animating Background Text>

今度はKerningのひし形を押していました。

Frameは240になっていました。

今度はFrameが120のところで以下の値をInputしました。

AnimationをPlayして確認するとTextが大きくなっていました。

ここでAnimationを早くしたいと、以下のbarを掴んでFrameの終わりを240から180の位置に移動させていました。

これどうやるんでしょうか?

更に以下の赤で囲ったIconを押して

以下の画面を開き

右上のTangent Lineを選択して以下のBoxを表示させ

Weighted Tangentsを表示させました。

Tangent Lineの左端の点を思いっきり左側に伸ばしました。

<Rendering>

今度はRenderingです。

以下のActorを選択します。

このCameraをTime Sequenceに追加します。

そして以下のIconをClickします。

このIconの元になっている道具をClapperと言うみたいですね。

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

Unsaved Configを選択します。

以下のようにSetting画面が表示されます。

Tutorialでは個々の設定は解説していませんでした。

この設定が終わったら閉じて、

以下のBoxに戻り

Render Buttonを押すそうです。

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

<Outro>

ここでは作成した映像を流していました。

あんなに一生懸命作成した青とオレンジの光が、本当に微妙にしか写っていません。

これが匠の技なんでしょうか?

これでTutorialの勉強は終わったので、来週は実装してみます。

7. Houdiniの勉強 

7.1 Houdini - Wall Tool 10 [7]を実装する

今週は先週勉強した内容を実装します。

先週の勉強内容を忘れてしまっているので先週のBlogを読み直して簡単に復習します。

UV Coordinateを直す事とChipped Areaの色を修正する事の2点をやっていました。

思い出してきました。

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

久しぶりにHoudiniを開きました。

TutorialではBooleanノードから実装を始めています。

私のProjectの実装をみたらTutorialと同じ箇所にBooleanがありました。

BooleanのParameterからA Inside Bを選択します。

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

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

あれ?

Tutorialの結果と違いますね。

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

これはBooleanノードの設定の何かを忘れているのかもしれません。

Tutorialを見直してみます。

BooleanノードではなくてSplitノードの設定を忘れていました。

以下に示した様にGorupにA Inside Bをセットする必要がありました。

やります。

結果です。

おお、今度はChippedした部分だけが消えて表示されました。

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

今度はSplitノードのInvert SelectionをEnableします。

Chippedした部分が表示されるようになりました。

これもTutorial通りの結果になりました。

元に戻します。

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

これを以下のように繋ぎました。

Split2ノードの左のOutputをUvunrapノードの左のInputに繋いだ形です。

Uvunwrap1ノードの結果を可視化しました。

Tutorialと同じような結果になっています。

更にUvunwrapノードを追加します。

こちらのUvunwrapノードにはSplit2ノードの右側のOutputを左のInputに繋ぎました。

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

こっちはChippedした部分が表示されています。

近づいてUV Textureがどうなっているのかを確認します。

あれ?

綺麗に貼られていますね。

Tutorialの結果はこんなになっていました。

うーん。

まあいいや。

Tutorialの通りにやっていきます。

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

先週のblogを見ると以下に示した様にここでUV図が表示されるようになると記されていますが、

結果は何も変わっていません。

むむ。

Tutorialを見直します。

うーん。

分からん。

Uvflattenノードで検索してみます。

公式SiteのUV Flatten [6]を見ると

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

やってみます。

まずView画面を2つに分けます。

右上のIconをClickしてSplitを選択しました。

結果です。

左側のViewを選択した状態でSpace + 5を押しました。

おお、UV Mapを表示しています。

でもTutorialのようなMeshの線は表示していませんね。

まあこっちは良いです。

今度はColorノードを追加しました。

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

先週のBlogでは、ここで色を追加した。と書かれていますが、どうやって追加したのかが不明です。

Tutorialを見て確認します。

何とTutorialを見てたらView画面が元に戻っています。

どうやって元に戻すの?

とりあえず画面を2つにSplitしたIconを元に戻してみました。

戻りました。

ただTutorialと同じ事をやっているかどうかは不明です。

というかやってないと思います。

Tutorialでは、以下に示した様に

UV UnwrapというToolbarが表示されていますが、

私のには

表示されていません。

それは兎も角Colorノードの色の変え方です。

その前にColorノードのClassをPrimitiveに変更していました。

おおい。

先週のBlogのまとめは、大事な所が結構抜けています。

そうだ。

先週は花粉症で鼻水が止まらなかったんだ。

私のProjectのClassをPrimitiveに変更しました。

色は以下の場所で指定していました。

赤で囲った部分をClickするとColor Pickerが開きます。

同様にセットしました。

結果です。

黒くなったのか?

なってるみたいです。

このNodeはBrickのPropertyを変更するParameterがあるので黄色くします。

この結果とUvunwrap1ノードの結果をMergeノードを使用して結合します。

結果です。

Tutorialをよく見たらMergeノードのMergeの順番が逆になっていました。

この順番を変える事でどんな影響があるのか不明ですが、一応Tutorialと同じにしておきます。

このMergeノードを選択した状態でSpaceと5を押してUV Mapを表示させます。

以下のようなUV Mapが表示されました。

Tutorialはここでは、UV Mapの表示方法を説明しています。

が何でさっきのUvflattenノードの時は何も説明しなかったんでしょうか?

これからこのUV Mapを調整します。

UVlayoutノードを追加します。

UV Mapの表示が以下のように変わりました。

おお、綺麗に並んでいます。

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

結果です。

それぞれのUV Mapの並びが変化しました。

Space + 1で元の画面にもどりました。

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

結果です。

この機能をEnableした瞬間に、UV MapのTextureが少し変化したのは目撃しました。

でもこうやって2つを重ねて比べてみると、どう変わったのか不明ですね。

この結果をForeach_end3ノードに繋げます。

Foreach_end3を可視化します。

Space+5を押してUV Mapを表示しました。

Tutorialと同じような画面が表示されました。

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

今度はその別々のUV Mapを貼るための実装を追加します。

Uvunwrap1ノードの後に、Groupノードを追加しました。

Group2を可視化しました。

Tutorialと同じような結果になっています。

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

しました。

Tutorialの方ではBは小文字になっていましたが、これって何かのRuleが有るんでしょうか?

大文字の方が読み易いので大文字に直しました。

同様にColor_BrickChipノードの下にもGroupノードを追加します。

こちらのGroup名はBrickChipsとしました。

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

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

8. UEFNの勉強 

8.1 How to Animate Your Character in UEFN - Creative 2.0 Fortnite [10]を実装する

今週は先週勉強したこのTutorialを実装してAnimation Sequenceを作成します。

<Intro>

特にやる事はありません。

<Animation>

MixamoのHomepageに行きます。

前にMixamoのAccountを作ったのかどうか覚えていません。今回はGoogleのAccountでLoginしました。

以下のような画面が開きました。

以下の箇所からFBXをUploadしました。

UploadしたFBXは以下に示したFreddyです。

先週、見つけたやつです。

Uploadが終わったら以下の画面が表示されました。

この時点で既にAnimationが付加されています。

Tutorialでは、FBX FileのUploadが終わると以下の画面に移動するとなっていましたが、ならないですね。

Next Buttonを押してみます。

いきなり以下の画面に飛んでしまいました。

<Tutorial>

Tutorialも飛ばしてこの部分からやる事にします。

まず歩いているMotionを探します。

これにします。

これをClickするとFreddyが歩き始めました。

もう完璧じゃないですか。

これをDownloadする事にします。

ここでTutorialはAnimationを外してFBXをDownloadしていますが、私の場合はMixamo内でUploadしたAnimationを加工した訳では無いので、AnimationだけDownloadしたらOKだと思います。

AnimationだけDownloadする事にします。

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

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

先週勉強したTutorialの通りにSkinの設定はWithout Skin、Frames per Secondの設定は60にしました。

Download出来ました。

次に以下の手を振っているAnimationもDownloadします。

出来ました。

ではこれをUEFN内で開いてみます。

Freddyが保存されているFolderを見つけました。

ここに先程のAnimationのFileをImportしてみます。

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

Import Allを押します。

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

開いてみます。

歩いていました。

<Result>

Level上にも配置してみます。

あれ?

まったく動きません。

これってFortniteを起動させる必要があるの?

Tutorialで確認したらそうみたいです。

TutorialでもLevel上に配置しただけではAnimationは開始してなかったです。

ではせっかくなのでIdlingのAnimationも追加します。

WavingのAnimationをInstallしました。

Installのやり方はWalkingと全く同じです。

Wavingを開くと以下のようにFreddyが手を振っていました。

Level上に配置しました。

Fortniteに入るのにすっごい時間がかかりました。

動いていました。

しかしFreddyってこんなに小さかったの。

Gameから出て編集画面に移動しましたが、ここでもFreddyは動いていました。

うーん。

 元々やる予定だったHOW TO ANIMATE YOUR CUSTOM PET - Fortnite UEFN / Creative 2.0 Tutorial [7]は、いわくつきのTutorialなので来週しっかり時間を取ってやる事にします。

今週のUEFNの勉強はこれだけです。

9. DirectX12の勉強

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

9.1.1 先週の復習をする

先週は沢山勉強したような記憶があったんですが、Blogを読み直すと Fence & Command List | D3D12 Beginners Tutorial [D3D12Ez] [8]の次の10分を実装しただけでした。

内容はCommand ListとCommand Allocatorの宣言をしてDevice ObjectのMember関数を用いて初期化して最後にReleaseするための実装をしていました。

この辺はDirectX12の骨格になりますね。

やっとDirectX12の全体像が分かって来たので、全体の流れの中で今の勉強は全体のどの辺の位置に存在しているのかが理解出来るようになって来ました。

そうなると、今の勉強がどれくらい大切なのかも何となく分かるようになって来ます。

今のままだと完全に趣味のLevelでしかないです。

何かこれに+αの付加価値を追加する必要があります。

9.1.2  Fence & Command List | D3D12 Beginners Tutorial [D3D12Ez] [8]の最後の10分を勉強する

それでは続きを勉強していきます。

まずID3D12GraphicsCommandList7型のObjectを返す関数を宣言しています。

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

この関数内でCommand Listに色々な仕事をやらせるようです。

ただ何でここでInitと呼んでいるのかは不明です。Command Listの初期化、つまりInitializationは既に行っています。

InitCommandList()関数の実装です。

あれ?

前回はここまで勉強したんだっけ?

2024-04-07のBlogを見直してみたら

ここまで勉強していました。

あ、思い出してきました。

このCommand ListとCommand AllocatorのReset()関数について「DirectX 12の魔導書」の勉強の方ではかなり勉強した形跡があったんです。

でも先週、これらのReset()関数について述べている箇所を過去のBlogから調べたらほとんど見つからないという、なんかキツネにつままれたような展開になったんでした。

先週のBlogには以下のようにまとめられていますね。

DirectX 12の魔導書」でも「3.3.6 Swap Chainを動作させる」の「ためておいた命令を実行する」を読み直してみます。

うーん。何となく理解出来ました。

SwapChain(画面の書き換え)を行うために、毎回Command ListとCommand Allocatorの中身をClearにする必要があるみたいです。

その作業をここでは初期化というかInitと呼んでいるみたいです。

今度はDispatch Command List()関数を宣言しました。

これは何をする関数なんでしょうか?

Dispatch Command List()関数の実装です。

Command QueueにCommandListを実行させていますね。

ここで使用されているCommand Queueの関数であるExecute Command List()関数は前に勉強したはずです。

Blogを見直してみます。

2023-09-18のBlogで勉強していました。

ただしこれだけです。

よく読むとこの週のBlogは「DirectX 12の魔導書」の「3.3 画面色のClear」の「3.3.6 Swap Chainを動作させる」についてまとめていました。つまりこの前にExecute Command List()関数を勉強しているのは確実です。

もう少しBlogを遡って見てみます。

ありました。

探したら結構長い間勉強しています。

何「3.3.6 Swap Chainを動作させる」は2023-06-04のBlogから勉強を始めて、2023-11-05のBlogまでこの節の勉強をしていました。

相当難解だったみたいです。

一寸復習する事にします。

9.1.3 「3.3.6 Swap Chainを動作させる」の復習をする

2023-06-04のBlog

Loop内でSwap Chainを作動させるための手順を勉強していました。

こういうやつです。

ここでCommand AllocatorとCommand ListのReset()関数についての勉強が出て来ました。

ここで勉強したのか。

ところが教科書の実際の説明を読むと以下の順序になっていました。

思い出してきました。

ここで特に問題になったのが、Command AllocatorとCommand ListのReset()関数をやる順番だったんだ。

まあどんな順番で行ってもCommand Listを使用する前にResetしておけば問題ないはずです。

Execute Command List()関数に関しての記録はなかったです。

2023-06-11のBlog

Command AllocatorとCommand ListのReset()関数を実装する段階になって、教科書とSample Codeのどっちの実装をやったのかがまとめられていました。

この時は結構悩んだんですが、その事をすっかり忘れてしまっていました。

ここで重要なのはDirectX12はCPUからGPUに命令する方法をこのようにした事で、Multi-Threadな実装に対応した事だと思います。

あれ?でもMulti-Threadに対応出来たのってDirectX11からだったかも。

今、即興で「DirectX 12の魔導書」の「1.5 DirectX12の歴史と変化」を読み直しましたが、Multi-Threadな観点からは何も述べられていなかったです。

2023-06-19のBlog

Render Target View、Descriptor、SwapChainそしてCommand Queueなどの関係が分からなくなってしまった。と書いていました。

これらの関係性を理解する事がDirectX12を理解する事なので、そんなに簡単には理解出来ないのは当たり前ですが、これらの関係性を理解した今、この時の勉強を見直すと、本当に暗中模索の状態でやっているなと思いました。

ここでの説明で一寸気になるのが、Viewの機能の説明です。

Render Targetの説明のところに以下のようにまとめられていました。

ここではViewはDataを解説するもの。と書かれていましたが、

先程読んだ「DirectX 12の魔導書」の「1.5 DirectX12の歴史と変化」の「1.5.2 DirectX 10」ではViewはDataを解釈して実行する職人。と説明されていました。

ここの説明だと、Render Target ViewはDataから色を塗る職人、Depth Buffer Viewは画像にDepth Valueを書き込む職人という感じになります。

最初の解釈では、Viewは評論家か通訳のように訳の分からないDataを誰かに理解出来るように変換している、もしくは注釈を追加しているだけです。

2番目の解釈だと、ViewはDataを解釈してその解釈に従って映像を作成するための何らかの作業も行っている事になります。

微妙な違いですが、どっちが正しいのか気になります。

これは今調べている時間は無いので後で調べる事にします。

2023-07-09のBlog

この週は、2023年も既に半分過ぎたのでその総括として、DirectX12のTutorialの中から、これからも勉強するTutorialとここで勉強を中止するTutorialに分けていました。

ので「3.3.6 Swap Chainを動作させる」に関する勉強は何もしてませんでした。

2023-07-23のBlog

この週のBlogは久しぶりにDirectX 12を勉強したので今週は復習だけしますと書いてありましたが、実際は復習した後に「3.3.6 Swap Chainを動作させる」の「Render TargetのClear」の実装もしていました。

この「Render TargetのClear」の次の節が「ためておいた命令を実行する」で、ここでExecute Command List()関数を勉強しています。

2023-08-06のBlog

ここでやっと「ためておいた命令を実行する」の勉強に入りました。

ようやくExecute Command List()関数についてどんな勉強をしたのかが判明します。

まずBlogを読み直しました。

結構、面白い話が書かれていました。以下にまとめました。

  • Execute Command List()関数を実行する前にCommand Listは閉じる必要がある
  • Command ListをArrayに変更する必要がある
  • 実行した後にCommand ListをClearする必要がある

うーん。

それぞれについてもう少し詳しくまとめます。

<<Command Listを閉じる>>

以下のようにしてCommand Listを閉じています。

これはCommand ListにInputされるDataを貨物や人に例えて、Execute Command List()関数を電車や船の発進に例えたらすぐに理解出来ます。

電車や船が発進しているのに、人や貨物をそこに入れようとしたら大変な事になります。

ので発進する前にDoorを閉じる訳です。

<<Command ListをArrayに変更する必要がある>>

これに関しては、この週のBlogでは何でこんな事しているのか不思議。と書いていました。

しかも最終的な結論が、

と書いていました。

今なら、何でここでArrayを使用する必要があるかは完全に理解しています。

以下の図を使用して、ここでArrayを使用する必要があるかを説明する事も出来ます。

そもそもCommand Queueの中には実行すべきCommand Listが複数存在しているのが普通なんです。

なのでCommand ListはArrayでセットするのがDefaultになっている訳です。

こうやって、昔理解出来なかった事が今は理解している事を確認出来ると、牛の歩みかもしれませんが、去年よりDirectX 12の理解が着実に進んでいる事が分かります。

<<実行した後にCommand ListをClearする必要がある>>

こっちは今まで散々やったCommand ListやCommand AllocatorのReset()関数の事だと思います。

これは次の週に勉強すると書いていましたので、これは次の週のBlogで確認します。

後、この週は「ためておいた命令を実行する」の実装もやっていました。

2023-08-14のBlog

Command ListをClearするは以下に示した様に

Command ListやCommand AllocatorのReset()関数の事でした。

ここで長々とそれぞれのReset()関数の機能について解説していました。

ここでReset()関数を勉強したんだ。

自分の記憶では、Reset()関数に関しては結構勉強した気がしてましたが、やっぱりしていました。

後、ここではDirectX12の重要な概念であるがまだ勉強していないPipeline Stateについての調査結果もまとめられていました。

このままやっていると終わりそうもないので、今週のLötwig Fusel氏のD3D12 Beginners Tutorial [D3D12Ez]の勉強はここまでとします。

続きは来週やります。

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

こっちも一週間に一回は勉強しておかないと何をやったのかを忘れてしまいます。

ので残りの時間はこっちを勉強する事にします。

9.2.1 前回の復習

先週は「4.9 Root Signature」を実装したんでした。

一応、成功したはずなんですが、詳しい確認はしていません。

まず、最初の実装する前ではErrorが表示されるはずですが、普通に実行出来ました。

先週のBlogではSample Codeと書いていますが、これは自分のProjectの書き間違えです。

この後に「4.9 Root Signature」の内容を実装しています。

その結果、

となりました。

教科書に書かれていた正しく実装出来た場合の結果と同じになったので一応、出来たと結論づけました。

うーん。

今、教科書の「4.9 Root Signature」の部分を読み直しましたが、特に何かやってない事があったりはしませんでした。

ので次の節を勉強する事にします。

9.2.2 「4.10 ViewportとScissor Rectangle」を勉強する

短い節なので一気に読んでしまいます。

ただし、今回は軽く読むだけにして全体の流れを把握する事に努めます。

<「4.10.1 Viewportとは」を読む>

ViewportはPCの画面に対してどのようにRenderingした画像を表示するのかを指定する箇所だそうです。

基本的にはこれだけでした。

Sample CodeではViewportは以下のように実装していました。

教科書に載っていた実装例もこれと全く同じでした。

<「4.10.2 Scissor Rectangleとは」を読む

なんと先程作成したViewportはそれだけではそのまま画面として表示されないそうです。

そのViewportのどの部分を画面に表示するのかを決定する存在があるからだそうです。

その存在の事をScissor Rectangleと呼ぶそうです。

以下にSample Codeでの実装を示します。

<「4.10.3 描画命令」を読む

ここでとうとう実際にDirectX 12を用いて描画する事になります。

うーん。

やっとここまで来たのか。

ここまで来るのに2年近くかかりました。

教科書を見るとこの節の最後には三角形が表示されています。

おお、と思いました。

以下の手順で実装するそうです。

  1. Pipeline Stateをセットする
  2. Root Signatureをセットする
  3. ViewportとScissor Rectangleをセットする
  4. Primitive Topologyのセット
  5. Vertex情報のセット
  6. 描画(Draw)のセット

結構、Volume沢山です。

まず今まで、名前は何度も出て来ましたが実際に使用するのは初めてであるPipeline Stateがとうとうここで登場しました。

これについては別個、勉強する事にします。

ここでは今まで、作成したObjectを全部セットしていますが、何にセットしているんでしょう。

あれ?

続きを読みます。

Pipelineは既に宣言されている事になっています。

そうでしたっけ?

今、自分のProjectを開いて確認したらしていました。

これらのSetは全部、Command ListにあるMember関数で行っていました。

Command ListにSetするのか。

Primitive Topologyに関してはPolygonの最小単位をどうするのかの指定をしているみたいです。

そしてVertexの指定もしていました。

最後にDrawInstanced()関数で描画命令を発していました。

Sample Codeの実行結果も見ておきます。

あれ?

本来ならここで3角形が表示されるはずですが。

されませんね。

第4章のProjectがStart upにセットされてませんでした。

改めて実行したら以下のようになりました。

おお、凄い。

描画Commandが2つ用意されていたので、もう片方も試してみます。

結果です。

こっちは三角形でした。

以上でした。

9.2.3 「4.10 ViewportとScissor Rectangle」を勉強した感想

今回は軽く読んだだけなので、何となく全体像を理解するにとどめました。

最初の2つの節である「4.10.1 Viewportとは」と「4.10.2 Scissor Rectangleとは」はそんなに難しくないですが、最後の「4.10.3 描画命令」は結構、濃い内容で、もう少し深く勉強する必要がありそうです。

特にPipeline Stateの機能や、Command Listにセットする内容やその手順に関してはかなり勉強しないと本当の意味では理解出来ない気がします。

どこまで勉強するのか、また勉強しても理解出来るかどうかも重要なのでその辺を見極めて来週から実装をやる事にします。

10. まとめと感想

特にないです。

今週は3D Gaussian Splattingの勉強について、何も考えてなかったのですが、その場に何か思いつくかと思ったら何も思いつかなかったです。

来週は、雨だそうで、そうなると外での撮影は無理になります。

うーん。どうしよう。

11. 参照(Reference)

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

[2] grade eterna. (2023, August 21). 3D Gaussian Splatting + Insta360 RS 1" - Impasse Saint-Eustache, Paris [Video]. YouTube. https://www.youtube.com/watch?v=qG_mLfAgZBQ

[3] grade eterna. (2023, August 24). 3D Gaussian Splatting + Insta360 RS 1" - Waterlily House, Kew Gardens [Video]. YouTube. https://www.youtube.com/watch?v=mD0oBE9LJTQ

[4] Ben Cloward. (2023, November 16). Procedural Brick Normals - Advanced Materials - Episode 30 [Video]. YouTube. https://www.youtube.com/watch?v=hil3qfliTFo

[5] 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

[6] UV flatten. (n.d.). https://www.sidefx.com/docs/houdini/nodes/sop/uvflatten.html

[7] 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

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

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

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

1.今週の予定

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

Videoを撮影してLama AIで3D Gaussian Splattingを作成してみます。

Niagara の勉強>

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

<Materialの勉強>

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

<Gaeaの勉強>

GaeaのTutorialを作成します。

先週出来なかった、Klaus氏のGaea2.0についての見解をまとめた動画を勉強します。

更に2024年のNividaのGTCで使用されたCGにGaeaが使用されていました。

についてもまとめます。

<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 Luma AIで3D Gaussian Splattingを試す

携帯のCameraでVideoを撮影して来ました。

あまり上手く撮影出来なかったので、おそらくきちんとした3Dは作成出来ないと思いますが、最初のTryとしてこのVideoを使用して試してみます。

<携帯で撮影したVideoをPCに移動するまで>

こんなの記録する必要が無いほど簡単だと思っていましたが、結構大変でした。

まずVideoが保存されているFolderがどれなのか分かりません。

Extensionから調べたら簡単だと思ったんですが、そもそもこの携帯で撮影したVideoがどのExtensionで保存されているのか不明です。

仕方なく全部のFolderを開いて見ましたが見つかりませんでした。

Photoの設定を見たら保存先指定にSDカードとなっていました。

今度はSDカードの方を見ると

DCIMというFolderに

100IMAGEというFolderがあり

この中に保存されていました。

ExtensionはMp4だったのか。

開いて見ると普通に見れました。

ところがこれをCopyしてPCのFolderに移そうとすると

となって移せません。

調べたら

「要求されたリソースは使用中です。」の解決策を模索した話 [2]に解決方法が載っていました。

PC上で携帯のmp4を開くとこうなるそうです。

一端携帯を外してPCに繋ぎ直し、いきなりPCにCopyすれば良いと書かれていました。

その通りにやったら出来ました。

ここまでやるだけでかなり疲れました。

<Luma AIにVideoをUploadします>

以下の設定でUploadします。

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

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

気長に待つことにします。

以下の表示が出て来ました。

うーん。

失敗したのか?

一応、以下の画面が追加されていました。

もう少し待ちます。

30分位経ちましたが変化ないです。

2つ目のVideoをUploadする事にしました。

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

やっぱり最初に上げた動画は何かおかしくなってたみたいです。

今度はPreprocessingが5%で止まってしまいました。

諦めかけたら突然35%まで上がりました。

もう少し待つことにします。

全く変化しません。

これは明日もう一回確認する事にします。

と思ったら急に90%まで行きました。

のでもう少しだけ待つことにします。

更に一時間待ちましたが出来ました。

中身を見てみます。

凄い。

写真と変わりません。

Videoに無い部分は抜けています。

でも最初にしたら十分に凄いです。

DownloadしてUE5でも見てみます。

下向きの矢印を押して

以下のBoxを開きました。

Gaussian Splatを押しました。

以下のZip FileがDownloadされました。

展開しました。

Ply Fileがありました。

UE5を開きます。

Luma AI PluginがEnableされている事を確認して

先程のPly FileをDrag and Dropします。

結果です。

おお、Fileが形成されました。

gs_SecondTest_B8_BakedをLevel上に配置してみます。

以下に一番見栄えが良い写真を示します。

うーん。

とても合格点を超えているとは言えませんが、最初にしてはまあまあでしょう。

gs_SecondTest_B8_Baked_No_TAAも試してみました。

この角度から見ると写真と変わりません。

しかし一寸角度を変えると

こんな感じです。

gs_SecondTest_B8_Dynamicです。

これはSkylightをEnableしないと何も見えなかったです。

gs_SecondTest_B8_Dynamic_No_TAAです。

どれがどう違うのかはまだよく分からないです。

後、色が白過ぎます。

この辺はSkylightやDirectional Lightの設定から調整出来るはずです。

これも後で考えます。

2.2 Luma AIで3D Gaussian Splattingを試した感想

今回は初めてのVideo撮影だったので、3D Gaussian Splattingは出来なくても良い位の気持ちでやっていました。

ので一応UE5で展開出来る所までいったので良かったです。

ただ、Modelの出来はかなり悪いです。

人が写らないように撮影したんですが、人を消す機能がついていました。

沢山の人が写っていても全部の人を消せるのかは分かりません。

一つ分かったというか仮説ですが、中心のObjectよりも周りの風景が大切です。

Objectはなくても良いかもしれません。

円形に回転して撮影出来る環境だったらかなり綺麗な風景を再現できるはずです。

もう一つは回転しないでそのまま歩いて撮影したVideoから3D Gaussian Splattingを生成する事は出来るのかどうかを試してみます。

映像を生成するためにこのLumaから生成した3D Gaussian Splattingが使用出来るのかどうかですが、出来そうです。

特に木や草などのMeshで再現しにくい箇所を生成するのに使えそうです。距離で言うと中距離のObjectを生成するのに最適な気がします。

こんなImageです。

  • 近距離;Static Mesh
  • 中距離:3D Gaussian Splatting
  • 遠距離;Gaeaを使用したLandscape

近距離でも盆栽のような境界が複雑なものは3D Gaussian Splattingで生成した方が良いかもしれません。

そう言えばKiri Engineでは3D Gaussian Splattingのまま3D ModelをUE5にImportする事は出来ないのでしょうか?

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

以上です。

<追記>

桜の3D Gaussian Splattingが作成したいので予定より沢山Testする事にしました。

間違えてLama AIにAccessしてしまいました。

もう少しでLuma AIと同じPasswordを入力する所でした。

危なかったです。

Luma AIが正しいWebの名称です。

<<Test3>>

自分を中心にぐるぐる回って動画を撮影しました。

これでも3D Gaussian Splattingは生成出来る気がします。

とりあえず撮影した動画をUploadしました。

後で確認してみます。

出来ていました。

中身を見てみます。

それなりに出来ています。

結論としては自分を中心にグルグル回って撮影しても3D Gaussian Splattingの生成は出来るという事になります。

ただし今回の結果に限って言うと一寸でも軌道を外れると

こんな感じになります。

これは色々な角度の撮影がまだ足りないからだと思います。

今度撮影する時はもっと色々な角度で撮影するようにします。

<<Test4>>

道を散歩している過程で風景を撮影しました。

同じ道を何回も言ったり返ったりしてそのたびにすこしだけ向きを変えて撮影しました。

これで周りの風景を3D Gaussian Splatting出来ないとUE5の風景に利用するのはかなり難しくなります。

出来たら良いな位の感覚ですが、とりあえず試してみます。

こっちもUploadしました。

これも後で確認します。

こっちも完成していました。

これは単に歩いている時に周りの風景を撮影しただけです。

これが3D化したら凄いですが、どうでしょうか?

おお、出来てそう。

右を見ます。

右の建物は完全に消えていました。

ただ何故かその奥にあるBuildingは生成されていました。

左側の風景です。

こっちは全然駄目でした。

でもそれなりに生成出来ている箇所もあります。

その奥の風景に関してはかなり綺麗に生成されていました。

この通路を行ったり来たりして撮影したので同じ様に移動してみます。

少しだけ奥に移動しました。

右側の奥の風景はかなりぼやっとしていますね。

通路を抜けたところです。

うーん。

ここもボヤっとした風景になっていますね。

Uターンして左側を写しています。

この部分は全く生成されていませんでした。

今度は反対側を向いて見ました。

こっちも全然生成されていません。

この辺はそれなりに丁寧に撮影したつもりだったですが、駄目でしたね。

通路そのものはかなり綺麗に生成されていました。

自転車もそれなりに綺麗に生成されていますね。

結論。

このやり方でも3D Gaussian Splattingから3Dを生成するのは可能みたいです。

ただしもっと風景をしっかり撮影しないと色々な箇所で破綻が発生します。

3.Niagara の勉強

3.1 「16.8 水面のRendering」を勉強する

先週勉強した「16.8.3 背景の作成」を実装します。その後で、次の節である「16.8.4 diffuse Specularの作成」を勉強します。

3.1.1「16.8.3 背景の作成」を実装する

以下のような背景のImageを撮影しました。

Cameraからの映像です。

これをUEにImportして名前はT_WaterBGと名付けました。

そして不必要なObjectを全部消します。

TutorialではFloorも消していますが、元々このProjectはThird PersonのTemplateでPlayするとPlayerが操作するCharacterが生成されます。

それがへんな影響が出ないようにFloorだけは残しておきます。

Contents Browserを開くとRender TargetのImageが白黒になっていました。

これもTutorialの説明通りです。

一応、これで出来たことにします。

3.2「16.8.4 diffuse Specularの作成」を勉強する

教科書を読んでいきます。

いきなり新規でMaterialを作成して名前をPP_DiffuseAndSpecularと名付けよ。と書かれていました。

一応、Sample Codeで確認したら

以下のMaterialがありました。

またPost Processingと使用するのでMaterial DomainはPost Processingに変更するそうです。

このMaterialを開いて実装をします。

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

名前をDepthToNormalにします。

Input Pinを4つ作成します。

それぞれの名前をdr、dl、du、そしてddとします。

これをEmissive Colorにつなぐそうです。

Sample CodeのDepth To Normalノードを見ると以下のようになっていました。

ResultノードのEmissive Colorにはつながっていません。

OutputはFloat4になっていました。

Codeは以下のように実装されていました。

上下、左右の差をとってNormalizeするのか。

何で上下左右の差をNegateしているんでしょうね。ここはよく分からないです。

この後、DrなどのInputの値を計算するための実装を追加しています。

ところが教科書の実装とSample Codeの実装が一寸だけ違っています。

おそらく最後には同じになると思いますが、今の時点では違います。

以下にSample Codeのdrの値を計算するための実装を示します。

赤線で囲った部分が教科書ではSceneTexture:SceneDepthになっています。

Preview画面も教科書には載っています。

PP_DiffuseAndSpecularのMaterial Instanceを作成します。

SceneCapture2D_DiffuseAndSpecularを選択して

以下のPost Process Materialsにセットします。

これはSample Codeの画面です。

PP_DiffuseAndSpecularのMaterial Instanceがセットされています。

今度はScene Captureの設定を変更します。

ここの教科書の解説が一寸難しいのですが、まず何をやったのかからまとめます。

Capture Sourceの値をFinal Color(HDR) in Linear sRGB gamutに変更しています。

この役割ですが、これが複雑です。

以下にまとめ直します。

Scene Capture 2DはDefaultの設定ではPost Processがかかる前のImageをRender Targetに書き込むそうです。

それではPost ProcessでParticleを水面に変更しても意味がありません。

のでPost Process変更後のImageをRender Targetに書き込むように変更するそうです。

その方法が、

「Capture Sourceの値をFinal Color(HDR) in Linear sRGB gamutに変更」

する事だそうです。

うーん。

言っている事は理解出来ましたが、何でこれを変更するとそうなるんでしょうか?

ここで教科書はこの結果をPreviewで表示しています。

そして次の「深度をぼかす」ための実装が始まっています。

あんまり沢山勉強して一個一個がおろそかになるのは避けたいので、今週のNiagaraの勉強はここまでとします。

来週は今週勉強した部分を実装します。

4.Materialの勉強

Ben Cloward先生のAdvance MaterialのTutorialですが、現在46まで行っています。

先週、実装が終わったのが28で今週勉強する予定なのが29になります。

もうこんなに進んじゃったの?

でもこれ一見沢山あるように見えて、

  • Procedural Brick関連
  • Vertex Shader関連
  • Water Surface関連
  • Particle System関連

の四つの話だけです。

いやそれでも多いです。

4.1 Procedural Brick Color Shader - Advanced Materials - Episode 29 [3]を勉強する

今週は先週作成したBrickに色を付けるそうです。

最初の半分はUnityにおける実装の説明なのでSkipします。

UEのところから勉強を開始します。

3つの方法で色を追加するそうです。

まず最初の方法です。

以下のように2つの色をLerpノードで繋ぎます。

更に前回の結果をAlphaに繋げます。

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

この時点でもかなり良いです。

しかしTutorialによると更にそれぞれのBrickの色を少しだけ変更するそうです。

以下の箇所にFloorノードを追加します。

FloorノードのReviewです。

ほとんどの箇所で、値が1より大きいのでどうなっているのかよく分かりません。

0.1を掛けます。

結果です。

これならそれぞれの値がどうなっているのか何となく分かります。

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

このNodeはInputしたVector2の値からRandomなVector3の値を生成する機能があるそうです。

これ既に2回位実装した記憶があります。

ただ新しいPCになってから実装したかどうかは不明です。

どうせどうやって実装したのかも覚えてないので、新しく作り直す事にします。

Hash23ノードの結果です。

RGBの3つのRandomな値を得る事が出来ました。

ただここでは1個のRandomな値があれば十分なので

以下のようにMaskノードを使用してRの値だけ取り出します。

以下のように実装を追加する事でBrickの色に変化を付けます。

まあ、このやり方が一番基本的ですね。

結果です。

おお、それぞれのBrickの色が微妙に変化しています。

更に複雑な色の変化を追加したい場合は、Hash23ノードの結果を全て使用してHSVの値として代用して色を生成する方法があるそうです。

以下のようにHSVToRGBノードを使用して計算するそうです。

まずHash23ノードの結果に以下の計算をかけて

値のRangeを-1~1の間に変換します。

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

この結果を先程の色に加算します。

結果です。

おお。

先程の色の変化と比較するとこっちの方が現実の色の変化に近い気がします。

この結果をLerpノードのBにつなぎ

結果を見ると以下のようになります。

うーん。

Hueに沿って色を変化させるとRGBで変化させるより現実の色の変化に近づきますね。

良い事知りました。

Hueの調整する値を以下のように変化しました。

結果です。

基礎の色も少しだけ変更しました。

結果です。

うーん。

この辺の値はもっと色々試す価値がありそうです。

実装が完成したら色々試す事にします。

最後に以下の箇所の値を変更してBrickの数を変えても

以下のように

Brickの色の変化のPatternが重なる事は無い。という長所を紹介しています。

これはTextureを使用する場合と比較して優位な点の一つです。

以上でした。

最初に3つの方法で色を追加する。と言っていたはずですが一個しか方法紹介していません。

もう一回その部分を聞き直してみます。

やっぱり言っていました。

5.Gaeaの勉強

5.1 「Gaea 2.0の公開に関しての連絡」という動画を作成した

かなり難産でしたがやっと完成しました。

以下に内容をまとめます。

PowerPoint

題ですが、簡単にしました。

ここでGaea 2.0の無料版が出るまではこのTutorial Seriesを続ける事を説明しています。

Gaeaをめぐる3つの大きな環境の変化をここで説明しました。

最初の環境の変化、Gaea 2.0のEarly Accessについて解説しています。

特に2つの点

  • UIや機能は大幅に変更された?
  • Gaea2のHomepageを見ると無料版は無いみたい?

が問題であると説明しました。

UIや機能の変化が何故問題なのかについての説明です。

Gaea 2.0の無料版が無い可能性が高い事から、Gaea 2.0が有料版しかない場合はどうするのかについて議論しています。

結論を述べています。

今年のNvidiaのGTCでGaeaを使用して作成したCGが公開されました。

NvidiaのGTCがどれだけ注目された発表だったのかについての解説です。

Gaeaへの評価も「今までの無料で商業利用できるお得なSoft」から、「Landscapeを作成するなら一番高品質のSoftであるGaea」に変りました。

UE5.4が公開されましたが、新しい機能として88,000,000kmのLandscapeが作成出来るようになりました。

これによりGaeaの有料版を買う価値が上がりました。

それについて解説しています。

最後にまとめです。

<動画>

録画しました。

録画したのを聞くと内容がおかしかったり、PowerPointの間違いが見つかったりして結局、3回も取り直しました。

三回目の動画をDavinci Resolveで編集しました。

何故か爆発音のところだけ音がずれていたので、その部分を直しました。

その結果、結局3回作り直してやっと完成しました。

以上です。

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

今週からUE5.4のMotion Designを勉強します。

6.1 Unreal Engine 5.4 Motion Design in 10 MINUTES! | 2024 [4]を実装する

先週、勉強したTutorialを実装します。

まずUE5.4を起動します。

始めて起動しました。

凄い時間がかかってやっと起動しました。

Pluginを開いてMotion DesignをEnableしました。

再起動します。

New Levelを開くと今度はMotion Designが追加されていました。

正しこのTutorialではEmpty Levelを選択します。

Motion Designを押します。

Editorが以下のように変化しました。

おお、今までのUEのEditorと全然違います。

今度はTool BarにあるCreate Defaultsを押します。

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

Spawnを押しました。

Preview画面は真っ暗なままです。

なんか下の方に今まで見た事のないIconが並んでいます。

Motion Design Outlinerを見ると以下のようになっていました。

CameraをUnlockして自由に動くようにします。

今、Pilot Modeになっていますが、このままCamera動かして良いんでしょうか?

Tutorialを見て確認します。

TutorialではCameraを以下の位置までPilotで操作して

もう一度固定していました。

同じ様にしました。

ActorsからCloner Actorを選択したLevel上に配置しました。

原点に配置しました。

Cloner2のDefaultCubeを消します。

Lego Blockが見つかりません。

Tutorialを見直したらDescriptionに以下の場所からDownloadして下さいとありました。

以下のPageに飛びました。

これをDownloadします。

UEにImportしました。

赤しかないです。

青と黄色も作成します。

しました。

Cloner2にSM_LegoCube_Blueを追加しました。

結果です。

近づいて確認したら以下のようになっていました。

Tutorialの映像とは一寸違いますね。

まあ良いです。

ClonerのSpacingの値を以下のように変化させました。

Legoの隙間が無くなりました。

今度は赤いLegoを追加しました。

結果です。

ここで気が付いたんですが、Tutorialと比較するとLegoにPlastic感が足りません。

Materialの値をすこしだけ変更します。

以下のようにしました。

Mesh Render ModeをRandomに変更します。

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

おお、配置がRandomになりましたね。

Coloner2のCountの値を以下のように変更しました。

結果です。

おお、一気に凄くなりました。

Cameraから見るとこんな感じです。

LegoをNanite化しました。

したけど可視化して確認したらなって無いです。

なぜ?

まあ別にならなくても動きが遅くなったりはしてないのでこのまま続けます。

新しいClonerを配置しました。

次にCloner3を選択してConstraintをTextureにセットしTextureにLogoをセットしました。

TextureのLogoは今作成しました。

Cloner3に黄色のLegoをセットしました。

Count数を50に変更しました。

Spacingの値もCloner2と同じにします。

Block一個分だけZ軸に沿ってあげると

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

今度はEffect Actorを追加します。

と思ったらActorを追加するWindowがありません。

うーん。

どうやって開くんだったけ?

あ、

UEがCrashしてしまいました。

もう一回起動させました。

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

しかし私のは以下のようになっています。

見事にEditor Modeだけありません。

理由が分かりました。

以下の箇所がSelectionにセットされていたからです。

Motion Design Modeに直したら

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

Effector Actorを選択して配置します。

こんな感じになりました。

このEffector Actorの名前をE_Planeに変更します。

しました。

次いでにCloner2とCloner3の名前も変更します。

Cloner_Planeを選択してEffectorsにE_Planeをセットしました。

今度はE_Planeを選択してTypeの値をUnboundに変更しました。

ModeをNoise Fieldに変更しました。

更にPanの値とLocation Strengthの値を変更しました。

波打つようになりました。

Frequencyの値を変化させました。

値が大きくなると波が増えます。

画像の処理がかなり遅くなってきました。

Nanite化しないと駄目っぽいです。

うーん。

調べたけど分かりません。

E_PlaneをDuplicateしてE_Textを作成しました。

これをCloner_TextのEffectorsにセットします。

文字も波打つようになりました。

ただ文字がPlaneの下に沈んで見えなくなるのは変です。

Tutorialは文字は常に見えています。

文字の位置がかなり高い場所にある感じです。

文字の位置を上げてみます。

Cloner TextのZの位置を500まで上げてみました。

結果です。

今度はイイ感じになりました。

最後にSpot Lightを追加します。

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

一応、これで完成とします。

7.Houdiniの勉強

7.1 Houdini 19 - Wall Tool 09 [5]を実装する

先週勉強したHoudini 19 - Wall Tool 09 [5]を実装します。

<Delete Small Parts>

Labs Delete Small Partノードを追加します。

Thresholdの値を0.4に変更します。

結果です。

Blockのいくつかが消えました。

更に黄色くしました。

次にする事は大変計算Costが高いので、WallのSizeを小さくしてからやるそうです。

Line_Widthを選択して

Lengthの値を3に変更しました。

結果です。

Resample_BrickRowノードを選択して

Segmentの値を6に落としました。

結果です。

今度はLine_Heightを選択します。

Lengthを2にします。

結果です。

はい。

これで準備が整いました。

Labs Edge Damageノードを追加します。

ただしこのNodeを使用すると大変計算が遅くなってしまうので、このNodeの必要な機能だけを持つ実装を別に作成してそれで代用する事にするそうです。

<Node Network>

For-Each Connected Pieceノードを追加します。

Foreach_begin3を可視化します。

結果です。

Remeshノードを追加します。

結果です。

なんかとんでもない形状になりました。

Target Sizeの値を0.03に変更しました。

結果です。

今度はMaskを追加してBrickにDamageを追加する箇所と追加しない箇所を指定します。

そのためにLabs Measure Curvatureノードを追加します。

Labs Measure Curvatureノードを可視化します。

結果です。

Tutorialの例と違って赤い部分と黒い部分しかないです。

Groupノードを追加します。

可視化します。

Group TypeをPointsに変更します。

結果です。

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

更にBase Groupの値を@convexity>0.7にしました。

結果です。

赤い部分のVertexだけ選択しています。

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

結果です。

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

GroupにEdgeNoiseを指定します。

結果です。

Range Valuesの値をZero Centeredにします。

これは最初からなっていました。

Amplitudeの値を0.09に下げます。

結果です。

かなりBrickの形状に戻って来ました。

Element Sizeも下げます。

1から0.227に下げました。

結果です。

あれ、もっとひどくなりました。

<Boolean Intersect Node>

今度はBoolean Intersectノードを追加します。

Foreach_Begin3ノードの結果をBoolean Intersectノードの左Pinに繋げます。

Mountain1ノードの結果を右Pinに繋げます。

結果です。

色を消します。

Measure_curvature1ノードを選択してExport ColorをDisableします。

Export ColorなんてParameterはありません。

代わりにVisualize Outputを消すと

赤が消えました。

これで代用します。

<Smooth Node>

Smoothノードを以下の場所に追加します

AttributesにNを追加します。

Strengthの値を41.44に上げます。

この状態でMountainノードの結果を確認します。

まだおかしな見た目をしています。

今度はMountainノードとBooleanノードの間にPeakノードを追加します。

Distanceの値を0から0.012に上げました。

結果です。

もっとおかしな結果になったようにも見えますが、どうなんでしょうか?

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

あれ、すごく良くなっています。

MountainノードのAmplitudeの値をさらに下げます。

Amplitudeの値を0.032にしました。

Booleanノードの結果です。

物凄く良い感じになりました。

<Offset the Noise Pattern>

最後にOffsetを追加します。

まずForeach_begin3_metadataを作成します。

MetaDataノードは以下の場所から作成します。

作り方を忘れていたのでこの場所に辿り着くまで結構探しました。

名前をIterに変更します。

Tutorialでこれだけ名前を変更した理由は不明です。

先週のBlogではこの続きに

と書いていますが、当然Iterノードの結果をMountainノードにPassしたはずです。

Tutorialで確認します。

確認したら何もやっていませんでした。

単にMetaDataノードを作成すれば、そのMetaDataにあるDetail Attributeは使用出来るみたいです。

あ、違った。

MountainノードのOffsetにdetail(“../iter”, “iteration”, 0)と書かれていました。

Iterノードにあるiterationと指定したから、直接Node同士を繋がなくてもそのNodeの値を取ってこれるようになったんでした。

MountainノードのOffsetの値を変更しました。

Booleanノードの結果です。

そしてBooleanノードの結果をForeach_end3の左Pinに繋ぎます。

Foreach_end3の結果を可視化します。

おお、Brickの端が削れています。

Peakノードを黄色くします。

Distanceの値を小さくします。

結果です。

おお、Brickの削れている部分が増えました。

MountainノードのElement Sizeの値を変更します。

結果です。

こっちは削れている幅を大きくしたんでしょうか。

どっちにして結果は凄いです。

7.2 Houdini 19 - Wall Tool 09 [5]を実装した感想

前回のBlogで以下の感想を書きましたが、

前回よりは何をやっているのかは理解出来きました。

要は、このやり方をするとBrickの辺を削った状態に変更出来るんです。

ただし具体的な実装に関しては今回は深入りしません。

焦って勉強して全部ご破算になる可能性があるからです。

それよりも少しずつでも前進した方が良いからです。

この技術は色々応用出来そうです。

Robotや戦車の装甲に使用したら、戦闘後の激しさを表せそうです。

やっている途中で以下の画面が開いてしまいました。

記録のためにもう一回Houdiniを開いたら直っていました。

もう再現出来ませんが、直し方が分かりません。

まあ、Houdiniを再起動すれば直る事が分かったので再起動すれば良いですね。

8.UEFNの勉強

8.1 HOW TO ANIMATE YOUR CUSTOM PET - Fortnite UEFN / Creative 2.0 Tutorial [6]を勉強します

先週、 Spawn Custom Pets / Props in Fortnite - UEFN / Creative 2.0 [7]の実装が終わったのでその次のTutorialであるHOW TO ANIMATE YOUR CUSTOM PET - Fortnite UEFN / Creative 2.0 Tutorial [6]を勉強します。

2024-03-24のBlogで以下に示した様に少しだけ勉強していますが、

Spawn Custom Pets / Props in Fortnite - UEFN / Creative 2.0 [7]の勉強が終わった後でないと理解出来ない内容なので

最初からやり直します。

<Intro>

前回はStatic Meshを生成するだけでしたが、今回はSkeletal Meshを生成した上でそれを動かすそうです。

ModelのCharacterはここからDownloadしたそうです。

<Creating our Freddy Prop>

前回作成したPropのBPであるFredをDuplicateしてFreddyを作成します。

開きます。

Static Meshを消してSkeletal Meshを追加します。

先程のSkeletal Meshをセットします。

更にAnim to Playに以下のAnimationをセットします。

これってSkeletal MeshをDownloadした時についてくるんでしょうか?

これついてこなかったらその時点で話が終わってしまいます。

と思ったら取りあえずは何もセットしないそうです。

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

<Creating Cine Sequence Devices>

Cinematic Sequence DeviceをLevel上に配置します。

名前をIdle Animationに変更します。

このCinematic Sequential DeviceをDuplicateします。

名前はFreddy Running Animationとします。

<Creating Animation Sequences>

今度はこのDeviceに使用するLevel Sequenceを作成します。

FreddyIdleとFreddyMoveと名付けます。

Level Sequenceを開いてFreddyを追加します。

Trackを押して以下のBoxを開きます。

Animationから以下のAnimation(手を振っている方)を追加します。

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

以下の赤いBarはSequenceの最後を示しているので

Animationの最後に移動させます。

もう一方のLevel Sequenceには走るAnimationを追加します。

Cinematic Sequence DeviceにLevel Sequenceをセットします。

Animationが8秒以上必要になる場合も考えてLoop PlaybackをEnableしておきます。

同じ事をもう一個のCinematic Sequence Deviceにも行います。

<Setting Up Creative Prop in Verse and Cinematic Sequence>

先週作成した以下の部分は使用出来ないと言っています。

このVerse内でSpawnしたObjectにAnimationの追加は出来なかったそうです。

うーん。

やっとこの部分の意味が理解出来ました。

のでまず以下の実装を追加して

Creative_propのConstantを宣言します。

実態はUEFNで追加します。

そして以下のVerse内でObjectをSpawnする実装を消します。

すると以下の部分がErrorになります。

のでここにPassするためのFunctionを新たに作成します。

最後のArgumentの値が違っていました。

動画では途中で切れていますが、

Freddy Propを追加しています。

先程のErrorが起きている実装のArgumentをこの関数に変更します。

でここからが一寸オカシイです。

なんと画面上から今作成した関数であるStartFollowingPlayerが消えてしまっています。

これはあれだ。

最後までTutorialを作成した後で、2つのAnimationをVerseで生成したPropには追加出来ない事が判明したんでしょう。

で、先程の部分だけ直した。

うーん。

最低のTutorialになったな。

Comment欄にも同じ事を指摘している人がいました。

更に動かないって書かれています。

は。

そらそうだ。

そして盲目的にほめている人達の群れ。

これはYouTube Cultやな。

そもそも今回のTutorialの目的はVerseで生成したSkeletal Meshを含むPropにAnimationを追加する方法を勉強する事だったはずです。

それが出来なかったので、UEFNで生成したPropを使用する事にしました。

この時点でグダグダです。

でも最後までやってからそれを直したら、まだTutorialとしては及第点を取れたでしょう。

でも最後まで見るだけは見てみましょう。

Running Sequenceの宣言を行います。

更にもう一個のLevel SequenceのためのConstantも作成します。

<Making Pet Follow at a Distance from the Player>

先週のTutorialではPetはPlayerの中心まで追いかけてきていました。

これは変なので、Playerの手前で止まるようにします。

そのためのConstantをまず作成するそうです。

そして以下のIf節をPetFollowsPlayer()関数に追加しました。

また画面が変になりました。

今追加したIf節がどっかに行ってしまいました。

仕方ないです。

ここは心の目で先程追加したIf節があると思って見ていきます。

でもバットボタンは押しておきましょう。

流石にこのTutorialは作り直すLevelです。

今度はPetがPlayerの右側に立つようにするそうです。

PlayerRightを追加しています。

そしてMove to()関数のArgumentを以下のように変更しました。

うーん。

これがあるなら先程のIf節は要らないかもしれません。

どっちにしろ、今回のTutorialはダメダメですけど。

<Programing Sequence Animations>

今度はAnimationを追加します。

まず以下のVariableを作成します。

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

それは良いんですが、今度はIf節が追加されています。

もう滅茶苦茶です。

Idleも追加していました。

更にElse節も追加しています。

これIdleじゃなかったらRunningのAnimationを流す訳だからどっちか一個で良いです。

今週のPi Equals Three氏は何をやってるでしょう。

今までの切れがまったくないです。

ここでIdleSequence.stop()関数を追加しています。

ここに追加するならElseの方にも追加する必要があるんじゃないの?

流石にこれは追加していました。

<Making Pet Face Player>

PetがPlayerの方を向くようにするそうです。

しかし最初は以下の実装をFollowsPlayer()関数に追加してCameraが上から写すようにしました。

このCodeを改良してPetの向きをPlayerに向けるようです。

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

ここはまあ納得です。

そして生成された値を以下の場所に追加します。

<Stopping Freddy from Flying>

ここはDirectに以下の実装を追加していました。

いや

に指定していました。

更にStartFollowingPlayer()関数に

を追加しました。

も追加しました。

<Last QOL Tweaks / Bug Fixes>

以下の箇所に0.75を追加しています。

Yの方にも追加しています。

UEFNに戻って以下の設定にしました。

ここではFreddyPropにLevel上に配置されたFreddyをセットしていました。

という事はこの時点では既にPropをVerse内で生成するのは諦めたという事になりますね。

<Final Result>

それなりに動いていますね。

FreddyはPlayerの方を向いていません。

出来てないです。

8.2 HOW TO ANIMATE YOUR CUSTOM PET - Fortnite UEFN / Creative 2.0 Tutorial [6]を勉強した感想

このTutorialヤバすぎます。

このまま作成しても多分、動かないでしょう。

でもそれ故にこのTutorialを自分で直して動かせるようにしたら、実力がつく気がします。

ので来週は一寸だけ試してみます。

9.DirectX12の勉強

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

9.1.1 先週の復習をする

先週何をやったのかまったく覚えていません。

Blogを読み直します。

Fence & Command List | D3D12 Beginners Tutorial [D3D12Ez] [8]の最初の10分を実装していました。

FenceをEventを使用して実装していました。

9.1.2 Fence & Command List | D3D12 Beginners Tutorial [D3D12Ez] [8]の次の10分を勉強する

次はCommand Listについての話です。

OperateをするためにCommand Listを使用するそうです。

Command ListはCommand Queueによって実行されると説明していました。

Command ListやCommand Queueに関しては結構勉強しました。

前のBlogを見て確認します。

これこれ。

この関係さえ理解しておけば良いんです。

Tutorialでは口で説明してるだけで、訛りが凄くて何を言っているのか今一分かりません。

Command listがGPU側に行くと、ある値をCheckしてOKだった場合、そのCommand Listにある命令を実行する。みたいな解説でした。

後、Command Allocatorの機能についても解説していました。

この部分はFront EndとBack Endに例えて説明していました。

しかし何が言いたのかよく分からないです。

ID3D12CommandAllocator型のVariableを宣言していました。

そしてID3D12GraphicsCommandList7型のVariableを宣言します。

この辺は、Command List、Command Queue、そしてCommand Allocatorの関係を理解しておけば取りあえずは良いでしょう。

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

その前に以下のように実装を整理していました。

これ見るとCommand Queueは既に初期化していますね。

CreateFence()関数のCodeのSUCCEEDEDをFAILEDに変更します。

そしてCreateEvent()関数も以下のようにCodeを変更しました。

この時点でかなりSample Codeの実装と同じになっていますね。

そしてCommand Allocatorを初期化しました。

CommandListを初期化しました。

当然、初期化したものはReleaseする必要があります。

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

Fenceは?

FenceはReleaseしなくていいの?

そしてCommand Listを使用するための関数を作成します。

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

InitCommandList()関数の実装です。

最初にCommand AllocatorとCommand ListをResetしています。

ここで10分たったので、残りは来週以降やる事にします。

今週はCPUの命令をGPUに送るために必要なCommand ListやCommand Allocatorを作成しただけで終わってしまいました。

9.1.3 Fence & Command List | D3D12 Beginners Tutorial [D3D12Ez] [8]の次の10分を勉強した感想

Command ListとCommand Queueの機能は

以下の図を見ると一発で理解出来ますが、

Command Allocatorの機能は全く覚えていません。

過去のBlogを見直して復習します。

まずCommand Allocatorの話が最初に出て来たのは2023-02-19のBlogでした。

何をするためのObjectなのか全く分からないと書いていました。

その後、ずっとこのObjectの目的は不明と書いていて、

2023-03-20のBlogでやっと以下の回答を得る事が出来ました。

更に2023-03-27のBlogで以下のような説明をしていました。

うーん。

今、読み直すとこの説明もよく分かりませんね。

もう一回、「DirectX 12の魔導書」の「3.3.2 Command Listの作成とCommand Allocator」を読み直します。

でもその前にBlogでCommand Allocatorについて述べている箇所を全部、復習してしまいます。

2023-06-19のBlog

以下の用語の意味について復習していました。

む、Swap Chainとか、Render Targetとか、Descriptor Heapとかの機能はもう忘れています。

うーん。

ここでCommand Allocatorの復習もしていました。

更に実際の実装方法もここで紹介していて

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

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

うーん。

この説明、かなり的を得ている気がします。

Command Allocatorの目的は、Command Listを作成するために必要なもの。という理解にしておきます。

9.1.4 「DirectX 12の魔導書」の「3.3.2 Command Listの作成とCommand Allocator」を読む

もうCommand Allocatorの目的は大体理解しましたが、一応「DirectX 12の魔導書」の「3.3.2 Command Listの作成とCommand Allocator」は読み直します。

読み直しました。

要するにCommand ListにはMemoryが無いんです。だから作成した命令を貯めるMemoryを別な場所に確保する必要があるんです。それをCommand Allocatorが担当しています。

はい。

これでCommand Allocatorの理解は十分でしょう。

Command Allocatorの目的を調べるために過去のBlogを読み直したんですが、

なんと今週の最後で実装したCommand ListとCommand AllocatorのReset()関数について何週にも渡って議論していました。

これは来週、読み直す事にします。

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

9.2.1 前回の復習

「4.8 Graphic Pipeline Stateの作成」の実装をしていました。

そうだ。

先々週で「4.8 Graphic Pipeline Stateの作成」が終わったんだ。なので先週は、「4.8 Graphic Pipeline Stateの作成」の実装をしたんです。

実装するに当たって

Depth Stencil Stateの実装がSample Codeではあったのに、「4.8 Graphic Pipeline Stateの作成」では無かった事を記録していました。

これは忘れてしまいそうです。

いや、先週のBlogに書いていたのに既に忘れてしまっています。

もう追加してしまいます。

Commentにまだ教科書には書かれていないと書いておきました。

後で、この部分の実装が教科書で出てきたら、何でこの実装を既にしているのかをこのCommentで思い出します。

もしこの部分の実装がここで実装しておかないといけないものだった場合は、今実装しているので後で問題が起きる事は無くなります。

これでこの部分の実装について忘れてしまっても大丈夫です。

9.2.2 「4.9 Root Signature」を勉強する

では今週はその次の節である「4.9 Root Signature」の勉強を行います。

<「4.9.1 Root Signatureとは」を勉強する>

最初にRoot Signatureの機能について解説しています。

しかしその説明は「Descriptor Tableをまとめたモノ」と言うDescriptor Tableが何なのかを知らないと理解出来ない、なんとも不親切な説明です。

と思ったらDescriptor Tableの説明もありました。

Descriptor TableはDescriptor HeapとShaderのRegisterを関連付けるそうです。

Descriptor HeapもShaderのRegisterもどんな機能なのか覚えていません。

ここから調べないといけないのかと思ったらその後に、もう少しかみ砕いた説明がありました。

GPUにどのSlotからどのくらいのTextureやDataを使用するのかを教えるのが役割だそうです。

こっちは分かり易いです。

最初にこっちの説明をして欲しかったです。

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

この節は結構長くて更に内容も濃いみたいです。

慌てずにゆっくり勉強します。

まずRoot Signatureが無いとE_INVALDARG Errorになる事が述べられています。

あ、これ自分のProjectでまだ試してなかったです。

うーん。

来週、実装する時にこれもやる事にします。

今回は別にTextureを使用する訳ではないので、空のRoot Signatureを作成します。

以下の手順で生成するそうです。

  1. D3D12_Root_Signature_Descの設定
  2. (1で設定したD3D12_Root_Signature_Descを)Binary Codeに変換
  3. 生成したBinary Codeを使用してRoot Signatureを生成
  4. Graphics Pipeline StateにRoot Signatureをセットする

実際に生成するのは3までですが、一応4も追加しておきました。

ここからそれぞれの手順の具体的な実装方法が説明されています。

<<「D3D12_Root_Signature_Descの設定」を読む>>

D3D12_ROOT_SIGNATURE_DESC structureの設定方法について解説していました。

公式SiteのD3D12_ROOT_SIGNATURE_DESC structure [9]では

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

教科書の説明によると、今回は空のRoot Signatureを作成すれば良いだけなので

ここの設定は以下のFlagだけ指定すれば良いそうです。

公式SiteのD3D12_ROOT_SIGNATURE_DESC structure [9]では

このFlagは

と解説されていました。

という事はD3D12_ROOT_SIGNATURE_FLAGSにどんな種類があるか調べる必要があります。

公式SiteのD3D12_ROOT_SIGNATURE_FLAGS enumeration (d3d12.h)[10]です。

以下の種類がありました。

上から2番目のを使用していますね。

ここでInput Assemblerを使用します。と指定しています。

教科書によるとこれが、頂点情報だけあります。後は何もない空のRoot Signatureです。

という意味になるそうです。

うーん。

これ教科書の解説が無かったら全く意味不明ですね。

<<「Binary Codeの生成」を読む>>

ここで手順の2番目の作業である「2.(1で設定したD3D12_Root_Signature_Descを)Binary Codeに変換」をやるみたいです。

まず教科書を読んでみます。

これは簡単でした。

D3D12SerializeRootSignature()関数を使用すればいいだけでした。

公式SiteのD3D12SerializeRootSignature function (d3d12.h)[11]を見ます。

うーん。

Remarkとかもそれなりにしっかり読んだんですが、この関数がBinary Codeを生成してくれる。という最も肝心な説明な載ってなかったです。

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

Versionの設定で教科書では敢えて1.0を使用しています。

何故、敢えて1.0を使用したのかについての理由が詳しく書かれていました。

まあ1.0を使用すればその辺の問題は回避できるので今回はそのまま1.0を使用します。

Sample Codeの実装です。

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

<<「Root Signature Objectの生成」を勉強する>>

「3. 生成したBinary Codeを使用してRoot Signatureを生成」の部分です。

CreateRootSignature()関数を使用して作成します。

当然ですが、このCreateRootSignature()関数はDeviceのMember Functionです。

Sample Codeを見ると

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

更にこの後すぐ、RootSigBlobを開放していました。

教科書では特にこの関数に関しての説明は無かったです。

一応、公式SiteのID3D12Device::CreateRootSignature method (d3d12.h)[12]も見ておきます。

今、気が付いたんですが、Copilotが以下の回答も表示してくれていました。

Root Signatureを生成するんじゃなくて、Root Signature Layoutを生成するんだ。と書かれているのは結構重要なPointかもしれません。

更にCreateRootSignature()関数のそれぞれのParameterについても詳しい解説が出て来ていました。

公式Siteの最初のParameterであるNodeMaskの説明です。

Copilotの説明です。

ほとんど同じです。

これはNY Times社がChat GPTはNY Timesの記事で学習しているんじゃなくて、盗んでいるだけだ。と訴訟を起こすのも理解出来ます。

まあDirectXとCopilotに関してはどっちもMicrosoftのものなので問題無いでしょうが。

<<Graphics Pipeline Stateに設定する>>

最後の部分です。

これでRoot Signatureの実装はお終いだそうです。

実行するとCreateGraphicsPipelineState()関数がS_OKを返すそうです。

以上です。

9.2.3 「4.9 Root Signature」を勉強した感想

やっぱし「DirectX 12の魔導書」は分かり易い。

他のDirectX 12の教科書やTutorialと比較して頭一つ、二つ抜き出ています。

これは最初はよく分からなかったですが、勉強を継続すると段々その凄さが理解出来ます。

噛めば噛むほど、味の出るスルメみたいな教科書です。

こういう教科書はもっと評価されるべきです。

10.まとめと感想

特にないです。

UEFNの勉強に使用しているPi Equals Threeの今回のTutorialは最悪でした。

前回のTutorialは凄い良かったので、まだ継続して勉強しますが、

このまま質が低下した状態で続くようなら、別な人のTutorialで勉強する事にします。

11.参照(Reference)

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

[2] KiironoMidori. (2024, February 13). 「要求されたリソースは使用中です。」の解決策を模索した話. パハットノート. https://kiironomidori.hatenablog.com/entry/android-file-copy-error

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

[4] Reality Forge. (2024, March 23). Unreal Engine 5.4 Motion Design in 10 MINUTES! | 2024 [Video]. YouTube. https://www.youtube.com/watch?v=RJyajs-Cztg

[5] Rick Banks. (2022, June 21). Houdini 19 - Wall Tool 09 [Video]. YouTube. https://www.youtube.com/watch?v=s5LsbiXhkEU

[6] 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

[7] Pi Equals Three. (2023, May 22). Spawn Custom Pets / Props in Fortnite - UEFN / Creative 2.0 [Video]. YouTube. https://www.youtube.com/watch?v=2-0t1mkQ6yc

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

[9] Stevewhims. (2024, February 22). D3D12_ROOT_SIGNATURE_DESC (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ns-d3d12-d3d12_root_signature_desc

[10] Stevewhims. (2022, January 31). D3D12_ROOT_SIGNATURE_FLAGS (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ne-d3d12-d3d12_root_signature_flags

[11] Stevewhims. (2022, January 27). D3D12SerializeRootSignature function (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-d3d12serializerootsignature

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

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

1.今週の予定

今週は三カ月に一回の休みの週ですが、AndroidのAppの作成に時間を取られてしまったので休みなしでやる事にします。

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

Kiri Engineを試してみます。

Niagara の勉強>

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

<Materialの勉強>

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

<Gaeaの勉強>

GaeaのTutorialを作成します。

Klaus氏が久しぶりに動画を上げていました。Gaea2.0についての見解を述べています。これをまとめます。

2024年のNividaのGTCで使用されたCGにGaeaが使用されていました。

それについてもまとめます。

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

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

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

<Houdiniの勉強>

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

<UEFNの勉強>

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

<DirectX12の勉強>

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

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

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

今週も3D Gaussian Splattingについての勉強をやります。

2.1 Kiri Engineの勉強の続き

先週、自分で撮影して作成した3D Modelは上部しか生成されませんでした。今週は以下の条件でもう一回やり直してみます。

AI Object MaskingをEnableしたから上部しか作成されなかった気がしています。

今回はAI Object MaskingをOffにしてやってみます。

後、写真を撮るのは大変なので動画で撮影した場合も試してみます。

<写真を撮る、AI Object Masking有り>

時計の周りを撮影するのではなく、時計を支える椅子を回して撮影しました。

のでAI Object MaskingはEnableしています。

第一印象ですが、先週、生成した3Dモデルよりはかなりマシです。

後ろ側です。

底です。

底も撮影したんですが、底は作成されていません。

上部です。

時計の上部が破けています。

これは駄目ですね。

正面です。

時計の文字はしっかり再現されています。

時計の枠はぐしゃぐしゃです。

こんな感じでした。

<Video撮影、AI Object Masking有り>

写真を70枚撮るのは大変です。

Video撮影を代わりにやる事にします。

Video撮影を開始するとカシャカシャ勝手に写真を撮っています。

これは手動で写真を撮るよりかなり簡単です。

結果です。

何これ?

全然駄目ですね。

これは来週もう一回試してみます。

以上でした。

<KIRI Engineの感想>

2週に渡ってKIRI Engineを試してみました。

色々、分かって来ました。

まず3D Modelの作成に関して言うと、撮影するよりBlenderなどで職人技で作成した方が綺麗に出来そうです。

Free版なので撮影出来る回数が70枚であると言う規制がありますが、Blenderは無料です。

3D modelを作成する以上、同じ土壌で勝負する必要があります。

後、これPhotogrammetryであって、3D Gaussian Splattingではないです。

3D Gaussian Splattingの特長である3D Modelの生成が難しい背景の生成はKIRI Engineでは出来ないみたいです。

3D Gaussian Splattingの生成が出来る他のSoftを探す事にします。

2.2 3D Gaussian Splattingの生成が出来る他のSoftを探す

<Luma AI>

Luma AIから調べていきます。

3D Scan your Environment with AI (Free Tool)[2]と言うTutorialがあります。

<Intro>

何とこれ、NeRFのScan方法を説明するTutorialでした。

なんかPhotogrammetry、NeRFを勉強した後にだけ、3D Gaussian Splattingの撮影方法が目の前に現れる気がして来ました。

とりあえずこれを勉強してみます。

<What are NeRF scans?>

NeRFについて解説しています。

大した話はしていないです。

このTutorialの作者が作成した映像を見せているだけです。

<Capture NeRF>

普通にVideoで撮影しているだけでした。

KIRI Engineの時のように特別なAppを使用している訳ではなさそうです。

撮影する対象を少なくとも三周はする必要があるそうです。

Luma AIでは撮影する時の条件を以下のように解説しているそうです。

HDRはどうやって切ったらいいのか分からないです。

<Process NeRF>

Luma AIのHomepageに行きます。

My CaptureをClickします。

以下に示した様に撮影した映像をUploadします。

以下のようにProcessingが始まります。

三十分位かかるそうです。

以下のように3Dの映像が完成します。

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

この後、この3D空間内でVideo撮影をするみたいです。

以下のReshoot Buttonを押します。

<Luma AI camera animation>

Focal Lengthについて解説しています。

Cameraを好きな位置に配置したら以下のAdd Keyframeを押します。

今度は別な位置にCameraを移動して、またAdd Keyframeを押します。

同様に更に何か所にKey Frameを追加しました。

画面の下中央にあるPlay Buttonを押すと

Key FrameにそってCameraから見た映像を表示します。

移動のSpeedが速すぎます。

これを調整する方法を説明します。

紫の丸をDragして右にひっぱります。

すると以下のようにKey Framesの時間が6.0 Sから10.5Sに変化しました。

更に他のKey Frameの位置も変更しました。

今度は適切なSpeedで移動するようになりました。

今度はこの映像をRenderingします。

以下のRender Videoを押します。

Aspect Ratio、Resolution、そしてFPSを選択します。

Renderを押します。

以上でした。

<Free 3d assets>

この作者が作成した3D Assetが無料でDownload出来る事を説明していました。

2.3 3D Scan your Environment with AI (Free Tool)[2]を勉強した感想

こんなに簡単なの?

これならすぐに出来そうです。

AQUOS R6のHDRを切る方法だけ調べます。

写真でHDRを切る方法は載っていましたがVideo撮影の場合は載ってなかったです。

そもそもAQUOS R6でVideoを撮影する方法すら分からないです。

勉強しました。

細かい機能はまあボチボチ覚えていきます。

おそらく3D Gaussian Splattingも同じ動画から生成出来るはずです。

これは思っていたよりかなり簡単でした。

Niagara の勉強

3.1 「16.8 水面のRendering」を勉強する

先週勉強した「16.8.2 Render Target、Scene Capture 2Dの追加」の実装を行います。

その後で「16.8.3 背景の作成」を勉強します。

3.1.1 「16.8.2 Render Target、Scene Capture 2Dの追加」の実装をする

Scene Capture 2Dを2つ追加しました。

Render Targetも2つ作成しました。

Render Targetの以下のParameterの値を変更しました。

それぞれのScene CaptureのTexture TargetにそれぞれのRender Target 2Dをセットしました。

以上です。

やっている事は単純ですが、この手順がもたらす機能は単純ではない事は先週の勉強で判明しています。

Widget上に3DのCharacterを表示したり、Level上に鏡を表示したりする時にもこの手順を用います。

3.1.2 「16.8.3 背景の作成」を勉強する

何とここで背景だけ撮影したTextureを作成するそうです。

Sample Codeで確認すると以下のTextureがありました。

でもSample CodeのDemoにはこのBackgroundは表示されていません。

何とここでLightingやFloorなどで不必要なAssetは全部消して以下のようにするそうです。

そうだったのか。

それでこのへんてこな設定になったのか。

後、教科書ではこうも述べていました。

Sky LightとVolumetric Cloudは粒子のRenderingで深度の計算に必要だそうです。

うーん。

凄い。

以上でした。

3.1.3 「16.8.3 背景の作成」を勉強した感想

量は少ないですが、内容は濃いです。

慌てずゆっくり勉強する事にします。

ので今週のFluid Simulationの勉強はここまです。

3.2 Sky LightとVolumetric Cloudの復習

教科書の解説によるとSky LightとVolumetric Cloudは粒子のRenderingで深度の計算に必要なそうです。

Volumetric Cloudは兎も角、Sky Lightは何を担当しているのか全く覚えていません。

今週はこのあたりを復習します。

<Sky Light>

公式SiteのSkylights [3]を見ます。

なんか、Documentも格好良くなっています。

以下の説明がありました。

うーん。

遠くの部分を画像としてCaptureしてそこから光を計算して後でその光を画面に適応する。って意味でしょうか。

Post Processingの部分に影響するみたいですね。

後は細かい設定の紹介でした。

これらの勉強はSkipします。

<Volumetric Cloud>

公式SiteのVolumetric Cloud Component Properties [4]を読みます。

そりゃそうだ。

こっちも残りは設定の細かい説明でした。

以上です。

4.Materialの勉強

4.1 Procedural Brick Pattern Shader - Advanced Materials - Episode 28 [5]を実装する

先週勉強したこれを実装します。

このBrick模様の生成方法は、今Houdiniで勉強しているWallの作成方法に通じる内容も、特に論理的な部分で、含まれている気がします。

<Intro>

特にやる事はないです。

<Benefits>

ここも特にないです。

Unreal Tutorial>

以下の実装だけしました。

まだ何をしているのか不明です。

これが

こうなりました。

ああ、値が10~20倍になったのか。

それぞれの結果にFracノードを追加します。

Fracノードは小数点以下の値だけ返します。

最初の結果にFracノードを追加した場合です。

結果は変わりません。元々0~1の間の値だからです。

Divideした結果にFracノードを追加した場合です。

値が10~20倍になっているため、小数点の繰り返しも10~20になってない?

うん。

5~10になっています。

あ、0.2で割ったら20倍じゃなくて5倍だった。

MaskをかけてUとVに分割しました。

ここからBrickのずれを追加します。

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

結果です。

見事にBrickがずれています。

この計算が何をやっているのか先週は分からなかったので、今一寸考えます。

分かりました。

まずGの値ですが、0,1,2,3,4となります。

0、2,4,の時は0.5をかけて0,1,2になるのでBrickのずれが無いように見えます。

1,3,5の時は0.5をかけて0.5、1.5、2.5になるのでBrickのずれが生じます。

<Rectangle Pattern>

Material FunctionでRectangle Patternを作成します。

しました。

この実装については後で考えます。

作成したMaterial Functionを追加します。

結果です。

Brickになりました。

4.2 Material FunctionのRectangle Patternを勉強する

Default値の結果です。

個の形状を作成するための実装みたいです。

0~0.1と0.9~1の間が黒くなって、その他の部分は白くなっている感じですか。

おそらく以下のInput値が白くなる幅をしてしているんでしょう。

まず2倍して1を引いています。

値が0~1の間からー1~1の間に代わりました。

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

成程。

値が1~0~1に変化するようになりました。

これで0.8を指定したら0.8以上を黒くするようにしたら、端だけが黒くなります。

Input WidthHeightノードで指定した値を引きます。

DDXもしくはDDYを掛けます。

DDXとDDYはそれぞれのSlope値を返すはずです。

更に絶対値にして加算しています。

その後でこの値で元の値を割っています。

割る前の結果と割った後の結果です。

割る前です。

割った後です。

うーん。

値を1より大きくしただけかもしれません。

One Minusノードを追加しました。

値が反転しました。

結果です。

うーん。

こういう風に反転するのか。

Maskノードを追加しています。

それぞれの結果です。

これでやっと両端が黒くなりました。

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

結果です。

うーん。やっと端が黒くなりました。

Saturateノードを追加して

中央の明るすぎる部分を調整しています。

結果です。

完成ですね。

うーん。

やっている事は理解しましたが途中のDDXやDDYは別のこのやり方でなくても出来そうです。

今、即興で考えたんですが以下の実装でも

以下のような結果になります。

このMFを代わりに使用してBrick模様を作ってみます。

結果です。

出来てますね。

5.Gaeaの勉強

今週はGaeaの勉強はお休みしてUE 5.4の新しい機能についての調査の続きをやります。

<追記>

「今週の予定」で以下の内容を調査すると言っていました。

すっかり忘れていました。

これらは来週やります。

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

6.1 UE5.4に新しく追加されたMotion Designについて勉強する

まずMotion Designの定義ですが、GoogleWikipedia)によると

となっていました。

ようするにAnimationのあるDesignの事です。

念のためにCopilotにも質問しました。

ここでは更に具体的な例として

映画の最後に流れるCreditやAnimation化されたLogoなどが紹介されていました。

Animation化されたLogoは分かり易い例ですね。

YouTubeで検索すると既に何個かのTutorialがUploadされていました。

最後のTutorialの人は全く見た事ない人ですね。

見るとAnimation化したLogoのTutorialがありました。

これは興味深いです。

後は以下のTutorialがAnimation化したLogoの作成方法を説明しています。

こっちはたった10分です。

軽く全部見てみます。

見ました。

これも凄いです。

しかもUE5.4のMotion Designの機能をそれなりに説明していて分かり易いです。

以下の動画も見ました。

これはMotion Designそのものの歴史とか参考になるYouTubeのTutorialやUE5で作成した成果物なんかを紹介していました。

非常に分かり易かったです。

William Faucher氏とともに

Pwinisher氏と

この人のTutorialは全く見た事ないです。

JonathanWinbush氏が紹介されていました。

うーん。

この人のTutorialは何個か勉強した事ありますが、そんな重鎮だとは知らなかったです。

Cinema4DとUE5を兼用して使う人達には、JonathanWinbush氏のTutorialは非常に重用されているそうです。

Pwnsiher氏のYouTube Channelを見ると登録はしてました。

Blogで引用した事はなさそうです。

検索には引っかからなかったです。

何個かここにある動画を見ましたが、圧巻の一言です。

何個か以下に示します。

こんなの宗教画と変わらん質です。

他のも凄いです。

ここがCinematic Renderingの頂点なのか。

初めて知りました。

審査員としてGavin Shapiro氏が参加していますが、

この人は知りません。

一応登録しておきました。

6.2 Unreal Engine 5.4 Motion Design in 10 MINUTES! | 2024 [6]を勉強する

UE5.4の新機能でLogoのAnimation化にも関係しているTutorialでそこそこ短いのを選択するとこれが最適かなとなりました。

Unreal Engine 5.4 Motion Design in 10 MINUTES! | 2024 [6]を勉強します。

まずMotion Design PluginをEnableします。

UEを再起動してNew Levelを開くと以下のように

Motion Design Templateが追加されています。

今回はEmpty Levelを使用するそうです。

Motion Designを押します。

以下のようなLayoutに変化しました。

Create Defaultsを押します。

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

Spawnを押して全部生成します。

以下に示した様にCameraはLockされた状態で生成されます。

Unlockして自由に動くようにします。

そして好みの場所にCameraを移動してからLockします。

今度は以下のMotion Designの使用方法についてです。

もし間違ってこのWindowを閉じてしまった場合、

Window→Editor Modes→Motion Designで開く事が出来るそうです。

Actors→Cloner Actorを選択し

Level上に配置します。

Rubic Cubeが配置されました。

原点に移動させます。

以下のDefault Cubeを消して

代わりにLego Brick Blueを追加します。

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

Cloner2のSpacingの値を101.0に変更しました。

Legoの間のSpaceが無くなりました。

今度は赤いLegoを追加しました。

結果です。

Cloner2のMesh Render ModeをRandomに変更しました。

結果です。

Legoの赤と青の配置がRandomになりました。

Cloner2のCountの値を以下のように変更しました。

結果です。

うん。

だんだん使い方が分かって来ました。

この時点でPCの挙動がかなり遅くなっているそうです。

その理由はこのLego一個で以下に示した様に7千個のVerticesがあるからだそうです。

この問題を解決するためにLegoをNaniteにします。

更に新しいClonerを配置しました。

Cloner3のConstraintを選択してTextureに変更します。

ここで使用するTextureは以下のものだそうです。

これは実装する時に適当に作成します。

以下のようにSetしました。

Cloner3のDefaultを消して黄色のLegoを追加しました。

結果です。

なにも見えません。

その理由はTextureを再現するだけのBrickが足りないからだそうです。

以下のようにCloner3のCount の値を変更します。

結果です。

うーん。

この時点で凄いです。

文字が綺麗に再現されてない時はこのCountの数を増やすと良いそうです。

今度はEffect Actorを原点に配置します。

こんなのでした。

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

あれ?

いつの間にか、Cloner2とCloner3の名前がCloner_PlaneとCloner_Textに代わっています。

Cloner_Planeを選択して

EffectorsのIndex[0]に

E_Planeをセットします。

後、UE5.4の新しい機能としてCtrlを押して1を押すとその場所が1にBookmarkされるそうです。

これは便利です。

今度はE_Planeを選択してTypeの設定をUnboundにします。

これは全部に作用する設定になるそうです。

次にModeをNoise Fieldにします。

PanのXの値を2.5にしました。

そしてLocation StrengthのZの値を50にします。

結果です。

赤と青のLegoで出来た部分が波打っています。

Frequencyの値をいじってFrequencyがどう影響するのかも説明していました。

これは実装する時に実際に試して確認します。

今度はTextのLegoにEffectを追加します。

まずE_PlaneをDuplicateしてE_Textを生成します。

そしてCloner_TextのEffectorsのIndex[0]にE_Textを追加します。

結果です。

文字も波打っています。

Spot Lightを追加しました。

以下のようにLightの当たる範囲を調整します。

LightのIntensityを5000 cdに変更しました。

結果です。

影を消すためにDirectional Lightは消しています。

以上でした。

うーん。

Level Sequenceは使用しないのか。

Level Sequenceの使用方法は別のTutorialで学ぶ事にします。

少しの間Motion Designの勉強は続ける事にします。

来週はこのTutorialの実装をやります。

7.Houdiniの勉強

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

<Delete Small Parts>

Labs Delete Small Partノードを追加します。

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

Thresholdの値を以下のように変更します。

結果です。

黄色くしました。

次にする事は大変計算Costが高いので、WallのSizeを小さくしてからやる事にします。

Line_Widthを選択して

Lengthを3に落とします。

結果です。

Resample_BrickRowノードを選択して

Segmentsを6にします。

結果です。

今度はLine_Heightを選択して

Lengthの値を2にしました。

結果です。

はい。

これで準備が整いました。

Labs Edge Damageノードを追加します。

ただしこのNodeを使用すると大変計算が遅くなってしまうので、

このNodeの必要な機能だけを持つ実装を別に作成してそれで代用する事にするそうです。

<Node Network>

For-Each Connected Pieceノードを追加します。

以下のNodeらが追加されました。

Foreach_Begin3ノードを可視化しています。

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

Shift Wを押すと以下のようにWireframeを見る事が出来ます。

Target Sizeの値を0.03に変更します。

結果です。

今度はMaskを追加してBrickにDamageを追加する箇所と追加しない箇所を指定します。

そのためにLabs Measure Curvatureノードを追加します。

結果です。

この赤い部分にだけ影響を与えるようにするそうです。

Groupノードを追加します。

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

Group TypeをPointsに変更しました。

以下のようにPreviewが変化しました。

Group Nameの値をEdge Noiseに変更しました。

更にBase Groupの値を@convexity>0.7にしました。

結果です。

赤い部分のVerticesだけ選択されています。

Mountainノードを追加しまいた。

結果です。

選択したVerticesが凸凹になっています。

Mountainノードを可視化しました。

これはもうBrickには見えませんね。

更にGroupにEdgeNoiseを選択します。

うーん。

このEdgeNoiseはどこで指定したんでしょう?

結果です。

うーん。

まだBrickには見えないですね。

Range Valuesの値をZero Centeredにして

Amplitudeの値を0.09に下げます。

結果です。

凸凹感が少なくなりました。

更にElement Sizeも下げました。

結果です。

もう何が何だか訳分からなくなっています。

<Boolean Intersect Node>

今度はBoolean Intersectノードを追加します。

Foreeach_Begin3の結果をBooleanノードの左Pinに追加します。

Mountainノードの結果を右Pinに追加します。

結果です。

色を消します。

Measure_curvature1ノードを選択してExport ColorをDisableします。

結果です。

<Smooth Node>

Smoothノードを以下の場所に追加します。

AttributesにNを追加します。

Strengthの値を41.44に上げました。

Mountainノードの結果です。

まだおかしな見た目をしています。

今度はMountainノードとBooleanノードの間にPeakノードを追加しました。

Distanceの値を上げます。

結果です。

Peakノードの結果を可視化しました。

Booleanノードに戻って結果を可視化しました。

おお、だいぶBrickが欠けた感じが出て来ました。

MountainノードのAmplitudeの値をさらに下げました。

Booleanノードの結果です。

おお、かなり端が削られたBrickになって来ました。

<Offset the Noise Pattern>

最後にOffsetを追加します。

まずForeach_begin3_metadataを作成します。

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

MountainノードのOffsetの値を以下のように変更します。

Booleanノードの結果です。

うーん。どう変化したのか不明です。

そしてBooleanノードの結果をforeach_end3ノードの左のPinに繋ぎます。

結果です。

Foreach_end3ノードの結果を可視化しました。

おお、凄いそれぞれのBrickが劣化しています。

これで終わりかと思ったらPeakノードを黄色くして

Distanceの値を小さくしました。

これでBrickの凸凹感がますそうです。

そしてMountainノードのElement Sizeの値を変更していました。

以上でした。

7.2 Houdini 19 - Wall Tool 09 [7]を勉強した感想

Houdiniの勉強はいつも五里霧中ですが、今回は更に訳分からなかったです。

まあ、これは慌てずゆっくりやって行く事にします。

全部をいっぺんに理解するのは不可能です。

ここで焦って勉強しても全部台無しになってしまう可能性の方が高いです。

ゆっくりやっていきましょう。

8.UEFNの勉強

8.1  Spawn Custom Pets / Props in Fortnite - UEFN / Creative 2.0 [8]を実装する

<Intro>

特にやる事は無いです。

前回、作成したDeviceのせいでTop Viewになっています。

新しいLevelを作成してそこでこのProjectをやる事にします。

<Setting up Custom Prop>

PropからBlueprintを作成します。

開いてStatic Meshを追加します。

Static Meshに地球儀は無いのでCabbageをセットします。

これを使用します。

<Setting up Signal Remote Manager / Signal Remote Spawner>

Signal Remote ManagerをLevel上に配置します。

 

Signal Remote AもLevel上に配置しました。

Signal Remoteは色々な種類があるのでTutorialと同じのを選びました。

後で設定が微妙に変わるのを防ぐだめです。

うーん。

複雑な形状をしていますね。

Signal Remote Managerの名前をSpawn Eggに変更します。

Signal Remote TierをUncommonに変更します。

あれ?

DefaultでUncommonになっていました。

<Creating Verse Device>

新しいVerse Deviceを作成します。

名前はTutorialと同じSpawn_Pet_Deviceとしました。

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

<Exposing Remote Manager and Creative Prop in Code>

まずCharacter Moduleを追加します。

Signal_remote_manager_device型のSpawnEggを初期化します。

次にCreative_prop_asset型のDebbyAssetも初期化します。

SpawnDebby()関数も作成します。

Player型のArrayの変数であるPlayersも作成します。

OnBegin()関数内でこのPlayersも初期化します。

<Subscribing on Remote Press>

Subscribe()関数を追加します。

<Creating Spawn Prop Function>

SpawnDebby()関数の実装を作成します。

<Setting up Devices in Editor>

BuildしてDeviceをLevel上に配置しました。

以下のようにSetしました。

SpawnEggはLevel上に配置されたAssetをSetしますが、DebbyAssetはClassそのものをセットします。

このAssetをPlay中に生成するんだから当然ですが、今まで気が付かなかったです。

そういう目で先程のConstantの生成を見直すと

以下に示した様にDebbyAssetの生成方法は他のConstantの生成方法と少しだけ違っていました。

うーん。

ここが今回のTutorialの肝だったのか。

<Result 1 (Testing Spawns)>

Testしてみます。

Signal Remoteを取るところまでは出来ましたが、その後どうやったらいいのかが分かりません。

1を押すとSignal Remoteを手に持つ事が分かりました。

そして色々弄ってみるとMouseの左ClickでCabbageが生成されました。

出来ました。

<Creating Pet Follow Player Function>

今度はこの生成されたDebbyがPlayerを追いかけるようにします。

またVerseに戻ります。

以下の関数を作成しました。

<Controlling Pet's Speed>

DebbyのSpeedを変化させます。

Playerが近くにいる時はゆっくり近づき、遠くにいる時は急いて移動します。

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

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

先週のBlogを見ると以下のように書いてありました。

この計算を見ると、移動する距離に関わらず速度が一定になるような実装になっています。

<Getting Creative Prop Instance from Spawn Prop Function>

SpawnDebby()関数内からPetFollowPlayer()関数を呼びます。

先週のBlogに以下のようにまとめられていました。

うーん。

そう言う事か。

先週の勉強と先程の気づきが結びつきました。

だからSpawnProp()関数のReturn ValueであるTopleの一番目のMemberを返す事で対応する訳です。

SpawnProp()関数の結果をConstantで得るようにします。

そして以下の方法でResultの最初のMemberであるCreative_Prop型の変数の値を得ます。

まずTuple型のMemberの値を得るためには[]ではなく、()を使用する必要がある事は理解しました。

次に?ですが、

先週のBlogでは以下のように説明していました。

でも以下のようにIf節を外すと?を外す必要が出て来ます。

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

もし先週のBlogのまとめ通りの意味だとするとIf節は関係ないはずです。

If節が無い場合とある場合で?が必要になったり不必要になるのは何か別な理由がある気がします。

PetFollowPlayer()関数を追加します。

Errorになっています。

これはTutorialの結果と同じですが、Errorの位置が違いますね。

まあ良いです。

同じ方法で直してみます。

む、Errorは消えません。

あSが抜けていました。

直りました。

このSpawnの使用方法については何も分かりません。

これってどういう意味なんでしょうか?

うーん。

謎技術です。

<Random Target I Had lol

UEFNに戻って来ました。

VerseのBuildをしました。

Signal Remote AのTime Before First Spawnの値を変更しました。

Spawn EggのCooldown Timeの値も0にしました。

<Final Result>

テストします。

Cabbagesが追いかけて来ました。

Tutorialほど遅くは無いです。

普通に追いかけて来るのが確認出来ます。

のでTutorialの残りはやる必要はないですね。

以上です。

9.DirectX12の勉強

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

9.1.1 先週の復習をする

先週のBlogを見ると Fence & Command List | D3D12 Beginners Tutorial [D3D12Ez] [9]の最初の10分を勉強していました。

Fenceについて勉強しています。

Fenceの機能については以下のようにまとめていました。

後、Fenceの実装方法についてもまとめてありました。

9.1.2 Fence & Command List | D3D12 Beginners Tutorial [D3D12Ez] [9]の最初の10分を実装する

DXContext.h内にSingalAndWait()関数を宣言します。

これは既に宣言してありました。

DXContext.cpp内にSubgalAndWait()関数の実装を行います。

これも既に以下のように実装してありました。

Tutorialの実装とは少し違いますね。

以下にTutorialの実装を示します。

先週のBlogを読み直したら、このTutorialの実装は以下の点で良くないそうです。

それでTutorialではSignalAndWait()関数の実装を以下のように改良しました。

Handle型のEvent Classを作成しました。

M_FenceEventです。

これも既に実装してありました。

そして以下の場所で初期化しています。

Sample Codeの実装をまるCopyした私のFileでは以下のように初期化されていました。

うーん。

まあ。どっちでも同じですね。

Shutdown()関数で作成したEventをReleaseしています。

Sample Codeでは

となっていました。

同じですね。

Tutorialの言いたい事がやっとわかりました。

以下の方法でThreadを待たせていると

GPU側の作業が終わった時もThreadが眠ったままになる危険があるのでEventを使って対応するようにする。という事です。

そしてEventを使用して以下のように書き直しました。

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

SetEventOnCompletion()関数はどういう状態だとSucceededになるんでしょうか?

M_FenceValueの値がm_FenceEvent内の値と同じになったらSucceededを返すんでしょうか?

公式SiteのID3D12Fence::SetEventOnCompletion method (d3d12.h)[10]を読んでみます。

これを読むとEvent Valueがある値に達したら、発生するEventを指定する。と読めます。

そうか。

段々理解して来たぞ。

C++のEventの仕組みを忘れてしまっているから、ここで何をやっているのかがよく分からないんだ。

JavaにおけるEventの仕組みが簡単な図で出て来ました。

何故かC++ではこういう図は出て来ませんでしたのでJavaで代用します。

https://ehindistudy.com/2018/01/05/java-event-handling-hindi/

まずEvent SourceとEvent Listenerが有ります。

Event ListenerはEvent Sourceに紐づけられています。

Event SourceはEventが起きるとEvent Objectを生成します。

そのEvent Objectを受け取ったEvent ListenerはEventに対して何らかの反応をします。

うん。

これ。

この関係を忘れていました。

何かが起きてEventが発生するんじゃなかった。

Eventが起きてEvent Listenerが何かをするんでした。

これを踏まえてもう一回以下の実装の内容を確認します。

まずSignal()関数ですが、m_fenceの値をm_fenceValueの値を一Incrementした値と同じにします。

次にSetEventOnCompletion()関数でEvent Objectを指定します。ここではm_fenceEventを指定しました。更にこのEventはm_fenceの値はm_fenceValueの値と同じになった時に発生する事も定義しました。

この設定が成功したらSucceededがTrueになり次のIf節に飛びます。失敗した時はElseに飛んでこの実行を終了します。

SetEventOnCompletion()関数の指定が成功した場合は次のWaitForSingleObject()関数の設定の指定をします。

20,000mSecondsまで待ちます。つまり最大20秒間待つ訳です。

それでもEventが発生しなかった場合は実行を終了します。

うーん。

大体こんな感じでしょう。

まあ、まだ細かい点は間違っているかもしれませんが、兎に角先週の勉強よりは進みました。

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

9.2.1 前回の復習

「4.8.6 Input Layoutの設定」、「4.8.7 Render Targetの設定」、「4.8.8 Anti-AliasingのためのSample数設定」そして「4.8.9 Graphic Pipeline State Objectの生成」まで勉強して「4.8 Graphic Pipeline Stateの作成」の勉強が終わったんでした。

ので今週は「4.8 Graphic Pipeline Stateの作成」の実装を行います。

9.2.2 「4.8 Graphic Pipeline Stateの作成」の実装をする

今週はこれをやっていきます。

以下の部分は2024-02-19のBlogで勉強していました。

<「4.8.3 Shaderのセット」>

Sample Codeの以下の部分をCopyしました。

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

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

<「4.8.5 Blend Stateの設定」>

ここから2024-03-17のBlogになります。

BlendStateの設定とRenderTargetBlendDescの設定を行います。

<「4.8.6 Input Layoutの設定」>

ここから先週のBlogになります。

Input Layoutの設定を追加しました。

Sample Codeではこの実装の前に以下のDepthStencilStateの設定を行っています。

これは教科書ではまだ行っていないはずです。

この部分の実装は後で確認します。

IBStripCutValueも設定します。

PrimitiveTopologyTypeの設定もここで行います。

<「4.8.7 Render Targetの設定」>

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

<「4.8.8 Anti-AliasingのためのSample数設定」>

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

<「4.8.9 Graphic Pipeline State Objectの生成」>

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

これで「4.8 Graphic Pipeline Stateの作成」が完成しました。

9.2.3 DepthStencilStateの設定の確認

DepthStencilStateの実装を忘れていないか教科書で確認しました。

うーん。

ないですね。

でも一個忘れている実装を見つけました。

教科書では「4.8.3 Shaderのセット」で以下のID3D12RootSignature型のRootsignatureの宣言を行っていました。

これは追加しておきました。

以上です。

10. まとめと感想

特にないです。

11. 参照

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

[2] Nik Kottmann. (2023, December 9). 3D Scan your Environment with AI (Free Tool) [Video]. YouTube. https://www.youtube.com/watch?v=jang1YA43PM

[3] Sky Lights in Unreal Engine. (n.d.). Epic Developer Community. https://dev.epicgames.com/documentation/en-us/unreal-engine/sky-lights-in-unreal-engine

[4] Volumetric cloud component properties in Unreal engine. (n.d.). Epic Developer Community. https://dev.epicgames.com/documentation/en-us/unreal-engine/volumetric-cloud-component-properties-in-unreal-engine?application_version=5.3

[5] Ben Cloward. (2023, November 2). Procedural Brick Pattern Shader - Advanced Materials - Episode 28 [Video]. YouTube. https://www.youtube.com/watch?v=7UelK8pouFE

[6] Reality Forge. (2024, March 23). Unreal Engine 5.4 Motion Design in 10 MINUTES! | 2024 [Video]. YouTube. https://www.youtube.com/watch?v=RJyajs-Cztg

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

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

[10] Stevewhims. (2024, February 22). ID3D12Fence::SetEventOnCompletion (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-id3d12fence-seteventoncompletion

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

1.今週の予定

今週からやっと普通のScheduleに戻ります。

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

Kiri Engineを試してみます。

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の作成

今週はKIRI Engineを実際に使用してみます。

2.1 KIRI Engineを使用してみる

KIRI EngineにSign Upしました。

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

+のIconを押します。

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

先週、勉強したImageと全然違います。

うーん。

Photo Scanを試してみます。

70枚、写真を撮れ。と出て来ました。

手短に近くにある時計を撮影しました。

汗ぐっしょりです。

矢印を押してUploadしました。

この辺の画面は大体は先週勉強した内容と同じでした。

Turn Tableは使用していませんが、AI Object MaskingはOnにしました。

別に深い理由はありません。

Uploadが終わりました。

Tokeiが登録されています。

Clickすると以下の画面が表示されました。

うーん。

かなり時間がかかりそうですね。

これは別な作業をする事にします。

PCからWebにAccessして

Loginしようとしたら

となってLogin出来ません。

うーん。

Google Passwordから調べます。

何と、Passwordを一文字間違って打っていました。

そのPasswordを打ったらLogin出来ました。

撮影した時計がありました。

色々Sampleが表示されていました。

Downloadも出来るみたいです。

してみます。

以下のFileが生成されています。

これをどうやってUE5にImportするんでしょうか?

𝟑𝐃 𝐒𝐜𝐚𝐧𝐧𝐢𝐧𝐠 𝐢𝐧𝐭𝐨 𝑼𝒏𝒓𝒆𝒂𝒍 𝑬𝒏𝒈𝒊𝒏𝒆 5: 𝐊𝐢𝐫𝐢 𝐄𝐧𝐠𝐢𝐧𝐞 𝐖𝐨𝐫𝐤𝐟𝐥𝐨𝐰 𝐓𝐮𝐭𝐨𝐫𝐢𝐚𝐥 [2]によると一端Blenderに読み込んで、FBXに変換して読み込んでいます。

3d scan to Unreal Engine 5.2 using Android Phone [3]の方が少しだけ詳しくやり方を解説していました。

こっちもBlenderを使用しています。

このTutorialを勉強します。

2.2 3d scan to Unreal Engine 5.2 using Android Phone [3]を勉強する

ここでBlenderで何をするのかだけ勉強します。

まずUnzipしています。

そうかBlenderだからZipのままImportするのか。

うん。

なんか私のFileと一寸違いますね。

説明をよく聞いたら、RetapoとPERはPro Versionだけ生成されるそうです。

うーん。

まあいいです。

Blenderを開いて真ん中にあるCubeを消しました。

FileからImportそしてWavefrontを選択します。

3D Model Retapo.objをImportしています。

私の場合はここは普通のObj FileをImportすればいいはずです。

色はついていませんね。

右上の以下のIconを選択すると

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

以下の箇所からStaticsをEnableします。

左上に以下の表示が追加されました。

220万のTriangleが使用されていますが、これは多すぎます。

Edit Modeに移動します。

そしてZをHoldして以下のIconを表示させ

Wireframeを選択します。

そして以下の箇所からSelect Lassoを選択します。

そして以下のようにRockを選択します。

結果です。

これをInvertします。

Ctrl+Iを押します。

そして以下のBoxを表示させ(どうやって表示させたのかの説明は無し)

SeparateからSelectionを選択します。

これで要らない地面の部分だけを消す事が出来るようになりました。

Object Modeに戻って地面の部分だけ消します。

結果です。

Nを押して以下のBoxを表示させ

Rockが原点に配置されているか確認します。

Rockの位置を調整した後、Ctrl+Aを押して以下のBoxを表示させ

All Transformを選択します。

Lightを消します。

今度はExportから

OBJを選択します。

うん。FBXじゃないの?

後はそのObjをUE5にImportしているだけでした。

Errorが起きています。

これは無視していいそうです。

Textureは手動でImportしていました。

どうやらMaterialは自分で組むみたいですね。

DisplacementのFileを開いてsRGBのCheckを外していました。

RoughnessとNormalのsRGBのCheckも外していました。

この辺のFileは私の場合はないのでまあその分の質は落ちるという事になります。

3D Model.jpgをDrag and Dropします。

そして以下の3D Model_Retopo.jpgのExtensionを

Pngに変更します。

そして3D Model.jpgを選択した状態で

Reimport With New Fileを選択します。

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

そして先程作成したPNG Fileを選択します。

すると以下のようになります。

うーん。

この部分が私のFileには全くないのですがどうやってTextureを張り付けるのでしょうか。

まあ適当にやってみます。

そしてこれらのTextureを使用して以下のようにMaterialを作成しました。

成程ね。

そして作成したRockをLevel上に配置しました。

うん。

大体のやり方は理解しました。

2.3 DownloadしたFileをUE5で表示する

別に編集しないのならBlenderを介する必要はないはずです。

直接UE5で開いてみます。

Import出来ませんでした。

うーん。

やっぱりBlenderで一回Importしないと駄目みたいです。

BlenderをInstallしてなかったです。

からします。

しました。

あれ?

Zip Fileからどうやって開くのかが分かりません。

Objを代わりに開いてみます。

おお。

普通に開けました。

Viewportを変更しました。

結果です。

何も変わっていません。

これはTextureを自作すべきなのか?

Blenderの設定はよく分かりません。

位置だけ移動させました。

UEでImportしてみます。

固まってしまいました。

しばらくほっておきます。

今度はDownload出来ました。

Level上に配置します。

うわ。

ちっちゃ。

25倍にします。

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

結果です。

おお。

思っていたのよりかなりマシな結果になりました。

白い点が散在しているのが気になります。

それ以外はほぼ満点の出来です。

もう少し細部を見てみます。

この辺はかなりCG感がありますね。

Wireframeを表示しました。

これは多すぎでしょう。

Blenderで減らす必要がありますね。

Naniteにしてみます。

普通に出来ました。

6体並べましたが、別にPCに負担が掛かる事は無かったです。

うーん。

成程。

2.4 撮影した3D Modelをみる

Succeedになっていました。

開いてみました。

何これ?

下から見た図です。

分かりました。

時計の上の部分だけが生成されたんです。

時計の文字なんて全く生成されていません。

これは駄目ですね。

無料版では3/WeeksしかExport出来ません。

これはExportするのは止めておきます。

もっとModelの撮影を試してみます。

2.5 KIRI Engineを使用した感想

思ったよりきれいに表示される事が確認出来ました。

ただこれってPhotogrammetryですよね。

3D Gaussian Splattingでは無いですよね。

その辺はどうなっているのか知りたいです。

Smart Poly氏がScan Anything to Unreal Engine 5 (TUTORIAL) [4]でRealityScanを試していました。

他のAppも試す事にします。

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

もう少しやりたいですが、まだ風邪が治って無いです。

あまり無理は出来ませんのでここで終わりにします。

3.Niagara の勉強

3.1 「16.8 水面のRendering」を勉強する

「16.8 水面のRendering」の勉強と実装をやります。

思ったより簡単そうなので予定した分より少しだけ多くやるかもしれません。

3.1.1 「16.8.1 Levelの作成」を実装する

ではまずMapを作成します。

TemplateはEmptyを選択しました。

名前はFluid Simulationとしました。

Sample Codeと同じにするためにSkylightとVolumetric Cloudだけ追加しました。

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

Directional Lightが無いならこれらのAssetを追加しても意味ないと思います。

NSを配置しました。

何も見えません。

うーん。

止めた。

別なLevelでやります。

以下の要になりました。

真っ暗な所に作成しても??なのでTemplateで全部そろっているのを使用しました。

NSの位置です。

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

これならLevel上から見てもParticleの動きが確認出来ます。

次にCameraを配置します。

Pilot機能を使用して以下のような映像になる位置にCameraをセットしました。

Cameraはこんな感じで配置されています。

Cameraの位置です。

当然Sample CodeのCameraの位置とは違います。

3.1.2 「16.8.2 Render Target、Scene Capture 2Dの追加」を勉強する

Scene Capture 2Dを2個追加するそうです。

これはCameraの代わりに画面ではなくRender Target 2DというTextureに対してRenderingを行っていくものだそうです。

そしてこのRender Target 2Dに対してPost Processを掛ける事でDiffuse LightやSpecular Lightの計算結果をRender Target 2Dに反映させるそうです。

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

次にこれらと対になるRender Targetを作成します。

TextureからRender Targetを選択します。

それぞれRT_WaterDiffuseAndSpecularとRT_WaterThicknessと名付けます。

それぞれ開きSizeを以下のようにセットします。

今度はScene Capture 2DのTexture TargetにそれぞれのRender Targetをセットします。

Scene Capture 2D Diffuse And SpecularではRT_WaterDiffuseAndSpecularをセットします。

Scene Capture 2D ThicknessではRT_WaterThicknessをセットします。

以上でした。

3.2 Scene Capture 2DとTexture Render Target 2Dについて調べる

もう少し教科書を進めようかと思いましたが、Scene Capture 2DとTexture Render Target 2Dというよく知らない機能が出て来たので、これらについて調べる事にしました。

やっぱり焦りは禁物です。

ゆっくりしっかり勉強していくことにします。

<Scene Capture 2D>

まずScene Capture 2Dから調べます。

公式Siteの「1.7 - Scene Capture 2D」[5]です。

これはUE4のDocumentでUE5では同様のDocumentは見つかりませんでした。

以下の解説がありました。

どうもこれを読むとScene Capture 2DはCameraで撮影した映像をMaterialに写し込む機能を持っているようです。

後、こんな質問が公式Forumにありました。

Why doesn’t the Scene Capture 2D camera in UE5 display the Render-Target texture like it did in UE4? [6]です。

UE4ではScene Capture 2D自身をCameraで撮影すると、鏡を重ねた時のような映像を作成する事が出来たのに

UE5では以下のように真っ黒になってしまう。と言う話でした。

これなんかもScene Capture 2Dの機能がCameraで撮影した画像をMaterialに写し込む事であるの証明ですね。

Scene Capture 2Dの機能は理解出来ましたので、今度は一般的な使い方を調べます。

YouTubeで検索しました。

これを見るとScene Capture 2Dのもう一つの使用方法としてWidgetに3DのCharacterを表示するのがあるみたいですね。

最初のTutorialは3分なのでこれを見ます。

UE5 l How to Capture Your Scene in Real Time Using Render Target l 3-Min Tutorial l Unreal Engine 5 [7]を勉強します。

以下のようなSceneが作成されていました。

これの作成方法を勉強するみたいです。

まずMaterialを作成しました。

次はRender Targetを作成しました。

Materialを開きTexture Sampleノードを追加します。

このTexture SampleノードのTextureに先程作成したRender Targetを追加します。

当然ですがこのTexture SampleはBase Colorに繋ぎます。

ActorからBlueprintを作成していました。

BPを開いてScene Capture Component 2Dを追加します。

そしてTexture TargetにRT_Testを追加します。

この設定をする事でCameraで撮影したImageがここにSetされたRender TargetにPassされるそうです。

うーん。

理解した。

今度はPlaneを追加します。

以下のようにCameraの前にこのPlaneをセットしました。

成程。

これで鏡のようになるわけですね。

更にこのPlaneのMaterialに先程作成したMaterialをSetしました。

うん。

もう完全に理解した。

このBPをLevel上に配置しました。

しかしImageのResolutionが低すぎます。

Render Targetを開いて以下の値を変更しました。

「16.8.2 Render Target、Scene Capture 2Dの追加」で、以下のようにRender TargetのSizeの値を変更していましたが、

写ったImageのResolutionを変更していたようです。

結果です。

うーん。

確かに映ったImageは細部まで表示されています。

3.3 UE - Get 3D character into 2D widget [8]を勉強する

もうScene Capture 2DとRender Targetの基本的な使い方は分かったんですが、ついでにWidgetに3D Characterを写す方法も勉強してしまいます。

<Intro>

以下のようなWidgetを作成するそうです。

もう今更Gameを作成しても仕方ない気がします。

もう時代がGameを求めていません。

しかしまあ、Widgetに3D Characterを表す方法には興味があるのでそこは勉強しておきます。

<Setup>

以下の3つを作成する必要があるそうです。

Character Capture BPです。

Scene Capture Component 2Dが追加されています。

このBPが何から作成したのかの説明がありません。

Third Person Character BPのDuplicateしたやつな気がします。

うーん。

微妙に違いますね。

まあ良いです。

2つ目はRender Targetです。

うん。

この辺は普通ですね。

この後で、TutorialではBPのParent Classについて詳しい説明をしていました。

どうやらこのTutorialはSeriesものの一部のようです。

以下のPlayer Character BPから

Proxy Classを作成してそのProxy Classを親にしてBPを作成していました。

なんのこっちゃと言う感じですが、

要は、

  1. このBPにCameraとScene Capture Component 2Dを追加する
  2. このCharacterを撮影してその画像をRender Targetに送る
  3. Render TargetのImageをWidgetに表示

をやっているだけでしょう。

最後のWidget内からRender TargetのImageを受けとる方法だけが分からないです。

やっぱりCameraをセットして

Texture TargetにRender Targetをセットしていました。

しかしこのTutorialを作成している人、バカですか?

このTexture Targetにセットしている箇所の説明をしているのに自分の画像でその部分をほとんど隠してしまっています。

<Render Target>

Render Targetの設定について解説しています。

Sizeの部分だけ変更すれば良いだけです。

Materialの作成はWidgetに表示する場合は要らないのかと思ったらしっかり作成していました。

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

Final ColorはBase Colorの事でしょう。

OpacityにAのOne MinusをPassしています。

Widgetに表示される3D CharacterにBackground Imageが写ってしまったらおかしくなってしまうので、この部分の設定は大切です。

<Widget Design>

Widgetの作成です。

これは普通のWidgetでしょう。

Widgetを開きました。

3DのCharacterが表示されています。

左側を見ると以下のようになっていました。

これは単なるImageのようです。

このImageのImageの設定を見ると以下のようになっていました。

うん。

これってさっき作成していたMaterialだよね。

MaterialをここにSetする事が出来るの?

後はこのGameの設定みたいな話でほとんどWidgetの設定とは関係ない話でした。

うーん。

これだけではWidgetに3D Characterを表示するのは無理かもしれない。

まあ良いです。

今回の目的はScene Capture 2DとRender Targetの基本的な使い方を理解する事です。目的は十分果たせました。

4.Materialの勉強

もうFlagの勉強はしません。

やりたくないのをいくら頑張っても成果は薄いです。

Ben Cloward先生の次のTutorialをやる事にします。

4.1 Procedural Brick Pattern Shader - Advanced Materials - Episode 28 [9]を勉強する

<Intro>

以下のBrick模様を作成します。

Materialの実装もここで表示されていました。

<Benefits>

今回の勉強の肝はこれをTextureを使用しないで作成する事だそうです。

その結果以下のMeritがあるそうです。

この辺は現状のGPUでは全くその通りですが、これからはどうなるんでしょう。

今日、NvidiaのConferenceのVideoを見ていましたが、もうGameなんか全く眼中に無かったです。

これからは「AI一本でやっていこう!」と言う感じでした。

そうなると、これからはAIに特化したGPUが作成されていくようになるわけですが、その場合Textureの読み込みにかかる時間は今よりも早くなるのか遅くなるのか。

その辺の情報も一寸欲しいですね。

<Tutorial>

ここはUnityにおける実装を説明しているのでSkipします。

Unreal Tutorial>

まずTexCoord[0]を以下の値で割ります。

これはWidthとHeightで割っているそうです。

結果にFracノードを追加しました。

うーん。

この時点ですでにBrick感がありますね。

MaskをかけてUとVに分けています。

これはBrickのずれを再現するためにやっています。

Fracノードは可視化のために使用したので実際は以下のようにFracノードを外して繋げます。

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

うーん。

これでズレるのか?

またFracノードを追加して可視化しました。

おお、ズレています。

Brickみたくなりました。

<Rectangle Pattern>

UnityにはRectangleを作成するNodeがあるそうですが、UEにはありません。のでMaterial Functionを使用して自分で作成するそうです。

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

それなりに細かい説明はしていましたがあんまり興味を引く内容では無かったので記録はしません。

実装する時に少しだけ考える事にします。

その時に興味が出てきたら戻って勉強する事にします。

完成したRectangleノードを使用して以下のように実装しました。

結果です。

うーん。

それなりに凄いです。

実装は来週やる事にします。

5.Gaeaの勉強

今週はGaea以外のYouTubeの動画関連の内容もここに記録します。

5.1 Google App作成の顛末を猫ミームで作成します

これはGaeaの勉強とは関係ないですが、先週までシャカリキになってやっていたGoogle PlayのGame作成の顛末を猫Memeで動画にしました。

たった2分半の動画ですが、ものすごく手間がかかっています。

動画の数だけで72個もあります。

Memeの中で使用されている曲はどうするんでしょう。

以下の曲が使用されています。

他の曲も使用していますが、Downloadした元の動画には元ネタが記録されていません。

色んな動画を見ましたが、曲名を記していない動画も結構ありました。

いろんな猫meme動画を調べましたが、My Happy SongとChipi Chipi Chapa Chapaは著作権関係が少し厳しいみたいです。

大体分かりました。

これらの曲は著作権で保護されていて、YouTube上で歌詞を使用したり曲を弾いたりするのは、YouTubeJASRACとの契約でOKですが、録音した曲をそのまま流すのは録音した人が許可しない限り違法だそうです。

そんな危険な行為はしたくないです。

Chipi Chipi Chapa Chapaを歌っていた歌手の人はどんどんMemeに使用してくれ。って言っていましたが、だったら利用可能な曲を自分で歌ってYouTubeに上げてくれ。って感じです。

そうじゃないと怖くて音源を利用する事なんか出来ません。

この2つは別な猫Memeで代用します。

調べた結果、一個を除いて使用されている音楽は著作権のあるものと判明しました。

残った一個のBGMも元の音が不明なだけでおそらく著作物を勝手に使用している可能性が高いです。

これは最初から仕組まれたブームかもしれません。

こんな著作権違反をしまくっても大丈夫なのは、このブームの仕掛け人たちが著作権を管理している団体と最初からつるんでいるとしか考えられません。

その人達の目的と違う事を誰かが猫Memeを使用して行った場合は、すぐに著作権違反で取り締まる事も最初から織り込み済みかもしれません。

BGMは全部消して音源フリーの曲で代用します。

うーん。

考え過ぎかもしれません。

YouTubeを見るとこの曲を使った動画も沢山載っています。

一日考えます。

5.2 Unreal Engine 5.4が公開されました

一応、Downloadしたんですが、まだどんな機能が追加されたのかよく理解していません。

Unreal Engine Public Roadmapを見るとNiagara Fluidsはまだ残っていますね。

一応、開発は継続されてはいるみたいです。

GameFromScratch氏のThe State Of Unreal GDC 2024 in Under 10 Minutes! [10]でUE5.4の発表された内容がまとめられていたので更にこれを以下にまとめます。

Dynamic Tessellationです。

Tessellationが出来るようになったのって5.3からですよね。

ここで紹介されている内容も5.3でも出来ると思っていました。

煙がVolumetric Cloudで作成出来るようになりました。

このお陰で煙や雲自身に影を追加する事が出来るようになったそうです。

今回のもっとも注目すべき内容の一つは以下のMotion Matching Animationです。

何をやっているのかは不明ですが、なんか凄い事をやっています。

PCGについてです。

これ木だけじゃなくてTerrainも変形しているようです。

うーん。

Gaeaを使う必要も無くなるのかも。

PCGで木を生成した後です。

うーん。

凄いけど、OpenAIのSoraを見た時のような衝撃はもうないですね。

UE5.4についてはこれだけでした。

<追記>

pinkpocketTV氏のUnreal Engine 5.4 New Features! Everything New in UE5.4 [12]を見たら更に色々理解しました。

Motion Matching Animation

が何をやっているのか判明しました。

今までUEでCharacterのAnimationを作成するためには以下のようにState Machineを使用してCharacterのMotionのAnimationを追加する必要がありました。

これの進化版がMotion Matching Animationだそうです。

この方法を導入する事でDynamicにCharacterのMotionのAnimationを作成する事が出来るようになるそうです。

更にRetargetingが簡単になった事も語られていました。

これについては別な人が詳しく解説していたのでそれも後でまとめます。

最後にMotion Graphic Toolsについてです。

Motion Graphicって何?と思ってググったら

と解説されていました。

要はAnimationのあるPowerPointです。

これはYouTubeの動画を作るのにものすごく有用になると思われます。

これについては別に勉強する事にします。

Chaos Physics Cloth Editorについても解説していました。

この機能は個人的には興味深いですがいかんせん情報が少なすぎます。

次いでなので、他のUE系YouTuberのUE5.4に関してのまとめもここに記録しておく事にします。

まずUnreal Sensei氏のUnreal Engine 5’s Biggest New Features [13]です。

やっぱりNanite Displacement(Tessellation)から紹介されていました。

以下のLandscapeが

Displacementを使用する事で

以下のようになります。

Unreal Sensei氏の説明なんですが、やっぱりDisplacement自体はUE5.3で導入されています。

それがUE5.4では劇的に改善されたそうです。

その一つがDisplacementをDynamicに行えるようになった事だそうです。

このDynamicがどの部分を指しているのかは不明ですが、CharacterやCamera周りだけDisplacementを生成する事ならUE5.3でも出来たような気がします。

間違っているかもしれません。

先程のLandscapeは最終的には以下のようになりました。

うーん。凄い。

ただSpecular Lightの設定がCG感を増してしまっています。

誰が見ても実際の風景を撮影したのではない事はすぐに分かります。そこが残念です。

UE5におけるDisplacementの使用方法が知りたい方は、Unreal Sensei氏のTutorialでそれを教えるのがあるそうです。

その時に作成したLandscapeが表示されていました。

最初の例は写真と言われても全く疑わないです。

凄い質です。

やっぱりUnreal Sensei氏は凄い!

次はPCGについてです。

これについてはPCG BIOME位しか新しい情報はなかったです。

同じ内容を繰り返してもしかたないので今まで知らなかった情報だけ記録します。

Face Animationが追加された件についてです。

この後、UEFNに新しく追加された機能について解説しています。

まずFirst Person Modeが追加されたそうです。

この辺の情報がどれくらいの精度なのか私は判断出来ません。

次がPhysics Engineが大幅に改善されたそうです。

Server側でPhysicsを管理するようになったそうです。

これで全部のUserが同じ挙動を同時に得る事が出来るようなったそうです。

更に以下のようなPhoto-RealisticなMapを作成する事も可能になったそうです。

これは意味が分からん。

今までのUEFNだって膨大な容量を使用したらPhoto-RealisticなMapは作成出来るはずです。

使用出来る容量が増えたのか、それとも少ない容量でもPhoto-RealisticなMapが作成出来るような技術的な革新があったのかもしれません。

Meta HumanをUEFN内でも使用出来るようになったそうです。

特にMeta Human Animatorを使用出来るようになったので

以下のような表情を作成出来るようになったそうです。

Cloth Editorも追加されたそうです。

うーん。

でも紹介している映像にBPが表示されています。

それよりもこのClothのDesignをするのにMarvel’s Designerが必要だそうです。

調べました。

Marvelous Designerなら有りました。

韓国の伝統衣装のAnimationが紹介されていました。

韓国の会社なのでしょうか?

数年前、Cloth Simulationの世界で物凄い優秀な会社が韓国にあるって聞いた事があります。

多分、この会社でしょう。

何と、UEFNのCreatorは一年間、無料で使用出来るそうです。

うーん。

これは良い事を知りました。

最後にLogoが表示されていました。

やっぱりMarvelous Designerでした。

ただしMeta Humanが使用出来るのはNPCだけだそうです。

VerseのUpdateも行われたそうです。

Scene Graph?が追加されたそうです。

以上でした。

もうかなりお腹いっぱいですが、もう一人Smart Poly氏のEVERYTHING NEW IN UNREAL ENGINE 5.4 [14]も見る事にします。

既に知っている内容は端折って、新しい情報だけ記録します。

Retargetingに関する情報です。

Retargetingの設定を今までは手動で一生懸命やっていたんですが、ほとんどの有名なSkeletonとのRetargetingが一瞬で出来るようになったそうです。

以下のSkeleton Typeが紹介されていました。

  • Mixamo
  • Motion Builder
  • Accents
  • Move AI

MixamoはAdobe社の標準Boneでしょう。

MotionBuilderはAutodesk社の標準Boneなはずです。

Accentsは何の事がまったく分かりません。

Move AIはこれの事でした。

それぞれUEの標準Boneとは違う設定があるようです。

MMDのBoneとの互換性はないんでしょうか?

と言うかMMDの標準Boneの権利って誰が持っているんでしょうか?

後はVulkanのRay Tracingが紹介されていました。

お、これはAndroidにも使用出来るかと思ったらLinuxだけだそうです。

Large World Coordinates On GPUです。

Mapの最大の大きさが21kmから88,000,000kmになったそうです。

21kmって今までそんなに小さかったけ。21x21=441㎞^2か。

日本の大きさが378,000 km²なので余裕で日本全体を収める事が出来るようになったのか。

これって地味に凄い事です。

2024-02-19のBlogで3D Gaussian Splattingの応用にあった

3Dの地図の話にも被ります。

Apple Vision ProもSupportするようになったみたいです。

Apple Vision Proが販売される時、UEは開発Softからハブられている。と言われてましたが、一応は開発出来るようになったみたいですね。

LumenがMobileでも使用出来るようになったみたいです。

これも地味に興味深いです。

せっかくGoogle Developer Accountが残ったので、なんかUEの最新の技術を使用したAppでも公開してみたいです。

Texture Toolsです。

何でしょう。

これってAdobeSubstance Designerみたいな機能なんでしょうか?

Large World Coordinates Networkingです。

これはMulti-PlayerでもLarge World Coordinateが使用出来るようになっているみたいです。

他にも色々述べてましたが、私が重要だと感じたのは以上でした。

6.Houdiniの勉強

6.1 Houdini - Wall Tool 08 [11]を実装する

先週勉強したHoudini - Wall Tool 08 [11]を実装します。

<Random Tint Color>

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

Color Typeの設定をRamp from Attributeに変更しました。

Attributeの値にcolRampと打ちました。

Colorノードの名前をcolor_TintBrickに変更しました。

WallのParameterがあるNodeなので黄色くします。

Loopの最初のNodeを選択しました。

以下の結果になりました。

このNodeのCodeの場所の最後に以下の実装を追加しました。

Color_TintBrickノードのClassをPrimitiveに変更します。

Delete All Existing Color AttributesにCheckを入れます。

結果です。

それぞれのBrickに色がつきました。

色を薄くしました。

今度は前回作成したFractureのシステムにもう少しだけ色々な干渉が出来るように実装を変更します。

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

ここで別の新たなRandomな値を作成します。

Foreach_begin2_metadata1ノードの結果を

このAttribwrangle2ノードの2番目のPinに繋ぎました。

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

Run Overの値をDetail(Only Once)にします。

<Detail Attribute>

Scatter1ノードのForce Total Countに以下の実装を追加しました。

結果です。

うーん。

多分出来てるでしょう。

後、Attribwrangle2ノードの名前を変更しました。

<Randomize the Seed>

Attribwrangle_CrackRatioノードの

CrackRatioの値を以下のように変更しました。

そしてSeedの値を0.768に変更しました。

Scatter1ノードの名前をScatter_randSeedに変更しました。

ここからの手順が前回のBlogには上手くまとめられていませんでした。

以下にまとめ直します。

Scatter_randSeedノードのGlobal Seedを選択して以下に示した

Copy Parameterを選択します。

Attribwrangle_CrackRatioノードに戻って

Paste Relative Referencesを選択します。

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

Global Seedの値を変化させると

亀裂の形状が変化しました。

同じ事をAttribwrangle_randScatterPointsノードにも適用します。

Seedを追加して

Seedの値を以下のようにしました。

結果です。

ScatterするPointも変化するようになっていますね。

これでこのTutorialは終わりです。

今度は花粉症になってしまったのか鼻水が止まりません。更に前からの咳も直って無いのであんまり深く考える事が出来ません。

無理しても仕方ないのでこの位で終わりにします。

7.UEFNの勉強

7.1 HOW TO ANIMATE YOUR CUSTOM PET - Fortnite UEFN / Creative 2.0 Tutorial [15]を勉強します

<Intro>

以下のCharacterが動いています。

NPCを動かす方法でも勉強するんでしょうか?

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

<Creating our Freddy Prop>

前回作成したDebbyをDuplicateして

Freddyを作成しました。

うーん。

これは単なるBlueprintでしょう。

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

Static Meshを消してSkeletal Meshを追加します。

Skeletal Mesh AssetにGlamrock_Freddyを追加します。

<Creating Cine Sequence Devices>

このBPとCinematic Sequence Deviceを

Level上に配置します。

このCinematic Sequence Deviceの名前をIdle Animationに変更しました。

Duplicateしました。

DuplicateしたCinematic Sequence DeviceはFreddy Running Animationと名前を変更しました。

<Creating Animation Sequences>

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

名前はFreddy Idleとしていました。

Duplicateしています。

2つ目はFreddy Moveと名付けていました。

Freddy Idleを開いてFreddyを追加しました。

Track、AnimationからGlamrock_Freddy_Anim_RIG_Glamrock_Freddyを選択します。

どっちも同じ名称だと思ったら2番目の手を振っているのを選択していました。

赤いBarはどこまでAnimationをPlayするかを指定しているそうです。

それをAnimationの一番最後にセットしていました。

同様の設定をもう一つのLevel SequenceであるFreddy Moveにもします。

Cinematic Sequence DeviceのIdle Animationを選択して

SequenceにFreddy Idleをセットしました。

8秒以上経っている場合もあるかもしれません。

その場合を想定してLoop PlaybackにCheckを入れます。

同様の事をCinematic Sequence DeviceのFreddy Run Animationにも行います。

SequenceにFreddy Moveをセットして

Loop PlaybackにCheckを入れます。

<Setting Up Creative Prop in Verse and Cinematic Sequence>

いきなりVerseのCode画面に飛びました。

しかも以下のCodeが既に実装されています。

どうもこれは前にFreddyのAnimationを作成した時のCodeのようです。

その時はVerse上でDebbyをSpawnしましたが、2つ以上のAnimationを作成する時はVerse上でNPCをSpawnすると動かなくなるそうです。

ので以下の実装を追加するそうです。

お、名前が見えました。

このDeviceの名前はSpawn_pet_deviceでした。

SpawnDebby()関数は消します。

そしてStart Following Player()関数を新たに作成します。

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

うん。

話のつじつまが合わない理由が分かりました。

このTutorialのSeriesには入ってないんですが、このTutorialの前に以下のSpawn Custom Petsと言うTutorialがありました。

これを先に勉強してその続きがこのTutorialだったみたいです。

前のTutorialを開いたらVerseのDeviceの名前がSpawn_pet_deviceになっていました。

このTutorialに出て来た最初のVerseのDeviceの名前も

です。

これは間違いないです。

7.2 Spawn Custom Pets / Props in Fortnite - UEFN / Creative 2.0 [16]を勉強する

そう言う訳で、急遽予定を変更してSpawn Custom Pets / Props in Fortnite - UEFN / Creative 2.0 [16]を勉強する事にしました。

<Intro>

上手くScreenshotは取れなかったですが、Playerのいる場所にPropをSpawnさせていました。

このTutorialではこの機能を追加するみたいです。

<Setting up Custom Prop>

以下のPropを用意していました。

このTutorialでは何故かこれらのPropをPetsと呼んでいます。

作り方は極めて基本的でPropからBPを作成して

以下のようにStatic MeshをComponentに追加しているだけです。

今回はDebbyを使用するそうです。

<Setting up Signal Remote Manager / Signal Remote Spawner>

Signal Rem… ManagerをLevel上に配置しました。

Signal Remote AもLevel上に配置しました。

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

Signal Remote Managerの名前をSpawn Eggに変更しています。

Signal Remote TierをUncommonに変更しました。

<Creating Verse Device>

新しいVerse Deviceを作成しています。

Verseを開きました。

<Exposing Remote Manager and Creative Prop in Code>

まずCharacter Moduleを追加します。

そしてSignal_remote_manager_device型のSpawnEggを初期化します。

もう流石にこの宣言の仕方にも慣れました。

更にCreative_prop_asset型のDebbyAssetも初期化しました。

SpawnDebby()関数も作成しました。

Player型のArrayの変数であるPlayersも作成しました。

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

<Subscribing on Remote Press>

そしてSubscribe()関数を追加しました。

<Creating Spawn Prop Function>

SpawnDebby()関数の実装を作成しました。

Playerの位置から3m離れた場所にSpawnします。

Rotationの値がEmptyなのはDebbyがSphereだから向きが関係ないからでしょうか?

<Setting up Devices in Editor>

BuildしてDeviceをLevel上に配置しました。

以下のようにセットしました。

<Result 1 (Testing Spawns)>

テストしています。

普通に出来ています。

<Creating Pet Follow Player Function>

今度はこの生成されたDebbyがPlayerを追いかけるようにします。

またVerseに戻って以下の関数を宣言しました。

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

<Controlling Pet's Speed>

DebbyのSpeedを変化させます。

Playerが近くにいる時はゆっくり近づき、遠くにいる時は急いて移動します。

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

うーん。

これTimeなの?

これだと、距離が変わっても速度が同じになってしまうんじゃないの?

うーん。

まあいいや。

実装するときにCreativeProp.MoveTo()関数の三番目のParameterの意味を確認します。

CreativeProp.MoveTo()関数の三番目のArgumentをTimeに変更しました。

<Getting Creative Prop Instance from Spawn Prop Function>

SpawnDebby()関数内から

PetFollowPlayer()関数を呼びます。

ここで一個問題があります。

PetFollowPlayer()関数の三番目のParameterはCreative_prop型です。

しかし以下に示した様にDebbyAssetはCreative_prop_asset型なんです。

でこの問題を解決するために以下の方法をとります。

まずSpawnProp()関数を利用します。

SpawnProp()関数のDigestを開くと以下のように書かれています。

ここにあるTupleはReturn Valueの事です。

そしてTupleは単なるContainerでその中にcreative_propが入っています。

これを取り出せばCreative_prop型のDebbyAssetを得る事が出来ます。

そのためにSpawnProp()関数の結果をResultで得るようにCodeを変更します。

そして以下の実装でSpawnProp()関数のReturn Valueの最初のMemberの値を得ます。

まず?ですが、これはそもそもTupleにあるCreative_propがOptionalなので無い場合もあります。

それを示しているのが、Digestに載っていた以下の部分で

Creative_propの前に?がついている事です。

この場合は、Result(0)の後に?をつける必要があります。

その次にCreative_propはTupleの最初のMemberなので0で指定します。

ただしTupleなのでParentheses ()を使用します。普通のArrayのようにBracket[]は使用しません。

だそうです。

Tupleってそういう意味だったのか。

このTutorialの方がその辺のC++の教科書より分かり易いTupleの説明をしていました。

そして以下のようにPetFollowsPlayer()関数を追加しました。

Errorになっています。

これはPetFollowPlayer()関数にSpecifierでSuspendsが指定されているにもかかわらず、この関数を呼び出すSpawnDebby()関数にはSuspendsが無いからだそうです。

以下のようにするとこの問題は回避できます。

うーん。

今回のTutorialはかなり勉強になります。

<Random Tanget I Had lol

特に重要な内容は無いです。

Signal Remote Aの以下のParameterの値を変更したそうです。

更にSpawn EggのCooldown Timeの値も0にしました。

<Final Result>

テストしています。

Debbyは移動していますが非常に遅いです。

<Giving Pet Speed III Potion>

Speedを900に変更しました。

<Final Result>

もう一回テストしています。

今度はDebbyの動きが速すぎてほとんど一体化しています。

以上でした。

実装は来週やります。

8.DirectX12の勉強

8.1 Fence & Command List | D3D12 Beginners Tutorial [D3D12Ez] [16]を勉強する

前回の勉強で Device & Command Queue | D3D12 Beginners Tutorial [D3D12Ez] [17]の実装が終わったので、今週からその次のTutorialであるFence & Command List | D3D12 Beginners Tutorial [D3D12Ez] [16]を勉強します。

まずDeviceとCommand QueueとFenceがCPUとGPUの関係においてどう動くのかをSynchronizationの観点から説明するみたいです。

Lötwig Fusel氏の話は抽象性が高くて、何が言いたいのかを把握するのが結構大変です。

とりあえず話を聞いてみます。

まず一般的な場合の、CPUとGPUのSynchronizationがどうのように働いているのかを説明するそうです。

GPUは一個のCommand Queueを実行するそうです。

この時にCommand Queueにある仕事を実行する事が出来る準備が整っているのかを確認する必要があります。

ここから一寸、曖昧な理解になってしまいますが、Command Queueが何かを実行したらFenceにある値をセットするそうです。

そのFenceの値を見て、Command Queueが実行されたかどうかを確認する。

こんな感じの内容と理解しました。

うーん。

Fenceってそんな働きだったでしたっけ。

確認します。

2023-10-15のBlogでFenceについて勉強していました。

DirectX 12の魔導書」の「3.4.2 Fence」のところです。

これを読むと、Fenceの機能はGPU側の処理が終わった事を教える事のようです。

そしてその具体的なやり方はGPU側の処理が終わるとFenceがある値をIncrementします。

CPU側はその値を確認する事でGPU側の処理が終わった事を確認出来るようになります。

はい。

大体こんな感じでした。

このTutorialにおけるFenceの説明を私なりにまとめた内容をもう一回見直します。

うん。

あってますね。

続きを聞く事にします。

この後、Singalを発してとかの具体的は解説をしていました。

この辺の実装は非常に複雑で2023-10-15のBlogを読み直しても、何をやっていたのか思い出せません。

実際に実装する段階になったらしっかり復習する事にします。

Signalを待つ関数でしょうか?

SingalAndWait()関数を宣言しました。

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

しかし赤で囲った部分はOSの観点から言うとあまり良い方法ではないそうです。

その理由についても簡単に説明していましたが、こんな感じです。

GPU側の作業が終わるまで、このThreadはやる事が無い。その間CPU側の作業を減らすために、このThreadは眠らせておく。

しかしただ眠らせておくとGPU側の作業が終わった時にも眠ったままになる危険がある。

GPU側の作業が終わった時にはこのThreadが目覚めるように(目覚まし時計)をかけておく。

よく分からないので直した新しい実装だけ以下に示します。

Handle型のEvent Classを作成します。

名前はm_fenceEventです。

そして以下の箇所にCreateEvent()関数を作成しました。

そしてShutdown()関数で作成したEventをReleaseします。

これはCloseしているだけなのかな。

もうC++分からないです。

そしてSingal And Wait()関数の実装を以下のようにしました。

これだとずっと待ってる事になる気がしますが。

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

うーん。

分からん。

丁度、Tutorialが10分だったので今週の勉強はここまでにします。

この実装の内容については来週検討します。

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

8.2.1 前回の復習

「4.8.5 Blend Stateの設定」を読んでいました。

Blend Stateとは生成されたFragmentをどのようにBlendするのかを指定しています。

その中でAlphaテスト、D3D12_BLEND_DESC structure、D3D12_RENDER_TARGET_BLEND_DESCについても解説していました。

AlphaテストはそのFragmentのAlphaの値が0だった場合そのFragmentを破壊してしまうそうです。

8.2.2 「4.8.5 Blend Stateの設定」を実装する

ここで実装するのは以下の部分だけです。

自分のProjectで確認するとこの部分の実装の前の部分の以下のCodeの部分がまるまる抜けています。

Blogを読み直して確認したら「4.8 Graphic Pipeline Stateの作成」を全部読んでからまとめて実装する予定だったみたいです。

成程。

では一端、実装は中止して「4.8 Graphic Pipeline Stateの作成」の残りを勉強する事にします。

8.2.3 「4.8.6 Input Layoutの設定」を勉強する

今度はD3D12_GRAPHICS_PIPELINE_STATE_DESC structureのInput Layoutの設定についてだそうです。

公式SiteのD3D12_GRAPHICS_PIPELINE_STATE_DESC structure (d3d12.h)[18]には

InputLayoutに関して以下の記述がありました。

では公式SiteのD3D12_INPUT_LAYOUT_DESC structure (d3d12.h) [19]を見てみます。

2つしかMemberがないんですね。

それぞれのMemberについては以下のように説明していました。

Sample CodeのInputLayoutの実装です。

ここで教科書ではInputLayoutは既に設定しているのでそれをここで使用します。

と書かれていました。

うーん。

調べたら確かに実装していました。

「4.7.1 D3D12_INPUT_ELEMENT_DESC構造体」で実装していました。

もう、節が一個前の作業も忘れてしまっています。

ジャングルで迷子になった感じです。

今度はIBStripCutValueです。

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

ここが何をやっているのか教科書の説明を読んだんですが、結構複雑です。

Triangle ListとTriangle Stripについての説明があってTriangle Stripの方が効率が一見良いですが、効率良くない場合もあって、その部分だけTriangle Listに切り替える場合に使用するそうです。

今回は当然使用しないので上記の設定になります。

PrimitiveTopologyTypeです。

PrimitiveのTypeは点、線、そして三角形だそうです。

ここでは三角形を指定しています。

8.2.4 「4.8.7 Render Targetの設定」、「4.8.8 Anti-AliasingのためのSample数設定」そして「4.8.9 Graphic Pipeline State Objectの生成」を勉強する

この辺は短いので一気に勉強してしまいます。

<「4.8.7 Render Targetの設定」>

これは現状では1しかないそうです。

更にRender TargetのFormatを指定します。

<「4.8.8 Anti-AliasingのためのSample数設定」>

教科書ではAnti-Aliasingはしないので以下の設定にしろ。で終わっていました。

<「4.8.9 Graphic Pipeline State Objectの生成」>

これでGraphic Pipeline State Objectを生成するために必要なものはSignatureを除いて全て完成したので、Graphic Pipeline State Objectを生成するそうです。

やり方はID3D12PipelineState型のObjectを以下のように宣言して

CreateGraphicsPipelineState()関数で初期化します。

以上でした。

これでやっと「4.8 Graphic Pipeline Stateの作成」の勉強が終わりました。

来週、「4.8 Graphic Pipeline Stateの作成」を実装します。

9.まとめと感想

特にないです。

10. 参照(Reference)

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

[2] Dusty PIxels. (2023, August 17). 3D Scanning into Unreal Engine 5: Kiri Engine Workflow Tutorial [Video]. YouTubehttps://www.youtube.com/watch?v=Zwk3Me6wnc0

[3] JSFILMZ. (2023, June 2). 3d scan to Unreal Engine 5.2 using Android Phone [Video]. YouTubehttps://www.youtube.com/watch?v=nBGF_jUN0GE

[4] Smart Poly. (2023, July 22). Scan anything to Unreal Engine 5 (TUTORIAL) [Video]. YouTubehttps://www.youtube.com/watch?v=wajCJvSTnOQ

[5] 1.7 - Scene Capture 2D. (n.d.). Unreal Engine 4.27 Documentation. https://docs.unrealengine.com/4.27/en-US/Resources/ContentExamples/Reflections/1_7/

[6] Why doesn’t the Scene Capture 2D camera in UE5 display the Render-Target texture like it did in UE4? (2022, April 16). Epic Developer Community Forums. https://forums.unrealengine.com/t/why-doesnt-the-scene-capture-2d-camera-in-ue5-display-the-render-target-texture-like-it-did-in-ue4/530139/1

[7] Coreb Games. (2022, August 16). UE5 l How to Capture Your Scene in Real Time Using Render Target l 3-Min Tutorial l Unreal Engine 5 [Video]. YouTubehttps://www.youtube.com/watch?v=c4YCMK9L9qI

[8] Unreal game dev with Yaz. (2023, January 24). UE - Get 3D character into 2D widget [Video]. YouTubehttps://www.youtube.com/watch?v=QjIMXIsT3ew

[9] Ben Cloward. (2023, November 2). Procedural Brick Pattern Shader - Advanced Materials - Episode 28 [Video]. YouTubehttps://www.youtube.com/watch?v=7UelK8pouFE

[10] Gamefromscratch. (2024, March 20). The state of unreal GDC 2024 in under 10 minutes! [Video]. YouTubehttps://www.youtube.com/watch?v=eF5arWfzP2k

[11] Rick Banks. (2022, June 21). Houdini - Wall Tool 08 [Video]. YouTubehttps://www.youtube.com/watch?v=syK94wp3HHg

[12] pinkpocketTV. (2024, March 22). Unreal Engine 5.4 New features! Everything new in UE5.4 [Video]. YouTubehttps://www.youtube.com/watch?v=Qtzsmpyc0EA

[13] Unreal Sensei. (2024, March 21). Unreal Engine 5’s biggest new features [Video]. YouTubehttps://www.youtube.com/watch?v=6VFSg6Ad8Ns

[14] Smart Poly. (2024, March 21). EVERYTHING NEW IN UNREAL ENGINE 5.4 [Video]. YouTubehttps://www.youtube.com/watch?v=233cdsSz3iE

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

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

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

[18] 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

[19] Stevewhims. (2024, February 22). D3D12_INPUT_LAYOUT_DESC (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ns-d3d12-d3d12_input_layout_desc

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

1.今週の予定

今週は先週出来なかったHoudini、UEFN、そしてDirectX12の勉強を先にやります。

Google Appの記録>

Google AppはInstall出来るが開かないと非承認になってしまっています。

しかしそのGoogleの別なテストでは、6台の携帯で問題なく動いている事がVideoの映像付きで証明されています。

外部に依頼したテストでも普通に動く事が確認出来ました。

もうAccountは消されてしまうでしょうが、証拠としてこの映像のScreenshotだけはここに記録しておきます。

<Houdiniの勉強>

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

<UEFNの勉強>

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

<DirectX12の勉強>

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

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

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

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

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

Niagara の勉強>

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

<Materialの勉強>

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

<Gaeaの勉強>

GaeaのTutorialを作成します。

2.Google Appの記録

Google AppはInstall出来るが開かないと非承認になってしまっています。

しかしそのGoogleの別なテストでは、6台の携帯で問題なく動いている事がVideoの映像付きで証明されています。

もうAccountは消されてしまうでしょうか証拠としてこの映像のScreenshotだけはここに記録しておきます。

Release前のReportに載っているTest Deviceです。

それぞれに動いている様子を撮影したVideoが載っていました。

それもScreenshotを取っておきます。

Google Pixel 7>

まず以下の試験の条件が表示されます。

次にLoad中の画面が表示されます。

GameのStart画面です。

Start Buttonを押してGameを始めています。

テストでは画面を押す事しか試していないので車が進む事はありませんでした。

おそらくAIがテストしているのだと思われます。

Pause Buttonを押して以下のPause画面を開きました。

Pause画面も問題なく開ける事が判明しました。

この後、Game画面が終了して最初の画面に戻りました。

Google Pixel 6>

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

中のMessageが変わっています。

成功したと出て来ています。

開始画面に戻ってしまいました。

動かなかったのかと一寸焦りましたが、

直ぐに以下の画面が開きました。

そして以下のGameのStart画面が開始しました。

そしてGameが開始しています。

ここでも画面を押す事しかTestしていないので車は移動しません。

偶然なのかどうかわかりませんがPause Buttonを押して以下のPause画面を開きました。

まだ携帯の開始画面に戻りました。

終了して最初の画面と同じのが表示されました。

Google Pixel 5>

最初の画面です。

これはSDKのVersionが30ですね。

いきなりLoad中の画面が表示されました。

すぐにGameのStart画面が表示されました。

Start Buttonを押してGameが開始しました。

Pause Buttonを押してPause画面を開きました。

Gameが終了して以下の最初の画面に戻りました。

Motorola Motorola G20

今度はMotorola社製の携帯でテストしています。

Load中の画面になりました。

GameのStart画面に切り替わりました。

GoogleのPixel Seriesよりは読み込みに時間がかかった気はします。

にしても一瞬です。

これで問題になるとは思えません。

Gameが開始しました。

ここでも画面をClickしているだけなので車が進む事はありません。

何とここでBrake ButtonをClickしていました。

車のBrak Lightが一瞬光るのが確認出来ました。

Brak Buttonもしっかり機能しています。

Pause Buttonを押してPause画面を開きました。

Gameの終了を押して最初の画面に戻りました。

Google Pixel 5 64bit Only (SDK34)>

これ2つ同じ名前のがありました。

よく比較したらSDK Versionが34と33になっていました。

こっちはSDKのVersionが34になっています。

いや、対象SDK、33までと指定しているんですけど。

なんかいい加減な試験をやっている気がします。

まあこのGameはAndroid 14でも動くのは確認出来てるので問題ないですけど。

最初の画面です。

ここでは以下の画面が最初に表示されていました。

ただしこれも一瞬です。

そしてLoad中の画面に変更されました。

Start画面が表示されました。

Game画面が表示されました。

Pause画面が表示されました。

Pause Buttonを押した様です。

最初の画面に戻りました。

Google Pixel 5 64bit Only(SDK 33)>

最初の画面です。

SDKのVersionが33になっています。

以下のIconが一瞬表示されて

Load中の画面になりました。

Stat画面が開始しました。

Gameが開始しました。

Pause Buttonを押してPause画面を開きました。

なんとここでまたGame画面に戻っています。

どうやら戻るButtonを押したみたいです。

またPause画面を開きました。

またGame画面に戻っています。

今度はBrake Buttonを押しています。

Brake Lightが光っています。

何でこのTestだけ挙動が違うんでしょうか?

最初にテストしたんでしょうか?

またPause画面を開きました。

でもまたまたGame画面に戻っています。

この後も色々やっていました。

動画の最後でやっとPause画面にあるGameの終了Buttonを押しました。

そしてGameが終了しました。

最初の画面に戻りました。

Release前Reportの概要の欄に

6種類のDeviceでテストしました。と書かれていて

問題が発生しなかったDeviceに6種類表示されているという事は

全部普通に動いていたという事でしょう。

前回拒否された原因は以下のように書かれていました。

今回のUpdateはSDKのVersionを34から33に指定し直した事と、Load画面にLoad中の文字を追加しただけです。

前回の時もきちんと動いてたんじゃないでしょうか?

これ本当にテストしているのか疑問に感じます。

前回、非承認になった時のテスト結果です。

ここでは5種類のDeviceでテストしたとありました。

もしかすると沢山テストして動いたDeviceだけここに表示しているのかもしれません。

なんとも言えませんね。

兎に角、今の環境では無料もしくは普通に払える金額においてこれ以上の機種でテストする事は出来ません。

これだったらAppleに毎年お金を払った方が安上がりです。

この辺で中止します。

3.Houdiniの勉強

3.1 前回までの復習

2024-02-19のBlogを見ると Houdini - Wall Tool 07 [2]の実装まで終わっていました。

次のTutorialを勉強する事にします

3.2 Houdini - Wall Tool 08 [3]を勉強する

何でしょうか?

Commentが2つしかありません。

なんか悲しいです。

<Random Tint Color>

RandomなTint Colorを追加するそうです。

Tintって色って意味だと思っていましたが、この文脈からすると違うみたいですね。

Googleの検索では以下のように出て来ました。

これはNounですが、やっぱり色って意味で使用しています。

こっちに専門的な説明がありました。

色に白を追加して色を変化させる事をTintと言うそうです。

逆に黒を追加して色を変化させる事をShadeと言うそうです。

うーん。

これがShaderの語源だったのか。

初めて知った。

Colorノードを追加します。

Parameter Paneに表示されている以下のColor Typeの値をRamp from Attributeに変更します。

AttributeにはcolRampと打ちます。

このAttributeは後で作成するんでしょうか?

ここで以下のBarの説明をしていました。

ここの指定に沿ってcolRampの値が0のは黒、1のは白をセットするそうです。

名前をColor_TintBrickとします。

WallのParameterがあるNodeなので黄色くします。

Loopの一番最初のNodeを選択して

以下のBrickを表示しました。

このNodeのCodeの場所の最後に以下の実装を追加しました。

Float型の新しいAttributeを作成しています。名前はcolRampですね。

値はRandomに指定されています。

Color_TintBrickノードに戻って来ました。

ClassをPrimitiveに変更します。

Blockには何の変化も起こりません。

ここで以下のAttributeにCheckを入れます。

結果です。

おお、色が現れました。

色をマイルドにして完成だそうです。

今度は前回作成したFractureのシステムにもう少しだけ色々な干渉が出来るように実装を変更します。

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

ここで別の新たなRandomな値を作成するそうです。

そのために以下のNodeの結果を

先程作成したAttributewrangle2の左から二番目のPinに繋ぎます。

ここで何をしたいのかが分かりました。

このすぐ下に配置されているScatterノードでBrickをScatterする値をここでRandomにしてScatterされる数をそれぞれのBrickによって変えるんです。

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

Integer型の新しいAttributeを作成していますね。

名前はnumScatterPointsとなっています。

Randomな値を生成するために、ここでMetaDataで作成されたIterationを使用しています。

TutorialによるとこのCodeは間違いだらけで動かないそうです。

正しいCodeを以下に示します。

まずRand()関数は0~1の間の値を生成します。

うーん。

確かに言われてみるとその通りです。

しかしScatterノードで欲しいのは整数の値です。

しかもここで作成したAttribute、numScatterPointsはInteger型です。

でその矛盾を直すのに使用したのがFit01()関数だそうです。

この関数を上記のようにしようすると、0~1の間の値を指定した整数の間の値に変換してくれるそうです。

上記の例では3~6の間に変換しています。

しかしTutorialの説明だとこれでもまだ不完全だそうです。

それは3.5のような整数でない値もFit01()関数は生成するからだそうです。

整数にCastする必要があります。

こんだけでした。

まあ、そうは行ってもC言語風の言語なのでこういう部分が厳密に作成されているのは気持ち良いです。

この状態では全てのPointにこの計算が適応されますが、この値は一回計算されれば良いそうです。

うーん。

一寸この部分、具体的なImageが湧きません。

とりあえずその部分を直すのに以下に示したRun Overの値をDetail(only once)に変更します。

<Detail Attribute>

Scatter1ノードのForce Total Countに以下の実装を追加しました。

Attribwrangle2ノードの名用をAttribwrangle_randScatterPointsに変更しました。

結果を確認しています。

それぞれのBrickでCrackの数が違っています。

<Randomize the Seed>

もう一個追加したいParameterはSeedのRandom化です

これは実装は簡単だそうです。

以下に示した様にAttribwrangle_crackRatioノードの実装の

crackRatioの初期化の実装の最後を

以下のように変更します。

そして以下のButtonを押します。

以下のように新たにSeedのBarが追加されました。

Scatter1ノードの名前をScatter_randSeedに変更しました。

そしてGlobal SeedをCopy Parameterを使用してCopyします。

Attribwrangle_crackRatioノードに戻ります。

Seedの値をPaste Relative Referenceを使用して以下のように設定します。

この状態でScatter_randSeedノードのGlobal Seedの値を変更すると

Blockのひび割れがRandomに生成されるようになりました。

以下にいくつかの例を示します。

うーん。

ひび割れがRandomになっていますね。

更に同じ事をAttribwrangle_randScatterPointsノードにもする事が出来ます。

Attribwrangle_randScatterPointsノードのVEXpressionにある

NumScatterPointsの値の決定方法を以下のように変更します。

Seedを使用して値を変更します。

Seed Barを生成しました。

このSeedの値に

Paste Relative Referenceを使用して

以下のようにしました。

これでScatterするPointもScatter_randSeedノードのGlobal Seedから変更する事が出来るようになりました。

これで終わりでした。

4.Google App続き

なんと承認されました。

何の連絡も無かったんですが、Homeに入ると製品版の表示に代わっています。

Dash Boardに移動すると以下の表示になっていました。

Google Playで表示をClickします。

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

前の表示と変わっています。

携帯のGoogle PlayからこのAppを探してみます。

うーん。

ありません。

テスト用のApp名を打ち込むと出て来ました。

あれ?まだテスト用のままになっています。

製品版のリリースダッシュボードを見ると以下のように

3月11日に公開と書かれていました。

リリースの概要を見ると3月10日に内部テストとして公開して同じAAB fileを3月11日にGoogle Playで完全公開したとありました。

うーん。

まだ承認された3月11日の方のAppの公開はGoogle Play Storeには反映されてないみたいですね。

しかしGoogle Playで公開とここに記されているので、2,3日経ったら置き換わるでしょう。

14日を過ぎても変わってなかったらGoogleに問い合わせます。

まあ、これでAppは完成した。とします。

これで私のDeveloper Accountも消される事は無いでしょう。

もし万が一消されたら、このScreenshotを証拠にしてGoogleに抗議して復活してもらうようにします。

5.UEFNの勉強

5.1 前回の内容を復習する

 2024-02-19のBlogを見ると CUSTOM CAMERA IN FORTNITE - UEFN / Creative 2.0 Tutorial [4]を勉強していました。

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

5.2 CUSTOM CAMERA IN FORTNITE - UEFN / Creative 2.0 Tutorial [4]を実装する

<Intro>

特にやる事はないです。

UEFNを開きます。

久しぶりにUEFNを起動します。

何も変わってないですね。

久しぶりにおもちゃ箱を開いた気分です。

<Creative Prop / Camera Perspective Setup>

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

BPをPropから作成しました。

名前はCamera Containerとしました。

このBPを開いてComponentsにCineCameraを追加しました。

このBPをLevel上に配置しました。

更に以下の箇所から

新しいCine Camera ActorをLevel上に配置しました。

これで2つのCameraが配置された事になります。

今度はCamera ContainerのCameraを消してSphereを配置しました。

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

Cameraの位置を調整しました。

こんな感じで写っています。

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

もう少しCameraの位置を下げる事にします。

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

<Create Cinematic Sequence>

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

以下のようにCameraがCameraContainerにAttachしました。

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

名前はTop Cameraです。

更にCameraContainerにAttachしたCameraの名前をTopCameraに変更しました。

このLevel SequenceのTopCameraを開いてCameraのTopCameraを追加しました。

ここで突然、新しいVerseのFileを作成しています。

作りました。

<Creating Reference to Camera Prop in Verse>

まずModuleを2つ追加しました。

以下の2つのModuleを追加しました。

using { /Fortnite.com/Characters }

using { /UnrealEngine.com/Temporary/SpatialMath }

Blueprint用の変数を作成しました。

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

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

<Creating Move Camera Function>

MoveCamera()関数を作成します。

<Getting Angle / Creating Rotation>

今度はAngleとRotationを取得します。

<Calling Move To Function>

以下のConstantを作成しIf節を追加しました。

OnBegin()にMoveCamera()関数を追加します。

これでVerseの実装は完成です。

<Setting up Device in UEFN>

Level内の設定をやります。

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

しました。

<Setting up Cinematic Sequence Device>

Cinematic Sequence Deviceを配置します。

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

<Final Result>

2024-02-19のBlogはこれで完成です。

テストしてみます。

あ、Sphereがあります。

これは消してしまいましょう。

結果です。

一応、Top Viewになりました。

しかし操作はSmoothではないです。

一応出来たという事ですね。

6.DirectX12の勉強

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

6.1.1 前回の復習をする

  2024-02-19のBlogを見ると Device & Command Queue | D3D12 Beginners Tutorial [D3D12Ez] [5]を実装していました。

その後でDevice & Command Queue | D3D12 Beginners Tutorial [D3D12Ez] [5]の続きを勉強していました。

今週はこれの実装をまずやる事にします。

6.1.2 Device & Command Queue | D3D12 Beginners Tutorial [D3D12Ez] [10]の続きを実装する

Main.cppの実装に戻りました。

DXContent.hをIncludeします。

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

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

うーん。

具体的に何をしているのか分かりませんね。

Tutorialを見て確認します。

Break Pointを以下の箇所にセットして

実行していました。

Errorが無い事を確認して終わっています。

その後で、DXContext ::Shutdown()関数の実装をComment Outして

Errorが起きる状態にしてもう一回実行しています。

すると以下のMessageが表示されました。

うーん。

これを試してみますか。

DXContext::Shutdown()関数をみます。

なんじゃこれ?

何でこんなにたくさんの実装が既に追加されているの?

 2024-02-19のBlogを見ると

と書かれていてどうやらSample CodeをそのままCopyしたのでTutorialと違う実装になったみたいです。

まあ良いです。

とりあえずm_device.Release()だけComment Outします。

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

この警告はTutorialで表示されたのと同じですね。

ただm_device.Release()のComment Outを外しても

と表示されていました。

うーん。

気にしないで先に行きます。

以下の解説をしていました。

この部分はもう一回勉強する事にします。

しました。

要するに3点中継する事で、Multi-Threadに対応しているって事です。

具体的にどうやって対応しているのかまでは分かりません。

次に進みます。

DXContext.h Fileです。

CommandQueue型の変数を作成しています。

既に作成してありました。

この辺は前回、適当にSample Codeを丸Copyしたので既に追加されている部分が沢山あります。

軽くCheckして先に進みます。

今度はDXContext.cpp Fileの実装です。

M_Deviceからm_cmdQueueを初期化しています。

ただしTutorialでは以下のようにM_Deviceを初期化したIf節内で実装しているのに対して、

Sample Codeでは以下のように別々に実装しています。

前回勉強したのはここまででした。

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

DXContext.cppのShutdown()関数にCommand QueueのRelease()関数を追加します。

次はFenceを作成しました。

そして以下の実装でFenceを初期化しました。

今度は以下のInlineを追加しました。

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

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

次にCommand Queueでも同じことを作成しました。

これでこのTutorialは終わっています。

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

6.2.1 前回の復習

前回、何を勉強したのか全く覚えていません。

その復習からやります。

「4.8 Graphic Pipeline Stateの作成」を勉強しています。

ただし「4.8 Graphic Pipeline Stateの作成」は非常に長い節なので、何回にも分けて勉強するそうです。

前回は「4.8.4 Sample MaskとRasterizerの設定」を読んだところで終わっていました。

6.2.2 「4.8.5 Blend Stateの設定」を読む

この節は数Pageにわたって解説があるので今週はこれを読む事にします。

BlendStateについて解説しています。

公式SiteのD3D12_BLEND_DESC structure (d3d12.h) [6]には以下のようにまとめられていました。

教科書ではここでAlphaテストについて解説しています。

DirectXではPixelのAlpha値が0の場合、そのPixelを破壊してしまうそうです。

そのためAlpha値が0かそうでないかを調べる必要があります。これがAlphaテストだそうです。

これPixelじゃなくてFragmentでしょう。

Pixelはその後ろに何も無いです。

Fragmentはその後ろにもFragmentがあります。

Fragmentを重ねて一個の列になったのをPixelっていうのが正確な言い方のはずです。

AlphaToCoverageEnableがこのAlphaテストを行うそうです。

IndependentBlendEnableにTrueをSetすると8個あるそれぞれのRender TargetのBlend Targetをそれぞれ指定する事が出来るようになるそうです。

3つ目のMemberであるD3D12_RENDER_TARGET_BLEND_DESCについても解説していました。

公式SiteのD3D12_RENDER_TARGET_BLEND_DESC structure (d3d12.h)[7]の説明です。

これを8個作成するの?

教科書にこの答えが書かれていました。

IndependentBlendEnableにTrueを指定した場合は、その通りでこれを8個それぞれ作成する必要があります。

IndependentBlendEnableにFalseを指定した場合は、一個作成したらそれが8個全部に適用されるそうです。

D3D12_RENDER_TARGET_BLEND_DESCでは沢山のMemberがありますが、指定しているのは描画先のImageとこれから描画するImageをどのようにBlendするかを指定しているだけだそうです。

今回はBlendを行わないそうなので、教科書ではその場合の設定に必要な最低限の解説だけしてありました。

その解説を読んだ限りでは、GaeaのCombineノードの設定方法とそっくりな印象を受けました。

<Blend処理の設定>

今回はBlendを行わないので、Blendを行う場合の解説はしないのかと思ったらしっかりここで解説するそうです。

まずBlendOpEnableをTrueにした場合です。

D3D12_BLEND_OPの値を変える事で、以下のBlendを行う事が出来るそうです。

  • Add
  • Subtract
  • Min
  • Max

公式SiteのD3D12_BLEND_OP enumeration (d3d12.h)[8]を見ると以下のようになっていました。

教科書では何故この中に乗算がないのかについて解説していました。

後に出て来る割合の値を使うと乗算が出来るのでこの中に入ってないそうです。

私はこれを見た時、やっぱりGaeaのCombineノードの機能とそっくりと感じました。

LogicOpの方は使用する可能性は0です。

今回はこの部分はSkipします。

<Blendの係数>

SrcBlend、DestBlend、SrcBlendAlpha、そしてDestBlendAlphaについてです。

まずD3D12_BLEND enumerationについて解説しています。

公式SiteのD3D12_BLEND enumeration [9]も参考にします。

この後3つのBlendingの設定方法について説明していました。

具体的なやり方は教科書を見ればわかるのでここにはまとめません。

以上でした。

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

7.1 3D Gaussian SplattingとUE5についての復習

 2024-02-19のBlogを見直したら3D Gaussian Splattingの応用方法について詳しく勉強していました。

先週、3D Gaussian SplattingとUE5の関係を勉強しましたが、この勉強の続きをする前に、 2024-02-19のBlogに書かれている3D Gaussian Splattingの応用方法の復習をやります。

以下の応用が考えられるとまとめられていました。

  • 3D Memory Capture(3Dの写真)
  • Reality Bending Visual Effects
  • Dynamic 3D Capture (Movement!)
  • Advanced Relighting Effects
  • Kitbashing in 3D Game Engines
  • Sharing Content Everywhere (Web & Mobile)
  • Editing Gaussian Splats & E-Commerce
  • Virtual Production & Game Dev
  • Heritage Conservation
  • Big Picture: Connecting Physical & Digital Worlds

この中でUE5との関連が強そうなのは

  • 3D Memory Capture(3Dの写真)
  • Reality Bending Visual Effects
  • Advanced Relighting Effects
  • Kitbashing in 3D Game Engines
  • Virtual Production & Game Dev
  • Heritage Conservation
  • Big Picture: Connecting Physical & Digital Worlds

です。

7.2 KIRI Engineについて調査する

KIRI Engineについても調査したかったので、今週はそれをします。

KIRI Engineは3D Gaussian Splatting関連で何度も名前を聞きます。

以下に示したのがKIRI Engineの開発者であるみたいです。

若い!

この年でこんなの作成出来るならいずれこの業界をしょって立つ人物になる事は間違いないです。

これがKIRI Engineなのか。

公式のWebsiteを見ると以下のVideoが紹介されていました。

走っているのは完全にUE5のAvatarです。

KIRI Engineで読み込んだ3DをUE5に落として作成したんでしょうか?

VFXの作成ではCinema 4Dが使用されていました。

値段です。

当然、Free Versionを使用します。

結構Free Versionでもいろんな機能を使用できますね。

うん。

使い方を説明したTutorialを見てみましょう。

7.3 How To Make Instant 3D Models with Just Your Phone - KiRI Engine [10]を勉強する

なんとこのTutorialではPhotogrammetryとNSRの2つのやり方を教えると言っています。3D Gaussian Splattingは教えてくれないの?

まあ良いです。

今週はこれを勉強しましょう。

<Photogrammetry>

まずKIRI EngineをInstallします。

自分のAccountを作成します。

Invitation Codeって何でしょう?

一番下の+のIconを押します。

すると以下の画面が表示されるので

Take Photosを押します。

すると以下のような画面になるそうです。

いきなりこんな画面になっても使い方分かりません。

右上の?のIconを押すとHelp Sectionに移動するそうです。

こんな画面に代わりました。

ここで使用方法を勉強出来るのでしょうか?

Videoで撮影方法の解説をやっていました。

<Close-up Shots>

以下の箇所からVideoに変更しました。

いや、これはVideoでも撮影出来ますよ。という説明でした。

右にある以下のButtonはAuto SettingかManual Settingの選択だそうです。

ここはAuto Settingで良いそうです。

3DのObjectを撮影するにあたって自分がObjectの周りを動くより以下のような回転する土台を使用して

Objectを回転した方が撮影し易いそうです。

撮影する時は以下のような四角Lightがあると良いそうです。

Close-Up Shotsとは以下のようにObjectにものすごく近づいて撮影する事でした。

これを追加する事でObjectの質感を再現出来るみたいです。

以下の部分からそのPhotoがどれだけ有効化が分かるそうです。

Photoを取り終わったら以下のIconを押します。

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

Objectの名前をTypeします。

その他のSettingです。

Turn Tableを使用する場合はAI Object Maskingを使用する必要があるそうです。

そしてUploadを押します。

Uploadが終わると以下のように撮影したObjectの3D Modelが見れるようになるそうです。

Cropについてです。

以下のように携帯からObjectを編集出来るそうです。

同様にTextureも調整出来るそうです。

以下のToolで調整していました。

調整が完了したら以下のSave Editを押します。

以下の画面が表示されるので

Generate a New Modelを押します。

これで携帯での作業は終わりだそうです。

今度はWebsiteに移動します。

ここでも携帯と同じような編集を行う事が出来るそうです。

ここには携帯では出来ない機能もあるそうです。

3D ModelをQUADによるMesh作成を行う機能だそうです。

以下のQUAD Buttonを押すと

以下の画面が表示され

<Lumion>

Lumionって何だと思ったらこのModelを見るSoftのようです。

これの事でした。

これは使用しないのでPassします。

NSRについても語っていました。

以下に示した様な平で尖った部分が無いObjectを生成するのは従来のPhotogrammetryでは非常に大変だったそうです。

この問題を解決したのがNSRだそうです。

以下のObjectを撮影しています。

撮影が終わったら以下のIconを押します。

Settingを押します。

Developer ModeをEnableします。

この後に以下の画面に移動していますが、どうやって移動したのか不明です。

Featureless Objectを選択します。

この状態でもう一回Objectを撮影しています。

Videoで撮影する必要があるそうです。

急いで移動するとMotion Blurが生成されてしまうそうです。

<BETA>

結果です。

残りの手順は同じでした。

以上でした。

うーん。

簡単。

これは来週やる事にします。

8.Niagara の勉強

8.1 前回の復習

たしか前回は液体のSimulationをParticleを使用して実装するところまで終わったはずです。

今週からこのParticleを水面に見えるように変換するための勉強をやるはずです。

 2024-02-19のBlogを読み直します。

「16.7 水面のRenderingの概要」も既に勉強していました。

簡単にBlogの内容をまとめるとParticleから水面のDiffuse Light、Specular Lightそして水の色を計算します。

水面のDiffuse Lightは以下の方法で求めます。

  1. 深度を表すImageをGray Scaleで作成する
  2. 隣接するPixel同士の値のずれをGradientとして捉えて、Normal Vectorを計算
  3. Normal Vectorをそのまま使用すると粒が目立つのでBlurをかけてぼやかす
  4. 得たNormal Vectorを元にDiffuse Lightを計算

Specular Lightと水面の色の求め方はBlogにはまとめられていませんでした。

8.2 「16.7 水面のRenderingの概要」をもう一回読む

どう考えてもSpecular lightや水面の色の計算方法もしっかり教科書に書かれていたはずです。

もう一回「16.7 水面のRenderingの概要」を読み直して確認します。

まずSpecular Lightの計算方法ですが、書いてなかったです。

Diffuse Light で計算したNormal Vectorを元に計算するとだけありました。

あ。

Specular LightはNormal VectorとCameraの位置とLightのVectorと物体の表面の位置とかが分ったら計算出来たはずです。

そう言う事か。

水面の色は水の深さから計算するそうです。

以上でした。

こんだけか。

今度は水面の実装をします。

8.3 「16.8 水面のRendering」を読む

<16.8.1 Levelの作成>

今週はこれを読んで終わりにします。

来週からは先週勉強した内容の実装と、次の節を読む事をやる事にします。

前に作成したFluidMapを開きそこに、作成したNiagara SystemのFluid Simulation Systemを配置すると書かれていました。

うーん。

そんなの作成したのか覚えていません。

確認します。

作って無いです。

教科書を読み直したら「16.3.1 Simulation以外の下準備」で作成していました。

「16.3.1 Simulation以外の下準備」は2024-02-12のBlogで勉強しています。

読み直したらLevelの作成は完全に忘れていました。

教科書を読むとLevelはBasic Templateを使用して作成します。とだけ書かれていました。

多分Emptyの事でしょう。

Sample Codeで確認します。

以下の構成になっていました。

SkyLightとVolumetricCloudが追加されていますね。

後、CameraActorが追加されています。

まあEmptyのLevelで大丈夫でしょう。

Niagara SystemであるFluid Simulation Systemは以下のような配置になっていました。

大体、教科書の値と同じです。

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

次にCameraの視点を固定するそうです。

まずCamera Acterを配置しています。

そしてLevel BPで以下の実装をします。

これは使用するCameraを今、配置したCameraに切り替えているだけですね。

Cameraを以下の位置に配置します。

以上でした。

これは思っていたよりもかなり簡単でした。

まあ良いです。

今週はあんまり無理をしたくないのでここまでとします。

9.Google App続きの続き

あれから2,3日経ったんですが、Google Playの検索には表示されるようにはなりません。

仕方ないのでPlay Console Helpに問い合わせました。

更に2,3日経って今日Googleから返事が来ました。

「ドライブ体験Gameで検索すると最初に表示されています。」

と書かれていました。

いや、そんな事はないはず。と思ってGoogle Playで検索したら普通に出て来ました。

オカシイ。

前は出てこなかったはずです。

まあ、でもこれでGoogle Developer Accountが消される事は無くなりました。

一安心です。

ただGoogle Playの表示を見ると色々オカシイです。

まず内部ベータ版とか表示されています。

後、アプリ内課金ありとも表示されています。

課金なんてないです。

この表示は内部テスターである私の画面だけなんでしょうか、よく分かりません。

まあ良いです。

後は、この体験を猫ミームにしてYouTubeに上げます。

10.Materialの勉強

 10.1 Animated Flag Part 2 - Advanced Materials - Episode 27 [10]を実装する

先週勉強したBen Cloward先生のTutorialを実装します。

<Flag Mesh>

以下のFlagの向きを変更します。

Z軸に沿って90度回転しました。

確かにFlagがはためたなくなりました。

これを直すには以下のようにTransformVectorノードを追加します。

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

結果です。

うん。

波打っていますが、

波打ってはいませんね。

以下のようにConstantの値を変更します。

結果です。

おお、波打つようになりました。

今度は角度を変えても旗が波打つようになっています。

<Normals>

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

一色のままでした。

これを直します。

Timeをはずして旗の動きを止めます。

結果です。

止まっています。

<Derivative>

SineノードにPassしている計算結果をCosineノードにPassします。

更にCoordinationを揃える(Local SpaceからTangent Spaceに変換)ためにAppendノードで以下の実装を追加しました。

結果です。

何にも変わっていません。

近づいて見たらこんなになっていました。

まずCosineのPeriodの値を90に変更しました。

波に対応して色が変化するようになりましたが、色がオカシイです。

ああ、RGでつないでいました。

RGBに直しました。

結果です。

おお。

まだ合っているかは不明ですが、前より格段に良くなりました。

うーん。

Tutorialの言うように逆なのかどうかは不明です。

赤い部分がないですね。

TutorialでやったようにCosineの結果にOne Minusを追加しました。

結果です。

うーん。

分からん?

裏から見るとこんな感じです。

なんか違います。

うーん。

Flagの勉強はここまでにします。

今、この問題を考える事に意義を感じません。

これで一端完成にします。

残りはまたこの問題に近い問題に直面した時に考えます。

11.Gaeaの勉強

今週はGaeaの勉強は無しです。

11.1 Gaea 2.0 - First Look [12]を見て

QuadSpinner社のYouTube Channelに以下の動画が公開されていました。

これを見るとGaea2.0のEarly Accessが開始されたみたいです。

GaeaのHomepageを開いてみると

前と比較して代わっている部分はないです。

Gaea2の料金体系がどうなっているのか調べてみます。

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

結局、以下のGaeaの有料版を買わないと使用出来ないみたいですね。

うーん。

まだGaeaの有料版を買う価値があるのかどうかは分かっていません。

世の中にはまだまだ無料で凄い価値のある物が沢山あります。

あえて、ここで有料版を買う必要があるのか、色々な角度から検討が必要だと思います。

と言う訳で、GaeaのTutorialは無料版の1.0でそのまま続ける事にします。

12.まとめと感想

無しです。

13.参照(Reference)

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

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

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

[4] 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

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

[6] Stevewhims. (2024, February 22). D3D12_BLEND_DESC (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ns-d3d12-d3d12_blend_desc

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

[8] Stevewhims. (2022, January 31). D3D12_BLEND_OP (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ne-d3d12-d3d12_blend_op

[9] Stevewhims. (2022, January 31). D3D12_BLEND_OP (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ne-d3d12-d3d12_blend_op

[10] Nuno Silva. (2023, August 7). How To Make Instant 3D Models with Just Your Phone - KiRI Engine [Video]. YouTube. https://www.youtube.com/watch?v=i2dlc7BJrL8

[11] Ben Cloward. (2023, October 26). Animated Flag Part 2 - Advanced Materials - Episode 27 [Video]. YouTube. https://www.youtube.com/watch?v=P8-oGG2d1RY

[12] QuadSpinner. (2024, March 15). GaEA 2.0 - First Look [Video]. YouTube. https://www.youtube.com/watch?v=3fGU98Hn5Us

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

1.今週の予定

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

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

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

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

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

Niagara の勉強>

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

<Materialの勉強>

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

<Gaeaの勉強>

GaeaのTutorialを作成します。

<Houdiniの勉強>

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

<UEFNの勉強>

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

<DirectX12の勉強>

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

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

2.Landscapeの作成

2.1 前回の復習

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

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

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

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

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

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

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

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

思い出してきました。

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

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

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

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

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

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

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

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

結果、

出来ました。

これが前回の結果です。

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

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

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

適当に見てみます。

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

Olli Huttunen氏の動画です。

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

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

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

これ。

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

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

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

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

うーん。

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

FloorのStatic Meshを追加します。

うーん。

途端にSmoothになりました。

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

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

Lightの調節をしています。

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

結果です。

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

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

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

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

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

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

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

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

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

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

3.Niagara の勉強

3.1 前回の勉強

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

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

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

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

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

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

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

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

<「16.6.1 Scratch Pad Moduleの準備」>

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

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

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

Update Position Moduleでしてた。

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

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

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

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

こうなっていました。

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

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

はい。

出来ました。

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

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

<「16.6.2 HLSLのCoding」を読む

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

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

Normalize(○○)xMax○○

となっていました。

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

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

うーん。

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

まあ良いです。

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

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

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

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

Applyを押します。

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

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

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

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

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

結果です。

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

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

その辺を直します。

3.3 Particleの重なりを防ぐ

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

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

うーん。

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

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

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

Sample Codeの値です。

うーん。

ここもあっていますね。

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

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

これで十分です。

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

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

これもやっていきます。

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

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

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

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

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

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

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

更にSpecular Lightを計算します。

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

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

以上だそうです。

うーん。凄い。

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

以上です。

実装は来週やります。

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

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

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

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

4.Materialの勉強

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

2024-02-19のBlogを見ると

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

もう旗は良いです。

次のTutorialをやります。

うそー。

またFlagなの。

おえー。

吐き気がしてきた。

まあ良いです。

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

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

<Intro>

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

<Flag Mesh>

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

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

うん。

それは知っています。

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

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

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

これも知っています。

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

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

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

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

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

結果です。

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

これは以下の計算が

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

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

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

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

結果です。

綺麗になびいています。

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

<Normals>

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

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

これを直します。

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

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

<Derivative>

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

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

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

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

はい。

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

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

うーん。

天才。

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

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

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

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

結果です。

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

<Checking Results>

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

これを直すために

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

結果です。

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

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

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

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

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

すると以下のように

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

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

結果は変わりません。

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

<Normalize>

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

以上でした。

5.Gaeaの勉強

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

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

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

5.1 前回の復習

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

まず復習します。

思い出しました。

Maskingを勉強したんでした。

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

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

5.2 PowerPointを作成する

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

まずHeight Nodeについてです。

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

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

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

承認されませんでした。

のおおおー。

何で?

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

うーん。

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

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

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

以下のSiteに飛びました。

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

うーん。

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

なんか、怪しい。

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

普通に動きました。

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

うーん。

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

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

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

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

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

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

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

これが原因だったのか。

直します。

直しました。

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

???

分かりました。

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

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

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

分かりました。

Project Settingの以下の設定です。

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

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

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

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

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

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

うーん。

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

正し

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

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

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

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

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

もう一回Packagingします。

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

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

うん。

今度こそPassするやろ。

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

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

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

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

と連絡がありました。

これでOKでしょう。

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

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

うーん。

どうしよう。

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

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

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

一寸考えます。

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

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

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

これは諦めます。

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

7.Houdiniの勉強

8.UEFNの勉強

9.DirectX12の勉強

10.まとめと感想

なしです。

11. 参照(Reference)

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

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

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

[4] Olli Huttunen. (2024, February 26). Experience combining a 3D Gaussian Splatting model from Postshot to Unreal Engine. [Video]. YouTube. https://www.youtube.com/watch?v=DXU38EJ_sL4

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

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