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の外枠を埋めるためのPointを生成したんですが、以下の様に向きがあっていません。

以下の様に右下と右上の外枠の向きを直しました。

という事は今週は左下と左上の向きを直します。

2.1.2 左下と左上のPointの向きを直す

前回、右下と右上のPointを作成した方法を復習します。

<右下のPointの生成方法>

以下の方法で右下のPointを生成していました。

  1. 右側にあるPointを利用します。
  2. Wall Size一個分だけ下にずらす。
  3. 元のPointとの差分をとる。
  4. Original Pointを右にずらしたPointとの差分をとる
  5. Offsetで位置をずらし、回転で向きを調整する

この方法を真似て、左側のPointを生成します。

<左下のPointを生成する>

出来ました。

右上のPointも追加しました。

全部のPointを追加します。

テストのため塀の形状を変化します。

色々な形状に変化しましたが、どの形状でも塀の外側のCornerにPointが正しい向きで生成されています。

今週はここまでです。

来週は塀の外側のCornerを作成します。

2.1.3 左下と左上したのPointを追加した感想

もうUE5の勉強をしても世の中からそんなに重要視される事は無いのかな。と思いつつ先週は過ごしていました。

が、こうやって塀の外枠が完成すると、中身のある進歩が感じられてやる気が戻って来ました。

また頑張る事にします。

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]の続きを実装していました。

<07:54 - Doors Setup>で以下のDoorのMeshを

ただし、このDoorのMeshのSizeはWallのMeshのSizeとは全然違います。

そのSizeを調整する必要があるのか無いのかが分からないのでここで止めると書いてありました。

うーん。

成程。

でもこれって問題が発生してから直せば良いんですよね。

となると今週はこの続きの実装をやるだけですね。

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

Trigger Boxを追加しました。

そしてTrigger BoxのTagにindex[0]を追加し、index[0]の値にDoorをセットしました。

そして以下の場所にCodeを追加します。

この場所は予想通りWallのComment内にありました。

Get Actor Dataノードを追加しました。

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

Track Actors Only Within BoundsはUncheckしました。

今度はIntersectionノードを追加して、以下の様に繋げました。

Intersectionノードを可視化すると以下の様になりました。

Differenceノードを追加して以下の様に実装しました。

結果です。

表示されたPointから生成されていたWallが消えました。

BoxのSizeを小さくしたらWallは一個だけ消えるようになりました。

今度はこの空間にDoorを生成します。

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

そしてIntersectionの結果をPCG Scale Wall SizeのPointsに繋げます。

結果です。

出来てると最初は思ったんですが、よく見ると隣のWallの様子が変です。

Tutorialの説明を聞くとどうもこのBugは後で直すみたいです。

以下に示した様にTrigger BoxのSizeを変更したらとなりのWallは元に戻りました。

こんだけ出来たら十分です。

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

続きは来週勉強します。

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]を勉強する事にしました。

2.3.1 先週の復習

  Full-Body IK [3]の勉強をしています。

Full Body IKノードの使い方は大体理解しましたが、予測と結果が一致しません。特に膝を曲げる動作ですが、膝が逆方向に曲がってしまいます。

付属のCR_Mannequin_BodyのFoot_r_ik_ctrlを動かすと、膝が綺麗に曲がります。

のでこの実装方法を調べる事にしました。

Setup Legノードという自作のNodeを使用して膝が正しい方向に曲がるIKを実装していました。

Setup Legノードの中身の実装も確認しましたが、知らない機能ばかりで、全く理解出来ません。

Chat GPTに質問しても変な回答しか返って来ません。

こういうNode BaseのProgrammingに関して言うと一寸でも深い質問をするとChat GPTなどのAIの回答はほとんどの場合間違った回答を返してきます。

ので自力で理解するしかありません。

それぞれのNodeの機能を調べようとしましたが、そのNodeがDefaultで存在してるNodeなのか、この実装のために作成されたNodeなのかすら判別できません。

結論として

まだ、生のControl RigのCodeを見て判別できるほどの知識が無い事が判明した。

地道に基礎力を上げる必要がある。

来週(今週から)Control Rig [2]にあるTutorialを勉強する事にする。

とまとめられていました。

2.3.2 Solve Directions [4]を勉強する

今週からChatGPT5が使用出来るようになったので、どの程度の性能なのか試してみます。

結構、評判は悪いです。

あれ?

評判悪いとは聞いていましたが、かなり感じ良いですね。

要点を先にまとめてもらいますか。

これは知ってます。

おお、足の接地についての解説がありました。

かなり分かり易い解説ですね。

もう直接聞いてしまいましょう。

これがこのTutorialを勉強する目的です。

これを理解出来るようになるんでしょうか?

Full Body IKのSolve方向と、Jointの初期方向の関係、を理解すると解決できる。

とはっきり言っています。

本当でしょうか?

Solve方向は先程の要点の説明から計算方向をTipからRootにするか、RootからTipにするかのどちらかです。

これの意味は分かっています。

