UE4の勉強記録

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

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

1. 今週の予定

先週のBlogを読み直して今週の予定を建てます。

1.1 映像作品としてのLevelの作成

先週作成したDragonと自転車の映像に影が何故無いのか?を調査します。

後、SmokeのEffectを直します。

Pwnisher氏のTutorialの勉強はMaterialの勉強で行う事にします。

1.2 AIの勉強

Jeremy Howard氏の Practical Deep Learning for Coders: Lesson 1 [1]の宿題をやります。

1.3 Materialの勉強

Pwnisher氏のUnreal Engine Materials in 6 Levels of Complexity [2]の実装をおこないます。

1.4 Gaeaの勉強

今週は無しです。

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

2024-05-05のBlogには以下の勉強をすると書いていました。

この予定で進める事にします。

つまり今週はOfficial Android Support for Unreal Engine Virtual Camera [3]を実装します。

1.6 Houdiniの勉強

先週のBlogで書いたように

次のTutorialを勉強します。

今週はHoudini 19 - Wall Tool 13[4]を勉強します。

1.7 UEFNの勉強

もうしばらくはPi Equals Three氏のTutorialを勉強する事にします。

 CUSTOM Fortnite Character Pt 2 (Animations) - UEFN / Creative 2.0 Tutorial [5]を実装します。

1.8 DirectX12の勉強

Lötwig Fusel氏のD3D12 Beginners Tutorial [D3D12Ez]は Creating a Window | D3D12 Beginners Tutorial [D3D12Ez] [6]の次の10分を勉強します。

DirectX 12の魔導書」の勉強は、「4.11 三角形ポリゴンを四角形にしてみる」の「4.11.1 Primitive Topologyを変更する」の実装を行います。

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

今週はDragonと自転車の映像を直してもっとRealにします。

2.1 Dragonが着地した時のSmokeのEffectを直す

まずParticle Spawn StageのSphere Location Moduleの設定から変更します。

Sphere Radiusの値を100から10に変更しました。

結果です。

www.youtube.com

かなりマシになりました。

更に直していきます。

youtu.be

Smoke Effectを本当にDragonの足の下に置いたら、Smokeがまったく見えなくなってしまいました。

Cameraから見るとDragonの足元に見えますが、実際は全然違う位置に配置しています。

3D Gaussian SplattingもNiagaraを利用して生成しているのでEffectと被ったらEffectが見えなくなってしまうのかもしれません。

3D Gaussian Splattingで背景を生成する時には、こういうDemeritがある事が分かりました。

youtu.be

もうこれでSmokeはほぼ完成と言ってもよさそうです。

youtu.be

Velocityを微調整してSmokeが少しだけ上に舞い上がる様にしました。

後はCameraの調整だけです。

まずCameraのFocusを調整します。

今はこうなっていますが、

遠くにいるDragonにFocusがあっているのにその周りの建物にはFocusが外れています。

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

Dragonが遠くにいる時にはピントが合わないようになっています。

結果です。

youtu.be

確かにDragonがピンボケしています。

その結果、映像的に良くなったと言えるのかはうーん。分かりません。

Cameraの位置を変更してDragonの全体像が写る様にしました。

youtu.be

Cameraの角度が変わったらSmokeのEffectがしょぼく見えるようになってしまいました。

SmokeのEffectを派手にします。

youtu.be

Smokeの部分を派手にしました。

うーん。

Smokeは横にもっと広がっても良い気がします。

後、Dragonが登場する時が、画像を張り付けた感じが凄いします。

背景とDragonの間に白い線があるかのように見えます。

実際には白い線はないですが、多分lightness(輝度)がDragonと背景で違っているんでしょう。

Directional LightのIntensityの値を10luxから1luxに下げました。

結果です。

youtu.be

Dragonが周りの背景から浮いている感じがなくなりました。

こんな簡単な調整で他の映像を埋め込んだ感じが無くなるなんて不思議です。

後はDragon登場時にCameraが少しだけShakeすると更にRealになりますね。

これはDavinci Resolveで追加しますか。

調べたらCamera SHAKE Effect - DaVinci Resolve [7]でCameraをShakeする方法が説明されていました。

Camera Shake Effectを追加するだけみたいですね。

やってみます。

以下のようにDragonが登場するのFrameを抽出しました。

ここにCamera Shakeを追加します。

追加したけど使用出来ないですね。

もしかしたらImageからImportしたからかもしれません。

別なProjectを作成してYouTube用にExportしたVideoをImportしてそれで試してみます。

駄目でした。

他のEffectでも出来ないのか確認したら出来ました。その後でもう一回Camera Shakeを試したら今度は出来ました。

あれ?

前のProjectに戻って同じように試したら今度は普通に追加出来ました。

色々試した結果、以下の設定でOKとしました。

結果です。

youtu.be

良い感じです。

後は音を追加します。

あれ?

音ってExportできるの?

取りあえず今までのようにImageを生成しました。

うーん。

JPEGに音なんか保存出来ないですよね。

調べたら以下の動画でやり方を説明しているみたいです。

Export an Audio Track in the Movie Render Queue (Unreal Engine) [8]

軽く見たんですが、結構知らない事をやっていてしっかり勉強しないと間違えて操作してしまいそうでした。

うーん。

今からこれを勉強したらこれの勉強で今週の「映像作品としてのLevelの作成」の勉強は終わってしまいますね。

まあ良いか。

これを勉強します。

2.2 Export an Audio Track in the Movie Render Queue (Unreal Engine) [8]を勉強する

OutlinerにあるLevel Sequenceを選択します。

Level Sequenceが開いている箇所に別なTab、Movie Render Qと言うのが表示されていて

そこにLevel SequenceをDrag & Dropしました。

ここからDrag and Dropしていました。

これって左脇にあるので、なんだか分からなかったですが、いつもの以下の部分にあるやつでした。

するとMovie Render Qは以下のような表示になりました。

これはRenderingする時に開くWindowとまったく同じ内容です。

