
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用の3D Modelを以下の様に作成しました。

一応、完成したはずです。
Projectから確認します。

後側はまだ作成していませんでした。
今週はこれを直します。
2.1.2 屋根の外側のCorner用の3D Modelを完成させる
なんと以下の部分も前のままでした。

直しました。
内側の屋根も作成しました。

なんか醜いですね。
理由が分かりました。
瓦の凸の部分が直交してないから醜く見えるんです。
そしてその理由は前回作成したMeshが以下に示した様に

左右非対称だからです。
これを直します。
更に瓦は4つにします。

これでもう一回作り直します。
これでも合わないです。

と思ったら、そもそも棟の部分の重なり方が均等になっていませんでした。
棟を均等にしてもう一回内側の屋根を調整しました。

線が合うようになりました。
取りあえずはこれで作成してみます。

出来ました。
以下の箇所にずれがありますが、

このズレを直すと他の部分がもっとズレてしまいます。
ここはほっておきます。

こんな感じです。
後側です。

こっちは屋根の角度と長さがあってないですね。
でも重なっている部分は、まあ及第点を上げても良いんじゃないでしょうか?
角度に関しては、今日直した屋根の外側のCorner用の3D Modelの方が正しいはずです。
こっちに揃えるようにします。
これは来週やります。
今週はここまでにします。
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]の続きを勉強する
先週はDo You Want to Remove Just One Side of Your Building? | UE 5.4 P4 [1]の続きを勉強しています。
今週は先週勉強した内容を実装します。
<15:15 - Directional Wall Remover>
Regular Wallの実装の以下の場所にMerge Pointsノードを追加しました。

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

そしてAttribute PartitionノードのPartition Attribute Selectorsの値を$indexに変更しました。

このParameterについても何をやってるのかをそろそろ理解する時期です。
Copilotに聞いてみます。

ここでAttribute(属性)を指定するそうです。
そうなのか?
細かい説明もその後に続きます。

だそうです。

更に具体例で説明しています。

という事はIndex1はAttribute1と言うようにそれぞれのPointが一個だけPointがあるそれぞれのAttribute Groupに分類されただけですね。
更に補足として@と$の違いが説明されていました。

今度は新しいPCG_Graphを追加しました。

名前はPCG_RemoveNotAlignedとしました。
更にもう一個PCG Graphを作成しました。

こっちはPCG_CheckSameRotationと名付けました。
PCG_RemoveNotAlignedを開き、
Inputノードの設定を以下の様に変更しました。

LabelはInputのPinの名前の値を指定しています。これは分かります。
次のUsageは何を指定してるのか分かりません。
Copilotに質問します。
以下の様に質問しました。

回答です。

一発でこれは駄目だと分かります。
UsageにはDefaultでNormalがセットされています。InとかOutとかを指定する箇所ではないはずです。
更に言うとPin Statusは以下の3つから選択するようになっています。

でもこの機能は大体知っています。
RequiredにするとこのPinが繋がってないとErrorになるはずです。
一応、GPT5で質問したんですが駄目ですね。
ChatGPTの方はとっくにLimitを超えてしまっているのでCPT5では答えてくれません。
同じ質問をDeep Researchでやってみます。
更にChatGPTでも質問してみました。


Pin Statusの説明はあってそうですね。
Usageの機能だけがよく分かりませんね。
以下の質問をしました。

回答です。

要するにこのPinは普通のPinとして扱え。という意味なのか。
一応理解出来ました。
CopilotのDeep Researchはまだ思考中です。
差に進みます。
次にOutputノードを変更します。

こっちではPin StatusをNormalに指定していますね。
次にLevel上にTrigger Boxを配置します。

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

Trigger BoxにはTagが作れるところが2つあってActorの方に作る必要があります。
PCG_RemoveNotAlignedに戻り

Get Actor Dataノードを配置しました。
設定を以下の様に変更しました。

ここでも沢山のParameterの値を変更しています。
ModeにGet Single Pointをセットしてる意味が分かりませんね。
AIに聞いても頓珍漢な答えしか返ってこないし。
Cursorを乗せたら、ここで何をしてるのかの説明が出て来ました。

指定したActorのどんな種類のDataを集めるのかをここで指定する。と言っています。
そしてGet Single Pointを指定した場合は

Actorに対して一個のPointを生成するそうです。
Actor TransformとかBoundsはどんなDataなのかは分かりません。
Tutorialでは
ここでInputノードのUsageの設定をLoopに変更するのを忘れていたと言って変えました。
変えます。

なんと
Usageが選択出来る値は

Normal、Loop、そしてFeedbackの3つしかありません。
一寸、AIの回答全然違うじゃないですか。

Loop Subgraphノードを使用した場合、
Inputから入って来るそれぞれのDataは別なSubGraph上で実行される。
と説明されていました。
それがLoopの意味だったのか。
ちなみにNormalは

