UE4の勉強記録

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

UE5の勉強などなど

1.今週の予定

今週もこの順序に従って勉強していきます。

  • 映像作成用UE5の勉強
  • AIの勉強
  • Nvidia Omniverseの勉強
  • Gaeaの勉強もしくはVroidとUE5の勉強
  • Houdiniの勉強
  • AIについての調査(ComfyUIの勉強)
  • DirectX12の勉強

それぞれの勉強の最初にその勉強をする目的を一寸だけ書いておきます。

2. 映像作成用UE5の勉強

2.1 PCGを使用した神社の作成

PCGで建物を作成する方法を勉強してるので、その応用としてPCGで神社を作成する事にしました。

最終的にはUEFNのMap内で神社を作成して、だれでも参拝出来るようにするつもりです。

2.1.1 先週の復習

先週は外向きのCorner用の屋根を途中まで作成しました。

今週はこの反対側を作成します。

更にMeshをぶった切って別なMeshを作成する方法も勉強します。

2.1.2 Corner用の屋根の反対側を作成する

まず反対側の屋根を作成しました。

で作成してて気が付いたんですが、奥の屋根を作ってなかったです。

作ります。

屋根のMeshのSizeを小さくすると見栄えが悪くなるので

以下の様にSizeをそのままで繋げてみました。

結果です。

こっちの方が綺麗に繋がっていますね。

2.1.3 Meshをぶった切る方法を検証する

ModelingのModelにあるPolyCutをいじってみたら

簡単に出来ました。

この後、Pivotの位置も調整しました。

これを使用してCornerを作ってみます。

おお、これはほぼ完ぺきでしょう。

他のMeshも同様に作成します。

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

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 先週の復習

<07:54 - Doors Setup>を最後まで勉強して更に実装もやっていました。

勉強と実装をいっぺんにやるのは効率的ですので続ける事にします。

以下の様に復習の玄関を作成する事が出来るようになりました。

今週は次の節で、2つのBuildingを繋ぐ実装を勉強します。

2.2.2  Do You Want to Remove Just One Side of Your Building? | UE 5.4 P4 [1]の続きを勉強する

<15:15 - Directional Wall Remover>

この部分は難しそうなので、今週は勉強だけする事にします。

最初に、Buildingどうしを繋げる時に起きる問題について説明していますが、よく分かりません。

最後まで実装したら言ってる内容が理解出来るようになるんでしょうか?

Regular Wallの実装の以下の場所にMerge Pointsノードを追加しました。

そしてAttribute Partitionノードを追加します。

以下の値をIndexに変更しました。

そして新しいPCG Graphを作成しました。

名前はPCG_RemoveNotAlignedとしました。

そう。

最初の説明で、このAlignしているとかしていないとかの説明が全然理解出来ませんでした。

この実装を見てから、もう一回説明を聞いて考える事にします。

更にもう一個PCG Graphを作成しました。

今度はPCG_CheckSameRotationと名付けました。

そう、最初の説明は、同じ向きか、もしくは反対の向きかどうか云々とか語っていました。

それを判別するための実装をここに作成するみたいですね。

PCG_RemoveNotAlignedを開き、

Inputノードの設定を以下の様に変更しました。

Allowed TypeをPointに変更もしていました。

次にOutputノードを変更します。

Pin StateをNormalに変更もしていました。

次にLevel上にTrigger Boxを配置します。

そしてTagにRemoveWallsをセットします。

そしてPCG_RemoveNotAlignedに戻り

Get Actor Dataノードを配置しました。

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

ここでInputノードのUsageの設定をLoopに変更するのを忘れていたと言って変えました。

そしてPCG Check Same Rotationノードを追加しました。

これの実装はまだ何もしていませんので、ただ配置しただけです。

ここで全部のPointをこのNodeでCheckしてRemoveするかどうかを決定するみたいです。

まだ、全体像が見えてきません。

PCG_CheckSameRotationを開きました。

Inputノードの設定を以下の様に変更しました。

更にInputを追加して以下のような設定にしました。

Outputノードの設定も以下の様に変更しました。

これらのParameterの意味もそろそろ勉強しないといけませんね。

こんなのChatGPTに聞いたらすぐに理解出来るはずです。

そしてPCG_RemoveNotAlignedに戻り、以下の様に組みました。

そしてPCG Remove Not Alignedノードを先程のRegular Wallの実装に追加しました。

PCG Remove Not Alignedノード内に戻り

Get Attribute From Point Indexノードを2つ追加しました。

ここで今週は力尽きました。

Tutorialは5分しか進んでいませんが、もう集中力が持ちません。

ここまでにします。

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 [2]を勉強する必要がある事が判明しました。

のでControl Rig [2]を勉強する事にしました。

 今はFull-Body IK [3]の勉強をしています。特にその中の Solve Directions [4]を勉強しています。

2.3.1 先週の復習

先週はPole Vectorについて勉強しようと思い、前にPole Vectorを使用した2025-04-20のBlogの復習をしました。

そしたら膝の曲げ方を指定したいFBIKノードではなくBasic IKノードを使用していました。

これでは今勉強する優先性は低いとなり、 Solve Directions [4]の続きを勉強する事に変更しました。

思い出して来ました。

先週勉強した内容で最も重要なのは、Forwards SolveとBackwards Solveの意味です。

これずっと勘違いしていましたが、Forward SolveというのはControlからBoneを操作します。そしてその反対にBackwards SolveはBoneからControlを操作します。

今までForwards SolveはRootから末端に操作する手法、Backwards SolveはIKの事と思っていましたが、それは違っていました。

最後に<<Previewing Backwards Solve>>でBackward SolveでAnimationを実行した時に、