あのWindowの名前がMove Render Qだったみたいですね。

SettingにあるMRQなんとかを押して以下のWindowを開きました。

これもLevel SequenceをRenderingする時に開くWindowです。

ただSettingの内容が違いますね。

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

これしかないです。

このTutorialでは

こんなに沢山あります。

しかも沢山あるだけじゃなくて.exr Sequenceのような直接Videoを生成してくれそうなSettingも表示されています。

うーん。

この辺を表示するための設定から勉強しないといけないのか。

これは簡単ではなさそうです。

お、Output Resolutionの値は以下のようになっていました。

これは4Kの設定みたいですね。

やっぱり4Kにしないと駄目か。

ここでこの設定でRenderingするとSoundの生成をする事は可能ですが、非常に時間がかかるので以下のようにMovie Render Qに同じLevel Sequenceの項目をもう一個作成します。

これ具体的にどうやって2つの同じSequenceを追加したのかは説明していませんでした。

そしてこっちのSettingは以下のようにします。

なんと以下の+を押してWav.Audioを追加しました。

一瞬しか開きませんでしたが、以下に示した様に

沢山の項目が表示されていました。

ここで何をRenderingするのかを指定みたいですね。

以下の設定も少しだけ変更しています。

この変更で重要なのはFile Name Formatの最後にFrame Numberをしている箇所があるので、それは削る。という事だけです。

右上のMRQ何とかと書かれている箇所をClickして以下のWindowを開き

Save As Presetを選択します。

以下のWindowが開きました。

この設定をPresetとして保存するみたいです。

MRG_AUDOとして保存していました。

またMovie Render Qに戻ってきました。

上の項目はRenderingしないので、Offにしました。

Outputの所の以下の三角をClickして先程保存したMRG_AUDOを選択していました。

成程、作成したPresetはこうやって使用するのか。

この設定で右下にあるRender(Local)を押していました。

これで以下のようにAudio Fileが生成されました。

以上でした。

うーん。

大体は理解しました。

これは来週試す事にします。

3. AIの勉強

今週はJeremy Howard氏の Practical Deep Learning for Coders: Lesson 1 [1]の宿題をやります。

先週のまとめでは宿題は以下のようになっています

Kaggleの登録が完了すればPyTorchも勝手に使用出来るようになるみたいですし、まずはKaggleの使用方法を勉強する必要があります。

教科書の第1章を全部読むのは結構大変です。

これは出来るだけやるようにします。

3.1 第一回の講義を復習する

教科書を読む前に今まで勉強した講義の復習をやります。

その方が教科書の内容も頭に入るでしょう。

2024-05-19のBlog

写真を見て鳥かどうかを判断するCodeをPythonを使用して書いています。

こういうやつです。

ぶっちゃけ、この辺の講義で説明に使用されたCodeをそのまま使用して探すImageだけ変更すれば今週の宿題は終わりでしょう。

Python初心者でも出来て、宿題の要求をPass出来る現実的なGoalはその辺でしょう。

その辺の事が出来るための情報を集中して復習する事にします。

途中まで読みましたが簡単にはまとめられる内容じゃなかったです。

紹介されたCodeと、そのCodeが何をやっているのかだけまとめる事にします。

Data Blockを作成しています。

作成したData BlockをパスしてCNN(Convolutional Neural Network)と言う手法で学習させています。

その後でFine Tuneを3回行っています。

Predict()関数を使用してテストしています。

今、Blogを読み直してみるとCopilotのお陰でかなりしっかりまとまっているのでこれらのCodeが何をやっているのかかなりしっかり理解出来るのですが、

以下の部分を調べるのは忘れていました。

これCreateと言っているんだからImageを生成していると思われます。

生成したImageに対してこのImageがBirdかどうかを予測しているみたいですが、自信はありません。

そうだ、Copilotに質問してみます。

だそうです。

ホントにCopilot役に立つ!

結果です。

まずはこの部分のCodeを自分で再現出来るようにする事ですね。

この後はそれ自体は重要な情報ですが、Codeを実際に書けるようになるための知識とはほとんど関係ない話でした。

2024-05-26のBlog

この週はKaggleは使用したくないので、PyTouchをLocalで使用する方法を調べていました。

KaggleのTutorialも調べていました。

KaggleのSettingはこの辺のTutorialを一個勉強した方が安全ですね。

肝心のCodeの解説ですが、以下のようになっていました。

まずDataBlockのそれぞれのMemberについての解説がありました。

それぞれのMemberの機能については実装する時に復習します。

ShowBatch()関数について解説していました。

これはBatchにあるImageから6個表示して。と言う意味です。

そして以下のLearnerについてです。

あれ?

ここではVision_Learnerを使用していますね。

Fine_TuneはModelに今までTrainしたDataとこれから学習するDataがどれくらい違うのかを示すそうです。

Predict()関数が来ました。

これで新しい画像が鳥であるかどうかをAIに聞いて、答えがあっているかどうかを確認しています。

以上でした。

先週のBlog

Segmentationについて説明しています。

Segmentationは画像に写っているObjectを分割する機能の事です。

Segmentation用のDataのLoadのやり方です。

この後、ずっとこのCodeの説明が続きます。

次はSegmentationにおけるLearnerの説明です。

Segmentationの実装はこれで終わっていました。

どうやってAIが勉強した内容をTestするんでしょうね。

この辺は教科書を読んで学習しないといけない部分のようです。

次にTableの分析について解説していました。

いきなりLearnerから始まっています。

でもDlsがあるから何らかのDataの塊は作成しているはずです。

あ、これでTableに使用するDataを読み込んでいました。

TableはAIが学習する必要は無いのでFine_Tuneは使用しないそうです。

Collaborative Filteringという個々のUserが望む項目でTableを作成する方法も紹介していました。

なんとこのCollaborative Filteringという手法でTableを作成した場合の例では

Fine_Tuneを使用していました。

さっき言っている事と違います。Collaborative FilteringはFine Tuneを使用する事も出来るそうです。

成程。

