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

先週は壁の色を変更したり装飾を追加したりしました。

2.1.2 更に色を改良する

先週の続きをやります。

かなり神社っぽくなって来ました。

最終的にはこうなりました。

まだ改良が必要ですが、今週はここまでにします。

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

Create Procedural Interiors With Full Room Separation | UE 5.4 P5 [1]の次の10分を実装しました。

で最後の部分の実装で

PCG Buildingに戻り、PCG Random Points with Floorsノードに必要なInputを接続しようとして

以下に示したGet Actor Propertyノードを使用して

Seedの値を取得しようとしたらErrorになりました。

BP_BuildingのVariableを見て確認したところ、

Seedはありません。

Tutorialを見直すとCorner Pillerの実装にあるPCG Scale Wall SizeノードのInputにSeedがありました。

どうもここでSeedは実装したようです。

と書いて終わっています。

でもこれって

BP_BuildingのVariableにSeedを追加すれば良いだけですよね。

あえて復習してTutorialではどのような方法で実装してるのかを確認する必要があるのかどうかです。

うーん。

一寸だけ確認してみますか。

2.2.2 Seedが何時実装されたのかを確認する

Corner Pillerの実装した時のBlogから復習してみます。

2025-05-18のBlogにCorner Pillerの実装方法を勉強している記述がありました。

この時点でPCG Scale Wall SizeノードにはSeedがあります。

ここにはSeedについて何も書いて無いですね。

PCG Scale Wall Sizeノードの実装した時のBlogを調べてみますか。

2025-03-09のBlogにPCG Scale Wall Sizeノードの実装方法を勉強した記録があります。

ここではSeedは追加されていません。

げ。ここでMaintenance中になってしまいました。

うーん。仕方ない。

これは中止します。

2.2.3 Create Procedural Interiors With Full Room Separation | UE 5.4 P5 [1]の続きを勉強する

仕方ないのでCreate Procedural Interiors With Full Room Separation | UE 5.4 P5 [1]の続きを勉強します。

<15:15 - Set Density on Room Center Points>

作成したPointにそのPointの数に準じたDensityを追加します。

以下に示した様にPCG Graphを作成し、名前をPCG_SetDensityにします。

PCG_BuildingにPCG Set Densityノードを追加しました。

そしてPCG_SetDensityノードを開きました。

OutputノードのPinの設定は以下の様にして

InputノードのPinの設定も以下の様にします。

2番目のInputの名前はNumber of Pointsにしています。

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

SetノードのInput Source1の値を$Densityに変更しました。

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

ここは各FloorのPointのDensityを決定するための実装何ですが、

この部分のDensityをどうやって決定してるのかの説明を聞いても今一理解出来ません。

何をしたいのかが不明なんです。

同じDensityの値をFloor毎に出したいのか、それ以外の目的があるのか、今の時点ではよく分かりません。

兎に角、実装方法だけは正確にまとめておきます。

更に、DivideノードのIn BにInputノードのNumber Of Pointsの結果を繋げて

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

Force Op to DoubleをTrueにしています。

そしてこのように実装しました。

PCG_SetDensityの実装の全貌が判明したので、どんな風にDensityを割り振りたかったのかをこの実装から推測してみます。

それそれのFloorの部屋数を決定するのは以下に示したDA_RegularRoomSizesです。

中を見ると

Half WidthとHalf Heightがあります。
うーん。

あれ?

こんなんだったけ。

これって何を指定してたんだっけ。

うーん。

分からん。

一寸これは無視します。

一階にPointが3つあるとします。

1割る3の余りは1です。その1に3を割ったら0.333が答えになります。

これがDensityの値になります。

この計算だと同じFloorのPointは全て同じDensityになりますね。

そこは理解しました。

PCG Buildingに戻って来ました。

PCG Random Points with FloorsノードにAttribute Partitionノードを追加しました。

そのAttribute Partitionノードの設定を以下に示した様に変更しました。

Index[0]の値をIndexに変更しています。

これTutorialでは口で説明して、実際に値を変更する画面が撮影される前に別な画面に移動してしまっています。

どんな設定に変更したのかの確認が画面上から出来ません。

本当にこういうのは止めてほしいです。

そしてこのように実装しました。

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

ああ、やっとさっきのDA_RegularRoomSizesの意味が判明しました。

DA_RegularRoomSizesのRoom Sizeの値をGet Entries CountノードにパスしてそれぞれのFloorのPointの数を計算しています。

PCG Set Densityノードの結果を可視化します。

結果です。

え、何で同じFloorでDensityが違ってるの?

うーん。これはもう少し考える必要がありますね。

Seedの値を変更して以下のDensityに変更する事もしていました。

ここで左上のPointが消えているのはそのPointのDensityの値が0だからだそうです。

ここで<15:15 - Set Density on Room Center Points>は終わっていました。

取りあえず今週の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 先週勉強したControl Rig Component [3]を実装する

先週、Control Rig Component [3]を途中まで勉強しました。今週は残りを勉強する予定でしたが、何を勉強したのか覚えていません。

なので復習も兼ねて、先週勉強した内容を先に実装する事にしました。

UEのAI Assistantに質問出来るので、これからはUE5.7で実装する事にします。

以下のProjectで実装します。

<Component Setup>

MannequinのBPに直接、Control Rigを追加しています。

これか。

