
1. 今週の予定
以下の内容を勉強します。
2. 映像作品としてのLevelの作成
2.1 PCGの勉強
2.1.1 Get Started With PCG 5.4 By Creating a Full Building | UE 5.4 P1 [1]の続きを実装する
同じProject内で色々な事をやっていると一つ失敗した時に全部駄目になってしまいます。
のでPCGに関しての勉強をする専用のProjectを一個作成する事にします。
名前はPCG_Studyとします。
このProject内に最初から作り直します。
2024-11-10のBlogをやり直します。
<01:12 - Enable PCG>
Procedural Content Generation Framework(PCG)をEnableします。

UE5を再起動しました。
<01:37 - Creating the BP Spline with PCG Graph>
PCG Graphを追加します。

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

更にActor ClassからBPを作成してBP_Buildingと名付けました。

BPを開いて通常のSplineを追加します。

Splineの形状を以下に示した四角に変更しました。

このやり方は2024-10-27のBlogにまとめてあります。
よくよく考えたら同じ内容をBlogにまとめても無駄になります。
前に別なProjectでやった実装は記録しないでやってしまいます。

出来ました。

<Exterior Walls Subgraph>
では先週勉強した内容を実装していきます。
BP_BuildingにWallThicknessを追加します。

PCG_Building側に以下の3つのNodeを追加しました。

ここから今あるPointの上下左右にPointを作成していくはずです。
最初の実装です。

Transform PointsノードにあるOffset MinとOffset Maxの意味が分かりません。
実際の変化で確認してみます。
これが

こうなりました。

全てのPointがX軸の正の方向にWall Sizeの半分だけずれただけですね。
2番目のPointを作成します。
以下の実装を追加しました。

最初のPointがX軸の正の方向にPointを移動させたので、このPointは負の方向に移動させています。
後、Make Vector Attributeノードを追加する必要がありました。
これが無いとPointは表示されなかったです。
結果も以下に示しておきます。

X軸の負の方向にWall Sizeの値の半分だけずれています。
同様の方法でY軸の正負にWall Sizeの値の半分だれずれたPointsも作成します。
以下の実装で作成しました。

上下左右というより東西南北にPointを生成したというべきですね。
次に以下の実装を行います。

これが何をしているかがよく分かりません。
結果を見て考えます。

ああ。成程。
こういう事をしているのか。
納得しました。
X軸の正にずらしたPointからX軸の負にずらしたPointを引いたら、X軸から正の方向に最も離れたPointsだけが生成されるようになりました。
今度は逆をやっています。

結果です。

今度はX軸から負の方向に最も離れたPointsだけが生成されました。
同様の実装をY軸に対しても行い

以下のようなPointsを生成しました。

生成された4つのPointsをMerge Pointsノードを使用して合成しました。

結果です。

むー。
要はBuildingの壁を生成するためのPointを生成していたのか。
ここでStatic Mesh Spawnerノードを追加してPointからStatic Meshを生成します。

以下のStatic MeshをFabからDownloadしました。

これをStatic Mesh Spawnerノードの以下のParameterに追加しました。

結果です。

Materialが生成されません。
うーん。
なんで?
一回UE5を再起動してみます。
やっぱり白いままです。
うーん。
他のStatic Meshで試してみます。

一緒にDownloadした柱の方です。
こっちは問題なくMaterialが表示されています。
もう一回セットし直したら普通に表示されました。

うーん。
焦った。
このWallは横が4m、高さが3mで幅は20cmです。
BP_Buildingの設定をこのWallの設定に合わせます。
以下のようになりました。

先週のBlogを読むと以下のように書かれていました。

そうなのか?
生成されたWallを上から見てみました。

赤がX軸、緑がY軸です。
Y軸がWallの厚さだけずれているのはあってそうです。
X軸がWall Sizeの値の半分だけずれているのはどうなんでしょう。それよりもすこしだけずれているようにも見えます。
取りあえずやってみます。
以下の実装を追加しました。

結果です。

なんかずれているように見えますが回転させて正しい位置に移動させたら変わるかもしれません。
それぞれのWallに回転を追加して正しい向きに変更します。
以下に示したTransform Pointsノードを選択して

Rotation MinとRotation Maxに以下の値をセットします。

それぞれのTransform PointsノードのRotation MinとRotation Maxに以下の値をセットします。
2番目

4番目

結果です。

うーん。
あっているのか。
壁同士は以下のようにつながっています。

Tutorialの壁同士の接合部を見ると一寸違いますね。

Tutorialは重なっています。
Y軸のOffsetを外してみました。

結果です。

こっちの方が正しいそうです。
これでやる事にします。
以下の部分の実装を選択して一個のNodeに変更します。

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

TutorialとはInput Pinの順番が違いますね。