以下のようなBackwards Solveで実装したControlが

ControlがAnimationと一緒に動くのを確認しました。

2.3.2 先週までの勉強のまとめ

一寸勉強内容が錯綜してるので、ここに整理直す事にしました。

まず、一番の目的は

Level Sequence上でDragonをAnimation Sequenceを使用するとDragonの爪が地面にめり込んでしまいます。こういう細かいAnimationを直す方法が知りたいです。

があります。

どうもそれをやるには、Control Rigを勉強する必要がある。

という事が判明しました。

のでControl Rigを勉強し始めたんですが、なんと最初に勉強したTutorialはUE5.0用のもので今のVersionで使用するにはOut-datedしてしまっている事が判明しました。

ので今度は、UE5.6用のTutorial、Control Rig [2]を勉強する事にしました。

Full-Body IK [3]を勉強してたら、膝を正しい方向に曲げる事が出来ない。事が判明しました。

試しに、どうしたら膝を正しく曲げる事が出来るのかを、ChatGPTに聞いたら、Preferred Angles(推奨角度)を設定しろ。とかPole Vector(方向ヒント)を追加しろ。とか言って来ました。

Preferred Angles(推奨角度)に関しては一寸だけ試したことはありましたが、Pole Vector(方向ヒント)に関しては全く知りません。

で慌てて調べたら、Pole Vector(方向ヒント)はUE5.0用のTutorialを勉強してた時に、肘を曲げる指定をした時に使用していました。

え。

と焦りました。こんな大切な事、前に勉強していたの?

でPole Vector(方向ヒント)を勉強していた2025-04-20のBlogの復習を先週はしたんです。

そしたらPole Vector(方向ヒント)を使用してたNodeはFBIKノードではなくBasic IKノードである事が直ぐに分かりました。

はあ。

で、これ以上この問題は深堀しても得るものが少ない。と判断して元のControl Rig [2]の勉強に戻る事にしたんです。

そして先週はSolve Directions [4]を途中まで勉強したんでした。

後、Solve Directions [4]はFull-Body IK [3]の内容の一部じゃなかったです。独立した内容でした。

大体こんな感じでした。

という事は、しばらくは基礎知識をつけるという事で、もうDragonの爪の問題や、膝が正しい方向に曲がらない問題は忘れてControl Rig [2]の勉強を進める事にします。

2.3.3  Solve Directions [4]の続きを勉強する

<<Bake Animation to Control Rig>>

ChatGPTはすぐにLimitに達しました。と言ってくるのでCopilotで勉強する事にします。

最初の説明文の訳です。

これは前に一回やっています。

この説明を読むとControl Rig次第で、AnimationのBakeが変化するみたいですね。

其の辺に注目して勉強していきます。

全部、読んだんですが、この辺の話題は書いてなかったです。

のでCopilotに質問しました。

やっぱりIK Controlを作っておけば、足の位置だけ変更したら済むようなBakeをしてくれそうです。

この節の残りは、どうやってSequenceにSetしたAnimationからKeyをBakeするのかの具体的な手順がまとめてあります。

これは既に勉強した内容なので、ここではSkipします。

<Construction Event>

Control RigにあるConstruction Eventについての説明です。

UEを勉強し始めた頃、このConstruction Eventに何を書けば良いのか全然分からなかったんですが、ようはこれはObject Oriented ProgrammingのConstructorと同じ機能を持ってるんです。

Copilotに質問してまとめてもらいました。

これを理解していればConstruction Eventに何を実装すべきなのかは迷わなくて済みます。

ではこの節を読んでいきます。

Construction Eventノードの呼び出し方が図解されていました。

次の文です。

Rig Sharingはどんな機能なのか分からないですね。複数のControlで一つのBoneを操作でもするんでしょうか?

以下の図が追加で載っていました。

Set Control Offsetノードの機能が分かりませんね。

Copilotに質問してみます。

ControlのBoneからの位置を調整するためのNodeのようですね。

ここでRig Sharingの意味も説明していました。

異なるSkeleton構造でも同じControl Rigを使用出来るようにする。のがRig Sharingの定義のようです。

何故この実装が重要なのかについても説明してくれました。

ControlとBoneのTransformが一致しないと、意図していない動きやズレが生じるそうです。

これをConstruction Eventで実装しておかないと、意図しない動きやズレが生じるのか。

結構重要ですね。

<<Spawn Rig Elements>>

文の訳をCopilotに頼んだんですが、ものすごくゆっくりな反応になってしまいました。

どうも画像を先程見せてその画像について質問した事で、無料で使用出来るToken数を超えてしまったみたいです。

やっぱりCopilotにもLimitがあるのか。

返事が返って来ました。

返事が英語になってる。

じゃあ、今回は翻訳は無しにします。

Rig ElementをSpawnするとありますが、どうやってするんでしょうか?

Tutorialでは以下のようにDynamic HierarchyからSpawnするRigのTypeに応じたNodeを選択していました。

という事は、Rig ElementってBoneとかControlなどを指していたんですね。

次の文です。

Animation Channelは使用した事無いですが、Controlも同様なのか。

一応、読んで勉強しておきます。

分かりました。

この文は以下の図の説明です。

この図のようにSpawnControlノードを配置した場合は、Initial ValueのTypeをWildcardから特定のTypeに変更しなさい。

と言ってるです。

次の文です。

更に以下の図がついていました。

確かにMySpawnedControlの色は黄色になっています。

Rig Hierarchyに表示されているControlからNodeを調べる方法も説明されていました。

Parameterの設定がNodeからしか出来ない事を説明しています。