すべてのDataがそのままPassします。
と書いてありました。
さっきまではこの意味は普通のPinとして扱う。と理解していましたが、
Loopの意味を知って別な解釈が出来る事に気が付きました。
これはLoopと違って全てのDataを同じSubGraph上で処理するって意味じゃないでしょうか?
そして
Feedbackの意味ですが

When used in a loop subgraph node, will pass data on the feedback pins to the next iteration only if the data is passed from a previous iteration(or the original subgraph call).
をChatGPTに訳してもらいます。
ループのサブグラフノードで使用される場合、フィードバックピンのデータは「前のイテレーション(または元のサブグラフ呼び出し)」から渡された場合にのみ、次のイテレーションへ引き継がれます。
こっちもLoopでNodeを作成した時の説明です。
ただその後の説明の意味はよく分かりませんね。
今度はPCG Check Same Rotationノードを追加しました。

これはLoopで作成しました。
PCG_CheckSameRotationを開きました。
Inputノードの設定を以下の様に変更しました。

2つInputを作成しています。
それぞれのParameterはほとんど同じですが、Usageが違います。
PointsはNormalでOverlapsはLoopになっています。
Outputノードの設定も以下の様に変更しました。

うーん。
こっちはUsageはNormalなのか。
PCG GraphのParameterの使い方はまだ完璧に理解したとは言えないですね。
そしてPCG_RemoveNotAlignedに戻り、以下の様に組みました。

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

ここで以下に示した様に先週のBlogではPCG Remove Not Alignedノード内に戻り

と書いてありますが、これはPCG_CheckSameRotationに戻っていますね。
そしてGet Attribute From Point Indexノードを2つ以下に示した様に追加しました。

ここで先週のBlogの勉強は終わっています。
うーん。
疲れた。
2.2.2 Do You Want to Remove Just One Side of Your Building? | UE 5.4 P4 [1]の続きを勉強した感想
今週はPCG GraphのInputのParameterの機能位理解して終わりにしようと思っていたら、全然理解出来ませんでした。
まず頼りにしていた、AIの回答が全然正しくないです。
これはUE5の質問に対しては非常によくある事です。
Gaming Engineに関してのProgrammingは全く学習させてないみたいです。
InputのUsageがどんな機能なのかは全くの謎ではなくなりましたが、それなりに謎であるままです。
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]を勉強する事にしました。
今週はControl Rig [2]内のSpline Rigging [3]を勉強します。
2.3.1 Spline Rigging [3]を勉強する
Copilotに前文を訳してもらいました。

Splineを使用して蛇のようなうねる動作を再現する方法を勉強するみたいですね。
これはDragonの動きをLevel Sequenceで再現するのに役に立つかもしれません。
そして以下の図がありました。

これはControl Rig内で実装してるんでしょうか?
<Create Spline>
最初の文です。

Spline From Pointsノードを配置しました。

次の文です。

以下の図が追加で表示されています。

Control Rigの位置って勝手に決められましたっけ。
実際に試しながら勉強したいですね。
このタコの触手のような3D Modelはどこで手に入るんでしょうか?

円柱のModelにBone Chainを追加したものでも良いのか
それなら昔、Blenderで作成した事あるな。
今ならUE5でも作れそうです。
これもCopilotに聞いてみますか?

やっぱり最近のUE5はBoneを追加する事も出来るのか。
もう何でも出来るようになっていますね。
以下の手順で作れるそうです。

これだけでは分からない部分が出てくるかもしれませんね。
Bone Chain、UE5でYouTubeを検索してみます。
ない。
全然出てこない。
UE5、Boneで検索したら以下のTutorialがしっぽにBoneを追加する方法を教えているみたいです。

https://www.youtube.com/watch?v=MMe80uQr_Vg
一寸見てみます。

しっぽにBoneを追加していました。
これは出来そうです。
Tutorialの勉強に戻ります。


これはそのまま実行すれば出来そうです。
次の文です。

しかしAIの翻訳技術は凄いですね。
こんな文章が一瞬で出て来る訳ですから、人間の翻訳家は太刀打ちできる訳ないです。

付属の図です。
以下の注意が書いてありました。

これはTutorialを実行するには問題ないですね。
次行きます。


TutorialではAnimationで説明されていました。
ここまでがTutorialの最初の図で実装されていた内容になりますね。
ここからは何をやるんでしょうか?
<<Apply Spline to Bones>>
どうも生成したSplineをBoneと繋げるための実装をやるみたいです。


Fit Chain on Spline Curveノードを使用してSplineとBoneを関連付けるみたいです。


Boneの配列の順序がSpline Pointの順序と同じ必要があるそうです。


ここまで何の問題も無く理解出来ました。