取りあえず名前だけ直しました。
完成したと思ってLevelに戻ったら以下のようになってしまっています。

何で?
取りあえずCtrl+Zで正しい形状を示すところまで戻ると思ったらUE5がFreezeして閉じてしまいました。
うおおーん。
UE5を再起動してこのLevelを開くと全く同じ状態になっています。
もうCtrl+Zで正しい形状の時まで戻す事も出来ません。
色々やったら直りました。

原因は以下のMake Vector Attributeノードの値で0になるものを指定してなかったからのようです。

全部指定し直します。
もう一回Subgroupしました。

今度はSubgroup化しても同じ結果になりました。

Pointの位置を一個だけ変更すると以下のようなWallが形成されます。

この原因ですが以下のようにPointが生成されるからです。

以下の隙間が気になります。

ここだけ直します。
WallのY軸側の位置をWallの厚さの半分だけ正の方向に移動しました。

結果です。

壁の継ぎ目がくっつきました。
正し他の継ぎ目は以下のようになってしまいました。

うーん。
まあこういう建物も無くは無いでしょう。
これで合格にします。
2.2 動画の作成ための勉強
2.2.1 Dragonに火を吹かせる
先週作成したDragonに火を吹かせます。
先週、既にNiagaraのSmokeを追加したんですが、

そのやり方をまとめるのを忘れていました。
どうやって追加したのか全く覚えていません。
Copilotで質問します。

How to use Niagara VFX in Sequencer Unreal Engine 5.1 [2]に詳しいやり方が載っていました。
これ見たら前回、この動画を見てNiagaraを追加したのを思い出しました。

追加出来ました。
先週追加したSmokeは要らない気がして来ました。
色々改良しました。
何でLandscapeが凸凹になってるの?
もう一回Encodeしました。
今週はここまでにしておきます。
来週はControl Rigを使用してLevel SequenceからAnimationを編集する方法を調査します。
3. AIの勉強
今週も「02_production.ipynb」の続きを読んでいきます。
今週で2章を最後まで読めると良いです。
3.1 先週の復習
先週はまずCleanerの使い方を勉強し間違ったLabelをしているDataを除去できるようにしました。
そして作成したAIを使用してAppを作成する方法について勉強しました。
3.2 「02_production.ipynb」の続きを読む
<Turning Your Notebook into a Real App>
先週までの勉強でJupyterノートブックですべてが動くようになったのでアプリケーションを作成できるそうです。
これを行うにはまず新しいノートブックを開始します。
そして必要なウィジェットを作成して表示するために必要なコードと表示したいテキストのマークダウンを追加します。
VoilàをInstallします。

Jupyterは使用しないのでColabでも同じ事が出来るのか調べる必要があります。
と思ったけど実際にAppを作成する時はLectureで説明したやり方をやる事にしているので別に調べる必要もないかもしれません。
Copilotに!の機能について質問するだけはやっておきます。

Colabでも同じみたいです。
ただVoilaをJupyterでやったように完全にLocalで走らせる事は不可能のようです。
VoilaをJupyterのLocalで走らせた場合、全てのCell Inputは無くなるそうです。
このCell Inputが何を意味しているのか具体的には分かりませんが、文章から推測するとウェブアプリケーションだけ表示する事を指しているようです。
更にこのCodeをVoilàのApplicationとして表示するにはブラウザのURLの 「notebooks 」を 「voila/render 」に置き換える必要があるそうです。
うーん。
これだけ聞いたんでは何がなんだか分かりません。
次の文章です。
VoilàやipywidgetsだけがFrameworkではありません。
以下のCodeを実行したら
pred,pred_idx,probs = learn.predict(img)
どのFrameworkでもAppを作成出来るそうです。
そうかVoilaってFrameworkを作成するLibraryだったのか。
この辺の知識が無かったんだ。

Voilaを使用するとJupyterやPythonをInstallしなくてもJupyterで作成したAppが動けるようになるそうです。
<Deploying your app>
まずAppを動かすにはGPUは要らないという事を説明しています。
更に作成したAppは無料で公開する事が出来るSiteが沢山ある事を説明しています。
その一つの例としてBinderが紹介されています。
Binderでは以下のやり方でAppを公開する事が出来るそうです。

これはAppと言うよりもWebsiteを無料で作成出来るSiteって事みたいです。
確かLectureでは違うSiteを使用していました。
この辺も実際に作成する時はLectureを参考にして作成します。
更にSmartphone用のAppを作成する場合もWeb serverを使用した方が良いなどのAdviceが続いています。
<How to Avoid Disaster>
Deep Learningを使用したAppの作成で起きる問題について語っています。
具体的にはOut-of-domain data とdomain shiftについて語っていました。
簡単にまとめるとOut-of-domain dataは学習に使用したDataと実際のDataが違うために望んだ結果が得られない問題を指します。
それに対してDomain Shiftは学習した時の目的と実際に使用する時の目的が変わってしまい、学習したDataが役に立たなくなる問題を指しています。
一応、Copilotに聞いてこの解釈で正しいか確認します。