Spawnして生成出来るElementの数に制限がある事、その制限数はClass SettingにあるProcedural Element Limitで設定されている事を説明しています。

この辺の知識は豆知識みたいなものですね。

知っておくと得ですが、そもそもControlを128以上もSpawnするとは思えません。

<<Previewing Construction Event>>

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

Construction EventもBackwards SolveのようにPreview画面で見る事が出来るそうです。

以下にConstruction EventをPreviewに表示さた時の図を示します。

Hip Controlが表示されているんでしょうか?

よく分からないです。

この辺は実際に試してみないとよく分からないですね。

<Backwards and Forwards>

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

まずBackwards and Forwards Preview Modeがあるのを知らなかったです。

このModeにするとBake Animation To Control RigのProcessと同じ事をするんですね。

正しくBakeされているのかを確認するためのModeのようです。

ここで正しくBakeされなかったらForwards SolveやBackwards SolveのControlやBoneの設定を変更するのかな?

以上でした。

3. AIの勉強

AIの勉強の目的ですが、

生成AIが凄いTrendになってるので、最低限の基礎は知っておくべきと思いこの勉強を始めたんでした。

のでこれを勉強してどうしたいというのは無いです。

3.1 前回の復習

Lesson 5: Practical Deep Learning for Coders 2022 [5]の動画を見ました。

<00:07:30 - Cleaning the data>の最後のちょっと手前まで勉強しました。

今回は表形式のDataからAIに学習させる方法を勉強しています。そして実装方法はCodeだけが提供されていて自分で足りない部分は補ってそのCodeを正常に作動するように改良する必要があります。

でもそれって前のLectureの宿題でもずっとやっていました。

まあAIの助けをバンバン借りていたので、AIが無いころに比べたら物凄く簡単になってるのは事実ですけど。

3.2 Lesson 5: Practical Deep Learning for Coders 2022 [5]の続きを勉強する

以下の実装の説明です。

DummyのColumを追加してるのか?

最初のCodeの意味がそれで正しいの分かりません。

ChatGPTに質問するか。

だそうです。

あ、そうか。

Indep_colsがどんなVariableなのかを知っておけば混乱しなかったんだ。

調べます。

なんとここで初登場でした。

じゃ、Added_colsは?

これは以下の様に定義されていました。

まあ、Columの数を増やしたという理解で充分でしょう。

次のCodeです。

うーん。

要はそれぞれのColumnに沿った値が保持されたって事でしょう。

Kaggleでは以下のような結果が表示されています。

最後にShapeを聞いていました。

特徴量が12個になっていますね。

これは数えてみます。

added_colsが8で4つ追加したので12個でした。

<00:26:46 - Setting up a linear model>

そして以下の係数をかけます。

この係数の初期値はRandomに決定されています。

あれ?

ここまで来て、思い出しましたがこれってやっぱり前のLectureでやったのと全く同じ内容ですね。

まあ、良い復習になります。

あんまり気にしないで続きを勉強していきます。

次の実装です。

最初のCodeでColumに必要な数を取得しています。

その数の分だけRandomな数字を作成し、0.5を引きます。

係数をかけました。

この計算がMatrixにVectorをかける計算で一寸注意が必要らしいです。

そしてBroadcastingという言葉でなんか一生懸命説明しています。

その説明を聞いたんですがよく分かりません。NotebookLMに解説してもらいます。

これって単に横×縦の計算を言ってるだけじゃ。

次に行きます。

これは年齢のColumnの数字が大きすぎるので最も大きな数字で割る事で正規化しています。

そしてまた係数を掛けます。

Sum(Axis =1)の意味が分かりません。

成程。

でもこれってPredictionになるのかな?

この辺の計算はもう忘れています。

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

ああ、そうか!

それぞれのParameterから生き残る値を算出してるんだから全部足した値がどれだけ生き残れる可能性が有るかの予測値になるのか。

納得。

以下の方法で計算するのもあるそうです。

これでLoss関数じゃないの?

やっぱりLoss関数だった。

こんな計算してたのか。

全然覚えてないというべきか、だんだん深く理解出来るようになってきたというべきか。

<00:38:48 - Creating functions>

ここで節が変わっているのか。

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

4. Nvidia Omniverseの勉強

robotic AIの仮想空間におけるTrainingのための環境設定こそがこれからの3D Graphicsの専門家が生きる場所であると思っています。

のでその仮想空間でRobotic AIがどんなTrainingを行っているかをまず勉強する事にしました。

色々調べると、その部分はNvidiaのOmniverseの中のIsaac Simが担当している事が判明しました。

のでその辺りを勉強します。

4.1 NVIDIA Isaac Sim - MuSHR RC Car - Ackermann Tutorial [6]の勉強

Version 4.2.0のIsaac Sim Documentation [7]のTutorialの勉強がROS and ROS2まで終わるまでPending。

WorkspaceのInstall方法並びに、Installした後の確認方法は理解したので時間があったらWorkspaceだけInstallしておきます。

ただし今週も他にやる事が沢山あるのでやりません。

4.2 Version 4.2.0のIsaac Sim Documentation [7]のTutorialの勉強

4.2.1 先週の復習

 Isaac Sim Extension Templates [8]の勉強を継続しています。

先週は<Implementation Details>の<<Loadボタン>>の内容を実装から確認しました。

2025-08-03のBlogで以下の様にまとめましたが

これが実装からみて正しいのかを確認しました。

Setup_scene_fn()関数の機能は、実際はSetup_scene()関数が担当します。

Setup_scene()関数の実装を見ると

となっていて、

これは既に生成されているSingletonのWorldを呼び出しているだけだそうです。

そしてこの関数のCommentにも

と書かれていました。