はい。
<Spline Properties>
ここはSpline From PointsノードとFit Chain on Spline CurveノードのPropertyを説明しています。
Tutorialの実装自体は前の節で終わっているみたいですね。
<Spline Nodes>
Control RigにあるSpline関連のNodeがまとめられています。
これも、Tutorialの実装には関係ないです。
以上でした。
2.3.1 Spline Rigging [3]を勉強した感想
英文を読むのを止めて、はなっからAIが翻訳した日本語で勉強したら、短時間でTutorialの内容を理解する事が出来ました。
しかも疲れません。
これがAI革命か。
英語の勉強はやっても無駄ですね。
実装は来週やる事にします。
3. AIの勉強
AIの勉強の目的ですが、
生成AIが凄いTrendになってるので、最低限の基礎は知っておくべきと思いこの勉強を始めたんでした。
のでこれを勉強してどうしたいというのは無いです。
3.1 前回の復習
Lesson 5: Practical Deep Learning for Coders 2022 [4]を勉強しました。<00:26:46 - Setting up a linear model>まで勉強しました。
勉強するに当たって、以下の2つを副教材的に使用しています。
- NotebookLM
- Linear model and neural net from scratch(KaggleにあるJensen HowardのSite)
今週は、
翻訳した日本語で勉強した方が、時短になるし疲れないしで良い事尽くめなので
Lectureの内容とほぼ同じ事をやってるLinear model and neural net from scratchの説明文を翻訳して進める事にします。
理解出来ない時はNotebookLMに質問します。
訳はCopilotで行います。
3.2 Lesson 5: Practical Deep Learning for Coders 2022 [4]の続きを勉強する
<00:38:48 - Creating functions>


これだけ理解してればこの部分は十分です。
Tutorialでは追加の情報として、こういう計算を別なところでしてしまうと、半年後とかにこのCodeを見たら何をやったのか分からなくなるから、全部ここに書いておくべき。と言っていました。
そんだけです。
<00:39:39 - Doing a gradient descent step>


Epochの意味を忘れてしまいました。
一回計算する事だったと思うんですが一応確認します。

成程。
ModelがTraining Data Set全体を一回通って学習する事をEpochと呼ぶのですね。
更に言うと、それによって係数の更新と損失の計算の2つの結果が生成されます。
Tutorialの説明を聞きます。
coeffs.requires_grad_()関数にはGradの後に_が追加されていますが、この機能について説明しています。
しかし聞いてもよく分かりません。
NotebookLMに聞いてみます。

うーん。
大体理解出来ましたが、もっと腑に落ちる説明が欲しいですね。
インプレース操作の意味を説明してもらいますか。
今度はCopilotに質問します。

これはまあ前の説明でも理解しています。
次に以下の例が紹介されていました。

成程。
これは分かり易い。
こんな機能がPyTouchにはあるのか。
後インプレース操作はin-place operationの訳だそうです。
全然カタカナからじゃ想像つかない。
そして以下のMeritがあるそうです。

これは凄い。
しかし以下の点に注意して使用する必要もあるそうです。

これはまあ当然ですね。
確かにTensorが別なところで参照されてた場合、破滅的な間違いを引き起こしますね。
Autogradに関してはよく分からないですね。
更に更に最後で以下の説明もしてくれました。

この場合はCoeffsの値が変わるって事になります。
はい。
完璧に理解出来ました。
次です。

この短い文は流石に訳す必要は無いです。
うーん。
Loss関数を計算してるのか。
で計算結果のGrad_fn = <MeanBackward0>って何なんでしょう?
Copilotに聞いてみます。

あれ?
Lossの訳は損失係数か損失関数か忘れてしまいました。
これもCopilotに聞いておきます。

Loss Functionが正しいのか。
それは兎も角、grad_fn=<MeanBackward0>はどのように計算されたのかを示しているのか。
納得です。
更にCopilotはMeanBackward0の意味も説明してくれました。

ここまでで十分ですが、更に

まで教えてくれました。
成程。

まとめまであります。
凄い。

これでGradient値を得る事が出来たはずです。
次の実装です。

得たGradient値を確認しています。

同じStepを繰り返しています。
これって1Epochで何回も繰り返すのかな。それともこの作業を一回やるのがEpoch何でしょうか?
Copilotに質問して確認します。
回答が返ってきたんですが、結構複雑です。
今これを勉強するとドツボにはまりそうなので止めて次に進みます。
あれ?
Tutorialでは以下の様な計算をやっています。

Kaggleの計算とは違いますね。
確認したらKaggleはこの後にほぼ同様の計算をしていました。

これを先に勉強します。

え?
Tutorialでは
coeffs.grad.zero_()
は使用してないです。
もう一回Tutorialを見て確認します。
この点については何も言っていません。
うーん。
ま、いいや。
今回の勉強の目的は全体の流れを大体掴む事なので、細かい計算の正しい手法は後で検証する事にします。
今、検証しても後で忘れてしまうでしょうし。
<00:42:15 - Training the linear model>

validation setを作成するのか。

