
1.今週の予定
今週もこの順序に従って勉強していきます。
- 映像作成用UE5の勉強
- AIの勉強
- Nvidia Omniverseの勉強
- Gaeaの勉強もしくはVroidとUE5の勉強
- Houdiniの勉強
- AIについての調査(ComfyUIの勉強)
- DirectX12の勉強
それぞれの勉強の最初にその勉強をする目的を一寸だけ書いておきます。
2. 映像作成用UE5の勉強
2.1 PCGを使用した神社の作成
PCGで建物を作成する方法を勉強してるので、その応用としてPCGで神社を作成する事にしました。
最終的にはUEFNのMap内で神社を作成して、だれでも参拝出来るようにするつもりです。
2.1.1 先週の復習
先週は、以下に示した様に普通の壁を作成しました。

ただしここで述べているように、床と地面の間が無いのでそこがおかしく見えます。
今週はその部分を直します。
2.1.2 Sampleの確認
まずはSampleではどのように作成してるのか確認します。
例1です。

以下のAssetや

以下のAssetを

使用して床を作成していました。
次の例です。

以下の素材を使用して床を作成していました。


Sampleの床を見た時、これは使える!と思ったんですが、Assetをみたら単なる棒でした。
素材をどう組み合わせるのかが本物らしくみせるPointのようです。
次のSampleです。

これなんか、上手く加工したら本物と区別付かなくなりそうです。

後のSampleは大体同じAssetを使用していました。


こんな感じでした。
2.1.3 実際の瑞垣の確認
前に実際の瑞垣がどうなっているのかの確認をしました。
その時のBlogを探して、実際の瑞垣の構造を復習します。
ありました。
最初のScreenshotです。

赤い!
これは気が付かなかった。神社は赤いんだ。
次のScreenshotです。

これは今のImageとそんなに変わらないですね。
後、この瑞垣、瓦を使用しています。
神社は瓦を使用しないんじゃないの?
こっちは玉垣の写真です。

普通の石垣が使用されていますね。

こっちも石垣が使用されています。
最後の例です。

ああ。こういうのが私の頭にあるImageです。
これは参考になります。
水がたまらない様に壁の前に排水溝が設置されていますね。

内側の写真です。
今はくすんでいますが、内側は結構派手だったようですね。
2.1.4 床と地面の間を作成する
では実際に作成していきます。

こんな感じで床と地面の間に壁を追加しました。
結果です。

うーん。
あんまり変らんかな。
後の壁は外してみますか?

おお、こっちの方がそれっぽいです。
大きさの確認もします。

通路が狭すぎました。
これは来週直します。
今週はここまでです。
2.2 PCGの勉強
PCGを使用した建物の作成を勉強しています。
その理由ですが、Luma AIで作成した3D Gaussian SplattingをUE5にImportすると以下の様に、

奥にあるHigh-rise apartment Building(マンション)が歪んでいます。
気持ち悪くなる位曲がっています。
これ直さないと3D Gaussian Splattingは使用出来ない。との結論になりました。
でどのように直すかとなると、PCGを使用してHigh-rise apartment Building(マンション)を作成するしかないのかな。となりPCGで建物を作成する方法を勉強する事になりました。
2.2.1 先週の復習
Do You Want to Remove Just One Side of Your Building? | UE 5.4 P4 [1]の続きを実装していました。
以下の様にPointの並びに偏りが有るせいでTrigger Boxの表側に面する壁は左側に穴が開きますが、

裏側に面する壁は右側に穴が開きます。

これを直しました。

2.2.2 Do You Want to Remove Just One Side of Your Building? | UE 5.4 P4 [1]の残りを実装する
このLectureの実装はもう全部終っていると思ったら、Lectureでは最後にもう一方の壁にも同様の実装を追加していました。

これを実装します。

しました。
結果です。

Trigger Boxが囲っている全ての壁が消えるようになりました。
通路を繋ぎ直しました。

中の様子です。

なんとこっちの壁は内側に壁が生成されていませんでした。
DA_RegularBuildingで確認したらOpen BackにCheckが入っていませんでした。

OpenBackをEnableしました。

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

繋ぎの部分です。
2.2.3 Create Procedural Interiors With Full Room Separation | UE 5.4 P5 [2]を勉強する
次のTutorialの勉強を始めます。
<00:00 - Tutorial Result Demo and Explanation of the Process>
今度は以下のような内装を追加するそうです。

正直ここまでは必要ではないですが、どうしましょう。
このTutorialはまったく期待しないで始めたのに、今年もっとも成果の出て来てるProjectに成長して来ています。
ここはTutorialを信用して勉強する事にします。
Seedの値を変更すると以下の様に区切りの形状が変化するそうです。

更に区切り毎にPointのDensityの値が変化しています。
Roof Sectionの以下の実装から変更していくそうです。

Attribute PartitionノードとPCG Close Open Back Floorsノードの繋ぎを外しました。

屋根が消えて建物の中身が見えるようになりました。
どうやって区切りを作成するかの戦略も説明していました。
まず部屋の大きさや数を示すData Assetを作成します。
次に全ての部屋にRandomなPointを生成します。全ての部屋がPoint一つを保持するように生成するみたいです。
ここから一寸よく分からなくなります。
そのPointからか部屋の壁までのXYの大きさか、純粋に部屋の大きさを示すXYか分からないですが、XYを求めるそうです。
そのXYと部屋の大きさが合ったら(ここも意味不明)、その大きさに応じてPointのDensityを決定するそうです。
Densityの決定方法はここの説明からではよく分からないですね。
あと、最初に見た例では部屋ごとのPointの数も沢山あります。一個ではありません。
あれ、この後に部屋の数に応じてDensityの値を決定する。って言っています。
うーん。
もう一回聞き直します。
分かりました。
最初のData Assetを作成する段階で部屋の数や大きさも決定してしまうんです。
XYの部分はそのData Assetの部屋が実際のFloorに合うかどうかを確認してるでした。
そして合う事が確認出来たら、部屋の数に応じてPointのDensityが決定されるんです。
うーん。
でもこの説明だとそれぞれの部屋にPointは一個しか生成されないはずです。
部屋に沢山のPointがある最初のImageとはMatchしないですね。
<01:49 - Starting With Sampling Interior Points>
Original Spline Pointを使用するそうです。