TableだからShow_Results()関数を使用するのか。

後は、重要ですがCodingとは関係ない話ばかりでした。

以上でした。

3.2 講義の復習をした感想

今回はCodingに関しての話だけまとめましたが、それ以外の話も結構重要で、内容も濃い話ばかりでした。

後、Blogを読み直すと結構勘違いして理解している箇所がありました。

それが今は分かるという事はそれなりには勉強になっているという事だと思います。

3.3 教科書の第一章を読む

以下の教科書を読みます。

と言ってもGitHubに公開されている方ですが。

だらだら読んでいてもしょうがないので休憩を含んで4時間だけ読む事にします。

まあ実質3時間だけ読むという事になります。

今軽く見たら大した量じゃなかったです。後書かれている内容も講義の内容とほぼ一緒でした。

これなら1時間で読めそうです。

それぞれの項について簡単にまとめます。

<Your Deep Learning Journey>

重要でない

<Neural Networks: A Brief History

Neural Networkの簡単な歴史がまとめられていました。

Neural Networkそのものについてはあんまり理解出来なかったです。

もしそれを理解する必要がある時はもう一回読み直す事にし、次に行きます。

<Who We Are>

重要でなし

<How to Learn Deep Learning

うーん。

重要な情報があるかもしれませんがとりあえずSkip

<The Software: PyTorch, fastai, and Jupyter>

ここで気になっているのはKaggleではなくJupyterを使用している点です。

この節だけはしっかり読む事にします。

どのSoftwareを使用しても関係ないって結論でした。

そう言う訳で今回はKaggleを使用する事にします。

<Your First Model>

うーん。

Jupyterからこの教科書を読むと読みながらCodeを改良出来る仕組みになっているみたいですね。

一寸Jupyterも調べてみる必要があるかもしれません。

結構長い文章でJupyterについて解説していました。

<What Is Machine Learning?>

ここは先週勉強したMachine Learningが従来のProgrammingとどう違うのかの説明をやっていました。

こういうやつです。

一応、しっかり読む事にします。

うーん。

前に勉強した以上の情報は拾えなかったです。

後このModelはMachine Learningの説明でDeep Learningではないみたいです。

<What Is a Neural Network?>

ここで集中力が切れました。残りは来週読む事にします。

4. Materialの勉強

Pwnisher氏のUnreal Engine Materials in 6 Levels of Complexity [2]の実装をおこないます。

4.1 Unreal Engine Materials in 6 Levels of Complexity [2]の実装をする

Materialを生成しました。

Material Instanceを生成しました。

Materialを開いて実装していきます。

やっぱりMaterial Instanceを右端に表示する方法は分かりません。

Material Instanceは別Tabで開いてそこで確認する事にします。

まずは適当なTextureを使用して簡単な実装を作成します。

それぞれのTexture SampleノードをParameterにConvertします。

Pwnisher氏のTutorialでは以下のTexture SampleノードをParameterに変更していました。

同じにしました。

更にMIの結果も確認しました。

Albedo Brightness Parameterを追加しました。

Powerノードを追加してContrastを調整出来るようにしました。

Desaturationノードを使用してSaturationを追加します。

Albedo Tintを追加しました。

これがBrightnessと同じじゃないのかと疑問に思っていますが試してみます。

Brightnessの結果です。

Brightnessが1の時です。

Brightnessが0の時です。

Tintが(1,1,1)の時です。

Tintが(0,0,0)です。

全く同じです。

しかしTintは色を追加する事が出来ます。

Tintは色を追加する。

Copilotの言うShader, TintはBrightnessの事。と専門用語の解釈を変更すればPwnisher氏の説明でもあいます。

おそらくそういう解釈をする流派もあるんでしょう。

Specularの設定です。

Roughnessの設定です。

今気が付いたんですが、Textureの設定ってそれぞれのMaterialで違っています。

例えばMegaScanからDownloadした以下のTextureはORDpと称していて

RにAmbient Occlusion、GにRoughness、BにWorld Displacementが入っています。

次のMegaScanからDownloadしたTextureは

DpRでRがDisplacement、GがRoughnessとなっています。

更にSketchfabからDownloadした3D Characterについて来たTextureは

RがAmbient Occlusion、GがRoughness、BがMetallicだったり

以下のような

RがAmbient Occlusion、GがRoughnessであったりします。

つまりそれぞれのMaterialによってTextureの構成がまったく違っています。

これを一個のMaterialで全部代用してしまおうというのはかなり無理があります。

うーん。

どうしましょう。

まずは基本として全部が別のTextureとしてセット出来るMaterialを作成しますか。

いやそれだと自分で試す事が出来ません。

やっぱりORDpを基本とすべきか。

うーん。

今回はORDpにそろえます。

とりあえずNormalの設定を先にやる事にします。

Normal Intensityの値が1の時です。

Normal Intensityの値が10の時です。

凄い凸凹しています。

とりあえず最後までやってそれから考える事にします。

今度はLevel3です。

今まで作成したAlbedoの実装と単純なColorをSwitch Parameterノードで切り替える事が出来るようにします。

同様の機能をSpecularとRoughnessにも同様に追加します。

Base SpecularのDefault値は0にしました。

更にSpecular値のRangeは0~1としました。

Base RoughnessのDefault値は0.5にしました。

更にRangeは0~1にしました。

MetallicにもParameterを追加しました。

あ、追加したParameterのGroupとSort Priorityの設定を忘れていました。

しました。

Checkを入れると以下のような画面に変更します。

Level4です。

Material Functionを作成しています。

Textureを回転させるやつです。

このMaterial Functionは色々な場面で使えるはずですので早速作りましょう。

出来ました。

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

このParameterの所属するGroupがまだ不明なのでNoneにしてあります。

Testします。

回転しています。

出来てます。

今度は先程のMaterial FunctionにScaleを管理するためのParameterを追加します。

しました。

Master Materialに戻ってそれぞれのParameterを追加します。

Testしてみます。

一応全部動きました。