RandomSplitter()関数はFastAIの関数のようです。
Seedの値も指定していますね。
Lectureの説明も聞いてみます。
なんとこのRandomSplitter()関数はTitanicのDataを分析する事が目的で作られたそうです。
それじゃここで使うのは必然ですね。

Training用のDataが713、Validation用のDataが178に分けられたという事でしょうね。


Epoch一回分の作業がここでまとめられている。
これ見るとさっきの作業やっぱりEpoch一回分だったようですね。
Tutorialの方の式です。

こっちはcoeffs.grad.zero_()関数を使用してないですね。
それ以外は大体同じか。

先程作成した関数を使用してTrain_model()関数を作成しました。

作成したTrain_model()関数を実行した結果ですね。
lrはLearning Rateの事か。
今、気が付きました。
最後にそれぞれのColumの係数を表示させていました。

<00:46:05 - Measuring accuracy>


Validation用のDataの結果と学習で得たCoefficientを使用して計算した予測結果を比較してるんでしょうか?
Tutorialの動画を見たら違いました。学習で得たCoefficientを使用してValidation用のDataのLoss Functionを計算していました。


ここで言う予測値が、Loss Functionの値なのかその値を使って何かしたモノなのかが分かりません。
まあ、今は分からんでも良いですが、
予測値0.5以上で生き残ると仮定しました。

0.7865となりました。

予測の正確性を計算するための関数を作成しました。
感でやっても5割はあたるはずですので0.78が良い結果なのかは微妙です。

Tutorialの方は0.79になっていました。
これくらいなら一寸はマシになりますね。
<Using sigmoid>


はい。


おお、ここは今までの計算方法と違いますね。

このSigmoid関数を使用して予測値を調整しています。

今度の結果は0~1の間に収まっていますね。

この結果を使用して予測値を計算し直しました。
今度は0.82になりました。
予測の精度が向上しました。
ここで、Tutorialの動画も確認しました。
うーん。
特に記録しておく必要のある事は無いかな。
後はSigmoidを使用した場合、Clampを使用した時より有利な結果になるかどうかをCopilotに聞いておきます。

なるそうです。
そしてその理由ですが、結構面白いです。
理由を以下に示します。

この勾配が消えないというのは目から鱗です。
確かに0以下や1以上の値を切り捨ててしまったら、それらの値の勾配は0になってしまいます。
納得しました。

<Submitting to Kaggle>
またKaggle Competitionに提出する話だ。
これはやらないので簡単に済ませてしまいます。

Test用のDataを読み込みました。


次です。


この辺のDataの調整は、結構面倒ですね。

予測値が計算されました。


ここで結果をCSV Fileにして保存しています。

こんな感じになっています。
最後のまとめです。

これで提出できるのか。
Tutorialの方も確認します。
特に新しい情報とかは無かったです。
<Using matrix product>
なんかやる気が無くなってきてしまいました。
今週はここまでにして残りは来週やる事にします。
と思ったんですが、流石にここで終わりにしたら短すぎます。
もう少しだけやる事にします。


うーん。
これって何を見てるんでしょうか?
Copilotに聞いてみます。

だそうです。
あ、分かった。このTutorialでは予測値を計算していますが、その計算を手動でやってるんだ。


この計算が先程の計算と同じって事?
Copilotに聞いたらその通りだと回答が返って来ました。

更に両方の計算の順序の違いについて解説してくれました。

これってでも裏の計算は一緒かもしれませんね。
次の文です。


なんとこっちの方が高速に計算出来るそうです。
うん。何で?
GPUでも使用して並列で計算してるの?

CPUだけでも早いみたいですね。
なんか最適化に工夫があるみたいです。

ああ、行列同士の計算にするには、Coeffも一列だけのVectorに変換する必要があるのか。
成程。

でこの実装の意味なんですが、ものすごく沢山Copilotに質問しました。
でもあまりに長くなるんでここにはまとめません。
復習したくなったらCopilotの以下のChatを見直します。

次の文です。


これもVector化してるんですね。
大体分かって来ました。
(N,1)という2次元TensorはVectorと同じになるんです。
Copilotに聞いたらあくまでもPyTouchはそういう風になってるそうで、数学的には厳密に言うとそうではないそうです。
で

となる訳です。

ここで分からなくなった。
今までVectorで計算した方が効率がいいのでVectorで計算出来るように値をVector化していました。
でいきなりTrain_model()関数で学習を始めたんですが、これって今までのVector化した値を使用してるの?
それとも今までの説明はTrain_model()関数内で実行されている計算を手動で説明したもの?
最後に結果が示されています。