つまりこの関数内ではWorldを生成する事はしないという事です。

2025-08-03のBlogの<<Load Button>>のまとめで次に書かれているのは以下の

アセットをステージにロードしてworld.scene.add()でWorldに追加します。

です。

これは以下の部分の実装が担当していました。

この実装のそれぞれの意味についても調査しました。

まずSelf._articulationですが以下の様に定義されていました。

Articulation()関数は、USD上においただけのRobotを物理Simulationで動かせるようにWrapするそうです。

つまりrobot_prim_pathには物理Simulationで動かしたいRobotのAddressが指定されています。

ここからが一寸ややこしくなります。

robot_prim_pathを見ると以下の様に指定されています。

これって単にFolderを指定してるだけじゃないの?

と思ったんですがChatGPTに聞いたらFolderではなくPrimを指定してると回答されました。

Primとは以下の事を指します。

今度はこのPrimに

以下の実装で、Path_to_robot_usdの内容を追加します。

因みにPath_to_robot_usdには

RobotのUSD Fileがある場所のAddressが入っています。

これで

robot_prim_pathが示すPrim(/ur10e)には、物理Simulationで動かせるようにしたいRobotが追加されました。

この状態で

を行うので物理Simulationで動かせるRobotがWorldに追加されたのです。

同様に

ではSelf._cuboidに入っているCubeがWorldに追加されたのですが、これを確認する前にCPG-5が使えなくなってしまったので、ここで先週は終了しています。

最後に

と書いて終わっていました。

4.2.2 今週の予定

今週は以下のscene.add(self._cuboid)の実装について調べます。

その後でsetup_post_load_fn=self._setup_scenarioの機能を調べる事にします。

因みに2025-08-03のBlogの<<Load Button>>の機能にはSetup_post_load_fn()の機能は以下のように書いてありました。

setup_post_load_fn(): アセットがロードされ、初期化済みであり、タイムラインが0タイムステップで一時停止していると仮定できます。

このCommentがどの程度正しいのかも同時に検証していきます。

4.2.3 Isaac Sim Extension Templates [8]の勉強の続きをやる

<scene.add(self._cuboid)の実装を見る>

self._cuboidは以下の実装で定義されていました。

ChatGPTにこのCodeを説明してもらいます。

イキナリ質問しても正確にどの分野のCodeなのか説明してくれます。

こういうAIの能力は人間をはるかに凌駕しています。

以下の様に説明してくれました。

こんな立体あったけと思って確認したらありました。

試しに色を青に変更してみます。

代わるんでしょうか?

Extensionが何故か閉じてしまったのでもう一回開いてLoadを押しました。

青くなっています。

そういう事か。

このTemplate(Loaded Scenario Template)のLoadするRobotを変更すれば、どんなRobotでもこのTemplateを使用してSimulationを始める事が出来る訳です。

やっと意味が分かって来ました。

で、逆にこのTemplateを使用しないと初期化などの問題と常に格闘する必要が出て来てしまうんです。

段々このTemplateの大切さが分かって来ました。

<_setup_scenario(self)の実装をみる>

以下にCommentを示します。

This function is attached to the Load Button as the setup_post_load_fn callback.

The user may assume that their assets have been loaded by their setup_scene_fn callback, that

their objects are properly initialized, and that the timeline is paused on timestep 0.

 

In this example, a scenario is initialized which will move each robot joint one at a time in a loop while moving the

provided prim in a circle around the robot.

ChatGPTの訳です。

この関数は Load ボタン に setup_post_load_fn コールバックとして割り当てられています。

ユーザーは、自分のアセットが setup_scene_fn コールバックによってロードされていること、

オブジェクトが正しく初期化されていること、そしてタイムラインがステップ 0 で一時停止していることを前提として構いません。

 

この例では、シナリオが初期化され、各ロボットの関節を順番に動かしながら、

与えられた prim(シーン内オブジェクト)*をロボットの周りで円を描くように移動させます。

 

*「prim」というのは USD のプリム(Primitive, シーン構造の最小単位) を指しています。

そのまま「prim」と表記するか、「オブジェクト」と意訳しても大丈夫です。

これだとsetup_post_load_fnがいつ呼ばれるのか分かりませんね。

先程のsetup_scene_fn=self._setup_sceneはLoad Buttonが押された時に呼ばれます。この関数はいつ呼ばれるのでしょうか?

ChatGPTの回答です。

成程。Prim(Object)が使用出来た後にする設定がこっちの関数に指定されているのか。

で、2025-08-03のBlogにまとめた以下の内容が正しいかどうかですが、

Asset云々の話は、Setup_Scene_fnが実行された時に行われるので、このSetup_post_load_fn()関数が実行される前には、こうなっているのは正しいです。

しかしここで解説してるのはSetup_post_load_fn()関数の機能ではなく、このSetup_post_load_fn()関数が呼ばれる前の状態の事です。

実際には何をしてるのか確認します。

def _setup_scenario(self)には以下のCodeだけが実装されています。

これらが何をしてるのかをChatGPTに質問します。

え。

これってさっき2025-08-03のBlogにまとめた内容じゃ。

あ、そっか。

setup_scene_fnつまりself._setup_scene()関数では、Primを読み込み配置する事を、実装し、setup_post_load_fnつまりself._setup_scenario()関数では、その配置したObjectの初期化を行っているんです。

具体的には

ロボットやオブジェクトの位置をリセットしたり、内部状態を初期値に戻す処理や、「開始 / 停止」切り替えのボタンをリセットなどを行います。

という事です。

成程。

理解しました。

で、これでやっと以下に示した2025-08-03のBlogのLoad Buttonの復習が終わりました。

うーん。

どうしようかな。