次のJointの初期方向の関係は何を指してるのか不明です。

続きを読みます。

これを指定するのが「Jointの初期方向」なんでしょうか?

以下の3つの原因があるそうです。

それぞれの原因について一寸だけ検証します。

<初期姿勢のヒント不足>

Pole VectorとかPreferred Angleなんて設定あったでしょうか?

確認します。

Preferred Angleは Full-Body IK [3]にありました。

Pole Vectorは無いですね。

これは後で調べます。

<ローカル軸の方向が想定と逆>

これは、何を言ってるのか一寸だけ理解出来ます。

前に肘のLocal軸を調べて向きを確認した時があります。

それの事を言ってると思われます。

一応Blogで確認します。

2025-04-20のBlogにPole Vectorの記録がありました。

ただしどのNodeがPole VectorのInputを持っているのかはこの図からは分からなかったです。

UE5の方から確認しました。

Basic IKにありました。

なんと、Vroidの手にIK Boneを追加していました。

この辺の勉強は何をやったのか全く覚えていません。

後で、復習する必要があります。

で、肝心のLocal軸の設定ですが、

2025-03-16のBlogにその辺りの話がまとめられていました。

以下の部分です。

 Creating and Modifying Control Rig [5]の実装でやっています。

2025-03-16のBlogを一寸だけ読み直してみます。

早速、間違えた記述がありました。

なんとなく間違えてる予感がしたのか、

とその下に書いてありました。

この辺のBlogは来週、復習する事にします。

今週は先程のChatGPT5の回答の内容を理解する事を優先します。

<Solve 順序の影響>

Forward Solveの段階で変形が入り、Backward Solve(FBIK)の計算基準が変わってしまう。

と書いてあります。

これは言ってる意味は分かりますが、Forward Solve Nodeしか使用した事が無いので、実際にどのように実装するとこうなるのかなどは全く分かりません。

<>

解決方法です。

<Preferred Angles(推奨角度)を設定>

これは試したはずです。

2025-07-27のBlogに以下の様に書いてありました。

<Pole Vector(方向ヒント)を追加>

これが、2025-04-20のBlogで肘にやっていた事かもしれません。

これは来週検討します。

<Solve順序を整理>

以下の様に書いてありました。

Forward SolveでFKポーズを作る → Backward SolveでIK補正 → 最後にForwardで他の制御…

Backward SolveでIK補正した後に、最後にForwardで他の制御と書いてあるという事は、

膝の位置は後で修正する事も可能なのかもしれませんね。

ここで時間が無くなってしまいました。

今週のControl Rigの勉強はここまでです。

2.3.3 来週の予定

来週は、2025-04-20のBlogを復習する事でPole Vector(方向ヒント)を勉強します。

今週は Solve Directions [4]を勉強する予定でしたが、始める事すら出来ませんでした。

来週以降にやる事にします。

3. AIの勉強

AIの勉強の目的ですが、

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

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

3.1 前回の復習

 Getting started with NLP for absolute beginners [6]のCSV Fileを生成するところまでやりました。

Kaggleの実装を確認しましたが、Kaggleにこの計算結果を提出する実装以外は全部出来てそうです。

そしてKaggle Competitionにこの結果を提出する気はないので一応全部出来た。という事になります。

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

3.2 Lesson 5: Practical Deep Learning for Coders 2022 [7]の要約を勉強する

まずNotebookLMで要約を作成してそれを勉強します。

Reportにある概要説明資料を作成し、それを勉強します。

何々?

まず0から線形Model、並びにNeural Networkの構築を行うのか。

そしてData前処理、Model Trainingなどの主要な概念について説明するのか。

これって部分的かもしれませんが、今までにある程度の説明はしてたはずですよね。今までの説明とはどう違うんでしょうか?

次にFast AIのFrameworkを使用する事の利点を説明するそうです。

うーん。

前回のTutorialでKaggleのFrameworkを使用してそっちの方が良いと言っていたのに。

Ensemble学習、Random Forestは初めて聞く言葉です。

おお、最後に具体的な作業が紹介されています。

またTitanicのDataを使用するの。

続きを読みます。

分かり易い。

それぞれの重要な用語とそれに対しての解説でまとめらえています。にもかかわらずそれらを読むだけで全体の内容も理解出来るような構成になっています。

凄い!

今度はFrameworkについての解説です。

要は、今回はFastAIのこのFrameworkに沿って実装するって事でしょう。

これは実装しながら理解していきます。

この中で、表形式データにおける特徴量エンジニアリングの重要性の話が興味深いですね。

まず表形式Dataでは画像や自然言語処理とは違い、特徴量Engineeringについてかなり長く真剣に考える必要があるそうです。

以上でした。

凄い。

この要約でこのLectureの内容が大体理解出来ました。

Mind Mapより理解し易いです。

音声解説も聞きました。

なんと、このTutorialは0から全部作成する場合と、FastAIのFrameworkを使用して作成する場合の2種類を示して、それぞれの長所・短所を明らかにしてるそうです。