うーん。別に新しいProjectを作成すれば問題ないんだけど、一応、Duplicateしてそっちに実装するか。

ここに実装します。

あれ?

TutorialのBPは

Componentにこれしかないです。

うーん。

Pawnを親にして新しくBPを作成します。

名前はBP_Mannequinとします。

中を開きSkeletal MeshとControlRigを追加しました。

Skeletal MeshのSkeletal Mesh Assetには何を追加すればいいんでしょうか?

うーん。

今は空欄にしておきます。

Control RigのControl Rig ClassにセットするためのControl Rigを作成します。

何かUE5.4にはMannequinと言う名前のSkeletal Meshはもう無くて、Mannequin型のSkeletal Meshは以下の2つだけみたいです。

じゃSKM_Quinn_SimpleからControl Rigを作成します。

一応、Duplicateして使用します。

名前はSKM_Quinn_Simple_meにします。

Control Rigを作成しました。

Control RigのControl Rig Classに

作成したControl Rigをセットしました。

先週のBlogには

と書いてありました。

私の結果です。

確かにBoneが表示されています。

しかしTutorialのは

Boneに追加でSkeletal Meshが写っています。

これと同じにするために

Skeletal MeshのSkeletal Mesh Assetの設定を以下の様にしてみました。

結果です。

一応、Tutorialと同じ表示になりました。

だんだん気がついて来たんですが、Control Rigってかなりクソです。

Tutorialでこんな大事な事を説明しないでどうやって学習者がControl Rigの使い方を学ぶ事が出来るんでしょうか?

<<Mapping Setup>>

On Pre Initializeノードを追加しました。

更にAdd Mapped Skeletal Meshノードを追加し以下の様に実装しました。

TutorialのAdd Mapped Skeletal MeshノードにはIn DirectionというInputはありません。

これはDefaultのままにしておきます。

AI AssistantにAdd Mapped Skeletal Meshノードの機能について質問しようとしたら以下の様にずっとグルグル回っています。

これじゃ、UE5.7で敢えて始めた意味が無いよ。と思いましたが、仕方ないです。

ChatGPTで質問します。

以下に回答を示します。

初っ端から間違っています。

私が知りたいのはAdd Mapped Skeletal Meshノードです。

何で、Make ControlRigComponentMappedBoneノードやMake ControlRigComponentMappedCurceノードが表示されてるんでしょうか?

Sourceが載っています。

本当にAdd Mapped Skeletal Meshノードの内容を回答してるのかどうかをSourceから確認します。

なんとSource先が今勉強してるControl Rig Component [3]でした。

ただし、この部分はまだ勉強していません。

更にChatGPTは以下の解説も付け加えています。

これはControl Rig Component [3]に書かれている内容を分かり易くまとめただけですね。

でも整理されていてそれなりには役に立ちます。

ただし、Control Rig Component [3]に書かれている内容を分かり易くまとめただけなので、Control Rig Component [3]に書かれてない事は分かりません。

当然、BPのSkeletal MeshのSkeletal Mesh Assetには何をセットすべきなのかとか、UE5.7のAdd Mapped Skeletal Meshノードには新しくIn DirectionというInputがあるがこの設定はどうしたらいいのかとかは分かりません。

AI AssistantのWindowを開き直したら使えるようになりました。

どうやらAI AssistantはProjectを開くたびにWindowを開き直す必要があるみたいです。

ここで同じ質問をしてみます。

回答です。

Skeletal MeshとControl RigをMappingする事でLinkすると言っています。

これは他の説明とほぼ同じですね。

これは結構重要な内容も語っています。

ChatGPTに日本語に訳してもらいます。

MappingってProgrammingで習ったんですが、どんな意味か忘れました。

一対一の関係でLinkするのがMappingなのか。

理解しました。

ああ、GTC October 2025 KeynoteのJensen HuangのSpeechが始まってしまいました。

残りのAI Assistanceの回答だけ以下に貼っておきます。

Referenceも貼っておきます。

今週のControl Rig [2]はここまでにします。

3. AIの勉強

今週はAIの勉強の代わりに

GTC October 2025 Keynote with NVIDIA CEO Jensen Huang [4]を見ました。

今、見た直後の感想をここに書いておきます。

まずJensen HuangはRobotic AIは諦めた感がありました。

Robotic AIは中国が一番です。

しかしNvidiaは今のTrump政権から中国寄りと思われているので、Trump政権から敵視されるを防ぐためにRobotic AIの成果(ほとんど中国製)を切り捨てたようです。

このKeynoteに出て来たRobotは全部米国製で、中国のRobotと比較したら一世代も二世代も劣っているように見えました。

中国は別にNvidiaGPUを売ら無くなったら、自分達で似たものを作るだけでしょう。

しかも中国政府のRobotic関連の援助が凄いです。5000億ドルぐらい準備しています。

後、10年したらNvidiaと同レベルのGPUもしくはTPUを使用したData Centerを作成するでしょうね。

代わりに量子Computerの話が長くなっていました。

NvidiaGPUを使うと、量子Computerの物理Qubitから論理Qubitを割り出すのが最も早くなる。みたいな量子Computerの研究を助けるためのGPUを紹介していました。

これなら量子Computerが失敗したとしても、その膨大な研究費から装置を買ってもらっているのでNvidiaは損しない関係になっています。

まあ頭いいですね。