こんな感じで全部勉強してもいいですが、勉強に費やした時間に対しての評価が得られない気がします。

ChatGPTに色々質問して考えたんですが、

ChatGPTはExtensionの勉強に力を入れても独自機能を拡張機能として整理して配布する事が出来るだけで、普通にシミュレーションやロボット学習を進めたい人にとっては必須ではない。

と断言しています。

更に

シミュレーション+ROS2+RLの一連の流れを回す

のが勉強の目的ならそっちに集中した方が良いと言っています。

これはそうかもしれません。

しかしこれを直接勉強できるTutorialは無いそうです。

それぞれを勉強して自分でつなげてやるしかないそうです。

今週はこのままIsaac Sim Extension Templates [8]の勉強を続けます。

<<Resetボタン>>

2025-08-03のBlogには以下のようにまとめられていました。

Reset Buttonの実装です。

Pre_reset_fnには何の関数もセットされていません。

post_reset_fnには_on_post_reset_btn()関数がセットされています。

Pre_reset_fnとpost_reset_fnの役割をChatGPTに質問します。

だそうです。

でもう少し詳しく説明してもらうと

となっています。

今の状態を保存するのはReset前にやる必要がありますね。

post_reset_fnの機能は、setup_post_load_fnつまりself._setup_scenario()関数に似ています。

_on_post_reset_btn()関数は以下のように実装されていました。

def _setup_scenario(self)の実装を以下に示します。

Reset ButtonのResetだけが違うのか。

大体理解しました。

2025-08-03のBlogの説明をもう一回見直します。

Pre_reset_fnはResetするまえにする事がまとめられるはずなので、この説明は正しいです。

post_reset_fnの説明はLoad buttonのsetup_post_load_fnの説明と同じですが、それは正しい事も確認出来ました。

<<Runボタン>>

今度はRun Buttonについてです。

2025-08-03のBlogの説明です。

これはState Buttonとなっていました。

なんと、ここでCPT5がlimitに達してしまいました。

まあここまでにしておくか。

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

5. Gaeaの勉強もしくはVroidとUE5の勉強

5.1 GaeaのTutorialの作成

今週はSatmapのImageを使用してLandscapeの色を追加する方法を説明しました。

何故、この内容を前回の動画に追加しなかったのかを説明しています。

TexCoord[0]ノードの設定を説明しています。

Material内でTextureの繋ぎ方を説明しました。

結果です。

6. Houdiniの勉強

Houdiniの勉強を始めた理由は、これからの3D GraphicsはProceduralな3Dの生成だという風潮が2年前ぐらいに起きて、それで慌てて勉強を始めたんです。

生成AIブームが起きて、Proceduralな3Dの生成のブームはすっかりなくなってしまいましたが、Nodeを使用して3Dを生成する手法は、職人的な技術が無くても3D Objectの生成が出来るのでかなり便利という事に気が付きました。

のでHoudiniの勉強は続けています。

しばらくHoudiniの勉強はお休みして木の生成について調査していましたが、やっぱりHoudiniの水のSimulationの勉強をする事にします

木を自分で実装してもその凄さに気が付く人はほとんどいません。

それに対して水のVEXを作成したら誰が見ても凄いと思うからです。

6.1 前回の復習

前々回のBlogでは Houdini is HIP - Part 14: Flip Fluids I [9]の<13:45 Flip Fluid Sourcing and Setup>を実装しました。

ところが、最後の結果が、

こんな感じになり

以下に示したTutorialの結果とかなり違う結果になってしまいました。

このBugを直しました。

このBugが起きた理由は

ScatterノードのForce Total Countの値が10,000になっていたからです。

この値を100,000に変更したら以下のようにTutorialと同じになりました。

以上です。

6.2  Houdini is HIP - Part 14: Flip Fluids I [9]の続きを勉強する

<22:18 Sticking on Collision>

Flipsolverノードを選択し

Stick on CollusionをEnableします。

TutorialではNormal ScaleとTangent Scaleについて細かい説明がありましたがそれはここにはまとめません。

最後に以下の様にTangent Scaleの値を1から0.2に下げました。

この値はParticleが地面などの水平な表面を移動する時のViscosity(粘度)を管理するそうです。

値を下げたのでViscosityが下がりました。

結果です。

Particleの広がり方が均一でなくなり、更に移動距離が増えました。

FlipObjectノードを選択し

GuideからParticleを選択します。

Color Rampの下にあるVisualization Attributeを見ると

Vが選択されています。

つまりそれぞれのParticleのVelocityが色付けされているという事です。

遠くに移動しているParticleはVelocityの値が高いので色が白くなっています。

おお、

これは面白い話です。

<25:47 Continuous Particle Sourcing>

今度はどんな風にSimulationが設定されているのかを説明するそうです。

今までにSimulationの設定でいじったのは以下に示したFlipObjectにあるInitial DataのSOP Pathだけです。

でこれを消してしまいます。

そして以下の様にPopSourceノードを追加します。

そしてPopSourceノードからSOPを指定します。

でこうすると何が変わったのかですが、

以下に示した様にBirth Rateの値で生成されるPointの数が指定されるようになりました。

ここでは5000になっています。

FlipObjectにあるInitial DataのSOP PathでSourceを指定するのと PopSourceノードをFlipObjectにつなげて、PopSourceノードからSOPを指定した場合は何が違うかCopilotに聞いてみます。

なんと昨日、勉強する気がなくてTikTok見ていたら、Copilotから勉強するためのやる気が出ませんか?やる気が出る方法ありますよ。てメールが届きました。

びっくりです!

でも非常に有難かったです。

ので今回はCopilotを使用します。