全部のParameterをPSR Groupに追加します。

Level 5です。

以下の場所にあるSurface Imperfectionを追加します。

これは無いので、適当なTextureで代用します。

これで代用します。

まずSurface Imperfectionの実装を以下のように組みました。

次にSurface Imperfection Blendを以下のように組みました。

テストします。

色々弄ってみましたが正直変化があるのかどうかすら分かりません。

Materialに使用するTextureがMetallicやGlassの時には役に立つのかもしれません。

以下のようにSurface Imperfection用のPSRも作成しました。

そもそもRoughnessって金属とそれ以外を示すための機能ですから非金属ではそんなに重要でないのかもしれません。

Level 6です。

Dirtを追加します。

以下のように組みました。

LerpノードのAにはBase Colorの結果が繋がっています。

Lerpノードの結果を示します。

こっちは結果がはっきりしています。

DefaultのTextureに、白黒がはっきりしているのを使用したのが良かったのかもしれません。

もうここでParameterのTestをしてしまいましょう。

Dirt Brightnessの値を1から10に上げました。

おお、結果が変化しています。

今度はDirt Contrastの値を0.1に下げました。

これも結果が変わっている

今度はLerpのAとBの値を変更してみます。

Dirt Maxの値を10にしました。

私の中ではこれはBrightnessの値と同様の効果しかないと思っていますがどうなんでしょうか。

以下に先週のBlogで私の意見を書いた部分を示します。

結果です。

うらああー。

やっぱしそうだった。

でもMinの値を弄った場合はどうなるんでしょう。

Dirtの数が減るのかな。

Minの値を0.8、Maxは1で試してみました。

結果です。

これはContrastの値を小さくしたときと同じ効果になっていますね。

これは計算式できちんと示したら同じ事をやっている事、証明できそうです。

うーん。

今はやらない。

今回はいかのようなCommentを付けとくだけにします。

更にEnable Dirtを追加しました。

結果です。

先程のImperfectionの結果がまったく見えなかったのはImperfection PSRの以下のParameterのDefault値が0になっていたからでした。

もう一回テストします。

やっぱり差は分かりませんでした。

これで実装は終わりです。

うーん。

どうしよう。

4.2 Unreal Engine Materials in 6 Levels of Complexity [2]の実装をしました。その後どうするか

このままで終了したら、今までの勉強と同じでUE5の筋トレしただけになります。

この先に繋げる何かを作成する必要があります。

以下のIdeaを考えています。

Mega ScanでDownloadしたDefaultのMaterialにこのPwnisher氏のMaterialを統合してMega ScanのDefaultのMaterialを改良します。

後は、SketchfabのMaterialか。

うーん。

後、Pwnisher氏のTutorialだけやってBen Cloward先生のTutorialは全くやらないのは一寸問題がある気がして来ました。

Ben Cloward先生のTutorialは直接の役には立たないかもしれませんが、Material作成の基礎力は確実につきます。

あ、そうだ。

今回の機能でSurface Imperfectionは要らないですね。

これは省きます。

後は整理の仕方か。

それぞれのGroupはAlphabet順に並ぶようです。

DirtやSurface Imperfectionが使用出来るようになった場合の並びです。

DirtとDirt PSRは並んでいるので分かり易いですが、Imperfection PSRはSurface ImperfectionともSurface Imperfection Blendとも離れた位置に配置されていて関連性がまったく不明です。

Surface Imperfection PSRと名付ければ丁度いい位置に並びます。

5. Gaeaの勉強

今週は無しです。

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

6.1 Texture Graphについて

何と、UE5.4のUpdateが来ました。

Texture Graphを試したら開けなくなったProjectが開けるようになりました。

UE5.4のRoadmapを見たら

Texture Graphが無くなっています。

最初から別な名前だったのか不明ですが、兎に角ここには載っていません。

Texture Graphは普通に開けました。

これは一寸勉強しようかな。

YouTubeSubstance DesignerのTutorialがあります。

https://www.youtube.com/playlist?list=PLB0wXHrWAmCxBw92VSRjqsbqYXgkF8puC

これを勉強してTexture Graphで実装したら結構行けそうです。

うーん。

勉強しますか。

6.2 Unreal Engine 5.4 Plant Growth Effect Tutorial In Under 5 Mins [9]を勉強する

今週はOfficial Android Support for Unreal Engine Virtual Camera [3]の実装をする予定でしたが、今、携帯を家族に貸してしまっているのでこの実装は来週にします。

代わりにUnreal Engine 5.4 Plant Growth Effect Tutorial In Under 5 Mins [9]を勉強します。

以下の画面から始まっています。

画面中央のSculptureはMega Scanから入手したそうです。

それは兎も角としてこのTemplateはFilmからEmptyを選択したんでしょうか。

その後で空のための一般的な設定を追加したのかな。

Outlinerの設定はLightingのFolderに内容が隠されてしまっていて

どうやって空の設定を追加したのかはここからでは分からないですね。

以下の3つのAssetを使用したそうです。

これらのAssetから以下のPlantをLevel上に追加しました。

こんな感じです。

配置した全てのMeshのLocationを原点にしました。

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

PlantのSizeが大きすぎるのでScaleを0.1に変更しました。

そしてここからMotion Design Modeに変更します。

Actorを選択して、更にClone Actorを選択します。

そしてLevel上に配置します。

これか。

これなら前に使用しました。

原点に移動します。

ClonerについているCubeを外して、配置した全部のPlantをClonerに追加します。

LayoutのLayout Nameの値をMeshに変更します。

更にSample Actorの値にSculptureをセットします。

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

よく見ると2つのおかしな事が起きています。

一つ目はGrassのTextureの色がGrayになっています。

二つ目はGrassがおかしな方向を向いています。

一つ目の問題を直すためにClonerのLocationのZの値を0.01に変更します。

二つ目の問題を直すには、以下のEffectorにSculptureを追加して

いや、このEffectorっていつ追加したの?

おそらくActorsにあるEffector Actorを追加したと思われますが、