まず全てのPointのDensityの値を0に戻すそうです。
以下に示した様にSet Attributeノードを追加し

Set AttributeノードのInput Sourceの値を$Densityに変更します。

Set AttributeノードのInBにはCreate Attributeノードを繋げます。
Create Attributeノードの値はDefaultの0にしておきます。
いや、こんな方法よりDensityノードを使用した方が簡単じゃない?
段々、Tutorialにツッコミ入れられる位には理解力が進んできました。
PCG Copy Point Up SimpleノードとInputに必要なNodeをCopyしてここにPasteしました。

元はCorner Pillar Sectionの以下に示したところにあります。

PCG Copy Point Up Simpleノードを可視化すると以下の様になります。

はい。
これは想像した通りです。
ここから部屋を作成するためのPointを選択するんですが、TutorialではこのPointの中からは選択したくないと言っています。
その理由ですが、
Point同士の間が、このPointで示したような小さな隙間になってほしくないからだそうです。
うーん。
何で?
もう少し話を聞きます。
理由は述べてませんでした。
しかしもっと大きな幅を作成するための別なSpline Samplerを作成して別のPointを生成する戦略を採用した事は分かりました。
そんな面倒な事をするの?
びっくりです。
理由についても説明していました。
ここにあるPointをそのまま使用した場合、隣り合うPointが選択された場合、
「もう一方の部屋が、最初の部屋を完全に取り囲むかもしれない」
危険があるからだそうです。
それはそれで良い気もしますが、ここはTutorialの指導に従いましょう。
Get Spline Dataノードを配置して、Spline Samplerノードを繋げます。

Dimensionの値をOn Interiorに変更します。

更にUnboundedをEnableします。

Spline SamplerのDimensionのそれぞれの値の違いはよく分からないですね。
これは来週実装する時に、実際に試して確認しましょう。
Unboundedも同じです。
そしてInterior Sample Spacingに以下の実装を追加します。

Get Actor PropertyノードにWallSizeをセットしたものに5を掛けた値です。
これであまり小さいPointは生成されなくなるという事のようです。
この後、Spline Samplerノードに最初の時にあったError表示が消えた事、とこのError表示がBugである事を説明していますが、そこは省略します。
<04:54 - Creating the Rooms Data Asset>
Data Assetの作成を行います。
Structureから作成します。名前はS_RoomSizesにします。

中の設定です。

Default値は両方とも2にました。

今度はBPからPrimary Data Assetを作成します。

名前はPDA_RoomSizesにしました。

以下のVariableを作成します。

そしてData Assetを作成します。
まずData Assetを選択して

PDA_RoomSizesを選択します。

DA_RegularRoomSizesと名付けました。

Data Assetってこれの事か。
これは前に作った事があります。
開き以下の様に設定しました。

PCG_Buildingに戻って以下に示した様にPDA Room SizesもDataAssetに追加します。

追加する時は、Soft Object Referenceを選択します。
最後に以下の場所の名前もRoomSizesに変更していました。

こんな事出来るの?
ここで丁度この節が終わったのでここまでにします。
2.3 Level Sequence上でAnimationの編集をする方法
Level Sequence上でDragonをAnimation Sequenceを使用するとDragonの爪が地面にめり込んでしまいます。
これを直すには、Animation SequenceではなくControl Rigを使用する必要があるみたいです。しかし私が使用してるDragonには付属のControl Rigがありません。
しかもControl Rigがどういうものなのか全く理解していません。
のでControl Rigがどういうものなのかについての全般的な知識と、その使用方法についての基礎を勉強する事にしました。
その後、今まで勉強してたTutorialはUE5.0用のTutorialで5.5はControl Rig [3]を勉強する必要がある事が判明しました。
のでControl Rig [3]を勉強する事にしました。
2.3.1 先週の復習
先週はSpline Rigging [4]をもう一回実装しました。
先々週実装したら以下に示した様に、Meshがぐちゃぐちゃになってしまいました。

具体的にどこが問題なのか分からないので、もう一回最初からやり直す事にしました。
以下に示した様に

MeshとBoneが繋がらなくて大慌てしました。
この原因は、Bind Skinを忘れていたからです。
なんでこんな大切な事忘れてたのか分かりませんが、兎に角忘れてました。
で、やり直してBind Skinも行いました。
そしたら

前回と同じ様にMeshが変形してしまいました。
2.3.2 Pose Caching [5]を勉強する
今は、一つの内容を深堀するよりも広く浅く沢山の知識をつける方が大切と判断しました。
ので次のTutorialであるPose Caching [5]を勉強します。

BoneのPoseやStateをReferenceにSaveする方法を勉強するみたいです。
次の文です。

うーん。
まずはPose Caching機能を理解するところからか。
<Prerequisites>
このTutorialを勉強するに当たっての問題は無しです。
<QuickStart>
これからどうやってPoseをSaveしたりSaveしたPoseを取り出したりするのかを示します。
<<Storing Poses>>
Poseの保存の仕方です。


まずRig Pose型の変数を作成するんですね。

作成した変数をSetterとしてGraph内に配置します。

Get Pose Cacheノードを配置していますが、どのBoneのPose Cacheを取得してるんでしょうか?
更にGet Pose CacheノードにはElement Typeがあり、ここでBone以外も指定出来そうです。

Setup Eventノードと繋げるのか。
それで終わり?
となると今のPoseが全部Saveされるって事みたいですね。
<<Applying Poses>>
今度はSaveしたPoseを読み取って使用する方法を勉強します。


今度はGetterを使用します。

以下の図も付いていました。

次の文です。

Weightを変える事でPreviewのAnimationが変化するのを示していました。
以下に簡単にそれをまとめます。
Weightが0.5の時です。

元々歩いてるAnimationがPose CacheにあるIdlingと混じってぎこちない歩き方になっています。
そしてWeightを1にすると

完全に止まってしまいました。
こういう事なのか。
理解しました。
<Pose Cache Nodes>
ここはどんな種類のpose cacheノードがあるのかを紹介しています。
一つ一つのNodeについてのまとめはSkipします。
ほとんどすべてのPose Cacheノードは以下に示したMemberがあるそうです。

それぞれのMemberについて簡単に解説していました。

うーん。
まあこれは今はどうでもいいや。Element TypeもAllを選択しとけば、実用には問題が無いみたいだし。
<Workflow Examples>

