
1.今週の予定
今週もこの順序に従って勉強していきます。
- 映像作成用UE5の勉強
- AIの勉強
- Nvidia Omniverseの勉強
- Gaeaの勉強もしくはVroidとUE5の勉強
- Houdiniの勉強
- AIについての調査(ComfyUIの勉強)
- DirectX12の勉強
それぞれの勉強の最初にその勉強をする目的を一寸だけ書いておきます。
2. 映像作成用UE5の勉強
2.1 PCGを使用した神社の作成
2.1.1 先週の復習
先週は以下のような

重なりがほぼ無い塀を作成するためのPointを生成しました。

先週はこのPointを生成するための実装方法についてはまとめませんでした。
のでここでそれをやっておきます。
まず元の土台のPointです。

(上から見て)上下左右にWall Sizeだけずらします。

右にずらしました。

左にずらしました。

下にずらしまた。
最後に

上にずらしました。
そして右から左をDifferenceノードして

を得ます。これを壁1と呼ぶ事にします。
左から右をDifferenceノードして

を得ます。
これは壁2と呼びます。
上から下をDifferenceノードして

を得ます。
これは壁3です。
最後に下から上をDifferenceノードして

を得ます。
これは壁4です。
壁1はWall Thicknessの半分だけX軸に移動させます。

壁2,3,4にはWall Thicknessの半分だけ-x軸側に移動させます。

最後に全部の壁を合成します。

こうやってPointを生成しました。
2.1.2 Pointが部分的に重なった部分を消す
いきなりですが出来ました。
まず部分的に重なったPointは、消えてはいませんが以下の様に灰色に表示されます。

これはDensityの値が、0に近いために起きていると考えられます。
のでDensityの値でFilteringするNodeでこの灰色の値のPointをはじけばいいと考えました。
しかしそれをやるNodeが分かりません。
Blogをずっと読み直して確認するとDensity Filterノードがそれをやる事が判明しました。

追加しました。
後は、この灰色のPointが消える位の値にFilteringを設定します。

結果です。

灰色のPointが消えています。
出直そうと思ったんですが、

重なってる部分を見ると

これはこれで有りって感じです。
このままでも良い気がして来ました。

ただし端っこが飛び出しています。

Thicknessの分だけY軸方向にずらす必要があるみたいです。

直しました。
理由は不明ですが、Thickness/3の分だけずらすと綺麗に揃いました。
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]の最初の20分を勉強する
今週は勉強します。
ただし先週要約したので、勉強する量を増やす事にします。いつもはTutorialの10分を勉強していましたが、今週は20分勉強する事にします。
<00:00 - Tutorial Result Demo>
このTutorialで何を勉強するのかを示しています。

柱ですが、ものすごく厚くなっています。

更にBuildingの入り口のDoorも作成しています。

最後にBuilding同士の通路も表示していました。
<00:42 - Data Asset Scale and Offsets>
今のBuildingの柱は以下の様になっています。

柱の大きさが壁の厚さと同じになっています。
これは柱のSizeがWallの厚さによって一義的に指定されるからです。
これを柱の大きさを自由に変更出来るようにします。
S_BuildingComponentにScaleとOffsetを追加します。

ScaleのDefault値は1,1,1に変更します。
当然、DA_RegularBuilingはCompileします。
ScaleとOffsetの項目が全てVariableに追加されました。

あ、分かりました。
これでそれぞれのAsset毎にScaleやOffsetを指定出来るようになったんです。
これでそれぞれのAssetのSizeを別々に変更出来るようになりました。
ここで結構役に立つTipが紹介されていました。
DA_RegularBuilingをCompileしたのでPCG_BuildingのDataAssetにまたDA_RegularBuildingをセットし直す必要があります。

このDataAssetの設定をSoft Object Referenceに変更します。

これでDA_RegularBuilingの設定を変更しても、PCG_BuildingのDataAssetの設定がNullになる事はなくなりました。
Attribute Partitionノードを外しました。

これはAttribute PartitionはPCG Scale Wall Sizeノード内で実装されているから、ここでやる必要が無いからです。
新しいPCG_Offset Transformsノードを作成します。

Inputの設定です。

Outputの設定です。

Get Attribute From Point Indexノードを追加し

Input SourceにOffsetをセットします。

更にもう一個、Get Attribute From Point Indexノードを追加して

こっちのInput SourceにはScaleを追加します。

Transform Pointsノードを追加して以下の様に実装します。

そしてUniform ScaleをUncheckします。

PCG_Buildingを開き、今作成したPCG Offset Transformsノードを追加します。

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

もうここで力尽きました。
20分やるっていって5分20秒までしか出来なかったです。
まあ、いいや。
Script Languageの勉強にはChatGPTやNotebookLMはあんまり助けにならないという事が判明したのだけでも成果が有ったという事になります。
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 先週の復習
そういえば、先週はWordを開くと以下の警告が表示され

かなり焦っていました。
今はもう表示されなくなりました。
という事は、証明書が更新されたって事でしょうね。
そうだ。
Commandで確認してみよう。

証明書の期限は2026年の6月20日になっています。
確かに証明書は更新されています。
それは兎も角、先週はUnreal Engine 5 Tutorial - Control Rig Part 1: Intro & Full Body IK [3]で実装した内容をLevel Sequenceから呼び出して、Animationとして実行出来るかをTestしました。
結果は、あっけないほど簡単に出来ました。

ただし先々週のBlogで述べたFull Body IKを動かした時に発生するArmの歪みもそのまま再生されました。
先週の勉強の結論としては

となりました。
となると正しくControl Rigを追加したSkeletal Meshを使用すれば、Level Sequence上で綺麗に動くはずです。
次の工程として、
正しいControl RigをセットしたSkeletal Meshを探して、それをLevel Sequence上で動かして、綺麗に動くかどうかを確認する事にしました。
何処にControl Rigを正しくセットしたSkeletal Meshがあるかなと考察したら、Content Exampleにそう言えばFull Body IKのSampleが有った事を思い出しました。
で確認したら私がやりたい事を完全な形で実装してる以下のSampleがありました。

でこのSkeletal Meshに使用されているControl Rigの実装を見たら

リグ(骨格)付きのキャラクターアニメーションで、インポートしたアニメーションのボーン位置を壊さずにコントロール(コントローラー)に反映させる実装が採用されていました。
Full Body IKを使用するとかとは次元が違うTechniqueがここでは使用されていました。
うーん。
絶句。
で終わっていました。
2.3.2 これからどうするか?
最終的にはAnimationをControl Rigから呼び出す実装をLevel Sequenceから管理出来るようになりたいですが、それが可能なのかどうかも分かりません。
先週の勉強でFull Body IKをLevel Sequenceから使用出来る事は確認出来ましたが、Full Body IKを使用するとSkeletal Meshの腕が歪んでしまうBugが発生します。
このBugの直し方は分からないままです。
流石に、こんな細かい問題の解決方法はAIも知らないだろうし、YouTubeにあるTutorialも対応してないと思われます。
うーん。どうしよう。
やっぱり既にControl Rigが追加されているSkeletal Meshの実装を確認してどうやってるのかを調査するしかないですね。
今週はこれをやります。
2.3.3 Control Rigが追加されているSkeletal Meshの実装を確認
公式SiteのFull-Body IK [4]を読んでいたら、