後、かなりTrumpをよいしょしてる発言が多かったです。

しかしとても本音で言ってるとは思えませんでした。

Palantir社との提携を発表したのなんか、もうAuthoritarianismの片棒を担ぐのと同じじゃないですかね。

Nvidiaなき中国とRobotic AIなき米国のAI覇権競争はどうなるのか?>

このKeynoteの後に、Nvidia株は爆上げしていますが、私の気分はその株価とは反対に落ち込んでいます。

Nvidiaは中国のAI技術者集団と完全に袂を分かちました。

そしてそれは中国のAI技術者集団もNvidiaと決別してやっていく事を示しています。

これから地球の覇権を決めるのがAI技術です。

今、中国と米国は一緒に繁栄を分かち合うのではなく、Winner Takes AllのDeath Match勝負をすると宣言をしたんです。

それぞれの戦力を分析すると

米国は、NvidiaのHard技術とその上にあるCudaがあるためHardでは中国に今は勝っています。

しかし中国は、Robotic AIやLLMのOpen Sourceでは世界で一番です。そしてAI研究者、AI技術者の数も他の10倍位います。

その後、Neck and Neckの争いが続き、どちらかが勝ち全てを得る事になるでしょう。

で、今の時点では、中国と米国は互角だと思います。

しかし今のTrump政権がNvidiaを敵視し続けたら、米国は中国に負けるでしょうね。

つまり中国が勝つ可能性も多分にあります。

私は中国に関してはほとんど知りません。

中国の株とか買っても保障してくれなさそうです。

どうやったら中国が勝った時に、勝ち組に入れるんでしょうか?

Nvidiaの株を買っておいたら、中国が勝ったとしても勝ち組に入れると思っていたんですが、駄目そうですね。

これから中国は自分の弱点を補強する方向で発展していって、10年したら全部自国で賄えるようになるでしょう。

中国政府は今まで全部そうして来ました。

GoogleAmazonを追い出して、同じServiceの中国製の会社を作りその会社に中国内のBusinessを任すようにしています。

Nvidiaだけ特別であり中国人に作る事は出来ないと考える根拠は無いです。

更に言うとその中国の保護政策のお陰で、自然と技術も育つのでTikTokのような米国人が欲しがるBusinessも出て来ます。

それに対して米国の技術は優秀な移民によって支えられてきました。

今Trump政権は有色人種の移民に対して非常に厳しくしています。いずれ米国の技術力は落ちるでしょう。

しかし米国は今までの貯金が凄いあります。

10年後だったら中国と良い勝負をするでしょうね。

<中国が米国に勝った場合に備える>

今、日本は中国から滅茶苦茶嫌われています。

どこに中国が勝った時には、どうやって勝ち組に入り込むべきでしょうか?

今は、全く思いつきませんがこの事はこれから考える必要がありますね。

4. Nvidia Omniverseの勉強

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

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

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

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

2025年9月からIsaac Lab Documentation [5]の勉強に切り替えました。

4.1 先週の復習

先週何を勉強したのか覚えていません。

Blogを見直します。

先週のBlogの最後に以下の様に書いてありました。

どうやら先週は、 Classes and Configs [6]を勉強したらしいですが、かなり重要な発見や理解があったらしく、それを忘れないように来週(今週)は絶対に復習が必要だ。と書いていました。

何を勉強したのか全く覚えていません。

うーん。

あんまり復習したくないですね。それよりも次のEnvironment Design [7]の勉強がしたいですね。

仕方が無いです。先週のBlogを読み直して以下にまとめ直します。

大体理解しました。本当に先週勉強した内容を忘れてしまっていました。

まずは以下のまとめです。

これはClasses and Configs [6]で勉強した、プロジェクト名_env.pyの実装と

その前のTutorialであるEnvironment Design Background [8]で勉強したIsaac Labの構成要素であるApp, Sim, World, Stage, そしてSceneの関係性や定義についてまとめらえたものです。

更にこの後に、Classes and Configs [6]の最後の節である<The Environment>のまとめもしていました。

ここでは以下に示したプロジェクト名_env.pyのそれぞれの関数の機能について簡単に説明していました。

ここで説明されている全ての関数の話は全部重要なんですが、先週のBlogにしっかりまとめられています。

ここで同じ話を繰り返しても勉強にはなっても後で復習する時に、同じ内容が2個あるだけになって復習の邪魔になってしまいます。

ので非常に独自の質問をChatGPTにした以下の2つ関数に関して

の話だけまとめます。

この2つの関数の機能ですが、

となっています。

これがLearning Agents PluginのGather Agent Completion functionとReset Agent Episode functionの機能と全く同じで有る事に気付きました。

そこで以下の疑問が発生しました。

Copilotの回答によると

Isaac LabもTerminatedとTime_out(Truncated)があるそうで、Isaac LabではTruncatedとは言わずにTime_outと呼ぶそうです。

以上です。

4.2 先週の復習をした感想

先週の復習をしてて気が付いたんですが、

以下のまとめは

ChatGPTの回答を元に作成したんですが、間違ってる可能性があります。

それについて以下にまとめておきます。

<Worldの定義>

Environment Design Background [8]におけるWorldの定義を見ると

Worldは座標を管理しています。それぞれのPrimeがその座標の中でどこに配置されているのかを設定しています。つまりUEで言う所のWorld Coordinateです。