うーん。Rigを使用したAnimationに関して全く知らないので、ここで紹介されている内容がどんだけ重要なのかの判別が出来ないです。
とりあえず勉強しておくか。
以下の図がこの文章の下にありました。

Clavicle_rから下部構造にあるBoneを全部選択したんでしょうか?
次の文を読んでみます。

Branchノードが実行された時のStateがSaveされるんでしょうか?
というかこれ最初の例と全然関係ないじゃん。
ここで終わっています。
2.3.3 Pose Caching [5]を勉強した感想
今回の話は前回と比較すると非常に簡単でした。
しかしあんまり重要でもない気がします。
こんな機能もある位の理解で良いと思います。実際に使用する事は無いでしょう。
今やってるProjectの中でHoudiniとControl Rigの勉強は、成果が全然出てこないです。
まあ慌てても仕方ないのでここはのんびりやります。
3. AIの勉強
AIの勉強の目的ですが、
生成AIが凄いTrendになってるので、最低限の基礎は知っておくべきと思いこの勉強を始めたんでした。
のでこれを勉強してどうしたいというのは無いです。
3.1 前回の復習
Lesson 5: Practical Deep Learning for Coders 2022 [6]の勉強の続きをしています。
先週はHow random forests really work [7] の内容を途中まで勉強しました。
ここでは表形式のDataで最も効果的な結果を出すRandom Forestのやり方を勉強しています。
<Data preprocessing>では、AIが学習出来るようにDataに前処理をしています。
<Binary splits>では、以下の事を勉強しました。
まずRandom Forestを作成する前に、決定木を作成する方法を勉強する必要があり、決定木を作成するにはBinary Splitがを作る必要があるので、ここでBinary Splitの作成方法を勉強しました。
で作成したBinary Splitを使用して男女における生存率を予測しました。これはあんまり当たりませんでしたが、その後作成したFareによる生存率の予測は更に悪かったです。
Binary Splitの勉強の途中で

勉強を終了していました。
3.2 Lesson 5: Practical Deep Learning for Coders 2022 [6](How random forests really work [7] )の続きを勉強する
先週の続きです。

まず従属変数の標準偏差を計算するのね。
そして行数をそれにかけるのか。
あれ?
これって何を計算してるんだっけ?
先週のBlogから最後の文の訳を持ってきました。

平均絶対誤差の代わりに不純度(Impurity)を計算して、Group内の行同士がどれくらい似ているのかを測定するんだ。
という事はこれがImpurityになるのかな。
次の実装です。

よく分からないのでChatGPTに丸投げします。

これが先程の不純度(Impurity)を計算してるの?
分からないのでChatGPTに聞いてみます。

をこの実装でやってるのか。
更に以下の説明がありました。

してました。


ここで何でこの計算で不純度のScoreを計算できるのか分からんとChatGPTに一時間以上質問していました。
とっくにLimitが切れてその後は、CopilotのGPT5に続きの質問をしていました。
で細かい説明は省くとしてその概要だけ以下にまとめておきます。
まず今回のCaseのように結果が0か1しかない場合は、標準偏差は最大で0.5です。
標準偏差が0.5の場合は、まったくの偶然となります。
例えば男女である事と生存率が関係ある場合は、標準偏差は0.5よりも小さくなります。
つまり標準偏差の値が小さい程、関連性があるという事です。
しかしこれがSample数が少ない場合で計算してると偏りが有る可能性があります。
のでここでは以下に示した様にSample数を掛けています。

これが意味不明でした。
だってサンプル数は数が多い程、精度が高くなるはずだから逆に割るべきじゃないの?
となってChatGPTと大議論です。
でやっと理解したんですが、ここで計算してるのはImpurity(不純度)なんです。
この不純度はそもそも結果に偏りがあると低くなるんです。つまり標準偏差の値が低い程、低くなります。純度が高くなるとも言えます。
この不純度はSample数によって全体の不純度に対しての貢献度が変わって来ます。
ので全体の貢献度を考慮するためにSample数を掛けています。
こんな感じで理解しました。
今、考えるともっと直接不純度の計算方法でAIに質問すればもっと適切な回答くれたかもしれません。
まあ良いです。
不純度の計算方法の整合性についてはまた後で検証します。
今回はこれぐらいの理解で止めておきます。
Lectureの勉強に戻ります。

作成したImpurityを使用して性別と生存率の関係性を計算しました。

同様にLogFareの場合も計算しました。

だそうです。
こっちも値が小さい方が関連性がある。という結果になっています。

以下の実装で作成していました。

これは手動でImpurityの値を求める事が出来るので便利ですね。


実際に試すのは実装した時にやります。
次の文です。
あんまりChatGPTに質問し過ぎたので今度はCopilotに質問します。

今度は自分で探すのが面倒だからComputerに探させるようにするんですね。

そこでまず分割点を生成するための実装を作成しました。

6歳から下の場合がもっとも生存率が高かったって事でしょうか?

0.47という結果になっていますね。
これは男女比のImpurityである0.40よりかなり高いですね。
全部のColumnに対しても同様の計算を行いました。

性別のimpurityが一番低いです。
この節の最後のまとめです。

偶然見つけたって?

これの事を言ってるんでしょうか?
これでBinary splitsの節は終わっていました。
うーん。
そうだ。
Lectureも見ます。
なんとImpurityの計算方法なんか全く説明してなかったです。単にErrorを測定する別な計算方法ぐらいの扱いでした。
でも自分が気になったところを深堀りするのも勉強になります。
こういう勉強もたまには良いでしょう。
4. Nvidia Omniverseの勉強
Robotic AIの仮想空間におけるTrainingのための環境設定こそがこれからの3D Graphicsの専門家が生きる場所であると思っています。
のでその仮想空間でRobotic AIがどんなTrainingを行っているかをまず勉強する事にしました。
色々調べると、その部分はNvidiaのOmniverseの中のIsaac Simが担当している事が判明しました。
のでその辺りを勉強します。
2025年9月からIsaac Lab Documentation [8]の勉強に切り替えました。
4.1 先週の復習
Quick start Guide [9]を勉強しました。
Install方法、強化学習の実行、環境の探索、そして新しいProjectの生成方法について勉強しました。
Install方法に関しては既にInstallし終わっているので省略します。
強化学習の実行も既にやっています。正し先週勉強したのは別なSampleを起動させていました。その点については以下に整理しておきます。
Quick start Guide [9]で実行するTrain.py