普通にMannequinを動かしていました。
こっちを今回は勉強する事にします。
2.3.4 Full-Body IK [4]を勉強する
まずはNotebookLMで要約します。
無効なURLです。って。
UE5の公式のDocumentは人力でAccessしてない場合は、Access出来ない仕組みになってるみたいです。
じゃ、全部読んで勉強する事にします。

ChatGPTの訳です。
Control Rig の Full Body Inverse Kinematic(FBIK) 機能を使用して、高い制御性と柔軟性を持つリグを Control Rig 内で構築できます。
全体的なソルバーの手法は Position Based IK フレームワークに基づいており、これにより高速なリグのパフォーマンス、ボーンごとの設定、好みの角度、スカッシュ&ストレッチなどが可能になります。
FBIK は、たとえば地面への整列や腕を伸ばす動作など、Control Rig 内で手続き的な調整ツールとして機能するよう設計されています。
このドキュメントでは、FBIK ノードの作成方法とそのさまざまな機能の概要を説明します。
高速なリグのパフォーマンス、ボーンごとの設定、好みの角度、スカッシュ&ストレッチなどが具体的に何を指しているのかまだ分かりませんね。
地面への整列の話が出ていますが、これこそ私がやりたい事です。
<<Prerequisites>>
特に勉強しないと理解出来ない事は無さそうです。
<Creation and Setup>
以下の方法でFull Body IKを配置します。

<<Rig Graph Setup>>
ここからFull Body IKのPropertyの設定になります。

RootにPelvisをセットしました。
前回、MannequinにFull Body IKを使用した時はRootの設定はPelvisにしたかな。
確認します。
2025-06-22のBlogにありました。

してますね。
次に以下のControlをNodeにしています。

ここは以下の解説が書かれていて

FBIK システム用に、目的のコントロールを作成して追加します。
通常、これらのコントロールは影響を与えたい四肢に対応しており、チェーンの**最終ボーン(終端ボーン)**を基準にしています。
この例では、頭部・手・足に対してコントロールが作成されています。
Ending Bone of the Chainと書いてあり、これが何か特殊なControlを指しているのかと考えましたが、
要は頭とか手とか足の事です。
特に気にする内容では無いと結論付けました。
で、ここでHandのBoneから生成したControlを追加しています。
なんで私の場合は、

なったんでしょう?
<<Effector Setup>>
配置したControlをFull Body IKのEffectorsに繋ぎます。
繋ぎ方は以下の通りです。

このへんは既に理解した内容です。
<<Setup Result>>
結果を示しています。

私のMannequinのように腕がビヨーンと伸びたりしていません。
この時点で結果が違っています。
前回の私のProjectではBoneとControlの設定をした後に、更にFull Body IKの設定を行いましたが、このTutorialではいきなりFull Body IKの設定だけ行っています。
この点くらいしか違いがありません。
一応、試してみるか。
以下の様に設定を変更しました。

手を動かします。

あれ?
直っています。
うーん。
そういう事か。
直りましたね。
問題が解決してしまったので、Full-Body IK [4]の勉強はここまでとします。
キリが良いので今週のControl Rigの勉強もここまでとします。
この後、もう少しFull Body IKの勉強を続けるのか、それともDragonにControl Rigを追加する方法を勉強するのかは、来週決定します。
3. AIの勉強
AIの勉強の目的ですが、
生成AIが凄いTrendになってるので、最低限の基礎は知っておくべきと思いこの勉強を始めたんでした。
のでこれを勉強してどうしたいというのは無いです。
3.1 先週の復習
Lesson 4: Practical Deep Learning for Coders 2022 [5]の内容をまとめました。
で以下の結論に達しました。

そして別に宿題とは出てないんですが、このLectureで勉強した最も重要な内容であるHugging FaceのTransformer Libraryを使用してNLPのFine Tuningの実装をするために
Getting started with NLP for absolute beginners [6]を勉強する事にしました。
しかし勉強する前に時間が来てしまい、この勉強は今週する事にして終わっています。
3.2 Getting started with NLP for absolute beginners [6]を勉強する
<Introduction>
ChatGPTと相談して以下の様にまとめました。
自然言語処理(NLP)では、法的文書の仕分けなどの分類タスクが可能です。
また、一見分類とは関係なさそうな「2つの単語やフレーズがどれくらい意味的に近いか」というタスクも、
カテゴリ分類(例:「異なる」「類似」「同一」など)として表現することで、分類タスクとして扱うことができます。
これ以上ないくらいまとまっています。
で、最後に
In this notebook we'll see how to solve the Patent Phrase Matching problem by treating it as a classification task,
by representing it in a very similar way to that shown above.
と言っています。
ここではPatent Phrase Matching problemを解く方法を実装するみたいですね。
<On Kaggle>
ここで使用するDatasetはKaggleにしかないのでKaggleに登録する必要があると書いてあります。
更にKaggleで実装するのが一番簡単だと書いてありました。
うーん。
KaggleでCodeを書くと必ず公開されてしまうんじゃなかったけ。
後、電話番号を入力する必要が有った気がします。
ChatGPTに聞いて確認します。
公開もされないし、電話番号も要らないって。
うーん。
変ったのかな?
じゃ、今回はKaggleでやる事にするか。
次の工程ですがGPUを使用する設定を選んでいます。

最初のCodeです。

何でOSをImportする必要があるんでしょうか?
ChatGPTにこのCodeの説明をしてもらいます。

分かりました。
このCodeを実行してる環境がKaggleの場合はKAGGLE_KARNEL_RUN_TYPEを返し、それ以外の環境だった場合は’ ‘を返します。
<Using Kaggle data on your own machine>
Kaggle以外でこの実装をやる場合の説明です。
うーん。
やっぱしColabで実装しようかな。
他の環境で行う場合は、Kaggle datasetをDownloadする必要があるそうです。
ここで使用されているCodeについてまとめておきます。

KaggleのLibraryをImportしています。
そしてKaggle APIを使用するためにKaggle keyを手に入れます。
click on your profile picture on the Kaggle website, and choose My Account, then click Create New API Token.
で手に入るそうです。
これを実行するとkaggle.jsonというFileがDownloadされそのFileに
{"username":"xxx","key":"xxx"}
などの情報があるそうです。
それを以下のように

実装します。
次のCodeです。

何をしてるのか全然分かりません。
ChatGPTに説明してもらいます。

Pythonの標準ライブラリpathlibからPathを読み込みます。
流石にそれは分かります。
Pathlibはファイルパスの操作を簡単かつクロスプラットフォームにできる便利なクラスだそうです。

~/.kaggle/kaggle.jsonというパスを表すPathオブジェクトを作成します。
これは分かりますが、最後のExpanduser()関数は何をするんでしょうか?
次の文で説明していました。
expanduser()は「~」(ホームディレクトリ)を実際のユーザーディレクトリに展開する。機能だそうです。
つまり、/home/ユーザー名/.kaggle/kaggle.json(Linux/Mac)やC:\Users\ユーザー名\.kaggle\kaggle.json(Windows)を指す。そうです。