これは私の解釈と大体同じです。

こっちはよく分かりません。
この説明だとOut-of-domain dataと同じ意味だと思います。
それは兎も角、これらの問題を避ける為にdeploy_processという方法が開発されました。
以下にDeplay_Processの方法を示します。

教科書にはこれらの詳しい解説が書かれていますが、読んでもあんまり実感が湧かないのでここにはまとめません。
<Unforeseen Consequences and Feedback Loops>
このDeep LearningのModelの結果が学習Dataに影響を与えて、その結果Deep Learningの結果を歪めてしまう例が紹介されています。
この例が分かりにくいですが、以下のような感じです。
- 「予測的取り締まり」アルゴリズムが、特定の地域で犯罪が増えると予測する
- より多くの警察官がその地域に派遣されるようになる
- その結果、その地域でより多くの犯罪が記録されるようになる、
これは犯罪は増えてないのに犯罪して捕まる人が増えたって事なの?
その結果、更に多くの犯罪が増えると予測されてその箇所に更に多くの警官が派遣されるようになるがそれは間違っている。という事を言いたいんでしょうか?
あ、以下のようにまとめていました。
- 予測的取り締まりは、将来の犯罪を予測するのではなく、将来の取り締まりを予測するものである。
この辺の解釈が難しいのは犯罪の定義が、捕まらなくても犯罪なのか、捕まった場合だけが犯罪になるのかが分からない事です。
この話は前提として捕まらなくても犯罪は犯罪と考えてこの話を進めているみたいです。
いやそれでもこの解釈には納得出来ないです。
例の説明から解釈すると、要は予測は間違っていたけど、その予測の結果、色々な対応がなされて、予測通りの結果に実際は違うのに見た目はなってしまった。という事が言いたいと思います。
<Get Writing!>
Deep Learningを勉強するに当たって、絶対にやった方が良いのは勉強した内容をBlogにまとめる事だそうです。
まさしく私が今ここでやっている事です。
<Questionnaire>
章の最後に質問が書いてあります。
流石にこれらを一々解いている暇はありません。
と思ったんですが、一応読んだらそんなに難しい質問じゃなかったです。
一応解答を以下にまとめる事にします。
Fastbook Chapter 2 questionnaire solutions (wiki) [3]に解答も載っているのでそれと比較もします。
Provide an example of where the bear classification model might work poorly in production, due to structural or style differences in the training data.
絵で描いた熊を識別する場合。
解答集の答えです。

学習に使用していないDataで予測する時は大体失敗すると言っています。
解答集の答えの方が精錬されていますが、言いたい事は同じです。
Where do text models currently have a major deficiency?
間違った答えをさも正しいように回答してしまう事です。
知らない事を知らないと言えない事です。
解答集の答えです。

正しい解答をするのが苦手と書いてあります。
更に間違った解答をさも正しいように書くのでその点では非常に危険と書かれています。
What are possible negative societal implications of text generation models?
間違った解答をする事です。
解答集の答えです。

2番目のBiasに関しては知らなかったです。
In situations where a model might make mistakes, and those mistakes could be harmful, what is a good alternative to automating a process?
これはあんまり考えた事なかったです。
解答集の答えを見ます。

専門家に確認してもらうのが必要だったのか。
理解しました。
What kind of tabular data is deep learning particularly good at?
Deep Learningは基本的にはTabular Dataは苦手です。
解答集の答えです。

だそうです。
この辺は勉強した事は覚えていますが、そんなに印象に残ってはいません。
What's a key downside of directly using a deep learning model for recommendation systems?
これは覚えています。
たしか本人に役に立つものを推薦するんじゃなくて、その人が買いたいものを推薦するようになるってやつです。
解答集の答えです。

同じ内容が書かれていました。
What are the steps of the Drivetrain Approach?
これは覚えていません。Drivetrain Approachで覚えているのは、実際のBusinessにDeep Learningを使用する際に起きる問題に対応するために開発された。という話だけです。
解答集の答えです。

これか。
これって結局よく意味が分からなかったんだよな。
How do the steps of the Drivetrain Approach map to a recommendation system?
Drivetrain Approachがあまりよく理解出来なかったのでその応用であるこれについては本当によく分かってないです。
解答集の答えをみます。