ところが、

Classes and Configs [6]では

と全然違う話になっています。

そして環境構成は以下の事を指しています。

これのInstanceがWorldだとするとWorld Coordinateどころの話ではなくなります。

でこの説明がどちらかが矛盾してるはずなんですが、WorldがCoordinateであるという事は

Environment Design Background [8]の以下に示した本文でしっかり述べられていました。

それに対してWorldと環境構成の定義がそっくりではないのかという話は、

以下の質問で私が勝手に言い始めたのが始まりでした。

もしかしたらAIはこうやって断定的に発言した内容に対して、その定義間違っていますよ。とは返答しないのかもしれません。

でHallucinationを起こしてしまったのかもしれません。

<Scene>

次の問題ですが、先週散々Sceneに含まれるのはPrimitiveだけではない、Primitiveを束ねるScene Element(Lightや地面など)も含まれている。とやりました。

しかしEnvironment Design Background [8]では以下の様にSceneの説明にPrimitiveを管理してると断言しています。

Isaac LabにおけるSceneがScene Elementで管理されていたり、Simulationで並列再生される単位がEnvironmentである事などすべてがHallucinationであるとは思えません。

あまりにも整合性が取れすぎています。

しかしここでもEnvironment Design Background [8]の説明と矛盾してる説明がされていました。

これらの矛盾を考慮すると、先週勉強したClasses and Configs [6]におけるWorld、Scene、そしてEnvironmentの定義は、そういう考え方もある位に理解しておいた方が無難なようです。

これが今週、先週の復習をかなりしっかりやった感想です。

4.3 Environment Design [7]の勉強

では次のTutorialを勉強しましょう。

ここで勉強する内容は、ChatGPTの回答も含めて、そういう解釈もある位に聞いて進める事にします。

全てのSourceに当たって一々確認したら膨大な時間を取られてしまい勉強が終わらないからです。

更に言えば「WorldはEnvironment ClassのInstance」のような回答は、それ自体はもしかしたら間違っているかもしれませんが、現状WorldとEnvironmentの関係性を理解するのにとても役に立っています。

つまり、結果的に間違っていたとしても最終的に正しい解答に到達するには必要な間違いである。と思われます。

ので間違っていたとしてもあんまり気にしないで進めます。

どうせ実際に自分で実装する時に間違っているかどうかは判明します。

今週はCopilot(GPT5)に訳してもらいます。

おお、ここで使用するRobotを定義するのか!

これは楽しみです。

修正した後のCodeは以下のGitHubで公開されていました。

<Define the Robot>

いきなりこんなにたくさんの作業をするの!

ここからは理論の学習と言うより実習が主になっていくようです。

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

Jetbot.pyの実装でしょうね。

Copilotの最後に

と書いてありました。

という事はこのCodeの意味も一通り理解しておく必要がありそうです。

Codeの説明をCopilotにお願いします。

まずImport部分の説明です。

別名でImport出来るのかPythonは。

でも何で別名でImportする必要があるんでしょうか?

あ。ArticulationとActuatorをごっちゃにしていました。

この2つは全然違う概念でした。

こういうのは間違えながら覚えていくしかありません。

どんどん間違えて憶えていきましょう。

Jetbot の設定本体の実装部の説明です。

USD fileのPassの指定、Actuatorの指定、そしてJointの指定を行っていますね。

Jointの指定でDampingとStiffnessの指定も行っています。

うーん。

今一分からない。

こっちの説明の方が分かり易いですね。

Stiffnessはバネのような抵抗で、Dampingは摩擦のような抵抗だそうです。

以下の式も紹介されていました。

Stiffnessは位置のずれによって生じる復元力、

Dampingは速度に比例する抵抗力

だそうです。

Stiffnessの式はバネの式そのままですね。

そして摩擦力は速度に比例(多分)してるのでこう表現してる。

こっちは更に深堀した解釈ですね。

一応、摩擦が速度に比例してる事は確認しておきます。

してなかった。一部の摩擦のみが速度に比例してるみたいです。

更に詳しい解説です。

つまり近似的に摩擦が速度に比例してると仮定してSimulationしてるって事です。

はあ、Simulationってこんないい加減だったのか。

Jensen Huangがもし今大学生に生まれ変ったら科学を専攻するって言った意味が分かりました。

こんな近似的なSimulationに頼って仮想空間で学習させても現実世界に持ってきた時に役に立たない可能性は非常に高いです。

次の文です。

USDのPathを指定するのが最も重要って事でしょうか?

<Environment Configuration>

またEnvironment Configurationの勉強をするの?

追加の実装です。

この実装について勉強する前に続きの文章を読んでおきます。

もしかしたらこの実装の説明が書いてあるかもしれませんから。

やっぱりこの実装の内容を説明していましたね。

Action空間は

観測空間は

で指定してるのは分かりましたが、

それ以外の説明の意味は不明です。

と思ったらCopilotが追加でこれらの定義について解説してくれてました。

アクション空間では駆動される関節が2つだから2としています。 アクション空間の値は常に駆動される関節数と一致するのですか?

Copilotに聞いてみました。

一致する場合としない場合があるそうです。

今回のように車輪を動かす場合は一致するみたいです。

観測空間についても質問してみました。

Isaac Simでは平面を移動するだけの場合でも、3次元で入力しないといけないそうです。