以下の様に質問しました。

回答です。

要は、

  • FlipObjectの「Initial Data」→ SOP Path指定では一回、Simulationの最初の時だけParticleを生成出来る
  • POP Sourceノード → SOP指定 + Birth Rate制御でParticleを生成する場合は、Frame毎にParticleを発生できる。

という事です。

成程ね。

Playを実行したら以下の様になっていました。

でも空中に浮いている青いSphereを形成するParticleは不動です。

これはおかしいですよね。

と思ったらこれはGuideといってどこからParticleが発生するのかを示しているもので、Particleとは関係ないそうです。

更に以下に示したGuideをDisableする事で消す事も出来るそうです。

GuideをOffにしてみました。

色が白くなるほどそのParticleの速度が速くなるから、重力加速度が効いてるとなると、地面に近づくほど白くなるはずです。

まあそんな風に見えますね。

後、Birth Rateはいつの間にか、50,000に増やしていました。

ここでTutorialはPopSourceノードのBirth RateとFlipObjectノードのParticle Separationの関係について説明しています。

まずPopSourceノードのBirth Rateの値を500,000に増やしました。

当然、Particleの数が増えます。

Screenshotでは伝わりませんが、Animationで見ると結構圧巻です。

この状態でのFlipObjectノードのParticle Separationの値を見ると、以下の様に0.0125になっています。

FlipObjectノードのPropertyを開けば、以下に示した様に正確なPointの数も確認できます。

1,000,000弱と言ったとところでしょうか。

Particle Separationの値を0.04に増やしました。

Playを実行しました。

どうみても生成されるParticleの量が減っています。

先程のFlipObjectノードのPropertyから実際に生成されるParticleの数を確認すると

50,000弱に減っています。

これはFlipSolverノードのReseedingを見ると

Reseed ParticleにCheckが入っています。

この場合は、Simulation中のParticleの数を一定に調整するために、Particleを増やしたり減らしたりする調整が入るそうです。

で、その調整の基準となるのが、

先程のFlipObjectノードのParticle Separationの値だそうです。

でこの方法でSimulationをするのはParticle Baseなんです。

今度はField BaseでSimulationする方法を示します。

まずPopSourceノードを消します。

ここで<25:47 Continuous Particle Sourcing>が終わっていました。

区切りが良いのでここまでにします。

7. AIについての調査(ComfyUIの勉強)

Iを使用するためのSoftが大量に公開されていますが、それらについて全く理解していません。

3Dやイラストそして動画関連のAI Softについて、どんなSoftが公開されているのか?それらのSoftを使用するとどんな事が出来るのか、どんな方法で操作するのか、

などの一通りの事を勉強しておこうと思い、この章を特別に作りました。

特にComfyUIの使用方法やそれに関して生成出来るイラストや映像について集中して勉強していこうと思っています。

2025-03-30のBlogでUE5でもReinforcement Learningが出来る事を知りました。

のでComfyUIの勉強は一端中止してこっちを勉強する事にします。

今週は、先週勉強した Improving Observations & Debugging (5.5)[10]の勉強の続きをします。

7.1 先週の復習をする

先週はSpecify Agent Action()関数とPerform Agent Action()関数のそれぞれの機能について勉強しました。

Specify Agent Action()関数はAgentがどんなActionを取れるのかを宣言し、

Perform Agent Action()関数は、Agentが出したActionを実行します。

更に先週のBlogでは注意すべき点として

Agent ActionではAgent Observationとは違い作成したStructは既に値を所持していて、その値をStructから取り出していました。

とまとめてありました。

で、今週は何を勉強しようかと思ったんですが、

以下の2つを考えています。

  • Improving Observations & Debugging (5.5)[10]の続きである<Debugging & Visual Logger>を勉強する
  • 今勉強しているTutorialの実装の内容がかなり理解出来たのでLearning Agents (5.5)[11]に戻ってLearning Agents Training Environment以降の実装をもう一度勉強し直す

まずはImproving Observations & Debugging (5.5)[10]の続きである<Debugging & Visual Logger>を勉強します。

その後で、多分来週以降になると思いますが、Learning Agents (5.5)[11]に戻ってLearning Agents Training Environment以降の実装をもう一度勉強し直します。

7.2 Improving Observations & Debugging (5.5)[10]の続きを勉強する

<Debugging & Visual Logger>

最初の文章をChatGPTに訳してもらいました。

観察内容を視覚化して、エージェントが正しいデータを受け取っているかを確認するのは良い考えです。

各 Learning Agents の観察はすでに Unreal Engine の Visual Logger に統合されており、

これは強力なデバッグツールです。

最初の文に対しては素直にそうですね。という感想しかないです。

次の文ですが、Visual Loggerってそんなのあったけと思いました。

「Make Location Along Spline Observation」を見てみると、

プレイヤーが操作するエージェント(ゲームモードのロジックで生成され、カメラが追従している車)に対して、

すでにデバッグデータを描画するように接続されているのが分かります。

この説明の後に以下の図がついていました。

こんなのあったのか覚えていません。

確認します。

ありました。

なんとGather Agent Observationに実装されていました。

Tools -> Debug -> Visual LoggerでVisual Loggerを開けるそうです。

せっかくUE5のこのProjectを起動させたのでこれも確認してみます。

ありました。

起動します。

以下のWindowが開きました。

TutorialにはPlayを押してSimulationを実行した状態で、Startを押すとこの画面に何かが表示されると言っています。

試してみます。

文字が表示されました。

取りあえずTutorialの言う通りに文字が表示されるのは確認出来たので止めます。

なんかErrorが凄い表示されています。

うーん。

これは今回は無視。

Tutorialの続きを読むと