この解答の方が本文のDrivetrain Approachの説明よりかなり分かり易いですね。
この辺は教科書をもう一回読む機会があったらしっかり勉強します。
Create an image recognition model using data you curate, and deploy it on the web.
これは来週からやり始めます。
と言っても来週はLecture2の内容の復習して終わりでしょうが。
What is DataLoaders?
WebにあるDataをDeep Learningの学習に使用出来る形のDataに保存するための関数です。
具体的な使用方法までは覚えていません。
解答集の答えは

となっていました。
関数じゃなくてClassなのね。
What four things do we need to tell fastai to create DataLoaders?
これはDataLoaderに必要なParameterを聞いているんでしょうか?
調べたら20個位のParameterが出て来ました。
これは勉強した内容とは違います。
先週のBlogには以下のまとめが書いてありました。

これがこの質問の答えです。
解答集の答えです。

同じですね。
What does the splitter parameter to DataBlock do?
学習に使用するDataと検証に使用するDataを分割する値です。Splitter parameterの値が0.2ならば、80%のDataが学習に使用され、残りの20%が検証に使用されます。
解答集の答えです。

うーん。
これ見るとSplitter Parameterは値を指定しないみたいですね。
確認します。

SplitterにはどのようにDataを分割するかの指定をしていました。
そしてRandomSplitter()関数を使用した場合は、学習に使用するDataと検証に使用するDataを分割する値をそのParameterで指定する事が可能でした。
How do we ensure a random split always gives the same validation set?
これは全く知りません。
こんなの勉強したんでしょうか?
解答集の答えです。

はい。
これは別にComputer全般に言える事です。
What letters are often used to signify the independent and dependent variables?
これは先に解答集の答えを見てしまいました。

答えを見れば話を思い出しますね。
What's the difference between the crop, pad, and squish resize approaches? When might you choose one over the others?
CropはImageの端を切ってSizeを調整するやり方で、Padは黒などの色で無い部分を補う方法です。Squishは縮めてSizeを揃える方法です。
解答集の答えは長いのでここには載せません。
大体合っています。
What is data augmentation? Why is it needed?
これは何を言っているのか不明です。
解答集の答えを見ます。

元にあるDataを一寸だけ加工して別なDataを作成して使用する事を指しているようです。
What is the difference between item_tfms and batch_tfms?
これも答えは知りません。
解答集の答えを見ます。

これは全く知らない事です。
こんな話は勉強する必要があるんでしょうか?
What is a confusion matrix?
これは先週勉強しました。

これの事です。
What does export save?
ExportはDeep Learningで作成したAIを単独に使用出来るようにしたAppみたいなものです。
解答集の答えです。

これが正しい解答ですか。
Testで丸を貰うためには、ArchitectureとParameterをSaveしているものである。という事を述べる必要がありますね。
What is it called when we use a model for getting predictions, instead of training?
うーん。
これは勉強した記憶はありますが覚えていません。

だそうです。
What are IPython widgets?
FastAIのWidgetを作るためのLibraryじゃなかったかな。

だそうです。
こういうのはどう解答するかが重要です。
ここでは
- JavaScriptとPythonが使用されている
- GUIを作成する
- Jupyter notebookで使用する
の3つを述べる必要がありますね。
When might you want to use CPU for deployment? When might GPU be better?
基本的にはGPUは使用しない。CPUで対応する。
ServerにDataを送って送り返す必要があるような膨大な計算を必要とするAppではGPUを使用しても良いかもしれない。
解答集の答えです。

これは一般的な解答としては正解ですが、別にこの教科書に書かれていた内容とは関係ない気がします。
どうなんでしょう?
What are the downsides of deploying your app to a server, instead of to a client (or edge) device such as a phone or PC?
Lagが発生する事です。
解答集の答えです。

LagじゃなくてLatencyでした。
Serverを使用する長所も書かれていました。
Endpointを気にしないでVersionをUpdate出来るのはかなり凄いMeritです。ここは気が付きませんでした。
What are three examples of problems that could occur when rolling out a bear warning system in practice?
熊は通常、木の陰に隠れているが、その場合は認識出来ない。
夜になった場合は熊を認識出来ない。
画像の端に熊が写っている場合は認識できない。
どうでしょうか?
解答集の答えをみます。

うーん。
一個だけか正解は。
Low Resolutionは考えた事なかったです。そう言えば教科書にも書いてあったかもしれません。
最後の予測が遅くて警告が間に合わなかった場合も考えてなかったです。
これは「画像の端に熊が写っている場合は認識できない。」や「熊は通常、木の陰に隠れているが、その場合は認識出来ない。」と原因は同じですが、その結果起きる問題まで発展して解答していますね。
What is "out-of-domain data"?
学習に使用しているDataが実際に予測するDataと乖離がある場合を指します。
解答集の答えです。