そういう事か。

Mind Mapも見てみます。

おお、今度は日本語になっています。

前までは言語設定を日本語にしてもMind Mapのそれぞれの要素は英語で表示されていました。

これは見やすいです。

それぞれの要素を見ていきます。

表形式のDataを扱うからHugging Face TransformerよりFastAIのFrameworkの方が優秀なのか。

これはそれぞれの環境の設定でも話してるんでしょうか?

学習する前にやらなければならない作業一覧って事ですね。

数値変数のLongtail分布、Category変数の処理、そしてTensor変換は何をやってるのか分かりません。

あんまり深入りしても全体像が見えなくなるので次に行きます。

線形Modelを0から構築するためにはこれらの工程をやる必要があるって事ですね。

Neural Networkも0から構築しています。

これは結構面白そう。

ここでは完成したModelを評価しています。

DLモデルって何を指してるんでしょうか?

Deep Learning Modelの事でした。

今度はFast AIのFrameworkを使用した場合のやり方です。

こっちは楽で現実的ですが、Blackbox化して理屈を理解しないでやってしまう可能性があります。

Ensemble学習を使用した場合、性能が劇的に向上すると言う話です。

Ensemble学習は一寸だけ違う条件で学習したModelの事らしいです。

幾つかのModelを作成して結果を平均化するのでしょうか?

Ensemble学習以外にRandom Forestsを採用する場合の話のようです。

こっちもかなり良い結果を示してるようです。

大体、何を言ってるのか理解しました。

今週はここまでにして来週は実際のLectureを見る事にします。

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 [7]の勉強

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

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

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

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

4.2.1 先週の復習

 Isaac Sim Extension Templates [9]を勉強したんですが、何の話をしてるのかよく分からないで全部勉強したんです。

で、結局最後までよく分からないで終わった後に、以下のExtensionを作成する時の話だと分かりました。

で、もう一回勉強し直そうとしたんですが、

前に書いた内容を見直してやり直すのが難しいので次の勉強にする事にしました。

4.2.2 Isaac Sim Extension Templates [9]の内容を実装してみる

<Learning Objectives>

以下の3つが出来るようになるそうです。

  • 提供されるテンプレートの構造と目的を理解する。
  • USD Worldとリアルタイムに連携するための機能的なコードを即座に書く。
  • カスタマイズされたUIベースの拡張機能を作成するスキルを習得する。

この辺に注意しながら先を進めます。

<Getting Started>

前回のBlogには

と言ってこの節を軽く流してしまいました。

今になってみれば、これは痛恨の失敗です。

この時に、Extensionって何の事を指しているのか思い出していたら、今週はもっと先に進む事が出来ました。

<General Concepts>

以下の様にまとめられていました。

これは前回既に確認していますが、もう一回やります。

共通の3つのPythonのFileはExtension、Global_variables、そしてUi_builderの事です。

でも./Script Folderは無いですね。

GPT5で確認します。

つまりこのFolderであってるみたいです。

あってますね。

まさしくここでScriptsとなってるFolder内の話です。

それぞれのPythonのFileを開いてみます。

なんと、VS Codeが反応しなくなってしまいました。

何回開いてもErrorになります。

こんなのは初めてです。

こんな画面になって停止しています。

一回PCを再起動します。

と思ったら突然動き出しました。

extension.pyです。

こんな感じのFileが出て来ました。

うーん。

やっぱりVS Codeの調子は良くないです。

あれか。前回色々UpdateしようとしてErrorになったのが影響してるのか。

Commentの内容をGPT5に訳させました。

おお、ここに説明されている関数は、先週のBlogにまとめた

と同じ内容ですね。

それぞれの関数を見てみますか。

と思ったらGPT5が以下の様に言っています。

じゃあ可視化してもらいます。

全然読めないじゃん。

でもExtension.pyからUIBuilderに指令が言ってそのUIBuilder内でCallback()関数が呼ばれる事は分かりました。

でもExtension.pyに以下の様に_menu_callback()関数を定義してる実装がありますね。

この中でUIBuilder.pyにあるon_menu_callback()関数が呼ばれています。

Pythonは勉強した事がないので、何をやってるのかは分かりません。

GPT5に質問しようとしたら

だって。

Copilotに質問する事にします。

だそうです。

分かり易い。

更に以下の様にもう少し詳しく説明してくれました。

Extension.pyで_menu_callback()関数が使用されているのは以下の箇所だけです。

何をしてるんでしょうか?

Copilotに聞いてみました。

分かり易い。

Buttonに_menu_callback()関数の機能を追加したのか。

Pythonは勉強した事がないのでこういう所で???になります。

でui_builder.pyのon_menu_callback()関数が呼ばれるのか。

ui_builder.pyを開いて確認します。

何もしてないじゃん。

という事はここにしてほしい作業を自分で追加するのかも。

うーん。

でもこれ読むと、UIがToolbarから開かれた時に発動するって書いてあります。