後は一応、Codeも見ておきます。

Import部分から見ていきます。

これはJetbotの一般的な設定をImportしてるんでしょうか?それともこのProject特有のJetbotの設定でしょうか?

Actuatorの設定もここからImportしてるそうです。

こっちはArticulationの設定をImportしてるのか。

これも一般的な設定をImportしてるかこのProject特有の設定をImportしてるのか不明ですね。

ArticulationはRobotの骨格、ActuatorはRobotの筋肉を表しています。

DirectRLEnCfgをImportしていますね。先週勉強したClassです。

強化学習環境のBaseクラスと書いてあります。これは先週勉強した通りの説明です。矛盾は無いです。

SceneをImportしています。

やっぱり複数の環境を並列で扱うのはSceneが担当してますよね。

ここで環境という言葉が出て来るからDirectRLEnCfgの指す環境とごっちゃになって、Sceneだけが並列で複製されるんじゃない。との発想になったのかもしれません。

実際、複製されるのはSceneの内容だけかもしれません。

Simulationの設定をするためのImportですね。

これはあれだ。

設定全体をClassとして管理するためのClassだ。

これでImportは全部見ました。

それぞれのImportが何のためにImportしてるのかが大体分かるようになりましたね。

一寸は勉強の成果が出てるようです。

DirectRLEnvCfgを使用する事を指定していますね。

DecimationはAction適用の間隔だそうです。

2 Stepに一回とは具体的はどういう意味なのでしょうか?

Copilotに聞いてみました。

はあ。

つまりSimulationを2回する時、その内の一回だけJetbotの速度を変化させる。って事だそうです。

Episode_length_sはEpisode一回分の長さだそうです。これはTimeoutした時の場合の設定でしょうか?Terminateした場合はどうなるんでしょうか?

この後詳しい説明が続きますが、基本的にはEpisode_length_sはTimeoutした時の設定であってました。

アクション空間と観察空間の値を指定しています。

三番目の状態空間ってなんでしょう?

過去の情報やRobotの内部の状態などを記憶しておく空間だそうです。

成程、どんなActionを取るかは、今観測された情報だけでなく、過去の経験や体の内部の調子などの影響も考慮する必要があります。

過去の経験や体の内部の調子などの情報を保持しておくのが状態空間という事のようです。

更に詳しい説明をCopilotがしてくれました。

Simulationの設定です。

これは先週も勉強しましたね。

ここで設定するのはRender Intervalの方ですね。

ここでRobotを設定しています。

うーん。

この設定はしっかり勉強したい。

しかしもう時間が無くなってしまいました。

ここからは来週やる事にします。

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

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 [9]の残りを実装する

Particle Fluid SurfaceノードのTransfer Attributesの値を見ると

Transfer Attributesの値にvがあります。

のでvを可視化する事が出来るそうです。

Particle Fluid SurfaceノードのPropertyを開きます。

2 Point Attrsにvがあります。

そのvをClickすると

Viewが変化しました。

VisualizationのIconを右Clickします。

以下のBoxが開きます。

VのPencilをClickします。

以下に示したEdit Visualizerが開きます。

TypeをColorに変更しました。

結果です。

おお、なんか凄いです。

Color TypeをRamped Attributeに変更しました。

結果です。

うーん。

さっきの方が綺麗だったな。

そしてColor Rampの歯車のIconをClickして

White Waterを選択します。

結果です。

最後にTreat As ScalerをEnableして

Usingの値をLengthに変更しました。

結果です。

これで終わりです。

6.2 Houdini is HIP - Part 14: Flip Fluids I [9]の残りを実装した感想

まずは実行してどんな映像になるのか確認します。

再生ボタンを押してもずっと計算しています。

なんか逆に再生しながら計算を始めました。

0まで戻って停止しました。

もう一回再生ボタンを押します。

遅い。

再生ボタンから滑らかな動きを見る事は出来なそうです。

他の事をします。

Edit VisualizerについてChatGPTに質問してみます。

回答です。

今回は属性はvなので速度になるはずです。

速度が色で表示されたという事になります。

更に詳しい解説がありました。

VectorをScalerに変換してそれに応じた色を表示してるそうです。

納得。

次の質問です。

Treat As Scalerはどんな機能なんでしょう?

うーん。

つまり、vをColorで表示したい時は、これをEnableする必要があるという事のようです。

でも最初に、Attribute に vが指定されていて、TypeにColorを選択した場合は、自然にvのScaler値が表示されるって言ってましたよね。

その事について質問してみます。

うえ、そういう事だったのか。

滅茶苦茶理解が進みます。

AI凄い。

更に具体的に説明してくれました。

Usingの値をLengthに変更しましたが、これの意味も聞いてみましょう。

すっご。

こういう意味だったのか。

もう謎は無いですね。

勉強になりました。

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

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

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

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

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

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

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

今週も前に勉強した Learning to Drive (5.5) [10]の勉強の復習をします。

7.1 先週の復習

先週何を勉強したのか覚えていません。

Blogを読み直します。

Learning to Drive (5.5) [10]の<Training>と<Inference>を勉強しています。そして最後の節である<Next Steps>を読んで終わっていました。

<Training>では

Trainingの途中でProjectを停止して、次に実行する時にそのTrainingの続きからやる方法が紹介されていました。

正しこのやり方の説明には一寸した間違いがあり、実際に実行してみないと本当に出来るかどうかは不明です。