あってますね。
What is "domain shift"?
これは学習した時の目的と使用する時の目的が変化してしまい、学習に使用したDataが役に立たなくなる事を指していると、自分では解釈しているんですが、Copilotの解答は違っていました。
解答集の答えを確認します。

うーん。
この説明もよく分からないです。
取りあえず結論を出すのは保留します。
What are the three steps in the deployment process?
これはさっき勉強したやつです。がThree Stepsのそれぞれまでは覚えていません。
解答集の答えを見ます。

これは本格的にAppを使用する場合だけ関係する内容なので初心者の私はまだ先の話です。
何故か解答集には更に2つの質問が載っていました。

これは本筋とは関係ないです。
<Further Research>
これで終わりかと思ったらここでも質問されていました。
一応質問だけ読みます。
Consider how the Drivetrain Approach maps to a project or problem you're interested in.
これはDrivetrain Approach自体を理解してないので、何も言えないです。
こういうのって実際やったら効果ないものも多いんです。ので慌てて勉強する必要もないでしょう。
When might it be best to avoid certain types of data augmentation?
まず今気が付いたんですが、data augmentationが正しいSpellingでした。

でこの質問の解答ですが分かりません。
なんか避けないといけないAugmentationってあったけ?
For a project you're interested in applying deep learning to, consider the thought experiment "What would happen if it went really, really well?"
あ、これ解答集に合った質問です。
Start a blog, and write your first blog post. For instance, write about what you think deep learning might be useful for in a domain you're interested in.
こっちも同じです。
やっとこれで教科書の第2章が読み終わりました。
3.3 「02_production.ipynb」を読み切った感想
これは長くなるので来週やる事にします。
4. Nvidia Omniverseの勉強
今週はROS2をInstallします。もうこれだけです。
4.1 Install ROS2 Jazzy in Windows by Using WSL - Windows Subsystem for Linux [4]を実装する
まずWindows Terminalを開きUbuntuのTabを開きました。

<Set locale>
まずUbuntuのCharacter Encodingの設定がUTF-8になっているかどうかを確認します。

はい。
なっていました。
次に以下のCodeを実行しました。

PasswordをInputしてEnterを押したら実行されました。
次のCodeです。

更に次のCodeも実行しました。

これは何の反応もないですね。

これも何の反応もないです。
最後に以下のCodeを入れて確認しています。

LanguageがEn_USのUTF-8に変更されています。
<Enable required repositories>
Ubuntu Universe repositoryをEnableします。

次に以下のCodeを実行しました。

Enterを押しました。

今度はROS 2 apt repositoryをInstallします。
そのためのROS 2 GPG key with aptをまずInstallします。

ここはTutorialと一寸違う返事が返って来てますね。
Upgradeとかよく分からないです。
このまま進めます。
次のCodeを実行しました。

これでROS 2 apt repositoryをInstall出来るようになりました。
次のCodeを実行してROS 2 apt repositoryをInstallします。

この辺何も返答が無いです。
合ってんのか不安です。
これでROS 2 apt repositoryがInstall出来たはずです。
<Install development tools (optional)>
以下のCodeを実行しました。

すっごい書き込みが現れて30秒ぐらいかかって終わりました。
<Install ROS 2>
ROS 2をInstallします。
まずapt repository cachesをUpdateします。

更にUpdateします。

これも凄い書き込みが続きました。
やっとここでROS2をInstallします。
Desktop版をInstallします。

普通にInstall出来たみたいです。
うーん。
これで完成したのか?
<Try some examples>
テストしてみます。
以下のCodeを実行しました。

なんの返事も帰って来ません。
出来てるって事のようです。
以下のCodeを実行しました。

普通に動いています。
別なTabからUbuntuを開いてListenerを起動させました。

おお、Talkerの信号をきちんと受け取っています。
Ctrl+Cを押してこのFileの実行を停止しました。
おお、出来たって事でしょうね。
ついでに以下のCodeも試してみます。
![]()
おおRvizが開きました。

以下のErrorが表示されているのもTutorialの結果と同じです。

出来てますね。ROS2のInstallが出来ました。
特に問題もなく出来ましたね。
なんか簡単に出来ちゃったのでびっくりしてます。
4.2 公式のSiteであるWhat Is Isaac Sim? [5]を勉強する
時間が余ったので公式のSiteでも読む事にします。
Isaac Sim Workflows [6]を読みます。
<Learning Objectives>
ここではIsaac Simで開発するためのさまざまなWorkflowと、既存のsystemとIsaac Simを連携させる方法が勉強出来るそうです。
<Getting Started>
Isaac Simでの開発には、主に3つのワークフローがあるそうです。
それぞれに長所短所があるそうです。
拡張機能は何を言っているのか不明です。
<GUI>
これはGUIについて解説しています。
以下の3つのTutorialでGUIの操作の基本は習えるそうです。
- Isaac Sim Interface,
- Environment Setup,
- Add Simple Objects,
どうせOmniverse Createと基本は同じでしょう。
更にRobotのGUIを学びたい場合は
- Assemble a Simple Robot.
を勉強すると良いそうです。
<Extensions>
拡張機能の事です。
OmniverseのCoreのModuleたちの事でした。
<Writing a Custom Python Extension>
ああ、これ見て分かりました。ExtensionってUE5で言う所のPluginの事です。
なんだ。
そう言う事か。
しかしそれ以上の事は何をやっているのか全く分かりません。
一寸Extensionで検索してみます。
How to Build an Omniverse Extension in Less Than 10 Minutes [6]でExtensionの作成方法が説明されていました。