Pause

を押して

LocationAlongSplineObservationを選択しright-most tickを更に選択していました。

この状態で

game viewport

をClickして、更に

F8

をClickします。

すると以下のような表示が確認できるそうです。

なんかさっき停止したら凄いErrorが出て来たので、これを試す前にBugの修正をする必要があります。

うーん。

結構、時間かかるよなBug取りは。

来週、しっかり時間を取ってBug取りをする事に決めました。

という事で、これは来週試す事にします。

今週はTutorialの残りを読むだけにします。

<Finished Behavior>

Tutorialには以下のように書いてあるだけです。

これはVideoが表示されてないのか?

それともTutorialを作成した人がVideoを貼るのを忘れてしまったのでしょうか?

まあいいです。

先に進みます。

<Summary>

ここに書かれている文章をChatGPT荷役してもらいました。

このチュートリアルでは、エージェントがスプラインの形状を先読みできるようにすることで、運転行動を改善しました。

エージェントの学習で問題に直面する場合、多くは正確な判断を下すための情報が十分に与えられていないことが原因です。

私たちは自分自身の運転経験を振り返ることで、エージェントを改善するための計画を立てることができました。

これはホントにSummaryと言う感じで、このTutorialで勉強した内容を簡潔にまとめています。

しかし簡潔であるがゆえにその奥にあるどうやって「正確な判断を下すための情報」をPassしたのかとか、

そもそも「正確な判断を下すための情報」とは何なのかという事、

そしてどんな情報をAgentに与えるかを考えるのは最新のRe-forced Learningでも重要な研究Themeである事。

などは全然ここでは語られていません。

更に言えば、このTutorialで復習する事で、やっとSpecify Agent Observation() 、Gather Agent Observation、Specify Agent Action()、

そしてPerform Agent Action()関数のそれぞれの役割と実装内容がやっと理解出来ました。

次の文です。

私たちは Static Array Observation を追加することで、エージェントに先読み用の複数のポイント(lookahead point の配列)を簡単に組み込むことができました。

Learning Agents には、ゲームでよく役立ついくつかのコンテナ型が用意されています。

以下に現在利用できるコンテナ観察の例を示します。

あれ、Summaryなのに突然追加の情報を紹介しています。

うーん。

いきなりこんなの表示されても

???

となってしまいます。

ChatGPTに説明してもらいますか。

だそうです。

今回の例では、

Agentから先に向かった一定の距離の複数のPointの値を観察したので、

数が決まっているリストを観察するのに適切なStatic Arrayを使用したんですね。

ChatGPTでは、それぞれのObservationの使い道についてもう少し詳しく説明しています。

ふと思ったんですが、ChatGPTかGeminiがPokémonをClearしたという話があったはずですが、それってこういうのは別に実装したんでしょうか?

これもChatGPTに聞いてみます。

うーん。

こんな風には操作してなかった感じですが、どうなんでしょう?

後は、この回答の補足でした。

どうなのかな。

この回答は一寸、Hallucinationの可能性があるかもと思って軽く聞いておく事にします。

8. DirectX12の勉強

3D Graphicsを作成するのにOpenGLを使ってるとバカにされるからDirectX12の使い方も勉強しようとしたら、Windows 8ではDirectX12が使用出来なくてずっと勉強を我慢していました。

で新しいPCを買ってやっとDirectX12を勉強できる環境になったら、もうDirectX12を勉強する人がいなくなっちゃってたんです。

のでこれも出来たら何したいというのは無いですね。

ああ、昔MMDを自分で作りたいというのはありました。それを目的にします。

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

8.1.1 先週の復習をする

ああそうだ。

Visual Studio 2022をUpdateしたんでした。

そしてUpdateした結果、良い事と悪い事が起きました。

まず良い事ですが、

GitHub Copilot Chatが使えるようになりました。

無料版ですのでLimitがあるみたいですが使える事は使えます。

次に悪い事ですが、

Sample Code並びに自分のProjectがBuildしなくなりました。

BuildするとErrorになります。

#include <cstdlib>

を追加するとErrorが消え、Build出来るようになりました。

でこんな事に時間を取られてもうDirectX12の勉強してる時間が無くなってしまいました。

一応、今週やる内容だけは先週の最後にまとめていました。

これに基づいて今週の作業を決めます。

8.1.2  Resources, Heaps & Copying | D3D12 Beginners Tutorial [D3D12Ez] [12]の続きを勉強する

38:32のところから復習する事にします。

CPUのDataをGPUにCopyします。

まずCPU側からGPU側にCopy出来る場所のAddressをMap()関数を使用して確保します。

次にUnmap()関数でCPU が編集した内容をGPUにCopyします。

ここでBreak Pointを設定して実際に動くかどうかを確認しています。

以下の様にUploadBufferAddressにあるAddressの値が追加されています。

という事は正常に動いているという証拠です。

次にMemcpy()関数を使用して

このAddressにHelloを保持させています。

今度はRelease ModeでBuildします。

Nsight Graphicsで確認します。

以下の場所からAll Resourceを選択して

以下のWindowを開き

Buffer1を選択します。

すると以下に示したWindowが開きます。

値が書き込まれているのを確認出来ました。

これはGPU側のMemoryに値が書き込まれているのを確認したのかな。

Copilotで確認します。

やっぱりそうですね。

ああ、大体の流れとその流れ通りにDataが渡されているのかの確認方法が理解出来ました。

VS2022のBreak Pointで確認出来るのはCPU側のvariableが値を持っているかどうかだけです。

ので、Nsightを使用してGPU側でも正しくDataを受け取っているのかの確認をする必要があるんです。

Copilotもそう言っていました。