となるとさっきのExtensionのCodeはやっぱりButtonを押した時に発動する機能じゃない気がして来ました。

Pythonは何も知らないですが、Buttonを生成するCodeにButtonの文字が一個も無いのはオカシイです。

今度は設定をSmart(GPT-5)に変更してもう一回質問してみます。

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

なんか幼稚園児に対する説明のようですが、理解出来ないので仕方ないです。

成程。

この場合だと

CreateUIExtension:{EXTENSION_TITLE}、例えばCreateUIExtension:MyAwesomeToolが呼ばれたら、

_menu_callback()が起動する。

という意味だそうです。

じゃButtonがClickされるのは関係ないの?

この後も、色々細かい質問をCopilotにしたら、大体の仕組みが分かって来ました。

が今回の目的は自分用のExtensionを作成する事ではないのでこの位で止めておきます。

global_variables.pyだけこの中に出て来ませんね。

開くと以下の2つのVariableの定義だけが書かれていました。

拡張機能を作成する際に指定した、タイトルや説明などのグローバル変数を保存するスクリプト

とまとめられているので、このpy Fileはタイトルや説明だけが記録されてるのかもしれません。

はい。

3つのPython Fileの確認が出来ました。

更にこのFileで使用されている重要なコールバック関数の一つであるon_menu_callback()関数がどのように呼ばれるのか、の実装も大体確認出来ました。

十分です。

次を勉強します。

<Loaded Scenario Template>

前回のBlogには

Loaded Scenario Templateでは、3つの基本ボタン「Load」「Reset」「Run」を含むシンプルなUIが提供されます。

とだけ書かれていました。

実際にLoaded Scenario Templateで作成したExtensionを開くと

3つの基本ボタン「Load」「Reset」「Run」で構成されています。

<<Simulation Timeline: Omniverse Kit>>

以下の様にまとめられていました。

Toolbarって言ってるって事はこれの事ですよね。

三角の再生ButtonでTime Lineの停止、再生、または一時停止が可能なんでしょうか?

試してみます。

うーん。

多分出来てるんでしょう。

<<Worldクラス>>

前回のBlogでは以下の様に書いてありました。

実際のCodeを見て、ここに書かれている内容が実装されているのか確認します。

ui_Builder.pyで

omni.isaac.core.worldからWorldがImportされていました。

ここで実装されているようです。

WorldのSingletonが呼び出されています。

これは_setup_scene()関数内の実装です。

そしてLoad Buttonの設定である以下の実装で

_setup_scene()関数を呼ぶような実装がされています。

納得。

これで

の確認は取れました。

後は以下の文の検証だけです。

コールバック関数が呼び出される際のシミュレーターの状態が保証とは何を説明してるのでしょうか?

まったく分かりません。

Copilotに質問してみます。

コールバック関数が呼ばれるとき、シミュレーター(World)が必ず特定の状態になっている。という意味だそうです。

もっと具体的に言うと

という状態が保証されるそうです。

はい。

理解しました。

実際のCodeで確認するまではしなくても良いでしょう。

最後の

ユーザーは簡単な操作でworld.scene.add(user_object)を利用できます。

についてです。

world.scene.add(user_object)関数は最初の_setup_scene()関数で呼ばれています。

この時には、Worldが必ず特定の状態になっている。のでworld.scene.add(user_object)関数を実行するだけで必要な前処理をしなくて良い。という事だと思います。

ここで時間切れです。

今週はここまでにします。

全然進まなかった。けど理解出来ないと言う訳ではないのでまあ良しとします。

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

今週はGaea2のTutorialを作成しました。

Gaea2のTutorialは英語圏でもほとんどないし、ChatGPTに質問してもほとんどの場合見当違いの回答をしてきます。

はっきり言って、私が作成してるこのTutorialだけがGaea2の使い方を理解出来る唯一の教材です。

分かってるんかな。

日本人の視聴者の人達は。このTutorialの大切さを。

5.1 PowerPointの作成

以下に作成したPowerPointを示します。

表示です。

LandscapeのMaterialの指定にGaea2でExportしたMaskを使用します。

QuadSpinner社がGaea2に関しての新情報を出しましたが、まだCheckしてない事を報告しています。

前回ExportしたMaskのSizeが1024x1024pxになってるので、それを1009x1009pxに直す方法を説明しています。

これをしないとUE5でMaskとして使用出来ません。

Landscapeに使用するためのMaterialを作成します。

Maskを使用するのでそれぞれのMaskに対応したLayerを作成します。

そのやり方を説明しています。

前の動画で説明した方法で、HeightmapからLandscapeを生成します。

ここで前の動画と唯一違うのは先程作成したMaterialを指定する所です。

Weight Blend Layerを作成します。

Base LayerのFill Layerを選択し、Base ColorでLandscapeを塗ります。

ここでどのLayerにどのMaskを使用するのかを指定します。

結果です。

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]の<13:45 Flip Fluid Sourcing and Setup>を勉強しました。