前に実行したTrain.py

Folderが違います。Quick start Guide [9]で実行するTrain.py
はskrl Folderにはいっていますが、前に実行したTrain.pyはrsl_rl Folderに入っています。
ChatGPTにこの違いについて質問したら

と回答して来ました。
更に他のFolderの特長も教えてくれました。

次に--task=Isaac-Ant-v0というCommandについて勉強しています。
この“--task=”はRobotだけでなくScenarioの指定も行うそうです。
大体の内容は以下のScreenshotにまとまっていました。

ここにGymnasium APIという言葉が出て来ます。
このGymnasiumについては先週は深堀はしませんでしたが、かなり重要なPointのようでこれからしっかり勉強する事になりそうです。
この後、isaaclab/scripts/environmentsにあるlist_envs.pyを実行してどんな環境が用意されているのかを示してるんですが、先週のBlogはこの部分を完全に間違って解釈して
Train.pyを実行した結果が表示されていると思ってまとめています。
これが、環境の探索の内容でした。
環境については、後
- Direct環境用とManagerBased環境用の違い
- Entry Pointについて
などの話もしていました。
新しいProjectの生成方法に関してです。

何故か、ここだけWindowsでのCommandが提供されていません。
ここは
isaaclab.bat --new
で同じ効果があると思われますが、何故かWindowsでのCommandはTutorialには載ってなかったです。
そしてChatGPTの回答によるとこのCommandを実行すると
以下のような質問が来るそうです。

質問には以下の様に回答すれば良いそうです。

最後に以下のCommandで作成した環境を起動してるみたいです。

いや、作成したEnvironmentを実行するのはTaskです。これは何を実行してるのか不明です。
ChatGPTの回答を見直すと以下の様に書いてありました。

つまり作成されたProjectの設定を直接Python Scriptから編集・実行出来るようにするためのCommandだったようです。
あ、分かった。
このCommandは作成したProjectを環境Listに登録してるんだ。
これで登録しないとTaskからこのProjectを起動できないか、先程やったlist_envs.pyで表示されない環境になってしまうんだ。
多分これが正解です。
いや、最後まで読んだら、やっぱりProjectのInstallをこのCommandはおこなってる気がして来ました。
Tutorialに以下の様に書いてあるからです。

先週のBlogを読むと、この部分の理解が全くできていません。
それは兎も角、ここで
このため、プロジェクトを Python パッケージとしてインストールする必要がある のです。
と述べています。
つまりProjectをInstallするのはこの方法で行い、そのProject内で作成したEnvironmentは先程のTaskで実行するのかもしれません。
この辺はまだよく分からないですね。
新しくProjectを作成するだけなのに何この複雑さは!
更にTutorialではこの後に、ConfigurationとRobotについての簡単な解説をしていました。
大体こんな感じでした。
4.2 Quick start Guide [9]を実装する
では今週は先週勉強した内容を実際にためしてみます。
やるのは強化学習の実行、環境の探索、そして新しいProjectの生成の3つです。
Isaac LabのInstallは既に終わっているのでこれはやりません。
<強化学習の実行>
前に実行したTrain.pyのCommandは以下のものです。

今回実行するCommandは以下の物になります。
![]()
げ、こっちはPythonで実行しています。
やり方が一寸違うって事か?
ChatGPTに質問してみました。


そうなの?
2025-09-21のBlogでisaaclab.bat -p train.py ...を実行していますが、この時は仮想環境は先に起動していました。
まあ今回はPythonのCodeで実行するのでこの問題については後で考える事にします。
仮想環境を起動して
![]()
Isaac LabのFolderに移動して、
以下のCommandを実行しました。
![]()
Trainingしています。

こっちはIsaac SimからTrainingの様子が確認出来て楽しいです。
もう飽きたと思ってTerminalを見たら

まだ1%しか終わっていません。
ああ。
これは時間かかるやつだ。
しかし一回は実際にやってみないと。
うーん。
今日はこれを最後までやる事にします。
と思ったら終わりました。
あれ?
D:\MyIsaacSim\IsaacLab\logs\skrl\ant\2025-10-02_00-49-20_ppo_torch\checkpointsに以下に示した様にPolicyが生成されてました。

これで一応出来たのか。
じゃ次に行きます。
<環境の探索>
以下のCommandを実行しました。
python scripts/environments/list_envs.py
結果です。

横に長すぎて何が書いてあるのか把握出来ません。
更に152個も紹介されていました。
ChatGPTは以下の様に解説してくれました。

Entry PointにはDirectと

ManagerBasedRLEnvがあります。

List Available Environmentsを英語で読み直したらここで言ってる事がやっと理解出来ました。
ここは別にpython scripts/environments/list_envs.pyを使用して使用出来るEnvironmentを確認するための節じゃなかったです。
先程実行したIsaac-Ant-v0には以下に示した2つ

のTaskがあります。
DirectとManagerBasedです。
それぞれは

といった特徴があります。
という事を語っていました。
<新しいProjectの生成>
isaaclab.bat --new
を実行します。

いきなりTask Typeを聞いてきました。
これはExternalです。

Pathは変更したかったんですが、どうやったら良いのか分からなくて適当に弄ったらこの場所になってしまいました。
WorkflowはDirectです。

今度はRLのLibraryです。
これはskrlを選択します。

今度はskrlのRL algorithmにAMPかPPOのどちらかを選ぶのかを聞いてきました。
ChatGPTに質問しました。


PPOを選びます。

うん。出来たの?

出来たみたいです。
はい。
次のCommandです。

今回の一番の山場。
まずこのCommandが何をしてるのかをChatGPTに質問します。

そして

ああ、そういう事か。
PythonがFirstMyProject内のScriptをEditableなPackageとして認識出来るようにするためのCommandだったのか。
やっと意味が分かった。

はい。出来ました。
この後、Tutorialでは__init__.pyが生成されてるはずだ。と言っています。
D:\MyIsaacSim\FisrtMyProject\source\FisrtMyProject\FisrtMyProject内にありました。

開いたら以下の様になっていました。

以下の様になってる。とTutorialには書いてあります。