やっとDirectX12の内容を理解する事が出来るようになって来ました。

2年ぐらいかかったかな。

Blogを調べたら最初にDirectX12の勉強を開始したのは2022-10-16の週でした。

今、2025の8月の最後の週ですので、2年と十カ月、ほぼ三年かかっています。

石の上にも三年とはよく言ったものです。

ここまで感動していてあれですが、

今確認したDataはUpload Heapの内容でした。

ので厳密に言えばまだCPU側のMemoryの話でした。

これからGPU側にCopyする実装を追加します。

これはUpload HeapからDefault HeapにDataを写すという意味です。

まずここにCommand Listを呼ぶ必要があります。

以下の実装のAutoを消して

以下の場所にCommand Listを作成する実装を追加します。

うーん。

Command Listの機能についてももう完全に忘れています。

復習します。

2022-11-06のBlogに以下の様にまとめてありました。

成程ね。

これがCommand Listか。

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

やっとここでCopyBufferRegin()関数を使用するのか。

CopyBufferRegin()関数の中身については、来週実装する時に勉強する事にします。

この部分は「DirectX 12の魔導書」の実装方法との比較においても重要な部分なのでじっくりやっていきます。

この後、この実装だと○○の理由でErrorになる可能性があるから、それを直すと言っています。

ただその○○の理由がよく分からないです。

直した部分は以下の場所です。

要はここの指定が間違っているとErrorになる。と言っています。

で何回も説明を聞いたんですが、どのように考えると正しい指定が出来るようなるのかが分かりません。

これも後から見たら理解出来るようになるんでしょうか?

一応、Tutorialでこの事を説明してる時間帯だけ記録しておきます。

44:20~45:31

位です。

なんと、別にErrorになってないので変えなくても良いと言って終わっています。

やっとここでNsight Graphicsを使用してTestを開始しました。

Default HeapであるBuffer2の方に値が書き込まれていました。

おお、これでやっとGPU側のMemoryに値がPassされた事が確認出来ました。

この後は、このTutorialで勉強した内容のまとめがあってそこで終わっていました。

はい。

これでこのTutorialは終わりました。

最後にBufferとHeapがInterchangeに使用されているのでそれぞれの単語の意味をCopilotに質問して確認しておきます。

以下にCopilotの回答を示します。

まずHeapの説明です。

HeapはMemoryの領域を指しているんですね。

そしてBufferの説明です。

BufferはDataの入れ物を指すのか。

つまり

BufferはDataの入れ物、HeapはBufferなどを保管するためのMemoryの領域。

という事です。

一応Copilotでこの解釈であっているのか確認します。

あってるそうです。

ここでさらに分かり易く例で説明してくれました。

え!

CreateCommittedResource()関数のParameterで、Heapを指定するParameterとBufferを指定するParameterで分かれていたのか。

全然気が付かなかった。

Copilotにこの事を報告しました。

すると更に詳しい説明をしてくれました。

以下にその説明を記しておきます。

ResourceDescがBufferの状態を全部指定していたんです。

なんか面倒な事を指定するStructだな。位にしか思っていなかったです。

そうか、HeapとBufferの違いが理解出来ると、この関数のParameterが何を指定してるのかの理解も出来るようになるのか。

DirectX12は、まだまだ勉強する内容は多そうです。

焦らずゆっくりやって行きましょう。

8.2 「DirectX 12の魔導書」を勉強する

こっちは「Lötwig Fusel氏のD3D12 Beginners Tutorial [D3D12Ez]を勉強する」のHeapのDataをGPUにCopyする実装が終わるまでPendingしておきます。

一応。今回の勉強でD3D12 Beginners Tutorial [D3D12Ez]ではCopyBufferRegin()関数を使用してる事が確認出来ました。

来週、「Lötwig Fusel氏のD3D12 Beginners Tutorial [D3D12Ez]を勉強する」でCopyBufferRegin()関数を実装し、正しく動く事が確認出来たら、

DirectX 12の魔導書」のやり方と比較しながら勉強していきます。

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] Control Rig. (n.d.). Unreal Engine. https://dev.epicgames.com/documentation/en-us/unreal-engine/control-rig-in-unreal-engine

[3] Full-Body IK. (n.d.). Unreal Engine. https://dev.epicgames.com/documentation/en-us/unreal-engine/control-rig-full-body-ik-in-unreal-engine

[4] Solve Directions. (n.d.). Unreal Engine. https://dev.epicgames.com/documentation/en-us/unreal-engine/control-rig-forwards-solve-and-backwards-solve-in-unreal-engine

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

[6] NVIDIA Isaac Sim - MUSHR RC Car - Ackermann Tutorial. (n.d.). YouTube. https://www.youtube.com/playlist?list=PL60qgWqGu6k82AJ2SDWOscEKLjCc5tdEW

[7] Isaac SIM UI and workflow Tutorials — Isaac SIM Documentation. (n.d.). https://docs.isaacsim.omniverse.nvidia.com/4.2.0/introductory_tutorials/index.html

[8] Isaac SIM Extension Templates — Isaac SIM Documentation. (n.d.). https://docs.isaacsim.omniverse.nvidia.com/4.2.0/advanced_tutorials/tutorial_extension_templates.html

[9] Nine Between. (2023, October 30). Houdini is HIP - Part 14: Flip Fluids I [Video]. YouTube. https://www.youtube.com/watch?v=DJfkTV3Pivc

[10] Learning agents (5.5) Improving observations & Debugging (5.5). (n.d.). Unreal Engine. https://dev.epicgames.com/community/learning/courses/GAR/unreal-engine-learning-agents-5-5/1w7V/unreal-engine-improving-

[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