もしkaggle.jsonファイルが存在しなければ、以下の処理をする。そうです。
これFolderじゃなくてFileなのか。
そこは分からんかった。

cred_path.parentは~/.kaggleディレクトリを指すそうです。そしてそのディレクトリがなければ作成します。
exist_ok=Trueは既にあってもエラーにしない設定だそうです。
あ、成程。Ifで調べた時にFolderはあったけどFileは無かった場合もあるので、exist_ok=Trueを指定する必要があるのか。

creds(先ほどユーザーが文字列として入力したAPIキー情報)をkaggle.jsonファイルに書き込む。そうです。
個々で疑問なんですか、前にkaggle.jsonファイルをDownloadしてますよね。
それをそのまま使用したら良い気がしますが、駄目なんでしょうか?
それともどこか勘違いしてるのかな。

ファイルのアクセス権限を600(オーナーのみ読み書き可能)に設定。するCodeだそうです。
Pythonにはそんな事を指定するCodeが存在するのか。初めて知った。
セキュリティのため、他のユーザーから読み取られないようにする。そうです。
じゃ、前にDownloadしたkaggle.jsonファイルはどうするの?
そんなにSecurityを気にする必要があるのか疑問です。

Path(...)
これは pathlib.Path クラスの呼び出しで、パスを表すオブジェクトを作ります。
文字列を単なるテキストではなく、OS上のパス(=場所)として扱えるようにするためのものです。
'us-patent-phrase-to-phrase-matching'
これは Kaggleのコンペ名でもあり、データフォルダ名として使うことが一般的。
実際にダウンロードされた .zip ファイルの中身が、この名前のフォルダに展開される想定です。
だそうです。
こういうFolderがある事になったって事でしょうか?
ChatGPTに聞いたらそれは違うと回答してきました。
のでもしus-patent-phrase-to-phrase-matchingというFolderが存在していたら、そのFolderのPathは、このpathに入ってるAddressと同じになるのか?と聞き返しました。
今度はその通りだと返事が返って来ました。
分かった。
Pathという概念が完全に理解出来ました。
現実正解ではAddressは単なる情報で物質ではないですが、Programmingの世界では全てが情報なのでAddressも物として扱う必要があるんです。だからAddressを扱うPathもObjectになってるです。
はい。

ここでChatGPTがO3だか何だかのLimitに達しました。との表示が出ました。
うーん。
じゃここまでにしておくか。
いやキリが悪いのでこのCodeの解説まで勉強する事にします。
このコードブロックは、Kaggle以外の環境(例:Colabやローカル)で、まだデータフォルダが存在しない場合に、Kaggleからデータをダウンロードして解凍する処理をしています。
だそうです。
あ、本当だ。最初にIf not iskaggleって書いてあります。
じゃ、Kaggleでやる場合はこのCodeは必要ないのか。
一応、Codeの内容を全部、勉強しておきます。

iskaggle は、「Kaggle環境かどうか」の判定フラグ(以前に定義済み)。
path.exists() は、us-patent-phrase-to-phrase-matching フォルダが存在するかどうかを調べています。
だそうです。

必要なライブラリをインポートします。
- zipfile: zipファイルを解凍するためのPython標準ライブラリ。
- kaggle: Kaggle API を使うためのライブラリ(!pip install kaggleでインストール済みの前提)。
だそうです。

Kaggle API を使って、指定されたコンペのデータセットをダウンロードします。
- str(path) → 'us-patent-phrase-to-phrase-matching' というコンペ名の文字列。
- 結果として、us-patent-phrase-to-phrase-matching.zip というファイルがダウンロードされます。
だそうです。

- ダウンロードした zip ファイル(例:us-patent-phrase-to-phrase-matching.zip)を
- 指定したフォルダ us-patent-phrase-to-phrase-matching/ に**解凍(展開)**します。
やっぱし、ここで終了してしまうと、

全体の8分の1しか勉強してない事になります。
となると実装する前に2カ月勉強しないといけなくなります。
これは時間かかりすぎです。
もう一寸勉強します。
<Import and EDA>

またPathを作成してる。
今度は別のFileでもDownloadするんでしょうか?
ChatGPTの回答です。
「Kaggle環境で実行されているなら、Kaggleが提供するデータパスを使い、必要なライブラリ(datasets)もインストールしておこう」
という Kaggle専用の初期セットアップ処理です。
このPathに先程DownloadしたDataがあるはずです。
そしてInstallするDatasetsはDataを処理するための専用のLibraryかなんかでしょう。

NLP datasetsはCSV Fileなどにまとめられているそうです。
このCommandでどんなFileがあるか確認出来るそうです。
Tutorialでは以下の回答が返って来ていました。

CSV fileが使用されているならPandas libraryで管理するのがBestだそうです。

PandasをImportしました。

Train.csvをImportしました。

Dataを表示しています。

これは意味が分かりません。
ChatGPTに質問します。

分かり易い。
確かに以下の結果が返って来ています。

あれ?
Countしか一致してないですね。
次にこの理由の説明がありました。

Objectはこっちを返すのか。

帰って来てますね。
うーん。
AnchorとTargetとContextの意味を忘れてしまった。
この表が何を示してるのか分からん。

これはCodeの意味は分かりますが、何故こんなCodeを作成してるのかが分かりません。
以下の様に書いてありました。
Earlier, I suggested we could represent the input to the model as something like "TEXT1: abatement; TEXT2: eliminating process".
We'll need to add the context to this too. In Pandas, we just use + to concatenate, like so:
こういう表示も出来るという事を示してるだけかもしれません。
最後に表示しています。

この章は簡単だ。
ほとんど疑問なく終わりました。
<Tokenization>
次の章も勉強しますか。

TokenizerのためにDatasetを作成します。
前に作成したのはdfで今回はdsか。

こういうDatasetになってるのか。
TokenizationとNumericalizationを行います。
この2つを何故行わないといけないのかは、前に散々勉強したのでここでは振り返りません。

おお、先にModelを指定しています。
Tokenizationは使用するModelと同じ方法で行う必要があるからです。

あれ?
これHugging FaceのTransformerのLibraryを使用する必要がある。って散々Lectureで述べてたのに、Hugging FaceのLibraryをImportしてないですね。
ChatGPTに質問してみましょう。

え。
何時、Transformer LibraryをInstallしたんでしょうか?
しなくて良いのかな?
これもChatGPTに聞いてみます。

やっぱりInstallする必要があるって言っています。
うーん。でもLectureであんなに大げさに言っていたHugging FaceのTransformerのLibraryってこんな簡単に使用出来るのか。
なんか拍子抜けです。

G'day folks, I'm Jeremy from fast.ai!をToken化するためのCodeです。

別な文章でも試しています。

InputをToken化する関数を作成しました。

ここで何をやってるのか分からなくなりました。
ChatGPTに説明してもらいます。

だそうです。
分かり易い。

で以下の結果を返しています。

成程。
先程のイメージ化(簡略化)の結果と同じようなものが出力されています。
更にChatGPTの説明によると

だそうです。
つまりここは今までのCodeが正しく動いてるのかを確認してるだけって事です。

これはOfという単語に対応するTokenのIDを表示してるのは分かります。
でも何でOfがTokenであると分かるのでしょうか?