なって無いです。
なんとこの奥のFolderにも__init__.pyがあり、5個ぐらい遡ったらありました。

これで一応、全部出来ました。
5. Gaeaの勉強もしくはVroidとUE5の勉強
なし
6. Houdiniの勉強
Houdiniの勉強を始めた理由は、これからの3D GraphicsはProceduralな3Dの生成だという風潮が2年前ぐらいに起きて、それで慌てて勉強を始めたんです。
生成AIブームが起きて、Proceduralな3Dの生成のブームはすっかりなくなってしまいましたが、Nodeを使用して3Dを生成する手法は、職人的な技術が無くても3D Objectの生成が出来るのでかなり便利という事に気が付きました。
のでHoudiniの勉強は続けています。
しばらくHoudiniの勉強はお休みして木の生成について調査していましたが、やっぱりHoudiniの水のSimulationの勉強をする事にします
木を自分で実装してもその凄さに気が付く人はほとんどいません。
それに対して水のVEXを作成したら誰が見ても凄いと思うからです。
6.1 Houdini is HIP - Part 14: Flip Fluids I [10]の続きを実装する
先週、勉強した範囲の実装が終わったので今週はTutorialの続きを勉強します。
<33:36 Particle Velocity>

Flipsource1ノードの

VelocityをEnableします。

VelocityをEnableした瞬間にV3flt型AttributeであるVecが生成されました。
![]()
Velocityの値を変化させると
以下の様になりました。

以下の様にすると明白ですが、

ParticleのSimulationとしてVelocityを扱っています。
これは先程のVelocityを表すAttributeがPointである事からも分かります。

このTutorialの前のPyroのSimulationではVelocityはVolumeとして扱いました。
のでここでもVelocityをVolumeとして扱う方法を勉強します。
Flipsource1ノードのVelocityをDisableします。

最初に戻しただけですね。
Obj Layer内にLabs Spiralノードを配置しました。

Labs Spiralの簡単な説明です。

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

ここでよく分からない事をやっています。
まずTransformノードのPinkを選択して

Spiralノードの水色を選択しました。

結果です。

SpiralのSplineが表示されるようになりました。
うーん。
何で?

Loopsの数を3に増やすと

更にPolyframeノードを追加しました。

PolyFrameノードの簡単な説明です。

このPolyFrameノードはVelocityに沿ったCurveを生成するのに非常に適してるそうです。
その理由も簡単に説明してくれるそうです。
Normalを表示します。

垂直方向に向かっています。
ここで、Normal NameをDisableしてTangent NameをEnableし、Tangent Nameの値にNを指定します。

すると以下のようなNormalが生成されました。

今度はTangent Nameの値にVをセットしました。

Velocityの値は小さすぎて可視化しても見えません。
ので以下の様にScatterノードを追加して

Force Total Countの値を10,000に変更すると

以下のようになります。

更にPointJitterノードを追加して

Scaleの値を0.16にすると

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

Velocityの表示を消すと以下の様になります。

次のNodeです。

なんだ。このNodeは?
Volume Rasterize Attributeノードと言うんでしょうか?

このNodeのAttributeにVをセットしました。
結果です。

ああ、理解しました。
今までのPointに対してのVelocityをVolumeに変換したんです。

Particle Scaleの値を0.05に変更すると

となりました。
更にVoxel Sizeの値も0.05に下げると

以下の様になります。

最後にNullノードを追加して

名前をVELOCITY_SOURCEに変更しました。
<24:47 Custom Volume Velocity>
Tutorialは時間が間違っているのでこの節は表示されていませんが、おそらくここからVolume VelocityをCustom化する話が始まると思われます。
今度はFLIP_DYNAMICS Layerに移動しました。

Volume SourceノードをFlipsolverノードの三番目のInputに追加します。

更にVolume SourceノードのSOP Pathの値に先程作成したVELOCITY_SOURCEをセットします。

更にOperationの値を増やして1にし

Source Volumeにvをセットします。

更にTarget FieldにVelをセットしました。
Vel何で作成したっけ。
憶えていません。

更にOperationの値をCopyに変更しました。
今の時点における結果です。

一寸だけSpiralな動きが出て来ました。
FLIP_BASICS Layerに戻ってAttribute Wrangleノードを以下の場所に追加しました。

この場所より後は、もうVelocityはPointでなくなってしまうから、ここがPointとしてのVelocityの値に干渉出来る最後の場所だそうです。
そしてAttribute Wrangleノードがいじれる値はPointだけなのでここでやる必要があるそうです。

Velocityの値を5倍にしました。
結果です。

今度はかなり激しくSpiralに沿って移動しています。
<40:10 Outputting Flip Fluids>
この計算結果をCashとして保存する方法をここで習うみたいです。
FLIP_DYNAMICS Layerに移動しました。

DOP I/Oを配置しました。
すると以下の様に2つのNodeが配置されました。

Dop Import FieldノードのDOP NetworkにFLIP_DYNAMICSをセットします。

DOP NodeにはFlip Objectノードを追加します。

Presetsの値にはFLIP Fluidを選択してるんですが、

言ってる内容とはあいません。

ここはPresetを選択しろ。って言っています。
PresetにPresetを選択するのは無理ですので、これは単なる良い間違いだと分かるんですが、
Presetsの値がFLIP Fluidを選択した後でも

Chooseになっています。
これは謎です。
Presetの下にあるImportのParameterが変わっているみたいですね。

結果も変わっています。

これは保存するCacheには色の情報は要らないからだそうです。
成程。そこは納得です。
Fluid Compressノードを以下の場所に追加しました。

FLUID COMPRESSノードの簡単な説明です。

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

FieldのSizeが減少した結果でしょうな。
で、このNodeは外しました。
今回は使用しないそうです。
Particle Fluid Surfaceノードを追加しました。

可視化しました。

そして以下に示したParticle Separationなどの値を調整します。

Flip Sourceノードの

Particle Separationの値を

以下に示した様にCopy ParameterでCopyして

これも以下に示した様にPaste Relative ReferenceでPasteします。

以下の様になりました。

結果です。