ここは説明を省いては駄目でしょう。

名前をEffector Rotationと変更しました。

そしてTypeをUnboundに変更します。

更にRotationのYの値を-90とします。

Clonerに戻り、ClonerのEffectsにこのEffect Rotationsを追加しました。

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

そしてLayoutのCountの値を4000に変更しました。

また新たなEffectorを追加しました。

Effectorを追加するのはLevel上にDrag & Dropする必要は無いんでしょうか。

なんか一瞬で追加しています。

そして名前をEffector Animationと変更しました。

そしてTypeをPlaneと変更しました。

更にEasingの値をIn Out Cubicに変更しました。

この辺の設定は何を指定しているのか、皆目見当がつかないですね。

実装する時に勉強します。

Scaleを0にしました。

こうする事でPlantが成長する事が出来るようになるそうです。

え。

じゃあ、ここの設定が一番重要って事?

またClonerに戻って

EffectorsにこのEffectorを追加します。

Effector Animationに戻り、Transformの設定を以下のようにします。

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

KeyboardのGを押します。

すると以下に示した様な赤と青の四角い枠が表示されます。

このIconを動かすと、

以下に示した様にPlantの生える位置が変化します。

回転させて上下に草が生える位置が変化するようにします。

こんな感じにです。

向きが逆だったと以下のように直しました。

この2つの四角の枠の幅で、Plantの大きさの変化を管理しているみたいです。

2つの四角の枠の幅は、以下のParameterで調節していました。

Plane Spacingの値を150に変更しました。

Sequencerを調整します。

もしVideo Sequencerが表示されてない場合は追加します。

これって後から追加出来るものなんでしょうか?

以下のIconを選択して

Add Level Sequenceを選択すると追加出来るそうです。

何!

これは知らなかったです。一つ勉強になりました。

SequencerにEffector Animationを追加しました。

これはOutlinerにあるEffector AnimationをDrag & Dropして追加しました。

Effector Animationにある+を押してTransformを追加しました。

あ、もうこの辺から大体やり方は想像つくようになりました。

0.00の位置にKeyを追加しました。

6の位置に白いBarを移動します。

白いBar。そういえばこれの正式名称を先週勉強しました。

Play headでした。

あ。

公式のSequencer Editor [10]やCine Camera Actor [11]を読んで勉強するのを忘れていました。

これはこのTutorialの勉強が終わったらやります。

Effector Animationの位置を以下の場所に移動します。

Keyを追加しました。

Level SequenceのPlayを押すと以下のようにPlantがSculptureの表面を生えていきます。

以上でした。

6.3 Unreal Engine 5.4 Plant Growth Effect Tutorial In Under 5 Mins [9]を勉強した感想

Unreal Katya Fedak氏はこのTutorialが最初に作成したTutorialだそうです。

それだと凄い才能の持ち主ですね。

これだけの内容をこんな簡単に短くまとめて教えられるなんて凄いの一言です。

一つだけ改良して欲しい点をあげるとParameterをTweakする時は、そのParameterの機能を一寸でいいので解説して欲しかったです。

LocationとRotationなんかはどんな機能なのかは流石に分かっていますが、

以下のEffectorの設定なんかは何を指定しているのかまったく見当つかないです。

この辺は一寸説明して欲しかったです。

6.4 公式のSequencer Editor [10]を勉強する

携帯が戻ってきたのでOfficial Android Support for Unreal Engine Virtual Camera [3]の実装を使用かと思ったんですが、公式Siteを読んで勉強する事もしないといけない事に気が付きました。

Official Android Support for Unreal Engine Virtual Camera [3]の実装は来週以降にやる事にします。

全部を一変に勉強しても全部忘れてしまうので、少しずつ勉強する事にします。

まずそれぞれの名称です。

まず1の名称はTool Barです。

これはまあ当然ですね。

次は2ですが、Outlinerと呼ぶそうです。

3はTimelineでこれもまあ順当な名称でした。

4はPlayback Controlsだそうです。

うーん。

Tool Barから勉強していきます。

このIconで使用した事があるのは、

これは当然ですね。

これは一回ぐらい使用したはずです。

Cameraを追加するんだったっけ。

RenderingしてImageを生成するためのIconです。

後はこれです。

Fpsを指定します。

これはKey Frame間の補間の仕方をどうやるかをGraphを使用して指定する機能だったはずです。

うーん。

この使用した事のあるIconの機能を勉強します。

<Create Camera>

やっぱり新しいCameraを追加するって書いてありますね。

もしTrackにCameraが無い場合はこのCameraがReferenceされるそうです。

うーん。

Referenceって何をReferenceするんでしょうか?

Renderingする時に使用されるCameraの事を指しているのかもしれません。

<Render>

Render Movieを開きます。

と書いてありました。

やっぱりExport an Audio Track in the Movie Render Queue (Unreal Engine) [8]で勉強した以下のWindowと

このIconを押すと開くWindowは同じものでした。

Export an Audio Track in the Movie Render Queue (Unreal Engine) [8]は今週勉強したのか。なんかかなり昔の気がします。

<Frames Per Second>

FPSの指定をするIconであっていました。

<Curve Editor>

あのKey Frameの補間方法を指定するためのGraphはCurve Editorと呼ぶそうです。

うーん。

毎週勉強する予定なので今週はこんだけにします。

6.5 Sequencer EditorCine Camera Actor [11]を勉強する

先週、Filmbackの設定が何を指定しているのか不明です。と書いていながら

それについてSequencer EditorCine Camera Actor [11]で調べる事はしませんでした。

今回はFilmbackについて調査します。

これを読むとFilmbackってCameraの世界では一般的な用語のようです。

Copilot先生に質問してみましょう。

うーん。

これ図に示してくれないと意味が分からんやつです。

色々参考文献を読んだら以下のようなものだと理解しました。

一般的に言ってCameraのLenzを通して入って来た映像は、Filmもしくは電気的なセンサーの上に投影してそのImageを画像として保存します。