前回のBlogに非常に重要な内容が書かれています。

それは

です。

このような実際にSoftwareを操作して実装する系の勉強はAIはほとんど役に立たないし、AIの要約を見ても無駄です。

それよりもYouTubeで実際の映像で見る方が何倍も役に立ちます。

6.2 Houdini is HIP - Part 14: Flip Fluids I [10]の<13:45 Flip Fluid Sourcing and Setup>を実装する

では前回、勉強した内容を実装します。

このTutorialを実装するための新しいProjectを作成します。

まず使用するHoudiniのVersionですが、Tutorialと同じ19.5を使用します。

Project名はFlipFluids_0814としました。

Geometryノードを配置します。

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

中を開きSphereノードを配置します。

Nullノードを追加します。

Nullの発音ですが、発音記号では/nʌl/と表示されます。

ここでʌは暗いアとか曖昧なアの音とか言われています。

しかし実際にNullの音を聞くと、アではなくオって聞こえます。つまりノーォルとかノーォウとかに聞こえます。

で??となってしまうんですが、最近この原因が分かりました。

これって日本人の感覚で発音記号を考えるからこうやって悩んでしまうんです。

まず日本人なら誰でも、ア、イ、ウ、エ、オの音の区別はあって当たり前と思っていますが、この常識が間違っています。

アメリカ人と言うかこの発音記号を作ったイギリス人は、はっきり発音する音にはア、イ、ウ、エ、オの音の区別はあるけど、はっきり発音しない場合はア、イ、ウ、エ、オの音の区別なんか付かないと断定して、はっきり発音しない音は全部、əで表したんです。

でもこのəの音でもStressをかける時がある訳です。その場合はʌで表す事にしたんですが、この時、少なくとも日本人の耳にはア、イ、ウ、エ、オの音が結構はっきり聞こえます。

このNullの発音のその例の一つで、日本人にははっきりとノールって聞こえます。決してナールとは聞こえません。Noと同じ発音に聞こえます。

しかし発音の仕方、口の開き方とか、下の位置とかはʌ、もしくはəと全く同じなので、発音記号はこれで表されているんです。

で、肝心のアメリカ人と話す時ですが、

Nullをナールと発音したら、バカだと思われます。

ノールって言いましょう。

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

以下の様になりました。

ScatterノードとSphereノードの間に、Isooffsetノードを追加しました。

Scatterノードの結果です。

Isooffsetノードを追加した事により、Sphereの表面だけでなくSphere全体をScatter出来るようになりました。

あれ、Freezeしてしまいました。

再起動しました。

全部消えとる。

作り直しました。

IsofffsetノードのUniform Sampling Divsの値を100に変更しました。

更にScatterノードのRelax IterationのCheckを外し

Force Total Countの値を100,000まで上げました。

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

Scatterノードの結果をSOURCEノードに繋ぎます。

そしてDopnetノードを追加しました。

Dopnetノードは名前をFLIP_DYNAMICSに変更しました。

中を開くとOutputノードだけがありました。

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

Flip solverノードも追加しました。

以下の様に繋ぎました。

結果です。

Space+FでPreview画面を以下の様に変更しました。

Space+FってUE5のFの機能みたいなものなんでしょうか?

そうでした。

この巨大な格子を見えなくします。

FLIP SolverノードのVisualize LimitsをDisableします。

しました。

格子が消えました。

この状態でSpace+Fを押すと以下の様にCubeが画面いっぱいに表示されます。

Flip Objectノードの以下の設定を変更しました。

結果です。

丸くなった?

更にGuidesのParticleのVisualizationの値をParticlesに変更します。

結果です。

おお、今度はParticleが表示されるようになりました。

これってSOURCEのParticleと同じなんでしょうか?

確認してみます。

ScatterノードのForce Total Countの値を100に変更しました。

こんな感じになっています。

この状態で

を可視化しました。

同じ結果になっています。

という事は、SOURCEのParticleと同じという事ですね。

FLIP_DYNAMICSに入ると色が青くなりました。

ここでFlip ObjectノードのGuidesのParticleのVisualizationの値を元のSpritesに戻します。

何で?と思ったら前回のBlogに

Tutorialの説明ではParticleでは実際のScaleがよく分からないのでSpritesの方が良いそうです。

と書いてありました。

納得。

更にPropertiesのParticle Separationの値を0.05に変更しました。

更に0.01に下げました。

結果です。

次はForceを追加します。

しかしその前の床を作成します。Forceが加わってParticleが下に移動したらField of Viewの外側まで落ちてしますからです。

以下に示した様にGround planeノードとMergeノードを追加します。

結果です。

半分が地面に埋まってしまっています。

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

これでForceの追加は完成しました。

今度はParticleの位置を修正します。

Geometry layerに戻り、Sphereノードの後に、Transformノードを追加します。

Translateの値を以下の様に変更する事で、

Sphereの位置を地面より上に移動させました。

Dopnet Layerに戻り、Playを実行しました。

非常にゆっくりですが、Particleが移動しました。