ChatGPTはこの疑問は全く持って正しいと言ってますね。
ちなみに_の意味は以下の通りだそうです。

ここの例のInformationにあるのはfoでofではないと思うんですが、AI的には同じ何でしょうか?

ScoreというColumの名前をLabelに変更しました。
これはTransformerで使用するにはLabelは必ずLabelと言う名前にしておく必要があるからです。
<Test and validation sets>

あれ、Test用のDataが最初から分けてあるのか。
<<Validation set>>
ここから何と何故、Validation SetやTestが必要なのかの説明が始まっています。
これはLectureで散々勉強したのでこの部分はSkipします。

この実装でValidation Setを作成するそうです。

でも結果を見るとTrainとTestに分けられていますね。
これってValidation用のDataじゃなかったの?

だそうです。
あ、Siteにも以下の様に書いてありました。

更に以下の解説がありました。
開発時の結果と本番環境での結果のギャップの原因として最もあり得るのは、検証(バリデーション)データセットの選び方が悪いことです
(あるいは、さらに悪いのは検証セットがまったく無いことです)。
データの性質によっては、検証セットの選び方が最も重要なステップになることもあります。
scikit-learn(sklearn)は train_test_split という方法を提供していますが、
これはデータからランダムにサブセットを選ぶ方法であり、多くの現実の問題に対しては適切とは言えません。
これについては後で勉強する事にしましょう。
今回はRandomに抽出したDataからValidation Testを作成します。
<Test set>
これは最後の最後に行うものだそうです。

ChatGPTに解説してもらいます。