このFilmや電気的なSenserの事をFilm backというそうです。

でこのParameterの設定には以下の種類があるそうです。

要するにFilmの大きさの事を言っていた。って事です。CameraがDigital化したのでFilmも天気的なSensorに変って概念が掴みにくくなったって訳です。

そんだけでした。

7. Houdiniの勉強

今週はHoudini 19 - Wall Tool 13[4]を勉強します。

7.1 Houdini 19 - Wall Tool 13[4]を勉強する

<Intro>

今回はTextureを追加する方法を勉強するみたいですね。

まずDigital AssetのParameter Systemを作るそうです。

Type Propertiesを開きました。

Parameterを開きます。

こんな風にParameterが追加されていました。

むー。

凄い。

まずFolderが3つあります。

あとRampが追加されています。

ここに新しいFolderであるMaterialを追加しました。

Materialsに3つのFolderを追加します。

それぞれの名前は、output_BrickWallOutputノードにある3つのPrimeの名前を使用しています。

MaterialのFolder Typeの名称をSimpleに変更しました。

今度はMaterialのSub FolderにTexture MapをPlugin出来る機能を追加するそうです。

By TypeからFile-ImageをDrag & Dropします。

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

名前を以下のように変更しました。

さらにDuplicateして4つに増やしそれぞれの名前を以下のように変更しました。

NormalはTextureの設定を変更する必要があるのでは?

Brick Chipsにも同様の処置を行います。

Groutも同様に行うそうですが、TutorialではSkipしていました。

今度はHoudiniの方でMaterial Networkを実装するそうです。

まずMaterial Networkを追加しました。

Nodeです。

小っちゃくて文字は読めませんね。

Matnet1と書かれていました。

何と、Matnet1ノードをClickしてそのNodeの中に入り込みました。

これってNodeを自作しているの?

分からん。

兎に角続きをやって行きます。

Principle Shaderを追加します。

こういうやつです。

うーん。

なんか凄い事になって来ました。

以下のHelp Buttonを押して

以下のWindowを開きます。

このDocumentにこのNodeの使用方法の詳しい説明があるのでここで勉強すると良いそうです。

次は以下のIconの説明です。

このIconをClickすると以下のBoxが表示されます。

このLabsのところに色々なMaterialが既に組んだ状態(Preset)で存在しているそうです。

名前をBrick Faceとしました。

Alt+Dragで複製を作成しました。

複製の作成方法がUEと同じですね。

名前はBrick Chipsとしました。

当然、Goutも作成しました。

Brick Faceを選択して

ここでPoint Colorについて解説しています。

が何が出来るのかよく分からなかったです。

<Linking Parameters>8:30

ここから作成したNodeとType Propertiesを繋げるための設定を行うそうです。

Texture Tabを選択します。

Base ColorのUse TextureにCheckを入れます。

Type PropertiesのDiffuseを選択します。

Channelsを選択します。

TextureをDrag して

以下の箇所にDropします。

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

Type PropertiesのApplyを押して

しばらく待つと

Textureの部分が以下のように変化しました。

Roughnessの部分も同様にします。

Occlusionも同様にします。

Normalはと思ったら

Normalの設定は別なTabでやっていました。

成程。

Normalは以下のTexture PathをDragしていました。

これで以下の4つのParameterとNodeをLinkする事が出来ました。

<Adding Textures>10:45

ここで使用するTextureをTextures.comから取得したそうです。

ああ、

UEじゃないからTextureをQuixel Bridgeから入手する事が出来ないのね。

一寸Textures.comを見てみます。

おお、結構凄そうです。

Uを押して上の階層に移動します。

BrickWallTool_Buildノードまで戻って来ました。

Propertyを見ると

以下に示した様に

Materialの項目が追加されています。

ここに先程Textures.comからDownloadしたTextureをセットします。

以下のIconをEnableしてTextureを表示します。

結果です。

何も変化していません。

これはまだMaterial Assignmentをセットしてないからだそうです。

まず以下の場所にMaterialノードを追加しました。

まず以下のXを押してGroupのTabを3つに増やします。

それぞれのGroupにBrickFace、BrickChipsそしてGroutを追加しました。

次にMaterialをセットします。

以下の右端のIconをClickすると

Boxが表示されるので

そこからGroup名と同じOperatorを選択します。

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

全部セットした結果です。

普段、UEでMaterialをいじっている身からするともう一寸工夫の余地がある。と言わざる得ませんが、まあ最初はこんなもんでしょう。

今度はTextureのSizeを変更するための機能を追加するそうです。

<Adding Global Scales>15:00

Type Propertiesに戻って来ました。

Floatを

Materialに追加しました。

DragしてTopに移動します。

Propertiesの名前とLabelを以下のように変更しました。

RangeのMinの値に0.1をセットします。

TextureのSizeが0になっては問題だからだそうです。

これでApplyを押してType Propertiesは閉じてしまいました。

次にMatnet1ノードをClickして

中の階層に入りました。

BrickFaceノードを選択して

Settingを選択します。

Scaleがありました。

せっかく閉じたのにまたType Propertiesを開きました。

もう何をやるのか大体分かっていますが、一応まとめます。

UV Scaleを選択してBrickFaceノードのScaleを追加しました。

はい。

他のNodeのScale Parameterとの整合性はどうするんでしょうか?

最初は以下のようにSizeの値を3にしてそれぞれのScaleを追加しようとしましたが、

出来ませんでした。

なのでScaleに以下のCommandを追加して

直接Pathを示していました。

このPathはそれぞれのNodeのScaleにも写していました。

以上でした。

7.2 Houdini 19 - Wall Tool 13[4]を勉強した感想

想像していたのより3倍位内容が濃かったです。

それぞれのNodeのParameterは簡単に言ってしまえば、InstanceのParameterと同じでそのInstanceが指定しているRangeないでしか参照する事が出来ません。

しかしそのInstanceのParameterが他のInstanceが必要とする場合が多々あり、Instance同士のParameterのPassをどうやって行うのかというのは、Programmingの大きな分野の一つです。