地面にぶつかったら粉々にはじけ飛びました。

Tutorialの説明によると、このSimulationはVolumeが変化してるので間違ってるそうです。

それを直すために、

FlipobjectノードのVisualizationの値をParticleに戻します。

結果です。

Volumeが変化してるかどうかは全く分かりません。

ParticleのSizeが小さくなってるだけな気がします。

兎に角、計算が遅いです。

まだ計算途中です。

先に進みます。

OpenCLをEnableします。

これで計算速くなるでしょうか?

Flip ObjectノードのParticle Separationの値を0.0125に上げました。

結果です。

Tutorialの結果と違いますね。

うーん。

まあいいや。

この違いは来週、調査します。

今週はここまでです。

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

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

3Dやイラストそして動画関連のAI Softについて、

どんなSoftが公開されているのか?

それらのSoftを使用するとどんな事が出来るのか

どんな方法で操作するのか、

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

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

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

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

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

7.1 先週の復習

Gather Agent Observationの実装を理解するに集中していました。

ここでChatGPTとCopilotの回答に矛盾が生じたんです。

簡単にまとめると

ChatGPTの回答は、Learning Agent ObservationはStructでSpecify Agent Observation()関数で指定した要素が入っています。

と回答したところで、GPT-4oが使用出来なくなったのでCopilotにその続きを質問したら

Make Struct Observationノードには特定のStructの構造は無いと回答が返って来ました。

で以下のような結論で終わりました。

で、今読み直すと、前回の勉強の勘違いがはっきり分かるんですが、

まず前回は、Specify Agent Observation()関数の前に関数があってそこでLearning Agent ObservationのStructの構造を決定してると思っていました。

しかしそれは間違っていて、Learning Agent Observationの構造を決定するのはSpecify Agent Observation()関数の中です。

Learning Agent Observationの構造を決定するのは以下の実装です。

のでChatGPTがLearning Agent ObservationがStructであると言ってるのと、CopilotがMake Mapの時にStructの構造が決定すると言うのは全く矛盾しません。

これが正解のはずです。

一応、今回はもう一回、Specify Agent Observation()関数の実装を、前回のBlogの勉強内容を確認しつつ、復習してこの解答が正しい事を確認します。

7.2 もう一回Specify Agent Observation()関数の実装を確認する

まずChatGPTの前回の勉強でした質問を探して読み直しました。

やっぱり先程の解釈であっています。

ので、今週は次のGather Agent Observation()関数の勉強の続きをやっていきます。

最初のCodeです。

これは、Gather Agent Observation()関数と全く同じです。

Agentを取得してObs Actorにセットしています。

次に以下の実装部分が実行されます。

この部分は今のAgentの位置から最も近いSplineの位置を決定し、Splineの始点からそのSplineの位置までのLengthを返します。

その値にTrack Distance Samplesにある値を足しています。つまりそのSplineの位置から以下の値の分だけ先の位置を指します。

あれ?

これ勉強したはずです。

うーん。

混乱して来た。

ああ、分かった。

Specify Agent Observation()関数で、Learning Agent ObservationのStructの構造を最終的には、

     Track

          -Location

         -Direction

    Car(Velocity)

に指定しています。

ところが、Gather Agent Observation()関数の途中で、Learning Agent ObservationのLocationとDirectionの値を以下の方法でLearning Agent Observationに保持しました。

勿論、最終的にはこの後にCar(Velocity)を追加して、Specify Agent Observation()関数で指定したLearning Agent ObservationのStructの構造と同じ構造になっているんですが、この時点でErrorが出ないのが私には不思議です。

Gather Agent Observation()関数内のLearning Agent Observationには、Specify Agent Observation()関数で指定したLearning Agent ObservationのStructの構造は影響しないのですか?

最終的なstructの形状が、Specify Agent Observation()関数で指定したLearning Agent ObservationのStructの構造と同じなら問題ないのですか?

これが、先週の質問だったのだ。

やっとつながりました。

じゃこれをChatGPTに質問します。

はい。

その通りでした。

納得。

となると次の疑問が出て来ます。

Specify Agent Observation()関数には以下の実装があります。

Specify Agent Observation()関数は、Learning Agent ObservationのStructの構造を決定します。

ここでは何を決定してるんでしょうか?

単にLocationの値を保持してるだけのように見えます。

ChatGPTに質問しました。

つまり

Specify Location Along Spline ObservationやSpecify Direction Along Spline Observationは、キーに対応するデータ型・スケーリングの仕様を指定してる。

という事でした。

納得。

もう謎が解けてしまいました。

今週勉強しようと思ってたところはこれで終わりです。

でもまたChatGPT5に質問出来ますね。もう少しやる事にします。

7.3 Specify Agent Actionの実装を勉強する

今までの理解から推測すると、ここはLearning Agent ActionのStructの構造を指定してる関数にあるはずです。

はい。

ここで作成されたStructは

Steering: Type: Float, Tag: Steering