うーん。
まあ、Lectureの内容をざっと理解するという本来の目的からすれば十二分に目的は達成出来ましたが、なんかまだ腑に落ちません。I haven't grokked it yet.って感じです。
一応、Tutorialの動画も確認しました。
特に追加でここに記録しなければならない内容は無かったです。
今週はここまでにしておきます。
頭もあんまり働かなくなって来ましたし。
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 [5]の勉強
Version 4.2.0のIsaac Sim Documentation [6]のTutorialの勉強がROS and ROS2まで終わるまでPending。
WorkspaceのInstall方法並びに、Installした後の確認方法は理解したので時間があったらWorkspaceだけInstallしておきます。
ただし今週も他にやる事が沢山あるのでやりません。
4.2 Version 4.2.0のIsaac Sim Documentation [6]のTutorialの勉強
4.2.1 先週の復習
Isaac Sim Extension Templates [7]の勉強を継続しています。
以下のRun Buttonの手前まで勉強していました。

4.2.2 これからの予定
これをこのまま勉強していったらIsaac SimのReinforcement Learningの勉強をするまでに更に一年かかってしまいます。
今年の10月からはOmniverse LauncherがDeprecatedします。そうしたらIsaac Simの5.5とIsaac LabをInstallし直します。
その時までにIsaac SimのReinforcement Learningのやり方を一通り理解しておきたいです。
このままこのやり方で勉強を続けていたら、今年の10月までにIsaac SimのReinforcement Learningのやり方を一通り理解しておく事は出来ません。
今週の始めか先週の最後かの辺りにChatGPTに以下の質問をしました。

この質問の会話の中で、ChatGPTがIsaac SimでReinforcement Learningをやるのに必要な勉強について語っている部分があります。
更にYouTubeの動画でIsaac SimでReinforcement Learningをやっているのがありました。
これらの内容を参考にしてこれから何を勉強するべきなのかをまとめる事にします。
<ChatGPT「PolicyとModelの違い」でのIsaac SimでReinforcement Learningをやるのに必要な勉強のまとめ>
以下の部分の質問での回答です。

そして以下の勉強方法を進めて来ました。

そしてROS2に関しても

と回答しています。
これを参考にしてIsaac Sim Documentation [6]のTutorialの必要なところだけ勉強したらいいはずです。
Isaac Sim Documentation [6]のTutorialを見てみます。
うーん。
確かにIsaac LabのTutorialが以下に示した様にあります。

ただしここに到達するまでに

こんなに沢山のTutorialが間にあります。
これを無視して先に進むのか。
<Isaac Sim & Isaac Lab: Full Guide to Building & Training Robots [8]を勉強する>
以下の動画にIsaac SimとIsaac Labを使用してReinforcement Learningをやる方法が説明されています。

これを勉強するのもありかもしれません。
もう9月です。
10月にはIsaac Simの5.5とIsaac LabをInstallし直して5.5で勉強し直します。という事はこの動画を勉強しておくのが一番近いのかもしれません。
今日を入れたら10月までに後4回勉強出来ます。
60分の動画なので4で割って、一回15分ずつ勉強したら10月前にこのTutorialの勉強が終わります。
これなら現実的に出来そうです。
4.2.3 Isaac Sim & Isaac Lab: Full Guide to Building & Training Robots [8]を勉強する
<0:00 – Intro>
まずNotebookLMにIntroの内容を要約してもらいました。

大体こんな感じの内容でした。
追加の情報で重要な事を以下にまとめると

の順で勉強します。
ここで重要なのはOmniverse Launcherを使用しないでIsaac SimとIsaac LabをInstallする方法です。
前にこの動画を見た時に公式Siteのやり方が紹介されていました。
そのSiteのURLもきっちり調べておく事にします。
<4:47 - Installing Isaac Sim>
今週の勉強でもっとも重要なところです。
まずはNotebookLMに要約してもらいます。

Isaac Simを2つInstallしてるのか。
そういう事も出来るんですね。
では動画を実際に見てみます。
まず以下のSiteにある

Compatibility Checkerで使用するPCでIsaac SimとIsaac Labが動くのかを確認します。
このSiteが知りたかった。と思ったらこの5.0.0のDocumentみてやっています。
これは駄目でしょう。
自分で探します。

と思ったら、Isaac Simの最新版は5.0でした。自分が勉強していたのは5.2じゃなくて4.2でした。
なんでこんな間違い今までしてたんでしょうか?

https://docs.isaacsim.omniverse.nvidia.com/5.0.0/installation/quick-install.html
ありました。
ここにあるCompatibility Checkerを使用すればこのPCの性能でもIsaac Simが使用出来るのかの確認が出来るのか。
出来るに決まってるじゃん。
と思っていますが一応確認する事にします。
DownloadしたZipを解凍すると以下のFileが入ってるそうです。

これを実行します。
以下の様にTerminalとWindowが表示されるそうです。

全部が緑色だったらOKだそうです。
自分のPCのGPU、RTX3070tiですけど。
VRAM足りないかもしれない。
でも強引にやる事にしますけど。
ここでIsaac SimをDownloadして更にIsaac Labを使用する時にもIsaac SimをDownloadしたそうです。
やり方は以下に示した先程の公式Siteに書かれている通りにやったそうです。

C DriveのFolderを調べたら以下に示した様にIsaac Simと言うFolderは今のところ無いですね。