<Inference>では

ここではまずInferenceが推論と言う意味で、推論がTrainingで完成したModelを実行する事を指す事を知りました。

これ今まで知らんかったです。

ここで作成したModelを別なProjectで使用する時はどうしたら良いのかを調べていました。

で、結論は多分出来ない。で終わっています。

これで Learning to Drive (5.5) [10]の全部の復習が終わりました。

Learning to Drive (5.5) [10]の復習の感想もまとめてありました。

そこには以下の意見のような

Learning Agents Pluginに対しての厳しい評価も述べていました。

Learning to Drive (5.5) [10]の復習のまとめは来週(今週)やると書いてありました。

そのまとめは以下の点にこだわってやるべきとも書いてありました。

うーん。

これは結構難しいですね。

後、先週はまとめると言っていますが、そんなにまとめる必要もない気がしています。

今まで勉強した内容、特に復習した内容はほとんどそのまま頭の中に入っています。

この先を勉強した方が良い気がします。

7.2 Headless Training & Network Snapshots (5.5) [11]を勉強する

つまりここではRenderingしないで強化学習を行う方法を勉強するって事です。

Headless Modeは画面を表示しないで強化学習を実行する事を指してるそうです。

そしてNetwork SnapshotはそのHeadless Modeを使用した時に、学習Dataを保存するために使用する物のようです。

<What are Snapshots?>

やっぱりSnapshotは学習で得たWeightを保存してました。

Compatibility Hash(互換性ハッシュ値)がなんなのかよく分かりません。

うーん。

ChatGPTに質問するか。

よく分からない事はChatGPTに聞くに限ります。

以下の質問をしました。

で、この回答が凄かったです。

非常に勉強になりました。

ので全部ここに載せる事にしました。

Hashの意味からです。

Hashってこういう意味だったのか。

知らんかった。

Hash値から元のDataを復元する事は出来ないのか。

今度はCompatibility Hashについてです。

ネットワーク特有のHash値を生成して、そのネットワークと保存してるWeightの元のNetworkが同じであるかどうかの判別を行っているんです。

こんな事がここで行われていたのか。

びっくりです。

このSnapshotの値を読み込むには、Learning AgentsのNeural Network Objectへの参照が必要だそうです。

当然ですね。このNeural Network Objectへの参照からHash値を生成してSnapshotにある値と同じかどうかを確認する訳ですから。

Training中のさまざまな時点での重みを保存する事も可能なのか。

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

今週のLearning to Drive (5.5) [10]の勉強はここまでにしておきます。

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 Input Assembler | D3D12 Beginners Tutorial [D3D12Ez] [12]の続きを勉強する

先週は<Input Element>の最後まで実装しました。

<Vertex Layout>

今週は次の節である<Vertex Layout>を勉強します。

最初の部分は先週実装したVertex Layoutのそれぞれの要素の説明をしています。

この部分は細部すぎるので今回はまとめません。

先週は以下の様に一つの実装でXとYの値を指定しましたが、

以下の様にXとYの値を2つの実装で指定しても同じだそうです。

これはその通りですが、Offsetが4になるのはどうしてなんでしょう?

R32だとOffsetは4になるのかな?

ChatGPTに聞いたら1Byteは8Bitだからと回答してきました。

そういえばそうでした。

そんな基本的な事も忘れてしまっていました。

Offsetには以下のMacroも使用できるようです。

前の要素で使用したByte数を自動で調べてその値を返してくれるMacroだそうです。

凄いですね。

このMacroは以下の様に3つ並べた場合は

二番目のOffsetが4なので三番目のOffsetは8を返すそうです。

で、今度は実際のVertexのDataを作成します。

でこの説明がかなり複雑です。

最初に基本の形を教えてその後に応用を教えてくれたら分かり易いのに最初から複雑な形状を示してその形状を説明しています。

以下にまとめます。

まずVertexの最小単位であるStructを作成します。

ここでは二次元のPositionを示す情報だけを保持できる最低限の要素が入っています。

次にそのStructを使用した配列を作成します。

このTutorialでは三角形を作成するので3つのPointの情報が最低でも必要になります。

のでこの配列は3つの要素で構成されています。

ここまでは理解出来ます。

しかしここから突然Texture用のPointをStructureのVertexに追加した場合の話を始めて

聞いてる方は時速200kmで突然引っ張られたような気分になってしまいます。

Texture用のVertexのDataを読み込むためのVertex Layoutの設定も以下の様に追加していました。

これは分かりますが、このTextureのOffsetが0なのは何でなんでしょう?

直してないだけでしょうか?

で今度は、Vertexに戻って

P0、01というPaddingを追加しました。

Paddingって何?

今度はVertex Layoutの設定の2番目の要素のOffsetの値を直していました。

4 byteの要素が4つ有るので、16 bitesです。

これは理解出来ます。

という事はさっきのTextureを追加した時は、Offsetは直してなかっただけって事ですね。

後は、Paddingについてです。

Paddingってどんな意味だか忘れてしまいました。

これはChatGPTに教えてもらいます。

以下の質問をしました。

途中でEnterを押してしまいました。

ChatGPTも困っています。

と質問に質問で返してきました。

続きの質問を書きました。

回答です。

ぐは!

こんなのがあったのすっかり忘れていました。