ThrottleBrake : Type: Float, Tag: ThrottleBrake

となっています。

Float Scaleの意味が分かりませんね。これが1.0以外の場合どうなるんでしょうか?

後、Tagの役割な何なんでしょう?

ChatGPTに聞いてみます。

単なる倍数でした。

こっちは知らなかったです。Tagは実行時のLabelになるんですね。

SpecifyAgentAction()関数の実装はこれで完全に理解出来ました。

今度はPerform Agent Action()関数の実装を勉強します。

ここでChatGPTのLimitに達してしまいました。

今週の Improving Observations & Debugging (5.5)[11]の勉強はここまでにします。

毎回少しずつですが、確実に進歩していますので、あきらめずに継続してやる事にします。

7.4 ChatGPT5を使用した感想

なんか、ChatGPT4と比較すると当たりが強い気がします。

何でそんな事分からないの?って言われて続けている感じがします。

質問してて楽しくないです。

ChatGPT4の方が優しかった気がします。

性能が上がってるのは確かですが、うん。楽しくない。

白人男性の研究者に質問した時の感じに似てます。

アジア人の質問なんか聞いてられっか。という本音と、質問受けたので回答しないとポリコレに反するから、一応回答してやるか。みたいな傲慢な感じがします。

AIのくせに生意気な。と言ってやりたくなりました。

他のAIが同じ性能だったら他のAIを使いたいです。

Copilotに同じ質問して、回答があってたらこれからはCopilotに質問しようかな。

でもCopilotのGPT5とChatGPTのGPT5って同じ質問しても全然違う回答返すんですよね。

何なんでしょう。

後、ChatGPTに課金しようと思ってたんですが、一寸考えます。

会話してて楽しくないのに課金してまで会話したくは無いです。

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 Resources, Heaps & Copying | D3D12 Beginners Tutorial [D3D12Ez] [12]の続きを勉強する

38.15から勉強します。

まずVSのModeの設定をReleaseからDebugに直しました。

地味ですがこれ忘れそうです。

一応書き残しておきます。

今回の実装でやるのはこれです。

CPU Resourceに書き込む実装、そしてそのCPU ResourceをGPUにCopyするための実装、の2つです。

まずCPU Resourceに書き込む実装ですが、以下の様にやっていました。

うーん。

よく分からん。

ChatGPTに質問してみます。

その前にSample Codeの実装を確認したら以下の様にしていました。

このCodeで質問する事にします。

ああ、質問し過ぎてこっちのまとめを忘れていました。

以下に回答をまとめます。

まずよく分からないのは、以下に示した先週までの実装で

Upload用のHeapとDefault用のHeapのMemoryは確保してるはずです。

ここは何をやってるの?

あ、実際のDataをここでUpload用のHeapにCopyしてるんだ。

そうなると

Mapやmemcpyの機能も分かるようになります。

うーん。

分からん。

Map()関数は以下の様になっていますが、

uploadBufferAddressの値がまだ決まって無いです。

で、流石にこれは分からん。となりChatGPTに質問しました。

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

これはAPIの説明と同じですが、以下の文にMap()関数の機能が説明されていました。

Map() の呼び出し前は uploadBufferAddress は「空っぽ」ですが、

→ 呼び出し後に uploadBuffer(GPU リソース)が CPU のアドレス空間にマップされ、

→ その開始アドレスが uploadBufferAddress に書き込まれる、という流れです。

uploadBufferAddressの値を取得するのがこのMap()関数の機能だという事です。

そして重要なのが、二番目のParameterであるpReadRangeは、CPUがどの範囲を読み取る予定か。をドライバに教える役割を担ってるという事です。

これで確保するMemoryの範囲を指定してるのではないんです。

本来、CPU側はUpload用のHeapにはDataを書き込むだけで、そこに書き込んだDataを読み込む事はしないんですが、ここではこのMemoryの範囲はCPU側で読み込む事もあります。と指定しています。

CPU側はこのMemoryを読み込む必要ないじゃん。と思ったら

ChatGPTも同じ事言っていました。

もうMap()関数については完全に理解しました。

今度はmemcpy()関数の勉強をします。

ここでは、TextureのDataを最初にCopyして、その後にVerticesのDataをCopyしています。

Upload用のHeapとして確保したMemoryのSizeは、以下の設定から

textureSize + 1024であるはずです。

という事はVerticesのSizeは1024以下であると勝手に決めてるの?

ChatGPTに確認しました。

そのようです。

そして以下の様に書いた方が良いとまで言っていました。

次の質問として

memcpy()関数では最初にTextureのDataを入れ、その後にVerticesのDataを入れています。 どこかでこの順番をGPUに伝える必要はありますか?

を聞きました。

これって別に逆でも良い気がするんです。どこかでこの順番をGPU側に伝えられたら良いだけですから。

ChatGPTの回答です。

成程。

この実装はUnmap()関数の下で行っていました。

最後にunmap()関数の機能ですが、

Unmap()すると、ドライバは「CPU が編集した部分」を GPU に反映させる準備をします。