だそうです。
この変換自体は、Training用のDataと同じですね。
ここで半分まで読みました。
今週の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 [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 Add Camera and Sensors [9]を実装する
まず新しいProjectを作成して以下のmock_robot_riggedを配置しました。

このProjectをSaveしました。

うん。USDでSaveされています。
これってProjectがUSDでSaveされているって事なのか?
ChatGPTに確認したら、Isaac SimにはUSDでSaveする機能しかないそうです。
<Adding Camera>
CreateからCameraを追加すると

Mock_robot_riggedに追加されました。

TutorialにあるVideoは以下の様になっていました。

む、DefaultPrimになっていますね。
これは後で検証します。
今、Viewportで見てる画面を撮影してるCameraを追加する方法も試してみます。
CameraのIconからCreate from Viewを選択します。

以下のperspective frustumを持つCameraが追加されました。

<Camera Inspector Extension>
Camera Inspector Extensionを使用して以下の事をします。
- Create multiple viewports for each camera → 各カメラに対して複数のビューポートを作成する
- Check camera coverage → カメラのカバー範囲を確認する
- Get and set camera poses in the desired frames → 希望する座標フレーム内でカメラの姿勢(ポーズ)を取得・設定する
<<Launching Extension>>
以下の場所からCamera Inspectorを選択します。

以下のWindowが開きました。

色々弄ったら、大体の使い方は理解しましたが、かなり使いにくいです。
まずここに載っている値は今のViewportの位置を示しています。
CameraにOmniverseKit_Perspがセットされていますが、これをCameraに変更すると今度はCameraの座標が表示されるようになりました。
そしてその状態で、Assign Cameraを押すとCameraのViewになります。
Create Viewportを押すと新しいViewportが開きます。
<<Creating a Viewport>>
以下のParameterを変更する事で色々な方向から見たViewを作成する事が出来ます。

Cameraから見たViewを作成する場合は、Cameraの値をCameraに変更し、Create Viewportを押します。
するとCameraのViewを示すViewportが生成されます。

CameraのViewを示してる事はTabの表示がCameraになってる事で分かります。
以下のIconから新しく開いたViewportのResolutionの値を調整する事が出来ます。

しかし、この値は先週勉強した通りApertureのAspect比と同じでなければなりません。
Camera ViewのResolutionは
Width: 1280
Height:720
CameraのApertureは以下のような設定になっていました。

Horizontal Aperture:20.955
Vertical Aperture:15.2908
ChatGPTに聞いたら、これらの値の比率があってないので直せと言って来ました。

確かに一致していません。
今回のTutorialではこの比を直さないと歪みが生じるとだけしか言っていないので、どっちの値に寄せるべきなのかが分かりません。
ので今はほっておきます。
<<Camera Status Panel>>
以下のParameterの説明です。

ここでよく分からないのはWorld Camera AxisとLocal Camera Axisの意味です。
World、USD、ROSの3つが選択出来るようになっていますがどういう意味なんでしょうか?
ChatGPTに聞いてみます。

あ、分かりました、軸が違うのか。
<Attach a Camera to Robot>
床を追加しました。

Cameraの名前を変更しました。

Viewportを2つ作成しViewport2をCar_Cameraに変更しました。

BodyにCar_Cameraを追加しました。

更にCameraの位置を微調整しました。


この画面ならCameraから見た映像とCameraの位置の両方を確認出来るので、Cameraの位置の調整が簡単に出来ます。
TutorialでCameraの位置が指定されていたので

その値に変更しました。
結果です。

Cameraの前にCornを置いて確認したら、以下の様になりました。

Car_CameraにConeが写っています。
この状態でPlayを実行しCarをShift+Dragで車を移動させると、その車の移動に沿ってCar_Cameraの映像も変化しました。
Cameraが車に付加されているのが確認出来ました。

後はこれだ。
ChatGPTの説明によるとCamera Viewの設定にしてViewを移動させるとCameraの位置も移動してしまいます。
Primという位置情報だけを持つXformなどをCameraの位置に配置してその子にCameraを設定すれば、間違ってCameraを移動させてしまった場合、そのXformの位置にCameraを戻す事が出来るので楽ですよ。
という意味だそうです。
こういう問題は、UE5で散々経験しています。
別にここで忠告されなくても自分で解決出来ます。
しかし、この部分の言ってる事の意味を理解する方が、この問題の解決方法を理解するよりも何倍も大変だった。
ここでChatGPTが40の使用限界に達しました。と言って新しい質問はNew Chatして下さい。と表示して来ました。
どうせここで終了です。
終わりにします。
4.2.2 Add Camera and Sensors [9]を実装した感想
先週勉強した感触から言うと、思っていたのより10倍くらい簡単でした。
ここで新しく勉強した事で、本当に勉強になったのは、
ViewportでCameraの映像を写すときは、ViewportのResolutionのRatioをCameraのApertureのRatioと同じにしなければならない。という事と
CameraをPrimに追加する事で、Cameraが万が一移動してしまった場合もPrimの位置に戻す事で、簡単に直せる事だけです。
それ以外の事は、UE5からの類推で何とかなる事ばかりです。
後、このLevelのTutorialだったら別に2周に分けて勉強する必要も無かったです。
一回に2つずつぐらいやって行きます。
4.2.3 Interactive Scripting [10]を勉強し実装もする
ここではIsaac SimをPythonで動かす方法を勉強するそうです。
- Script Editor window and Python editing environment
- Isaac Python REPL extension
- Adding a Cube using USD API
- Adding a Cube using Isaac Sim API
の4つについて学びます。
<Getting Started>
特になし
<Script Editor>
以下に示した様にWindowからScript Editorを開きます。

以下に示した様にScript Editorが開きました。

Tabを追加しました。

それぞれのTabは同じ環境で繋がっているそうです。のであるTabで指定したVariableやImportしたLibraryは他のTabからでも使用出来るそうです。
付属のVideoでは以下の実装がしてありました。

Tab0のPython0でnumpyをImportして、Nに10を指定しています。
そしてTab1のPython1で以下の実装を追加しています。

そしてPython0を実行し、その後でPython1を実行しました。
結果です。

普通に実行されています。
やってみます。

普通に出来ました。
PythonのCodeの書き方知らんので、そこが心配ですが一応再現は出来ました。
<REPL Extension>
Read–Evaluate–Print loopの略だそうです。
REPL 環境へのアクセスは、Isaac REPL 拡張機能(Linux のみ)を通じて提供されます。って書いてあります。

じゃWindowsからは動かせないの?
うーん。
ChatGPTに聞いたらWindowsからでは使用出来ないと言ってます。
そうか。
一応試してみます。

Install出来ませんでした。
はー。
更に調べたらこの機能はIsaac Sim4.5では非推奨になってしまったそうです。
じゃ勉強しても意味ないか。
次やります。
<USD APIs>
以下のCodeをScript EditorにCopyして実行しろ。と言っています。

やってみます。
以下の様になりました。

出来たけど、ここは何を勉強するところなの?
説明文を読んだら、ここに使用されているScriptは生のUSD APIsだそうです。そしてOmniverseはUSDを使用して作成されているので生のUSDから環境を構築する事も出来るそうです。
そういう事か。
それだけ理解出来たら十分です。
<Isaac Sim Core APIs>
USD APIsを簡素化して使いやすくしたAPIだそうです。

勉強するならこっちか。
でもGUIから操作するのとそんなには違わないんだよな。
結局は。
4.2.4 OmniGraph [11]を勉強して実装もする
もうどんどんやってしまいます。
OmniGraph[12]も読んでね。と書いてありました。

これは時間があるときに勉強します。
<Learning Objectives>
以下の内容を勉強するそうです。
- introduce you to the basic concepts of OmniGraph
- walk you through building an action graph to control a robot in Isaac Sim, specifically, the Jetbot.
- show you how to use the Omnigraph shortcuts to generate a differential controller graph for the Jetbot.
Jetbotって何?
まあやってるうちに分かるでしょう。
<Getting Started>
<<Prerequisites>>
当然ですが特に問題なしです。
<<Graph Editors>>
Action GraphとGeneric Graphの2つがある事が書かれています。ほとんど使用するのはAction Graphだそうです。
<<Node Search>>
これは今までVisual ScriptingをしたことがないUserを対象にNodeを簡単に説明してるだけです。
<Fundamental Concepts>
<<Action Graph vs Push Graph>>
Action GraphとPush Graphについての簡単な説明がされていました。
Action GraphはUE5の普通のBPと全く同じ構造です。
Push Graphについては以下にChatGPTの要約を示しておきます。
- Push Graph(または Generic Graph) は、毎フレーム自動的に実行されるグラフで、特別な「実行ノード」は不要です。
- ビューポートが常にレンダリングしているため、Push Graphにノードを追加すると、シミュレーションを再生していなくても即時に実行されます。
- 例えば、「Print Text」ノードをPush Graphに追加し、コンソールで情報ログを有効にすれば、テキストを入力した瞬間に出力されることが確認できます。
Push GraphはUE5のBPにおけるConstructに対応してるのかもしれません。
まあやってく内に理解出来るでしょう。
<Try It Out>
実際にやってみるみたいです。
<<Setting Up the Stage>>
Tutorialに以下の手順でやれ。とあるので

やってみます。

出来ました。
というか非常に基礎的な内容でした。
Jetbotが何なのかも分かりました。
Jetbotは、NVIDIAがAIやロボット制御を学ぶために設計した小型Robot Carでした。
話は変わりますが以下の箇所から

Cameraなどのplaceholder meshを非表示にする事が出来るそうです。
<<Building the Graph>>
以下の手段でAction Graphを生成します。

やります。

出来ました。
今度は前程は簡単じゃなかったですが出来ました。
The Articulation Controller applies driver commands (in the form of force, position, or velocity) to the specified joints of any prim with an articulation root.
と書いてありました。
要はArticulation Controllerはある種のJointにForce、PositionそしてVelocityなどの命令を出すControllerという事です。
どのRobotをControlするかを指定するために以下の事をします。

ますUsePathなんて存在しません。robotPathは以下に示した様にありました。

もしくはAdd Targetですがこれもどこにあるか分かりません。
ChatGPTに質問しても変な回答しか返って来ません。
これは困ったと思ったら、Tutorialにしっかり図が載っていました。

両方はやるな。と書いてあります。UsePathを使用する方法をやってみます。

私のVersionにはUsePathが無いです。
のでUsePathのCheckは入れられないです。
次はDifference Controllerの説明です。
The Differential Controller computes drive commands for a two wheeled robot given some target linear and angular velocity. Like the Articulation Controller, it also needs to be configured.
Target LinearとAngular Velocityで管理すると書いてあります。
それぞれの定義は以下の様になっています。

Difference Controllerの設定です。

以下の様に設定しました。

Articulation Controllerに戻ります。
Articulation ControllerはどのJointをArticulateするかを知る必要もあります。
以下の作業でそれを教えるみたいです。

出来ました。

更に以下の工程がありました。

出来ました。

テストします。
動きません。
Articulation Controllerが警告を発しています。
2025-07-02 19:30:01 [Warning] [omni.graph.core.plugin] /World/ActionGraph/articulation_controller: [/World/ActionGraph] OmniGraph Warning: Prim path expression ['World/jetbot/jetbot'] is invalid, a prim matching the expression needs to created before wrapping it as view
ChatGPTにこの警告の意味を聞いたら
OmniGraphのノード(ここでは articulation_controller)が参照しようとしている Prim(/World/jetbot/jetbot)が存在しないので無効です。
OmniGraph は、その Prim(ロボット本体)を見つけられず、処理を進められないという警告です。
と返って来ました。
じゃ、

が間違っているって事になります。
以下の設定に直しました。

もう一回Testします。

Desired Angular Velocityの値を変更したら、上記のように回転しました。
更にDesired Linear Velocityの値を変更したら直進しました。

うーん。
今週はここまでにします。
残りは来週やります。
もう考えられない。頭が限界です。
5. Gaeaの勉強もしくはVroidとUE5の勉強
5.1 Gaea tutorial用のPowerPoint作成

今週はSatMapを使用したMaskingの話をやります。

前回の動画で作成したPortalの続きの話です。

Maskingの結果です。

やり方を説明しています。
6. Houdiniの勉強
今週もHoudiniの勉強はお休みして木の生成について調査します。
6.1 plant factory the best tree generator is now free [13]を実装する
まずはPlant FactoryをInstallします。
![]()
に移動します。

何で2024の方が下にあるんでしょうか?
まあ良いです。2024の方をDownloadします。
Installします。
出来ました。

開いてみます。

うーん。
使い方は分からない。
Tutorialによると、File->OpenからCatalogを開けるそうです。

開けました。
TutorialがやってるようにBanana Treeを選択しました。

開けましたね。
Tutorialでやってるように
以下のMain Bark Dummyノードを選択して

Lengthの値を増やすと

Banana Treeの幹が伸びました。

おお、
見た目は複雑ですが、操作自体は結構簡単です。
Render Buttonを押してみました。

Viewportの画面が以下の様に変化しました。

今度はStem Dummyを選択して

Leafを選択します。

すると
以下のようにDistributionのParameterにNumberが表示されます。

この値を増やすと

Banana Treeの葉の数が増えます。
Exportする時は以下の場所からするそうです。

以下のBoxが開きました。

FBX FileでExportしてUE5で開いてみます。

出来ました。
思ったよりしょぼいですね。
後、風が吹いてる感を再現するためのそよぎも無いです。
Materialは2つ生成されていました。
その内の一つの中身です。

うーん。
Leapいらん気がします。
まあ、色々言いたい事はありますが、何も調整しないでこんだけ出来たらはっきりと凄いって言えます。
Tutorialではこんなに沢山のSampleがありますが、

私の方には

これしかありません。
TutorialでもこれらのAssetについては何の説明もしていません。
これってどこかからDownload出来るって聞いた気がするんですが。
そうだ。
2025-06-22のBlogでNotebookLMに要約させたんだ。そこで別なところからDownloadする必要があるって言ってた気がする。
確認します。

うーん。
これを読むと、Plant Factoryには表示されているけど実際に使用する場合は、Downloadする必要がある。て読めます。
私の場合はそもそも最初から表示されないんですが?
分かりました。
以下に示したPlantCatalogの方にありました。

Tutorialと表示方法が違いますが、これはVersionが一寸だけ違うからだと思います。
Mushroomとかもありました。

でここからが本番です。
これらのAssetを使用しようとするとDownloadする必要があります。
と出て来ます。
そしてPlant FactoryをDownloadしたPageに飛びます。
そこに以下のFileがあるので

これをDownloadします。
これをどこにDownloadすれば良いのかとかは全く説明していません。
Downloadした後の設定方法が全く分からないです。
使えません。

Downloadするのはこっちじゃね。
うーん。
分からん。
ここはChatGPTに聞いてみましょう。
この回答も要領を得ません。
うん。

こっちじゃない。
これをDownloadしたらExe Fileがあります。
実行しました。
終わりました。
うーん。
何も起きません。
Plant Factoryを開いてPlantCatalogを見ます。

あれ?
先程あんなに沢山あったContentsが無くなってる。
うーん。
分からん。
今回はこの部分は諦めます。
で、このTutorialはこの後、Draw Fromという機能を使用して

木を描いているんですが、当然この項目も無くなってしまいました。
残りは適当にやる事にします。

位置からTreeを作る部分は一応出来ました。
問題があるのはLibraryだけのようです。
Draw From Scratchに先程のSampleもある事が判明しました。

今週はここまでにします。
来週、もう一回勉強する事にします。
7. AIについての調査(ComfyUIの勉強)
AIを使用するためのSoftが大量に公開されていますが、それらについて全く理解していません。
3Dやイラストそして動画関連のAI Softについて、
どんなSoftが公開されているのか?
それらのSoftを使用するとどんな事が出来るのか
どんな方法で操作するのか、
などの一通りの事を勉強しておこうと思い、この章を特別に作りました。
特にComfyUIの使用方法やそれに関して生成出来るイラストや映像について集中して勉強していこうと思っています。
2025-03-30のBlogでUE5でもReinforcement Learningが出来る事を知りました。
のでComfyUIの勉強は一端中止してこっちを勉強する事にします。
7.1 Learning to Drive (5.5) [14]の続きを勉強する
<<Tick>>
Sample Codeをそのまま貼り付けました。

Trainer Training SettingsとTraining Game SettingsがErrorになっています。
Variableにしました。

ChatGPTによるとこの2つの変数は以下の意味があるそうです。

更にRun Trainingノードの機能についても説明してくれました。

<<Finishing Touches>>
以下の説明が書かれていました。
At this point, all the components necessary for reinforcement learning are in place;
however, there are a few tweaks we need to allow training to work successfully.
ChatGPTによる翻訳です。
この時点で、強化学習に必要なすべてのコンポーネントは揃っています。
ただし、学習を正しく機能させるためには、いくつか調整が必要です。
具体的には以下の作業が必要と言っています。
Since the actions are occurring in real-time using simulated physics,
we need to allow some time to pass in order for the action to have time to affect the game state.
これもChatGPTに訳してもらいます。
アクションは物理シミュレーションを用いたリアルタイムで行われているため、
アクションがゲームの状態に影響を与えるための時間を少し設ける必要があります。
更に具体的に以下の設定を行うと言っています。
This is simple to achieve by decreasing the tick rate of the manager - which will effectively control how frequently our agent’s take decisions.
From the manager blueprint, click the class defaults button at the top of the window, and then adjust the Actor -> Tick Interval (secs) to be 0.1.
This will allow enough time to pass such that the throttle, brake, and steering actions will have a meaningful impact on the game state.
これは簡単に実現できます。
マネージャーのティックレート(Tick Rate)を下げることで、エージェントがどのくらいの頻度で意思決定を行うかを効果的に制御できるようになります。
マネージャーのブループリントで、ウィンドウ上部にある [Class Defaults](クラスデフォルト) ボタンをクリックし、
その後、Actor → Tick Interval(秒) の値を 0.1 に設定してください。
これにより、スロットル、ブレーキ、ステアリングの各アクションがゲームの状態に対して意味のある影響を与えるだけの時間が確保されます。
やってみます。
Managerと書いてありますので引き続きBP_SportsCarManager上の設定変更と解釈します。
Class Defaultを選択すると

Actor Tickの項にTick Intervalが表示されています。

TutorialにはActorと書かれていますが、ここはActor Intervalと書かれていますね。
多分UEのVersionがTutorialとは違うせいでしょう。
Tick Intervalの値を0.1にします。
次です。
Additionally, select the LearningAgentsManager component from the Components panel and set the MaxAgentNum property to 32 so that we can train using multiple agents:
訳です。
さらに、[Components(コンポーネント)] パネルから LearningAgentsManager コンポーネントを選択し、
MaxAgentNum(最大エージェント数) プロパティを 32 に設定してください。
これにより、複数のエージェントを使って学習を行えるようになります。
そんなのあるかい。と思ったらありました。

LearningAgentsManagerを選択して
MaxAgentNum(最大エージェント数)

に32をセットしました。
学習においては、環境からデータを収集する速度がBottleneckになるそうです。
このBottleneckを解消するために、Agentを沢山配置してそれぞれのAgentからDataを収集します。
ので、沢山のDriving Agentsをマップ上に配置します。
はい。
で、実際にAgentをLevel上に配置しようと思ったら、ここからのTutorialの指示が何言ってるのが今一分かりません。
以下の様に書かれています。
Navigate to the SportsCar_Pawn and then place more agents on the map.
About 32 agents seemed to work well.
Place 31 agents on the map (the final agent will be spawned by Unreal’s game start logic).
This final agent which is automatically spawned will be the one you watch from the viewport during Play-In-Editor.
ChatGPTによる訳も以下に付けておきます。
SportsCar_Pawn に移動し、そこからエージェントをマップに配置してください。
だいたい 32体のエージェント がうまく機能するようです。
マップ上に 31体のエージェントを手動で配置し、残りの1体はUnrealのゲーム開始ロジックによって自動的にスポーンされます。
この最後の自動生成されるエージェントは、Play-In-Editor(エディタ内でプレイ)中にViewportから観察する対象になります。
Navigate to the SportsCar_PawnはChatGPTが訳したように、SportsCar_Pawn に移動し、としか解釈出来ません。
しかしLevel上に配置するAgentはSportsCar_Pawnしかありえません。
何で、SportsCar_PawnをLevel上に配置するのにSportsCar_Pawnに移動する必要があるの?
SportsCar_PawnがあるFolderに移動しろ。って事でしょうか?
まあいいや。

SportsCar_Pawnを31台Level上のSpline上に配置しました。
次の指示です。
By default, the cars will collide with one another.
For simplicity, this collision should be disabled.
To do so, open the SportsCar_Pawn blueprint and in the Class Default’s Collision section,
change the Collision Presets to Custom and then click the checkbox to ignore Vehicle collisions:
訳です。
デフォルトでは、車同士が衝突してしまいます。
シンプルにするために、この衝突を無効化しておくべきです。
そのためには、SportsCar_Pawn のブループリントを開き、
Class Defaults(クラスデフォルト) の Collision(衝突) セクションで、
Collision Presets(衝突プリセット) を Custom(カスタム) に変更し、
Vehicle(車両)との衝突を無視するチェックボックスをオンにしてください。
ではこれもやってしまいます。

しました。
<<Training>>
ここから学習に入るのか。
長かった。というかもう全体像が分からなくなってしまいまいした。
At this point in time, everything should be set up. Save everything so you don't lose any work.
Training will take roughly 15 minutes for you to see a noticeable improvement, and by about 2 hours your cars should be fully trained.
と書かれていました。
ChatGPT訳です。
この時点で、すべての準備が整っているはずです。
作業内容を失わないように、すべて保存しておきましょう。
学習が目に見えて効果を表すまでには およそ15分 かかり、
約2時間 もすれば、車は十分に訓練された状態になるはずです。
更に
Hit play and let the agents train.
Whenever you are satisfied with the training results, you can click stop play.
The trained weights will be saved to the neural network assets that we created.
The editor will mark the asset as dirty, so save those assets to save the weights to disk.
[Play(再生)] をクリックして、エージェントの学習を開始しましょう。
学習結果に満足した時点で、[Stop(停止)] をクリックして終了できます。
学習済みの重み(weights)は、事前に作成しておいた ニューラルネットワークのアセット に保存されます。
エディタはこのアセットに「変更あり(dirty)」のマークを付けるので、これらのアセットを保存すれば、重みもディスクに保存されます。
と書かれています。
試しにPlayを押してErrorにならないかだけ確認します。

あれ?
Errorにはなりませんが、普通にGameが始まりました。

配置した他のCarもまったく動いていません。
ナニコレ?
どっかの実装が間違ってるって事ですか?
7.2 Learning to Drive (5.5) [14]のErrorを直す
そもそも正しく設定出来た時はどうなるのかが分かりません。
2025-03-30のBlogにLearning to Drive (5.5) [14]に関連してUnreal Engine 5.3: Machine Learning Tutorial [15]のTutorialが載っていました。
このTutorialがもろにLearning to Drive (5.5) [14]の内容でした。
これを見てどこが間違っていたのか確認します。
まず正しく実装されると以下のように動くそうです。

うーん。
画面がこうなってないよな。まず。
休憩も兼ねて軽く見ていきます。
このTutorialではSportsCar_PawnをDuplicateしてSpartsCar_Pawn_Playerを作成しています。

BlogとProjectの両方で確認しましたが、SportsCar_PawnをDuplicateしてSpartsCar_Pawn_Playerを作成なんかしていません。
別に要らないんじゃね。と思って先を見たら
SportsCar_PawnをPlayer AgentにしてSpartsCar_Pawn_PlayerをPlayerがControlする車にします。って衝撃な発言をしています。
え、じゃSportsCar_Pawnを直接改造しちゃったら駄目なの?
取りあえず先を見る事にします。
うーん。
5.5は5.3の設定とはかなり違います。
今回は、Learning to Drive (5.5) [14]で書かれている通りに実装出来てるかどうかの確認をします。
BP_SportsCarManagerのTagには

LearningAgentManagerと書かれていて
SportsCar_PawnのGet All Actors with Tagには

LearningAgentsManagerと書かれていました。
これでは見つける事出来ませんわ。
Tutorialで確認したらBP_SportsCarManagerのTagの方が間違っていました。

直しました。
テストします。
今度のErrorは以下のようなのが表示されました。
Blueprint Runtime Error: "Accessed None trying to read property ActActor". Node: Set Steering Input Graph: PerformAgentAction Function: Perform Agent Action Blueprint: BP_SportsCarInteractor
ChatGPTに質問したら
変数 ActActor が設定されていない(=null)状態なのに、それにアクセスしようとしたから。
だそうです。
BP_SportsCarInteractorのPerform Agent Action Blueprintを確認したら以下のAgent Idが切れていました。

直しました。
もう一回Testします。
またErrorです。
Blueprint Runtime Error: "Accessed None trying to read property CallFunc_GetAgent_ReturnValue". Node: Return Node Graph: GatherAgentCompletion Function: Gather Agent Completion Blueprint: BP_SportsCarTrainingEnv
これもAgent Idが繋がってなかったです。

今度のErrorです。
Blueprint Runtime Error: "Accessed None trying to read property RewardActor". Node: Return Node Graph: GatherAgentReward Function: Gather Agent Reward Blueprint: BP_SportsCarTrainingEnv
これもAgent Idが繋がってなかったです。

またTestします。
今度はErrorはErrorですが、一応動いてはいるみたいです。
LogLearning: Error: TrainingEnvironment_1: ResetAgentEpisode function must be overridden!
LogLearning: Warning: PPOTrainer_6: Agent with id 15 has completed episode and will be reset but has not generated any experience.
ChatGPTによると

という意味だそうです。
うーん。分かり易い。
こうやって解説してくれたら今まで理解出来なかった部分も氷解していきます。

いやでもこの回答は間違ってるでしょう。
流石にこんな基本的なMissはしないと思います。

してました。
この部分の実装をすっかり抜かしていました。
実装しました。
Testします。
今度は出来たようです。
10分位したら車が道路に沿って走る様になりました。

更に1時間学習させました。
まだCourseから外れますね。
この位で今週は止めておきます。
8. DirectX12の勉強
8.1 Lötwig Fusel氏のD3D12 Beginners Tutorial [D3D12Ez]を勉強する
8.1.1 先週の復習
先週は、Input AssemblerにおけるMemoryについて勉強しました。
以下に勉強内容をまとめます。
Input AssemblerにおけるMemoryで最も重要な内容は、DirectX12ではGPUのMemoryの管理においてResourceとHeapという概念が導入された事です。
ResourceはID3D12ResourceというInterfaceから生成されるObjectで、Buffer、Texture、そしてRenderTargetなどのGPU特有のDataの管理を担当します。
Heap(この文脈におけるHeap)は、Upload Heap、Default Heap、そしてReadback Heapに分類されます。
Upload HeapはCPU側にあるDataをGPU側のMemoryに移すためのHeapで、GPUもAccess出来ますがDefault Heapより遅いです。
Default HeapはVRAMの事で、GPU側からしかAccess出来ません。その代りUpload Heapより速いです。
最後のReadback HeapはGPU側にあるDataをCPU側に送るときに使用するそうです。今回はこれは使用しません。
注意しないといけないのは、CreateCommittedResource()関数を用いてResource Objectを作成する時です。
これは頂点DataをGPUに渡すのが目的ですが、この時にHEAP TYPEの指定でUpload Heap以外を選択するとErrorになります。
うーん。
大体は当たってると思いますが、一応ChatGPTに確認してもらいます。
ChatGPTの回答です。

以下に厳密に述べると間違ってる点が述べられています。

HeapとResourceの関係はInput Assemblerに限らず全Pipeline共通である事。
Upload Heap は CPU からアクセス可能なメモリに GPU リソースを作る方法 である。CPU側のDataをGPU側に移すという言い方は間違い。
CPU側のDataをGPU側に移すのはCopyBufferRegion()関数が行う。
Default Heapは抽象化された概念でVRAM使用は実装依存であるので断言は避けるべき。
Upload Heap以外を選択するとErrorになる事について。これはAPIの仕様違反エラーではなく、動作上の問題が発生する という意味合いなので、エラーが出るというより、期待通りに動作しない、あるいはアクセス違反と言うべき。
という事ですか。
かなり勉強になります。
以下にChatGPTが修正した文を貼り付けておきます。

成程。勉強になりますね。
8.1.2 Resources, Heaps & Copying | D3D12 Beginners Tutorial [D3D12Ez] [16]を勉強して実装もする
ここで述べている内容は既に理解してるので実装部分だけまとめます。
まずMain()関数の以下の場所に

Char*型のVariable、Helloを作成します。
当然実装もここでやってしまいます。

Char*型のVariable、Helloを作成しました。
何故か、私のProjectでは
DXwindow::Get().SetFullscreen(true);
が実装されてなかったので、これも追加しておきました。
一応、Testすると普通に動きましたが、画面がFullscreenで生成されます。
これは扱いづらいので、やっぱり消します。

Comment Outしておきました。
そしてHelloの保持してるTextをGPUにPassします。
ここでResource Objectを作成する必要が出て来ます。
Resource Objectを作成するに当たってDirectX12は以下に示した様に

沢山の関数が用意されています。
ここでは一番簡単にResource Objectを生成出来るCreateCommittedResource()関数を使用します。
![]()
CreateCommittedResource()関数のそれぞれのParameterは以下の様になっています。

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

このParameterは何を指定しれるのか分かりません。分かりませんが今は調べません。調べると全体像が分からなくなるからです。

Resourceを保持するためのObjectです。
ではこれを実装します。

しました。
CreateCommittedResource()関数が正常に動いてるのかCreateCommittedResource()関数のすぐ後にBreak PointをつけてProjectを実行して確認します。
uploadBufferがNullのままですね。

Tutorialでは

のようになっています。
特に間違ってる箇所は無さそうですが何故でしょう?
ChatGPTに聞いてみます。
6つの点を確認しろ。との回答が返って来ました。
一個ずつやっていきます。

hr E_INVALIDARG One or more arguments are invalid. HRESULT
となりました。
やっぱりErrorになっています。
ChatGPTは

と主張しています。
ので
rd.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
を追加して試してみました。
hr S_OK HRESULT
一発でOKになりました。
ChatGPT恐るべし。
Lötwig Fusel氏のD3D12 Beginners Tutorial [D3D12Ez]の勉強はここまでにしておきます。一寸時間が無くなってしまいました。
rd.Layoutの設定がTutorialにあるかどうかなどは来週確認します。
8.2 「DirectX 12の魔導書」を勉強する
8,2,1 「ID3D12GraphicsCommandList::CopyTextureRegion()Methodによる転送」を勉強する
なんとこの部分、 Resources, Heaps & Copying | D3D12 Beginners Tutorial [D3D12Ez] [16]で先週勉強したUpload HeapとDefault Heapを分ける実装を行っています。
凄い偶然の一致。
教科書の説明によると、ID3D12Resource::WriteToSubresource()関数はCPU主導でGPUに転送するUMAでは速いが、DMAでの転送には向いていません。
ChatGPTに質問したら以下の回答が返って来ました。

CopyTextureRegion()関数は、いきなりDefault Heapに書き込むのか。
教科書の説明はあまり分かり易くありません。
図は分かり易いです。
自分なりに理解した説明を以下に書きます。
CopyTextureRegion()関数を使用する場合のTextureのCPU側のMemoryからGPU側のMemoryに転送する方法は以下の手順に沿って行います。
- CPU側にあるTextureのDataをGPU側にあるmemoryのUpload BufferにCopyする。
- Upload BufferにあるTextureのMemoryを読み取り専用BufferにCopyする。
更に詳しく説明するとGPU側にあるmemoryのUpload Bufferと読み取り専用BufferはそれぞれResourceを作成してMemory領域を確保する必要があります。
そのためのResource Objectを作成する必要があります。
この後のそれぞれの作業も一辺に勉強してしまおうと思いましたが、結構な量があります。
これは来週以降に回す事にします。
今週の「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] Ryan Laley. (2022, October 27). Unreal Engine 5 Tutorial - Control Rig Part 1: Intro & Full Body IK [Video]. YouTube. https://www.youtube.com/watch?v=F6dOXkD2-h8
[4] Full-Body IK. (n.d.). Unreal Engine. https://dev.epicgames.com/documentation/en-us/unreal-engine/control-rig-full-body-ik-in-unreal-engine
[5] Jeremy Howard. (2022, July 21). Lesson 4: Practical Deep Learning for Coders 2022 [Video]. YouTube. https://www.youtube.com/watch?v=toUgBQv1BT8
[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] Add camera and sensors — Isaac SIM Documentation. (n.d.). https://docs.isaacsim.omniverse.nvidia.com/4.2.0/gui_tutorials/tutorial_gui_camera_sensors.html
[10] Interactive Scripting — Isaac SIM Documentation. (n.d.). https://docs.isaacsim.omniverse.nvidia.com/4.2.0/gui_tutorials/tutorial_gui_interactive_scripting.html
[11] OmniGraph — Isaac Sim Documentation. (n.d.). https://docs.isaacsim.omniverse.nvidia.com/4.2.0/gui_tutorials/tutorial_gui_omnigraph.html
[12] OmniGraph — Omniverse extensions. (n.d.). https://docs.omniverse.nvidia.com/extensions/latest/ext_omnigraph.html
[13] TopChannel1on1. (2024, July 3). plant factory the best tree generator is now free [Video]. YouTube. https://www.youtube.com/watch?v=LBSl_PMEBS8
[14] Learning to Drive (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
[15] jourverse. (2024, April 21). Unreal Engine 5.3: Machine Learning Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=387ym_2VLUA