このTutorial通りやっても問題なさそうですね。

これを実行するそうです。
何時ものIsaac SimのWindowが開きました。

こんだけか。
思ってたのよりかなり簡単です。
さらにShortcut IconをDesktop上に作成していました。

これ絶対必要です。
<6:59 - Isaac Sim interface>
流石にここは勉強しなくて良いでしょう。
一応、NotebookLMに要約させてみます。


大体は知ってる内容ですね。
一応、動画も確認します。
Physicsを追加する時の設定方法だけはここにまとめておきます。
Objectを選択してそのObjectのPropertyを表示して以下の設定を選択します。

全部動画を見ましたが、NotebookLMの要約の通りでした。
この要約は非常に正確でしかも簡潔でした。
<9:14 - Examples and assets>
これもNotebookLMに要約してもらいます。


まずどんなRobotが使用出来るのかの確認が必要ですね。
普通に以下のAssetsから確認していました。

そんな簡単に出来るようになったの?

でもここから追加したObjectは単なるMeshのようですね。Simulationには対応してなさそうです。
WindowからExamplesを選択してRobotic Examplesを選択した場合は

以下のTabが開き

以下のようなSimulation可能なRobotが使用出来るようになります。

お、このRobotは前に操作した事がありますね。
二足歩行のRobotのSimulationも例として示していました。

5.0になってOmniverse Launcherを使用しなくなったからと言って、4.2から全く変わった訳じゃないという事が分かりました。
今までの勉強が無駄になった訳ではなさそうです。
安心しました。
しかもこれらのRobotのSimulationを実行するために使用してるUIが

先週まで勉強してたLoaded Scenario TemplateのExtensionと同じです。
この辺も根本的な内容は変わってないという事のようです。
<12:10 - Installing Isaac Lab>
NotbookLMの要約です。

成程。
動画でも確認します。
以下のSiteの情報を参考にしてIsaac LabをInstallしています。

探してみます。
有りました。

https://isaac-sim.github.io/IsaacLab/main/source/setup/installation/pip_installation.html
ここでもっと詳しいInstall方法を説明してくれるのかと思ったら出来ました。で終わってしまいました。
CopilotにこのSiteの方法に従ってInstallするつもりだ。と言いました。
すると以下の様に詳しいやり方を説明してくれました。

一個ずつの手順の説明です。



もうこれ通りにやったら完璧に出来ますね。
今週のNvidia Omniverseの勉強はこれで十分です。
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 前回の復習
先週、何を勉強したのか全く覚えていません。
Blogを読み直して復習します。
Houdini is HIP - Part 14: Flip Fluids I [9]の続きを勉強していました。
<22:18 Sticking on Collision>から<25:47 Continuous Particle Sourcing>の最後までを勉強しました。
という事は今週はこの部分の実装を行います。
6.2 Houdini is HIP - Part 14: Flip Fluids I [9]の続きを実装する
FlipSolverノード選択して

Tangent Scaleの値を0.2に変更しました。

結果です。

Particleの広がり方が均一でなくなりました。
FlipObjectノードを選択し
GuideからParticleを選択します。

Visualization AttribにVがセットされている事を確認しました。
<25:47 Continuous Particle Sourcing>
FlipObjectにあるInitial DataのSOP Pathの値を消します。

消しました。
Popsourceノードを以下に示した様に追加しました。

そしてPopsourceノードの以下の場所からSOURCEを指定しました。

PopsourceノードのBirth Rateを見ると5000になっています。

これでFrame毎に5000のPointを生成するようになりました。
Testして確認します。

何も生成されません。
Tutorialを見直して確認しました。
PopsourceノードのSourceにあるEmission TypeがPointsに変更させられていました。

これを忘れていたんです。
直しました。
もう一回Testします。

出来ました。
更にPopsourceノードのSourceにあるGuideをOffにする事で

空中に表示されていたPointの発生位置を示す、青い球状の塊を消す事に成功しました。

Birth Rateを50,000に増やしてみました。

結果です。

Tutorialと比較するとあまり迫力がありません。

よく見たら、TutorialはBirth Rate の値を50,000ではなくて500,000にしていました。
直しました。
もう一回Testします。

こっちは凄い迫力でした。
FlipObjectノードのParticle Separationの値とPopSourceノードのBirth Rateの値の関連を説明しています。
まず今の状態のParticle Separationの値は0.0125です。

PopSourceノードのBirth Rateの値は変えてないので500,000です。
この条件で生成されるPointの値を、FlipObjectノードのInformationから調べると
以下に示した様に

1,203,609になっていました。
そして
FlipObjectノードのParticle Separationの値を0.04に変更すると

以下に示した様に65,610に変化しました。

見た目も以下に示した様に凄い変わっています。

FlipSolverノードのReseedingを見ると

Reseeding ParticlesにCheckが入っています。
この結果、Simulation中のParticleの数を一定に調整するために、Particleを増やしたり減らしたりする調整が入るそうです。
ここで先週のBlogには