細部が綺麗に出てますね。
最後に色を追加する方法を示していました。
これが結構複雑なのでこれは来週やる事にします。
6.2 Houdini is HIP - Part 14: Flip Fluids I [10]の続きを実装するした感想
<40:10 Outputting Flip Fluids>はSimulationの結果をCacheで保存する方法を説明してるんだと思っていましたが、違うんでしょうか?
一体何をしてるんでしょうか?
これはChatGPTに質問してみましょう。

DOPからSOPへのDataの転送を行ってるのか。

SimulationはDOP内で行われ、その結果を可視化するのはSOPで行うのか。
DOPからSOPにDataを引き抜くのは分かりますが何で、ここでCache管理が必要になるのでしょうか?
Simulationを毎回行うのは計算が大変だからCacheしてるのでしょうか?
分からない事だらけですが、取りあえずは全部読んでみます。

DOP Import Fieldsノードについての解説です。
DOPで生成したFieldをSOPにPassするためのNodeだそうです。
説明を読むとこのNodeの機能がよく分かります。

今度はFile Cacheノードの機能についての説明です。
ここでそれぞれのFrameの計算結果をCacheとして保存するのか。
やっと理解した。
最後に以下の説明がありました。

はい。完璧にこの2つのNodeの役割を理解しました。
む。
ChatGPTはこうやって利用したらHoudiniの勉強にも役に立ちそうです。
まず実装をTutorialからDirectに学びます。
その後で、理解出来ない実装部分をChatGPTに何故、そんな事をしてるのかを質問します。
ChatGPTの回答は、HoudiniのWorkflowから説明してくれるので理解出来ます。
納得して次に進めます。
来週からはChatGPTはこんな感じで利用する事にします。
7. AIについての調査(ComfyUIの勉強)
AIを使用するためのSoftが大量に公開されていますが、それらについて全く理解していません。
3Dやイラストそして動画関連のAI Softについて、どんなSoftが公開されているのか?それらのSoftを使用するとどんな事が出来るのか、どんな方法で操作するのか、
などの一通りの事を勉強しておこうと思い、この章を特別に作りました。
特にComfyUIの使用方法やそれに関して生成出来るイラストや映像について集中して勉強していこうと思っています。
2025-03-30のBlogでUE5でもReinforcement Learningが出来る事を知りました。
のでComfyUIの勉強は一端中止してこっちを勉強する事にします。
今週も前に勉強した Learning to Drive (5.5) [11]の勉強の復習をします。
7.1 Learning to Drive (5.5) [11]のImplementing the Manager のBegin Playを復習する(Blogの復習)
今週からImplementing the Managerを復習していきます。
今週はその中のBegin Playの実装を復習します。
<Implementing the Manager>全体のまとめが

だけで終わっていました。
そして<<Begin Play>>に関しては

がScreenshotとして貼られていました。
そして以下のScreenshotを示して

こんな沢山の実装の内容を理解するのは不可能なので最初の1個だけ勉強する。と書いていました。
そしたら最初の2つはFunctionを読んでなかったので三番目の実装を勉強しています。
その後は、Tutorialを忠実に読んでいってますね。
ただしまとめは端折っていました。Policyに関連する実装部分だけまとめていました。
Begin Playの実装を始めています。
途中でお腹が痛くなって中止していました。
Begin Playの実装の実装の続きをしています。
ここではPolicyを生成するに必要な追加の実装を行っています。
それはDA_SportsCarEncoder、 DA_SportsCarPolicy、そしてDA_SportsCarDecoderの作成です。
それぞれの機能です。

Criticでもneural network assetを作成する必要があり、DA_SportsCarCriticを作成していました。
Criticノードは何をしてるのかをChatGPTに質問していました。

これはNice Moveです。今回もそれぞれの機能についてChatGPTに質問して確認しましょう。
更にCritic Neural Network Assetの機能についても以下の説明がついていました。

次のBranchの実装で
前にInteractorをセットしたTrack SplineにMake Training Environmentノードで生成したTraining Environmentをセットしています。
これが意味不明でChatGPTに説明を求めています。
ChatGPTの回答は

でした。
こんなの全く覚えていなかったです。
結構重要な内容を勉強していますね。
7.2 Learning to Drive (5.5) [11]のImplementing the Manager のBegin Playを復習する(実際に復習する)
大体どんな事を勉強したのかは理解しました。
今回の復習は実際に何をやってるのかを理解する事を主にしています。
それは2つの意味があって
- 実装内容を理解するという事
- その部分が全体の中で何を担当してるのかを理解
です。
Implementing the Managerが何を目的として作成されたのかを理解する事から始めます。
ChatGPTに以下の質問をしました。

間違えて質問の途中で切れてしまったんですが、必要な回答はくれました。
まずBP_SportCarManagerの役割です。

成程。
これらの事を管理してるのか。
更にTutorialの説明文も訳してもらいました。

Begin Playの役割についても回答してくれています。

これは実装をそのまま説明してるのかもしれませんね。
では、これらの内容を踏まえて、Begin Playの内容を復習していきます。
TutorialのBegin Playの最初の文です。

はい。
この後、実装するに当たってCopy and Pasteでは直せない手動で直す部分について細かい説明が続きますが、その部分は今回は重要でないのでSkipします。
それぞれのBranchの実装の説明です。
最初のBranchです。

以下の説明がされていました。

この説明で100%納得です。
このBranchでは全てのAgentのReferenceを取得して、それらのAgentがManagerより後にTickされるように設定しています。
次のBranchの実装です。

これもTutorialの説明を以下に示します。

これもそのままですね。
このBranchではSplineのReferenceを取得して、それを専用のVariableに保持させています。
次のBranchです。

説明文です。

BP_SportsCarInteractorは今まで散々実装してきたBPです。
それをここで生成するのか。
このBranchでは、このProjectのInteractorであるBP_SportsCarInteractorを作成し、そのReferenceを専用のVariableに保持させています。
更に、Track SplineにSplineとBP_SportsCarInteractorをセットしています。
Track Splineは何をする変数なんでしょうか?
ChatGPTの回答です。

要はTargetにどのSplineを使用するのかを指定するためのNodeという事らしいです。
でもInteractor内でもどのSplineを使用するのかは指定してるはずです。
一寸納得いかない部分もありますね。
ChatGPTが、全体の流れを以下の様に説明してくれました。

この3つを理解するのが基礎ですね。
今度はPolicyのBranchです。

以下の説明文がありました。