やっぱりこれUE5で言う所のPluginだ。
でここで説明してるのはそのExtensionの作成方法でした。
ただこれ読んだだけじゃ何してるのか全く理解出来ないです。
<Writing a Custom CPP Extension>
C++でもExtensionを書く事が出来るそうです。
<Standalone Application>
Pythonで書いたScriptを使用してIsaac Simを起動し、Renderingと物理演算を手動で行う方法を勉強するみたいです。
全部読んだんですがこの説明だけでは何をやっているのかもどんな目的でやっているのかもよく分かりません。
更に言うと10分位離れるとWebが停止して動かなくなってしまいます。
一寸調べてたりしている間にWebが停止してしまうので非常にやりにくいです。
Extensionについては別な動画で調べる事にします。
今回のOmniverseの勉強はここまでにします。
5. Gaeaの勉強
5.1 PowerPointの作成
以下のPowerPointを作成しました。

今週は時間経過を追加するためのNodeを勉強します。

Lectureの内容について簡単に説明しています。

Fabの期限付きAssetについて解説しています。

Simulate Groupが時間経過を追加するためのNodeが属しているGroupです。

Simulate Groupに属しているSubgroupを紹介しています。

Erosion Subgroupの説明です。

Scatter Subgroupです。

Snow Subgroupについてです。

Vegetation Subgroupについての説明です。

Water Subgroupについての説明です。

ErosionノードとしてEasy ErosionノードとErosion2ノードについて勉強します。

Easy ErosionノードのParametersについて説明しています。

Erosion2ノードのParameterで説明しています。

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

DowncuttingについてGeology的な観点から説明しています。

Gaea2におけるDowncuttingについて説明しています。

Erosion Scaleについて説明しています。

最後にまとめです。
6. Houdiniの勉強
今週も以下の2つを勉強していきます。
- VEX Isn't Scaryの勉強
- 2024-08-04のBlogの勉強の続き
6.1 VEX Isn't Scaryの勉強
6.1.1 VEX Isn't Scary - Part 5: Loops [5]を実装する
先週勉強したTutorialを実装します。
<Intro>
For Loop、For Each Loop、そしてWhile Loopの使用方法を勉強します。
Geometryノードを配置してその中にAttribwrangleノードを配置します。

AttribwangleノードのParameterであるRun Overの値をDetail(only once)に変更しました。

<Array>
以下のArrayを作成しました。

更に以下のAttributeを初期化しました。

Geometry SpreadsheetのDetailを開くと

Attribute Testが生成されています。
今度はAttributeのArrayを作成します。

Arrayの型を指定した後にSquare Bracketsを追加するだけですね。
Geometry SpreadsheetのDetailです。

以下の方法でArrayの要素の値を変更する事が出来ます。

Geometry SpreadsheetのDetailです。

TestArrayの二番目の値が15.3に変化しました。
Arrayの使用方法が理解出来たので、Foreach Loopの実装を行います。

Geometry SpreadsheetのDetailです。

あってますね。
<For Loops & Iteration>
今度はFor Loopの実装です。

単なるFor LoopですがChannel Functionとか、Attributeの概念が入ってくるとそれなりに複雑に感じます。
Geometry SpreadsheetのDetailです。

NumberOfIterationの値は4にセットされているので8であっています。
<While>
While Loopも実装してみます。

結果です。

これBooleanを使用してCodeをスッキリさせようとしたら、Booleanって型はVEXには無いみたいです。
Copilotに聞いたら以下のように回答していました。

<Infection solver>
ここからのTutorialの内容はLoopを使用するとこんなのも生成出来ますよ。というもので一寸真似して実装しても出来る気がしないので今回はSkipします。
6.2 「2024-08-04のBlogの勉強」の続き
6.2.1 Digital Assetについての確認
Digital Assetって特別なWindowがあったんでしたっけ。
今週はこれについて確認します。
Houdini 19 - Wall Tool 01 [7]を見ると