GPU側は16 Byte毎に読み込むんでしたっけ?
取りあえず続きを読みます。

えーとColorはR32G32B32A32なので、それぞれ4 Byteで16Byteじゃない?

うん。この場合は32 Byteだからピッたしじゃない?

まあ、これは隙間が空く場合もある。って言ってるから単なる例という事で聞いておきましょう。

もうPaddingの仕組みは理解しました。

ChatGPTのまとめも以下に貼っておきます。

散々実装を弄って色々な例を示しましたが、

最終的には以下の様になりました。

そして実際の三角形のVertexのPointを以下の様に

Vertex型の配列であるverticesに指定しました。

すると以下の場所がErrorになってるので直します。

ここで<Vertex Layout>は終わっていました。

キリが良いのでここまでにします。

8.1.2 Input Assembler | D3D12 Beginners Tutorial [D3D12Ez] [12]の続きを勉強した感想

今週は<Vertex Layout>を勉強しました。

ここでは、VertexのDataをどのようにまとめてGPUに送るのかを説明していました。

これは「DirectX 12の魔導書」で一回勉強していますが、その時は実装方法の手順を追うので精一杯で、その中身がどうなっているのかまで頭が回らなかったです。

今回の勉強でやっとVertexのDataのまとめ方が理解出来ました。

ここで大切なのが常に16 byteの大きさにまとめてGPU側に渡す必要がある。という事です。

これを実行するためには、

1byteが8bitである事や、Paddingを使用して16 byteになるように調整する必要がある事などを理解する必要があります。

こういう細かい部分って結構間違いそうです。

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

「5.12 ID3D12GraphicsCommandList::CopyTextureRegion()Methodによる転送」を実装します。

8.2.1 先週の復習

先週は、「5.12.1 Upload用のResourceを作成する」を実装しました。

これはCh5_CopyTextureと言う名前のProjectに実装しました。

この実装は普通に出来たんですが、以下の2つの問題が発生しました。

一つ目は、

今まで使用してたWriteToSubResource()関数関連の実装は消す必要があります。

今までは、WriteToSubResource()関数を使用して

CPU側のMemoryからCPUでもGPUでもAccess出来るMemoryにDataを送っていたんですが、

これからはCopyTextureRegion()関数を使用して、CPU側のMemoryをGPU側のMemoryに送るようにします。

のでWriteToSubResource()関数関連の実装は消す必要があります。

しかし教科書にはどの実装を消したら良いのかが書いてありません。

Sample Codeを参考にして自分で判断して消すしかありません。

2つ目の問題は、

先週、Upload用のResourceを以下の様に作成するように習いました。

もうこのResourceの作り方を忘れてしまって、Lötwig Fusel氏のD3D12 Beginners Tutorial [D3D12Ez]ではどうやったのか覚えていません。

特に

D3D12_RESOURCE_STATE_GENERIC_READ

を使用する事で、CPUからのみ書き込み可能な設定にしてるそうですが、

こんなMacro使用した記憶が無いです。

いや、全部の設定が記憶が無いんですが、この設定は読み込み専用としています。

つまりGPU側からの書き込みが出来ない領域のHeap層にMemoryを確保します。

その結果、CPUからの書き込みが出来るHeap層にこのMemoryが確保されるようになります。

こんな構造だったらその部分位は記憶の片隅に覚えているはずです。

それがありません。

うん、今週はこの2つの問題を解決しますか。

8.2.2 D3D12_RESOURCE_STATE_GENERIC_READは今まで使用したCreateCommittedResource()関数で使用されたのか?

こっちは前のBlogを調べるだけなので簡単です。

のでこっちからやります。

2023-12-03のBlogで使用していました。

凄い昔です。約2年前のBlogですね。

読みます。

DirectX 12の魔導書」の「4.3 Vertex Buffer」で使用していました。

という事は、Lötwig Fusel氏のD3D12 Beginners Tutorial [D3D12Ez]では使用してないのかな。

それは兎も角、このBlogを全部読みます。

CreateCommittedResource()関数の勉強をしていますね。

何で、D3D12_RESOURCE_STATE_GENERIC_READを選択したのかはについては一切書いてありません。

Lötwig Fusel氏のD3D12 Beginners Tutorial [D3D12Ez]で使用してないかどうかを確認します。

D3D12_RESOURCE_STATE_GENERIC_READでは検索に引っかからなかったので、CreateCommittedResource()で検索してみます。

2025-08-31のBlogでCreateCommittedResource()関数を使用していました。

なんかBufferとHeapの違いについて質問していました。

しかしここで重要なのはそこではありません。

CreateCommittedResource()関数内でHeapTypeについて指定しています。

あれ?

先程のSample CodeのCreateCommittedResource()関数では、uploadHeapPropになってるのかな?

一寸CreateCommittedResource()関数のDocumentで確認します。

公式のDocumentであるID3D12Device::CreateCommittedResource method (d3d12.h)[13]を参照します。

まずSyntaxは以下の様になっていました。

最初のD3D12_HEAP_PROPPERTIESを見てみます。

ここでTypeを指定していました。

一応Typeの種類を確認しておきます。

UP_LOADがありました。

ああ、やっとつながった。

今度は、InitialResourceStateについてです。

D3D12_RESOURCE_STATESというEnumを使用して指定します。

しかしそれよりも重要な説明がありました。