これは先程のBlogの復習のところでしっかり復習したので軽くやります。
それぞれのData Assetは以下の役割を担当しています。

次の文です。

これもBlogで復習した範囲なのでここでは訳を乗せておくに留めておきます。
次の文です。

ここではCriticの説明です。Criticの役割についても簡単に説明しています。
ここで疑問です。
PolicyやCriticに関して、ここではData Assetを指定した以外の設定はしていません。
もっと詳しい設定をそれぞれに課す必要がありそうですが?
はい。
ChatGPTに質問します。

だそうです。
そして

も説明していました。
Criticで損失関数や学習率を指定してるのか。
これは勉強になります。
ただしUE5のLearning Agent Pluginを使用してる限りはこれらのParameterを変更する事は出来ないみたいです。
まとめると
Making the policyでは、Policyを作るための実装を行っています。
Making the criticでは、Criticを作るための実装を行っています。
次のBranchです。

ここだけ何故かScreenshotがありません。

自分のProjectから持ってきました。
ここも前の節で散々復習したところです。
ここではSkipします。
Making the training environmentではTraining Environmentを作成しています。
次のBranchです。

このBranchの説明文の訳です。

うん。
このBranchの実装は共有のMemoryを使用する箇所だ。

Python側の実装はこのTutorialでは関与しないはずです。

へ。Python側の実装もやろうとすれば出来るみたいですね。
Making the shared memory communicatorではUE5側のDataで、Python側がRLを行うに必要な情報にAccess出来るようにしています。
次のBranchです。


あれ?
ここでPPOの設定をしていました。
先程のChatGPTの回答では

となっていましたが、実際はここでPPO Trainerの設定を行っていました。
いやこれはPPOそのものの設定を行っている訳ではないのか。
PPO Trainerと言う物を生成してるのか。
そもそもPPOが何なのかすら知らないです。
そこからChatGPTに質問してみます。

更に詳しい説明です。

へ。
ここでも勾配法が使用されているんですね。
Make PPO Trainerノードの機能に関しての最後の確認をします。


はい。
やっぱりそうだったのか。
Making the PPO Trainerでは、PPO Trainerを作成しています。
最後のBranchです。

説明文です。

Inferenceって推論と言う意味だったのか。
まずこれが驚きです。
推論時とTraining時の違いが分かりませんね。
追加の説明もありました。

これは実際にTestする時に使用する実装ですね。
Inference時には手動でResetするように設定しています。
これでBegin Playの実装が終わっています。
7.3 Begin Playの復習まとめ
それぞれのBranchの実装の目的をまとめると以下の様になりました。
Getting the cars:全てのAgentのReferenceを取得して専用の変数に保持、それらのAgentがManagerより後にTickされるように設定
Getting the track spline:SplineのReferenceを取得して、それを専用のVariableに保持
Making the interactor:このProjectのInteractorであるBP_SportsCarInteractorを作成し、そのReferenceを専用のVariableに保持
Making the policy:Python側でPolicyを作成するのに必要な情報をまとめたLearning Agent Policyを作成
Making the critic:Python側でCriticを作成するのに必要な情報をまとめたLearning Agent Criticを作成
Making the training environment:このProjectのTraining EnvironmentであるBP_SportsCarTrainingEnvを作成し、そのReferenceを専用のVariableに保持
Making the shared memory communicator:UE5側のDataで、Python側がRLを行うに必要な情報にAccess出来るようにした。
Making the PPO Trainer:Python側がPPOを実行するために必要な情報をまとめたPPO Trainerを作成
We manually reset the cars if we're doing inference(最後のBranch):Inference時にはResetする
最初にChatGPTが説明したBegin Playでやる内容です。

Get Learning Agent Subsystemなんか呼び出してないですね。
これは間違っていますね。
それは兎も角、このまとめの感想をChatGPTに聞きました。

補足した内容です。


結構直されましたね。
補足の情報を逐一、Checkしたんですが、その通りとしか言いようがないくらい綺麗に必要な情報を追加してくれてました。
8. DirectX12の勉強
3D Graphicsを作成するのにOpenGLを使ってるとバカにされるからDirectX12の使い方も勉強しようとしたら、Windows 8ではDirectX12が使用出来なくてずっと勉強を我慢していました。
で新しいPCを買ってやっとDirectX12を勉強できる環境になったら、もうDirectX12を勉強する人がいなくなっちゃってたんです。
のでこれも出来たら何したいというのは無いですね。
ああ、昔MMDを自分で作りたいというのはありました。それを目的にします。
8.1 「DirectX 12の魔導書」を勉強する
今週はSample CodeがBuildしてもErrorにならない様にします。
結構、頭を使う事になるので最初にこれからやります。
8.1.1 DirectXTex.libを使用出来るようにする
2025-09-21のBlogで確認すると2025-06-08のBlogに詳しいやり方がまとめられているそうです。
DirectXTex.libをビルドしたときに使用した「Windows SDKのバージョン」、「ソリューション プラットフォーム」、「ソリューション構成」は、DirectXTex.libを利用するプロジェクト側でも同じ設定にする必要があります。
これらの設定を確認したところ、今自分のProjectで使用してるDirectXTex.libの「Windows SDKのバージョン」、「ソリューション プラットフォーム」、「ソリューション構成」はSample Codeのそれらと同じである事が判明しました。
ので
自分のProjectで使用してるDirectXTex.libをSample Codeから参照出来るようにすればBuild Errorが直るはずです。
これはVisual StudioのPropertyにあるInclude DirectoryとLibrary Directoryを正しくSetすれば出来るはずです。
2025-06-08のBlogには以下の方法で出来ると書かれていました。

2025-06-15のBlogには実際に実装した様子がまとめられていました。
環境変数としてDXTEX_DIRに
"D:\2025\DirectX12_Study\DirectXTex-main\DirectXTex-main\DirectXTex\Bin\Desktop_2022\x64\Debug\DirectXTex.lib"
をセットした話が長々と書いてありますが、今回はこの部分は要らないはずです。
Include Directoryの設定をしたところです。

Configurationの値がAll Configurationになっているのを問題視してますね。
確かReleaseでも問題なくBuildしてるんですが、もしかしたらこの部分の設定間違ってるのかもしれません。
Library Directoryの設定です。