そうです。

作成したMapを消す訳では無いです。

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

8.2.1 前回の復習

前回は、「5.12.1 Upload用のResourceの作成」の実装が必要なのか確認しました。

これ、Sample Codeにはこの部分の実装がまるまる抜け落ちています。

調べると、教科書に正解らしく回答が、教科書に書いてありました。

ID3D12GraphicsCommandList::CopyTextureRegion()関数を使用してDataをCPUからGPUに転送する方法を5.12では教えると書いてあります。

そして今までのDataをCPUからGPUに転送する方法は、ID3D12Resource::WriteToSubresource()関数を使用した転送方法だったそうです。

で、前回のBlogの最後には

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

ので今週は、

ID3D12Resource::WriteToSubresource()関数を使用したCPUからGPUへのData(Texture)の転送を復習します。

そしてID3D12GraphicsCommandList::CopyTextureRegion()関数を使用したCPUからGPUへのData(Texture)の転送方法を勉強、

更にLötwig Fusel氏のD3D12 Beginners Tutorial [D3D12Ez]でのCPUからGPUへのData(Texture)の転送方法との違いも検証します。

8.2.2 ID3D12Resource::WriteToSubresource()関数を使用したCPUからGPUへのData(Texture)の転送を復習する

WriteToSubresource()関数の実装ありました。

Imgの設定が分かりません。

以下の様に初期化していました。

うん。

単なるImageを保持してるObjectですね。

WriteToSubresource()関数ですが、なんと直前の「5.11.4 画像DataをGPUに転送する」で勉強していました。

で教科書の解説を読んだんですが、ほとんど解説らしい解説は載ってなかったです。

DirectX 12の魔導書」ではVerticesの方はどうやってGPUに転送してるのかも確認します。

以下の様にやっていました。

ちなみにVerticesは

と定義されていました。

大体事情は理解しました。

WriteToSubresource()関数についてChatGPTに質問してみます。

おお、便利だが制約があるのか。

更に詳しい解説として以下の説明がありました。

Map() / memcpy() / Unmap()の機能を全部行ってくれるのか。

で制約の方ですが、

成程ね。

Upload用のHeapにしか書き込めないのが制約なのか。

で、

となっています。

当然、texHeapPropはUploadにセットされているだろう。と確認したら

Customになっていました。

うーん。

よく分からんけどChatGPTの意見を先に聞いてしまいます。

要はCPUについてるGPUか、独立してるGPUかによって設定が変わって来るという事です。

更に

こんな事をしてたの?

全然知らなかった。

DirectX 12の魔導書の5.6ぐらいから関連する内容を読み直したんですが、これに関しての情報はあんまり書いてないです。

どちらかと言うと今勉強してる5.12の方がこれに関しては詳しく説明しています。

でもよく分からないです。

ChatGPTによるとこの設定では、NVIDIA / AMDのdGPUではVRAMが独立しているのでCPUから直接VRAMに書き込むことはできません。

と断言しています。

そしてそれを可能にするためには

texHeapProp.CPUPageProperty や texHeapProp.MemoryPoolPreference などの追加の設定が必要であると言っています。

指定していますね。

これらが何を指定してるのか、何故、これを指定するとNVIDIA / AMDのdGPUでもWriteToSubresource()関数でVRAMに書きこむ事が出来るのかは全然分かりません。

ChatGPTに質問します。

もう丸投げです。

ChatGPTの回答です。

これ読むと、D3D12_MEMORY_POOL_L0がCPUが直接Access出来るGPUのMemory領域にMemoryを確保しろ。と言ってるようです。

Writeback Cashはよく分かりません。

Texture用のDataを扱うのに有利なのかもしれませんが、CPUがAccess可能なGPU側のMemoryを確保するのには関係なさそうです。

ChatGPTに質問したら以下の回答が返って来ました。

更に以下の様にまとめてくれました。

CPU がどう扱うかを CPUPageProperty が決める。とまとめていました。

納得です。

もう、脳がパンクしそう。

一応これでWriteToSubresource()関数を使用したTexture用のDataのCPU側からGPU側への転送方法は理解出来た事にします。

残りは来週以降勉強する事にします。

焦った状態で頑張っても何も得るものは無いです。

ゆっくりでも確実に進む事にします。

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] Creating and Modifying Control Rig. (n.d.). Unreal Engine. https://dev.epicgames.com/community/learning/courses/5vL/unreal-engine-creating-and-modifying-control-rig/DnO1/unreal-engine-creating-and-modifying-control-rig-overview

[6] Jhoward. (2022, May 16). Getting started with NLP for absolute beginners. Kaggle. https://www.kaggle.com/code/jhoward/getting-started-with-nlp-for-absolute-beginners

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

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

[9] Isaac SIM Extension Templates — Isaac SIM Documentation. (n.d.). https://docs.isaacsim.omniverse.nvidia.com/4.2.0/advanced_tutorials/tutorial_extension_templates.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) 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-