と書いてあり、
最後に

PopSourceノードを消して終わっていました。
そうか。
これは次の話題の話になるからこれは実装しないで終えておきます。
今週のHoudiniの勉強はここまでにします。
7. AIについての調査(ComfyUIの勉強)
AIを使用するためのSoftが大量に公開されていますが、それらについて全く理解していません。
3Dやイラストそして動画関連のAI Softについて、どんなSoftが公開されているのか?それらのSoftを使用するとどんな事が出来るのか、どんな方法で操作するのか、
などの一通りの事を勉強しておこうと思い、この章を特別に作りました。
特にComfyUIの使用方法やそれに関して生成出来るイラストや映像について集中して勉強していこうと思っています。
2025-03-30のBlogでUE5でもReinforcement Learningが出来る事を知りました。
のでComfyUIの勉強は一端中止してこっちを勉強する事にします。
今週は、先週勉強した Improving Observations & Debugging (5.5)[10]の勉強の続きをします。
7.1 先週の復習をする
先週、何をやったのかまったく覚えていません。
先週のBlogを読み直します。
Improving Observations & Debugging (5.5)[10]を最後まで勉強していました。
ここでは新しいDebugging の方法やVisual Loggerについて学びました。
ただし、実際に試してはいません。
それはImproving Observations & Debugging (5.5)[10]で改良した実装を、実行したら大量のErrorが表示されたからです。
そこで先週のBlogには

と書いてありました。
更に
これからの勉強予定として

が書かれていました。
これを整理すると
今週、
- Bugを直して改良したCodeでReinforcement Learningが出来るようにする
来週以降、
- 先週、Improving Observations & Debugging (5.5)[10]で勉強したDebugging の方法やVisual Loggerを試す
- 実装内容がかなり理解出来るようになったのでLearning Agents (5.5)[11]に戻ってLearning Agents Training Environment以降の実装をもう一度勉強し直す
をやるようにします。
7.2 Bug取りをする
取りあえずProjectを立ち上げてPlayを実行してみます。
こんなErrorが表示されています。

肝心の画面の方ですがこんな感じです。

全く動きません。
しばらくほっておいてみます。
変化ありません。
Errorを直していきます。
Blueprint Runtime Error: "Accessed None trying to read property ObsActor". Node: Set SampleDistance Graph: GatherAgentObservation Function: Gather Agent Observation Blueprint: BP_SportsCarInteractor
まずはこのErrorです。
BP_SportsCarInteractorのGatherAgentObservation FunctionのSet SampleDistanceノードがErrorを発しています。

ErrorはObsActorノードに値が正しくセットされてない。と言っています。
同じ関数内でSet Obs Actorノードを見つけました。
Get AgentノードのAgentIdが-1になっていました。
Sample CodeではGather Agent ObservationノードのAgent Idの値がPassされています。
直します。

出来ました。
もう一回Testします。
今度はErrorは出てないみたいです。

しばらくほっておきます。
20分位たったら車がSmoothに走っていました。

Bugは直ったみたいです。
7.3 <Debugging & Visual Logger>を試してみる
Visual Loggerを開いてみます。
Playを押した後にVisual LoggerのStartを押しました。

Pauseを押して、LocationAlongSplineObservationを選択し、更にtickを一つ選択しました。

この状態でgame viewportをClickして、更にF8をClickします。

Tutorialでは

が表示されています。
多分こっちです。