GeometryノードのParameterからDigital Assetを操作しています。
要は一個の新しいNodeを作成したという事です。
先々週作成したDigital Assetも確認しておきます。
なんと、Saveしてなかったです。
うーん。
もう一回作成するか。
Geometryノードを追加してその中に以下のNodeを配置しました。

先々週のBlogを見ると以下のように書いてありました。

これのやり方が分かりません。
Copilotに聞きました。

出来ました。

本当にAI様様です。
このNodeのDigital Assetを作成します。
後は、Blogに書かれた通りにやって出来ました。
SubnetノードのParameterにDigital Assetで作成した新しいParameterが表示されています。

はい。
こうやって新しいNodeのParameterを作成するのがDigital Assetの機能である事が確認出来ました。
これで一応、以下の4つの工程の

具体的な方法を確認する事が出来ました。
6.2.2 それぞれの工程の確認
今週から今まで勉強したそれぞれの工程の実装を確認します。
工程1と2でBrickを生成していますが、UE5のPCGではPointに対してStatic Meshを直接Setしています。
この辺の違いはどうなんでしょう。
このTutorialだけBrickをこの方法で生成していて他のTutorialではUE5のPCGのようにPointに対して直接Static Meshを作成していそうです。
この辺は沢山、Tutorialを勉強する事で経験値を増やしていくしかないですね。
以下のように実装してPointにMeshを生成出来るかどうか試してみました。

結果です。

出来ました。
となるとUE5のPCGのような使い方も出来るという事です。
以下のような十字架が並ぶModelを作成してみます。

出来ました。

地面から垂直に生えている事と十字架の向きが同じ事が絵と違いますね。
でもまあこれぐらい出来たら今は良い事にします。
全然理解出来なかった前に比べたら凄い進歩です。
7.VFXの勉強
7.1 「Houdini is HIP - Part 4: Rendering [8]の次の10分を実装する」をやり直す
先週、Principled ShaderノードのDisplacement TabからEnable Noise DisplacementをOnにしたんですが、何の変化も起きませんでした。
今週はこの問題を直します。
まずTutorialのNoiseの設定を確認しました。

まったく同じ設定にしました。

が結果は変わりません。

Karma Renderingから見ましたがこの結果も同じです。

Comment欄をしっかり読んだら同じ問題に直面している人がいました。

それについて解答している人がいました。

何と13日前の書かれたCommentです。
これを試してみます。
まずObject Layerから以下のBoxを開くと

Edit Parameter Interfaceがあります。
これを開きます。
以下のWindowが開きました。

Renderを探します。

Render PropertiesというTabはありました。
Renderというのは無いですね。
この中にMantraがあるか探してみます。

なんとありました。
Mantraの中にShadingがあるか探してみます。

これもありました。
この中にDisplacement mapがあるか探します。
以下の2つはあったんですがDisplacement mapは無かったです。

うーん。
どっかで間違えたんでしょうか?
Copilotに聞いてみます。

これを読むとObjを選択してからParameter Interfaceを追加する必要があるみたいですね。
これはSPIRAL_DONUTとmatnet1ノードのどっちに追加すべきなんでしょうか?
ここから開いてもDisplacement MapというParameterは無かったです。
うーん。
このやり方では無理そうですね。
更に調査しました。
How to get displacement to work on Karma XPU? [9]のColumnに
以下の質問が書いてありました。

そしてそれに対して以下の回答が書かれていました。

でこれを読むと全く意味が分かりません。
どうもMaterial Networkノード内での実装方法についての解説のようです。
Karma material Builderノードはここにありました。

うーん。
中を開くと以下のような実装になっていました。

これはさっきの回答にあった

この部分と同じでした。
うーん。
今、勉強しているTutorialはまずPrincipled Shaderノードの使い方を覚える事を主においています。おそらくですが、Karma Material Builderノードはその先に勉強すべき内容のような気がします。
はい。
この部分は今は諦めます。
先に進む事にします。
2024-11-10のBlogの続きをやります。
Principled ShaderノードのCoatの値を1に変更しました。

結果です。

何も変わっていません。
あれ?
色々弄ってみましたがCoatは全く効いてないです。
なんかこのParameterは実装されてない感じがします。
全然計算してる感じがしません。
使えないParameterにこだわっても仕方ないです。
先に進みます。
ここで2024-11-10のBlogの勉強は終わっていました。
Houdini19.5でProjectを開いてみました。

うーん。
同じか。
どうするか来週考える事にします。
<追記>
Houdini 19.5で以下の実装を試しました。
Geometryノードを配置し

その中にSphereノードを配置します。

Object Networkに戻り

Material Networkノードを配置します。
更にその中にPrincipled Shaderノードを配置しました。

Geo1ノードを選択して
Materialに先程作成した

Principled Shaderノードをセットします。
Principled ShaderノードのBase Colorの値を黄色に変えてみました。