C++ではEventやSignalとSlotなど、色々な方法を用いてInstance同士でParameterの情報をやり取りしています。

今回はHoudini内で別なNode同士でParameterをPassする方法を勉強しました。

更にNodeの中に入ってそのNodeの機能を追加するなど、今までやった事のない設定方法も勉強しました。

TextureのImportはShaderの基礎で、そういう意味ではHoudiniにおいて今回初めてShaderに関係した勉強をしたとも言えます。

8. UEFNの勉強

8.1 CUSTOM Fortnite Character Pt 2 (Animations) - UEFN / Creative 2.0 Tutorial [5]を実装する

<Intro>

特になし

<Creating Verse File / Editable Prop>

Verse Fileを作成します。

名前はCustom Model Deviceとしました。

Visual Codeで開きました。

Prop用のConstantを初期化します。

<Creating Main Update Model Function>

次にFreddyがPlayerを追いかけるためのFunctionを作成します。

FortniteのCharacterを使用するために以下のModuleを追加します。

UpdateModel()関数の実装を追加しました。

<Setting up Mutator Zone to Transform into Custom Character>

Mutator ZoneをLevel上に追加します。

名前はChangeToFreddyに変更しました。

Verseに戻ってConstantのMutatorを作成します。

Event Handlerを追加します。

先週のBlogには以下のように書いていましたが、

これは間違っています。

まずEventは先程のMutatorのRange内に侵入したら発生します。

そのEventを受け取る関数がEvent ListenerもしくはEvent Handlerになります。

それがこのMutator.AgentEntersEvent()関数になります。

Event HandlerはEventの発生を受け取った時に実行する関数を指定する事が出来ます。

この実行する関数の事をCallbackと呼びます。

Mutator.AgentEntersEvent()関数におけるCallbackを指定するための関数が、Subscribe()関数になります。

そしてCallbackはHandleAgentTriggerになります。

はい。

HandleAgentTrigger()関数を追加します。

Suspendのある関数をSuspendの無い関数から呼び出す場合は、Spawn:を追加する必要があります。

UEFNに戻ってVerseをBuildしたりDeviceをLevel上に追加したりします。

DeviceのFreddy Propに

以下のSkeletal Meshをセットしようとしたら出来ませんでした。

そうだPropを作成する必要があったんでした。

今から作成します。

しました。

DeviceのFreddyPropにこのPropをセットしました。

<First Result>

それではTestします。

横向きになってる。

Propに行って向きを直しました。

Testします。

向きは直っていますが浮いています。

これも直します。

まだ一寸浮いている様にも見えますが、これ以上下を向くとFreddyがうつ伏せになってしまうので、これでOKとします。

<Creating Animation Sequence>

Level Sequenceを追加します。

Sequenceを開いてFreddyを追加します。

歩いているAnimationを追加しました。

End Markをあわせました。

秒表示に切り替えます。

Sequenceを表示するためにCinematic Sequence Deviceを配置します。

しました。

そこに先程作成したLevel Sequenceをセットします。

Look PlaybackもEnableしました。

<Cinematic Sequence in Verse / Setting up Animation Update Loop>

はい。

Verseに戻って来ました。

先程配置したCinematic Sequence DeviceをVerse側から管理するためのConstantを作成します。

UpdateModel()関数を改良します。

Brachを追加しました。

Branch内の実装は実行されますが、それと同時にBranchの次に書かれているCodeも実行されるそうです。

<Using SprintedEvent to Change Animation States>

Branchの後に実行するCodeを追加しました。

SprintedEvent()関数が発動すると、止めていたCodeを実行するそうです。

それ以外の時はAnimationを停止しています。

UEFNに戻ってDeviceにRunning CinematicにCinematic Sequence Deviceをセットしました。

<Second Result>

二回目のTestをやります。

歩いている時だけAnimationが表示されます。

先週のBlogを読むと

と書いてありました。

出来てますね。

<Fixing Character Rotation>

Freddyが上下には移動しないようにCodeを改良します。

前のTutorialからCodeをCopyして以下の部分に追加しました。

Errorの箇所を直します。

まず以下のModuleを追加します。

追加したCodeは以下のように改良しました。

FreddyProp.MoveTo()関数のParameterは以下のように変更しました。

ここでTestするのかと思ったら、

やっぱりこの部分の実装は以下のようにLoopの中に書く必要があったと、Codeを移動させています。

同様に移動させました。

このAngleの値がXとYから作成しているからPlayerのZ軸における変化は無視されるはずです。

後、PlayerPosの設定が間違っていたのでそこは直しました。

<Final Result>

はい。

それではテストします。

走っている時に上を見上げました。

うん。

出来ています。

8.2 CUSTOM Fortnite Character Pt 2 (Animations) - UEFN / Creative 2.0 Tutorial [5]を実装した感想

段々VerseとUEFNの関係が分かって来ました。

UEFNでAssetを指定して、Verse側でそのAssetの機能を追加します。

大体はEvent HandlerにCallbackを追加する形式でAssetに機能を追加します。

Callbackには関数が使用されます。

9. DirectX12の勉強

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

9.1.1 Creating a Window | D3D12 Beginners Tutorial [D3D12Ez] [6]の次の10分を勉強す

<Shutdown Method>

DXWindow ClassのInit()関数の最後にReturnを追加しました。

今度はShutdown()関数の実装を行います。

このUnregisterClassW()関数が全部やってくれるそうです。

<Creating the window>

Main.cpp fileに戻って作成したDXwindow ClassのInit()関数が動くか確認しています。

Window.hをIncludeしました。

DXWindowを初期化しました。

WhileにBreak Pointを追加してDXWindowが初期化しているのかを確認しました。

今度はWindow.cppに戻り、

Init()関数の最後に以下の実装を追加しました。

これで実際のWindowを作成しています。

<Creating the window handle>

先程のCreateWindowExW()関数はReturn ValueにWindow Handlerを返します。