まずF8はViewportをTop Viewに変更するだけです。
そしてLocationAlongSplineObservationを選択します。これ上から2番目じゃなくて4番目でした。
でも一応出来ました。
Improving Observations & Debugging (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 先週の復習
まず先々週の勉強で、VS 2020をUpdateしたら色々問題が発生して予定していた勉強が出来なくなってしまったので
勉強する予定の内容だけ記しておきました。

先週はこの予定の<1. Tutorialの動画の続きを勉強する>をしました。
今週はこの先週勉強した内容を実装します。
8.1.2 Resources, Heaps & Copying | D3D12 Beginners Tutorial [D3D12Ez] [12]の続きを実装する
以下の部分の実装を行う所からやります。

この部分には以下に示した実装が既にされていますが、

これは一端消します。
そしてTutorialと同じ実装を以下の様に追加します。

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

Break Pointを設定して実際に動くかどうかを確認します。
![]()
という事は正常に動いているという証拠です。
次にMemcpy()関数を使用して

uploadBufferAddressの値のAddressにHelloを保存させる実装を追加しました。
今度はRelease ModeでBuildします。
で
Nsight Graphicsで確認します。
Buffer1のMemoryを開きました。

何か書き込まれている事が確認出来ました。
ここからCPU側のResourceに書き込まれたHelloをGPU側のResourceに移すための実装を追加します。

まず以下のBegin Drawingにある

cmdListのAuto*を消します。

そして以下の場所のAuto*付きで同じCodeを追加します。

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

やっとここでCopyBufferRegin()関数を使用しました。
先週のBlogには以下の様に書いてありました。

うーん。
これはまた後でやる事にします。
次の工程ですが、これがまた問題です。
先週のBlogには以下の様に書いてあります。

Tutorialの44:20~45:31当たりの場所です。
そして
別にErrorになってないので変えなくても良いと言って終わっています。
つまりこの部分は直す必要は無いんですが、何を言ってるのか分からないです。
ここでsight Graphicsを使用してTestします。

今度はBuffer2の値を調べます。
これはDefault Heapの値を表示してるのでここに値が書き込まれているという事は、GPU側のMemoryにHelloの値がPassされたという事を示しています。
おお、出来てますね。
結構感動です。
8.2 「DirectX 12の魔導書」を勉強する
8.2.1 「ID3D12GraphicsCommandList::CopyTextureRegion()Methodによる転送」を勉強するに当たっての問題
今週は今までの経過をまとめる事にします。
「5.12.1 Upload用のResourceの作成」では
ID3D12GraphicsCommandList::CopyTextureRegion()関数を使用してUpload用のHeapからDefault用のHeap、つまりCPU側のMemoryからGPU側のMemoryにDataを移動しています。
これを実装しようとしたら、Sample CodeではWriteToSubresource()関数を使用してやっていました。CopyTextureRegion()関数は使用していません。
で、ChatGPTに色々質問すると
CopyTextureRegion()関数を使え。こっちが正しいやり方と言って来ます。
で、D3D12 Beginners Tutorial [D3D12Ez]ではどうやってTextureのDataをGPU側のMemoryに送るのかを確認してからどっちの関数を使用するのか決定しようと、Pendingしました。
で先週明らかになったんですが、
CopyBufferRegin()関数
を使用していました。
「DirectX 12の魔導書」で使用したWriteToSubresource()関数やCopyTextureRegion()関数とも違う関数を使用していました。
何で?
と思ってCopilotに質問してみました。

対象とするResourceが違う。
簡単に言えば、BufferとTextureで使用を分けていると言っています。
それだけです。
言われてみればそうですね。
D3D12 Beginners Tutorial [D3D12Ez]では今、BufferのDataをGPU側に送った段階でした。
複雑な構造なので、こういう重要な工程が逆に見えなくなってしまいます。
で、「DirectX 12の魔導書」でBufferのDataをGPU側に渡すのにはどんな関数を使用したのかを確認したところ、
よく分かりません。
以下の場所でBuffer用のResourceを作成して

その後、Map、Copy、そしてUnmapまではしています。

この先に
CopyBufferRegin()関数が使用されるのかと思ったんですが、されてないです。
この続きは

となっていてIndex用のResourceの作成が始まっています。
うーん。
分からん。
そもそもUpload用のResourceしか作成して無いので、Default用のHeapにDataを写す事は出来ないですが、GPUはどうやってこのDataを受け取ってるの?
教科書でこの部分の実装を説明してる部分を探したら見つかりました。
「4.3 頂点Buffer」で説明しています。
まず読みます。
読みました。
Upload用のHeapに頂点のBufferのDataを渡したので、これでGPU側にDataを渡す事は出来た。と書いてありました。
その上で、本当にDataがわたったのかどうかを確認するために、一気に頂点を表示するための実装を紹介しています。
うーん。
これはCopilotに質問して確認します。

出来るって。
そう言えばUpload用のHeapってCPUとGPUの両方からAccess出来るんだから、出来て当然です。
しかし

それをやると遅くなります。
成程。
でもこの部分は理解出来ました。
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] Spline Rigging. (n.d.). Unreal Engine. https://dev.epicgames.com/documentation/en-us/unreal-engine/control-rig-spline-rigging-in-unreal-engine
[4] Jeremy Howard. (2022, July 21). Lesson 5: Practical Deep Learning for Coders 2022 [Video]. YouTube. https://www.youtube.com/watch?v=_rXzeWq4C6w
[5] NVIDIA Isaac Sim - MUSHR RC Car - Ackermann Tutorial. (n.d.). YouTube. https://www.youtube.com/playlist?list=PL60qgWqGu6k82AJ2SDWOscEKLjCc5tdEW
[6] Isaac SIM UI and workflow Tutorials — Isaac SIM Documentation. (n.d.). https://docs.isaacsim.omniverse.nvidia.com/4.2.0/introductory_tutorials/index.html
[7] Isaac SIM Extension Templates — Isaac SIM Documentation. (n.d.). https://docs.isaacsim.omniverse.nvidia.com/4.2.0/advanced_tutorials/tutorial_extension_templates.html
[8] Nikodem Bartnik. (2025, August 29). Isaac Sim & Isaac Lab: Full guide to building & training robots [Video]. YouTube. https://www.youtube.com/watch?v=tQziqSx-F80
[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