こっちでも
Configurationの値がAll Configurationになっているのを問題視してます。
はい。
こんな感じでやっていました。
やり方が判明したので、実際に試してみます。
あれ?
Include Directoryの設定を見ると

既に
$(DXTEX_DIR)
になっていました。
Library Directoryの設定も確認してみます。
Sample Codeの設定です。

正しい設定です。

これは間違っています。
直します。

これで今度はBuild Errorにならないはずです。
試してみます。

出来ました。
出来たら超絶簡単でしたが、途中で間違ったら直すのが非常に面倒になる可能性があったので緊張はしました。
8.2 Lötwig Fusel氏のD3D12 Beginners Tutorial [D3D12Ez]を勉強する
Input Assembler | D3D12 Beginners Tutorial [D3D12Ez] [12]の勉強をしています。
8.2.1 先週の復習
NotebookLMが作成したDocumentを読みました。
Input Assemblerの役割について勉強したんですが、その中で静的設定と動的設定と言う概念が出て来ました。
この概念が、前回のLectureで習ったUpload用のHeapとDefault用のHeapに匹敵する概念のようなのでここでもまとめておきます。
まず静的設定の定義ですが、これは一度作成すれば再利用可能なPipeline State Object(PSO)で行われるものを指します。
そして動的設定の定義は、CommandList実行時に切り替えられるPSOのBindingなどを指します。
先週のBlogを読み進めたら、更にPipeline State Object(PSO)について深堀もしていました。
Input Assemblerの静的設定は、D3D12_GRAPHICS_PIPELINE_STATE_DESC構造体にあるInput Layout Memberが担当するそうです。
そしてD3D12_GRAPHICS_PIPELINE_STATE_DESC構造体はPipeline State Object(PSO)の一部を構成しています。
こんな感じでNotebookLMが作成したDocumentを最後まで読んで終わっていました。
8.2.2 Input Assembler | D3D12 Beginners Tutorial [D3D12Ez] [12]を勉強する
それでは実際のLectureを見ていきましょう。
<Intro>
![]()
今のVertex DataがHello Worldである事なんかを説明しています。
そうだ。
前回のLectureはここで終わったんだ。
Input Assemblerの目的もここで簡単に説明していました。
GPUにあるVertex bufferのDataを取得して、Pipelineに流せる形式に変換する事。と述べていました。
こっちの説明の方が分かり易いな。
<Explanation>
静的設定はStatic Configurationって言ってます。
でもその後は、Static SideとDynamic Sideと言っています。こっちの方が静的設定と動的設定に近い概念ですね。
動的設定にあたる単語はこのDynamic Side位しか言ってませんでした。
<Pipeline State>
実装始める前に前回の実装のCommentを追加していました。

そして以下の場所にPipeline Stateの実装を追加していきます。

Pipeline State ObjectはDeviceにある以下に示したCreatePipelineState()関数で作成するそうです。

しかしこの関数を作成するに必要なArgumentを全部作成し終わるまで、この関数は呼び出さないそうです。
この関数を使用するのはかなり後になりそうです。
まずはD3D12_GRAPHICS_PIPELINE_STATE_DESC構造体についてです。

この構造体でInput Assemblerで使用するのに必要なMemberはD3D12_INPUT_LAYOUT_DESCとD3D12_INDEX_BUFFER_STRIP_CUT_VALUEだそうです。
<Indexing>
先程の2つのMemberを以下の様に指定していました。

IndexやStripを使用するとMemoryの量を減らせるとかの説明をしています。
この辺は理解しています。
で、D3D12_INPUT_LAYOUT_DESCの設定に戻るんですが、
D3D12_INPUT_LAYOUT_DESCは以下に示した様に、Structで構成されています。

DirectX12の特長である
必要な情報を一括してまとめて渡す。
がここでもいかんなく発揮されています。
ここで、<Indexing>は終わっています。あんまりキリは良くないですが、今週のDirectX12の勉強はここまでにします。
9. まとめと感想
なし。
10. 参照(Reference)
[1] Procedural Minds. (2024, August 25). Do you want to remove just one side of your building? | UE 5.4 p4 [Video]. YouTube. https://www.youtube.com/watch?v=ngizgkYM2Ac
[2] Procedural Minds. (2024, September 9). Create procedural interiors with full room separation | UE 5.4 P5 [Video]. YouTube. https://www.youtube.com/watch?v=yefxdWg_GTo
[3] Control Rig. (n.d.). Unreal Engine. https://dev.epicgames.com/documentation/en-us/unreal-engine/control-rig-in-unreal-engine
[4] Epic Games. (n.d.). Control Rig Spline Rigging in Unreal Engine [Documentation]. Epic Games Developer. https://dev.epicgames.com/documentation/en-us/unreal-engine/control-rig-spline-rigging-in-unreal-engine
[5] Epic Games. (n.d.). Control Rig Pose Caching in Unreal Engine [Documentation]. Epic Games Developer. https://dev.epicgames.com/documentation/en-us/unreal-engine/control-rig-pose-caching-in-unreal-engine
[6] Jeremy Howard. (2022, July 21). Lesson 5: Practical Deep Learning for Coders 2022 [Video]. YouTube. https://www.youtube.com/watch?v=_rXzeWq4C6w
[7] Howard, J. “How Random Forests Really Work.” Kaggle, https://www.kaggle.com/code/jhoward/how-random-forests-really-work
[8] NVIDIA Isaac Lab. (n.d.). Welcome to Isaac Lab! https://isaac-sim.github.io/IsaacLab/main/index.html
[9] The Isaac Lab Project Developers. Quickstart Guide — Isaac Lab Documentation. Retrieved from https://isaac-sim.github.io/IsaacLab/main/source/setup/quickstart.html
[10] Nine Between. (2023, October 30). Houdini is HIP - Part 14: Flip Fluids I [Video]. YouTube. https://www.youtube.com/watch?v=DJfkTV3Pivc
[11] Learning Agents (5.5). (n.d.). Unreal Engine. https://dev.epicgames.com/community/learning/courses/GAR/unreal-engine-learning-agents-5-5/7dmy/unreal-engine-learning-to-drive-5-5
[12] Lötwig Fusel. (2023, July 27). Resources, heaps & copying | D3D12 Beginners Tutorial [D3D12EZ] [Video]. YouTube. https://www.youtube.com/watch?v=Mehv3B6l9JY