重要なのでChatGPTにこの部分を日本語に訳してもらいます。

つまりHeapのTypeをUploadに指定した場合、

InitialResourceStateは

D3D12_RESOURCE_STATE_GENERIC_READ

にする必要がある。ってしっかり書いてあります。

これ三年前にも読んだ記憶があります。

その時は何を言ってるのかまったく理解出来ませんでした。

3年越しにこの部分の説明を理解する事が出来ました。

やったあ!

という事は、D3D12 Beginners Tutorial [D3D12Ez]でもCreateCommittedResource()関数のParameterに

D3D12_RESOURCE_STATE_GENERIC_READ

を使用してるはずです。

確認します。

してません。

何で?

公式Siteで

って書いてあるじゃん。

ChatGPTに聞いてみますか?

ChatGPTの回答です。

簡略化した書き方だそうです。

更に以下の理由が述べられていました。

これらは何故、

D3D12 Beginners Tutorial [D3D12Ez]でもCreateCommittedResource()関数のParameterに

D3D12_RESOURCE_STATE_GENERIC_READ

ではなく

D3D12_RESOURCE_STATE_COMMON

が使用されているのかの推測で、

結論としては私の指摘(D3D12_RESOURCE_STATE_COMMONではなく、D3D12_RESOURCE_STATE_GENERIC_READを使用すべき)

は正しいが、

現実問題としては

D3D12_RESOURCE_STATE_COMMON

でも動きます。

と言ってるに等しいです。

はっは。

やっと関数のそれぞれのParameterの設定の正しさまで自分で判断出来るようになったぞ!

ChatGPTの回答の最後のまとめと結論も載せておきます。

はい。

<まとめ>

最後にまとめます。

D3D12_RESOURCE_STATE_GENERIC_READは今まで使用したCreateCommittedResource()関数内で使用されたのか?

という疑問に対しての解答は、

DirectX 12の魔導書」では「4.3 Vertex Buffer」でCreateCommittedResource()関数を使用しており、その時のParameterに

D3D12_RESOURCE_STATE_GENERIC_READ

を使用していました。

それに対して

D3D12 Beginners Tutorial [D3D12Ez]では

CreateCommittedResource()関数のParameterに

D3D12_RESOURCE_STATE_COMMON

を使用していました。

公式のDocumentであるID3D12Device::CreateCommittedResource method (d3d12.h)[13]では

CreateCommittedResource()関数に使用するHeap Typeの設定が

D3D12_HEAP_TYPE_UPLOAD

である場合、

D3D12_RESOURCE_STATE_GENERIC_READ

を使用しろ。と書いてありますが。

D3D12 Beginners Tutorial [D3D12Ez]がやったように

D3D12_RESOURCE_STATE_COMMON

を使用してもほとんどの場合、動くそうです。

以上です。

全然簡単じゃなかった。

もう時間が無いので

今まで使用してたWriteToSubResource()関数関連の実装を消すのは

来週やる事にします。

9. まとめと感想

なし

10.参照(Reference)

[1] 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

[2] Epic Games. (n.d.). Control Rig in Unreal Engine. Retrieved October 21, 2025, from https://dev.epicgames.com/documentation/en-us/unreal-engine/control-rig-in-unreal-engine

[3] Epic Games. (n.d.). Control Rig in Blueprints in Unreal Engine. Retrieved October 21, 2025, from https://dev.epicgames.com/documentation/en-us/unreal-engine/control-rig-in-blueprints-in-unreal-engine

[4] NVIDIA. (2025, October). GTC October 2025 keynote with NVIDIA CEO Jensen Huang [Video]. YouTube. https://www.youtube.com/watch?v=lQHK61IDFH4

[5] Nvidia. (n.d.). Isaac Lab Documentation. Retrieved from https://isaac-sim.github.io/IsaacLab/main/index.html

[6] Isaac Lab Project Developers. (n.d.). Classes and Configs. Retrieved from https://isaac-sim.github.io/IsaacLab/main/source/setup/walkthrough/api_env_design.html

[7] Isaac Lab Project Developers. (n.d.). Environment Design. Retrieved from https://isaac-sim.github.io/IsaacLab/main/source/setup/walkthrough/technical_env_design.html

[8] Isaac Lab Project Developers. (n.d.). Environment Design Background. Isaac Lab Documentation. Retrieved [access date], from https://isaac-sim.github.io/IsaacLab/main/source/setup/walkthrough/concepts_env_design.html

[9] Nine Between. (2024, June 18). Houdini is HIP – Part 14: Flip Fluids I [Video]. YouTube. https://www.youtube.com/watch?v=DJfkTV3Pivc

[10] 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

[11] Unreal Engine. (n.d.). Headless Training & Network Snapshots (5.5). Epic Games Developer Community. https://dev.epicgames.com/community/learning/courses/GAR/unreal-engine-learning-agents-5-5/DPDd/unreal-engine-headless-training-network-snapshots-5-5

[12] Lötwig Fusel. (2023, August 1). Input Assembler | D3D12 Beginners Tutorial [D3D12Ez] [Video]. YouTube. https://www.youtube.com/watch?v=qmT98sWHe6o

[13] Microsoft. (2021, October 13). ID3D12Device::CreateCommittedResource method (d3d12.h). In Microsoft Docs. Retrieved from https://learn.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-id3d12device-createcommittedresource