それを受け取るVariableを作成します。

Window.h fileのPrivateに以下に示した様にHWND型の変数を宣言します。

名前はm_windowとします。

Window.cppのInit()関数に戻って

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

これでCreateWindow()関数のReturn Valueの値をm_windowが受け取るようになります。

更にinit()関数のReturnの値を以下のように変えました。

これでCreateWindow()関数がWindowを生成出来たかどうかをInit()関数のReturn Valueから確認出来るようになりました。

<Testing the window>

実行します。

以下のようなWindowが生成されました。

ただしこのWindow、何をしても反応しません。

例えばWindowを閉じようと右上のxを押しても、何の反応もしません。

これはWindowがFrame毎に同様に反応すべきかを指定してないからだそうです。

そのための関数をWindow.h fileに追加します。

更にWindow.cppにその関数の実装を追加します。

最後のDispatchMessageW()関数だけ意味がよく分からないです。

後は大体理解出来ました。

まずWindowのClose Buttonを押すなどすると、Eventが発生します。そのEventを受ける変数をまず作成します。

これがMSG型の変数であるmsgです。

これにPeekMessageW()関数を使用してWindowが発したEventをmsgにAssignします。

そのままでは理解出来ないのでTranslateMessage()関数でmsgの内容を翻訳します。

そしてDispatchMessageW()関数で何をするの?

どこかにこのMessageを送るのか。

うーん。

この先でEvent ListenerがあってそこでDispatchMessageW()関数から送られたMessageを受け取るのかな。

ここで22:25になったので、今週の勉強はここまでとします。

9.1.2 Creating a Window | D3D12 Beginners Tutorial [D3D12Ez] [6]の次の10分を勉強した感想

前に他のTutorialでWindowを作成した時は、この部分の説明はよく分からなかったですが、今聞くと単なるEventとその処理をどうするのかについての話だと理解出来ました。

勉強の成果が出ている証拠です。

たしかに一週間では一寸ずつしか成長していませんが、この成長は正しい方法で勉強しているから起きている事であり、けっして軽んじてはいけないと思います。

このまま勉強を続けたいと思います。

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

9.2.1「4.11 三角形ポリゴンを四角形にしてみる」の「4.11.1 Primitive Topologyを変更する」を実装する

今回は先週の勉強の内容を実装する事にします。

果たして、四角が表示されるようになるでしょうか?

まず今の実装のままで実行してみます。

以下に示した三角形が表示されました。

それではCodeを変更します。

まずVerticesの指定ですが以下のように最初から4つ指定しています。

ここは変更する必要ありません。

次です。

PrimitiveのTopologyの設定を以下のD3D_PRIMITIVE_TOPOLOGY_TRIANGLELISTから

D3D_PRIMITVE_TOPOLOGY_TRIANGLESTRIPに変更する必要があるそうです。

変更します。

更にDrawInstance()関数の最初のParameterの値も3から4に変更します。

はい。

これで四角を表示するための実装の変更は出来たはずです。

実行して試してみましょう。

おお、四角になりました。

出来ました。

9.2.1「4.11 三角形ポリゴンを四角形にしてみる」の「4.11.1 Primitive Topologyを変更する」を実装した感想

前に四角を表示しようとして失敗しましたが、結構惜しかった所までやっていたんですね。

PrimitiveのTopologyのやり方を指定したのは覚えていたんですが、どこでその指定をしたのかまでは覚えていませんでした。

来週からはIndexを使用してVertexの位置を指定する方法を勉強します。

実際はIndexで指定するらしいのでここはしっかり勉強する事にします。

10. まとめと感想

特になし

11. 参照(Reference)

[1] Jeremy Howard. (2022, July 21). Practical Deep Learning for Coders: Lesson 1 [Video]. YouTube. https://www.youtube.com/watch?v=8SF_h3xF3cE

[2] pwnisher. (2024, May 11). Unreal engine materials in 6 levels of complexity [Video]. YouTube. https://www.youtube.com/watch?v=iZgbzwBQTPY

[3] WINBUSH. (2024, April 24). Official Android support for Unreal Engine virtual camera [Video]. YouTube. https://www.youtube.com/watch?v=bzFM0HdLYSU

[4] Rick Banks. (2022, June 28). Houdini 19 - Wall Tool 13 [Video]. YouTube. https://www.youtube.com/watch?v=NU60wnBsIkM

[5] Pi Equals Three. (2023, June 12). CUSTOM Fortnite Character Pt 2 (Animations) - UEFN / Creative 2.0 tutorial [Video]. YouTube. https://www.youtube.com/watch?v=7VETvYBZNQc

[6] Lötwig Fusel. (2023, June 5). Creating a Window | D3D12 Beginners Tutorial [D3D12EZ] [Video]. YouTube. https://www.youtube.com/watch?v=yBKQLxkcXz4

[7] Daniel Batal. (2023, May 21). Camera SHAKE Effect - DaVinci Resolve [Video]. YouTube. https://www.youtube.com/watch?v=bqZiYVl6XQc

[8] Cart & Horse. (2023, June 27). Export an audio track in the movie render Queue (Unreal Engine) [Video]. YouTube. https://www.youtube.com/watch?v=8BowOk2mxdA

[9] Unreal Katya Fedak. (2024, April 10). Unreal Engine 5.4 Plant Growth Effect tutorial in under 5 mins [Video]. YouTube. https://www.youtube.com/watch?v=JJyJD_QDLy0

[10] Sequencer Cinematic Editor Unreal Engine | Unreal Engine 5.4 Documentation | Epic Developer Community. (n.d.). Epic Developer Community. https://dev.epicgames.com/documentation/en-us/unreal-engine/sequencer-cinematic-editor-unreal-engine

[11] Cinematic Cameras in Unreal Engine | Unreal Engine 5.4 Documentation | Epic Developer Community. (n.d.). Epic Developer Community. https://dev.epicgames.com/documentation/en-us/unreal-engine/cinematic-cameras-in-unreal-engine?application_version=5.4