結果です。

黄色くなりました。
これでPrinciple Shaderノードの結果がGeometryノード内にあるSphereに反映される事が確認出来ました。
この状態でNoiseにあるEnable Noise DisplacementをOnにします。

TutorialではHoudini19を使用しているのでこれでNoiseが発生するはずです。

何も発生していません。
Out Layerに移動してKarmaノードを追加し

Karma Viewportからも確認してみました。

ああ。
Displacementが発生していました。
Houdini19ならTutorial通りになるみたいです。
8. DirectX12の勉強
8.1 Lötwig Fusel氏のD3D12 Beginners Tutorial [D3D12Ez]を勉強する
8.1.1 BackBuffer as ID3D12Resource | D3D12 Beginners Tutorial [D3D12Ez] [10]の最初の10分を勉強する
なんとこのTutorialは章によって分かれていません。
全部で18分なので、今週は9分前後でキリが良い場所まで勉強します。
ずっとSwapChainが何なのかを説明していてこのLectureは実装はしないのかもしれないと思ったらWindow,hに以下の実装を追加しました。

これはSwapChainが保持しているBufferを取得するためのObjectだそうです。
ただしSwapChainが保持しているBufferは2つあるのでArrayに変更します。

GetFrameCount()関数を認識出来ません。
GetFrameCount()関数を以下のように書き換えます。

そしてm_bufferの初期化を以下のように書き換えました。

Errorが消えました。
以下に示した様にWindows.cppのCreate Swap Chainの後に以下の実装を追加します。

これでm_buffersにSwapChainに保持されているBufferがCopyされました。
ここでTutorialの最初の10分が経ちました。
9.2 「DirectX 12の魔導書」を勉強する
9.2.1 前回の勉強を復習する
2024-10-27のBlogを見ると「5.7.1 Descriptor Heapを作成する」を勉強しています。

これは勉強しただけなのか実装もしたのか分かりません。
確認します。

既に実装していました。
ただTestはしてないみたいです。
何で?
あ、思い出しました。
このCodeをBlogに貼るのに教科書のCodeをそのまま貼ってしまうと著作権で面倒な事になる可能性があるので、MIT Licenseで公開されているSample CodeのCodeを貼ったんでした。
それで次いでに自分のProjectにもその部分のCodeを追加したんです。
9.2.2「5.7.1 Descriptor Heapを作成する」を実装する
それでは先週実装したDescriptor Heapが正常に作動しているのか実際のCodeを実行して確認してみます。
Test用に以下のCodeを追加しました。

実行します。
特に問題なく起動しました。
Break Pointを追加してResultの値を確認します。

S_OKが返って来ています。
出来ていました。
9. 参照(Reference)
[1] Procedural Minds. (2024, July 28). Get started with PCG 5.4 by creating a full building | UE 5.4 p1 [Video]. YouTube. https://www.youtube.com/watch?v=oYNA24tcYc0
[2] MR3D-Dev. (2023, January 30). How to use Niagara VFX in Sequencer Unreal Engine 5.1 [Video]. YouTube. https://www.youtube.com/watch?v=xup3jZqthA4
[3] Fastbook Chapter 2 questionnaire solutions (wiki). (2020, December 28). fast.ai Course Forums. https://forums.fast.ai/t/fastbook-chapter-2-questionnaire-solutions-wiki/66392
[4] Aleksandar Haber PhD. (2024, August 11). Install ROS2 Jazzy in Windows by using WSL - Windows subsystem for Linux [Video]. YouTube. https://www.youtube.com/watch?v=xPBFf_Tk0dw
[5] What Is Isaac Sim? — Omniverse IsaacSim latest documentation. (n.d.). https://docs.omniverse.nvidia.com/isaacsim/latest/index.html
[6] NVIDIA Omniverse. (2022, May 11). How to build an omniverse extension in less than 10 minutes [Video]. YouTube. https://www.youtube.com/watch?v=eGxV_PGNpOg
[7] Rick Banks. (2022, June 20). Houdini 19 - Wall Tool 01 [Video]. YouTube. https://www.youtube.com/watch?v=lu4CEAIwGLo
[8] Nine Between. (2023, March 30). Houdini is HIP - Part 4: Rendering [Video]. YouTube. https://www.youtube.com/watch?v=L3SUQMKGtb8
[9] How to get displacement to work on Karma XPU? (n.d.). Reddit. https://www.reddit.com/r/Houdini/comments/u7vr4o/how_to_get_displacement_to_work_on_karma_xpu/
[10] Lötwig Fusel. (2023, July 6). BackBuffer as ID3D12Resource | D3D12 Beginners Tutorial [D3D12EZ] [Video]. YouTube. https://www.youtube.com/watch?v=ExMykz6lnXg