1.今週の予定
今週もこの順序に従って勉強していきます。
- 映像作成用UE5の勉強
- AIの勉強
- Nvidia Omniverseの勉強
- Gaeaの勉強もしくはVroidとUE5の勉強
- Houdiniの勉強
- AIについての調査(ComfyUIの勉強)
- DirectX12の勉強
それぞれの勉強の最初にその勉強をする目的を一寸だけ書いておきます。
2. 映像作成用UE5の勉強
2.1 PCGを使用した神社の作成
PCGで建物を作成する方法を勉強してるので、その応用としてPCGで神社を作成する事にしました。
最終的にはUEFNのMap内で神社を作成して、だれでも参拝出来るようにするつもりです。
2.1.1 屋根の追加
先週までで瑞垣を以下のところまで作成しました。
今週は屋根を追加します。
まずは
にある屋根の部品を確認します。
なんか凄いあります。
完成した建物をみて確認します。
何と建物が5種類もありました。
一番手前の建物が形状的に近そうです。これの屋根を調べます。
あれ?
この建物の形状は一寸変です。
本当の塀はどんな屋根がついてるか確認します。
こんな感じで綺麗な角が出来てました。
うーん。
どうやらこの辺のPartsは自分で作成しないと駄目みたいですね。
屋根の構造を説明するのにそれぞれの部位の名称が分からないと文に出来ません。
この屋根を元にして名称を書き込んでいきます。
以下の部分を棟と呼ぶそうです。
屋根の頂点の部分です。
屋根の端にも部分的に頂点になってる箇所があります。
最も大きい棟を大棟とは主棟と呼び、小さい頂点を隅棟と呼ぶそうです。
更に以下の棟もあるそうです。
これらは以下の部分を言うそうです。
この辺が瑞垣を作成するには必要ないですね。
以下の先の部分は軒先と呼ぶそうです。
神社の軒先には以下の特長があるそうです。
その間は平部と呼ぶそうです。
以下の正面の部分を妻と呼ぶそうです。
更に以下の様に屋根と屋根が重なってる部分を谷と呼ぶそうです。
大体Imageがつかめて来ました。
まず棟があります。
瑞垣を上から見ると、棟がこんな感じで四角くあります。
その棟の左右に平部があります。
こんな感じです。そして重なってる部分が谷が形成されます。
つまり谷のあるCornerだけ別なMeshで作成すれば良いはずです。
Corner以外の屋根は以下の部分のStatic Meshで代用出来そうです。
特に棟は
で作成出来そうです。
GreyRooftop_Longと言う名前でした。
以下の土台の上に棟の位置を示すPointを生成する事からやることになりますね。
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 Isolate Corners With PCG To Create Pillars and Roofs | UE 5.4 P3 [1]の次の6分を実装する
先週勉強した内容を実装していきます。
<09:29 - Tip Regarding Pivots and Modular Assets>
PCG_BuildingのDataAssetを確認します。
あれ?
普通にDA_RegularBuildingがセットされています。
DA_RegularBuildingを確認します。
MyPillerがRoof Border Wallにセットされていました。
うーん。
一応、一回外して付け直しました。
Roof Boarder Wallを作成していきます。
以下の実装を追加しました。
Tutorialの実装と全く同じです。
以下のPointが生成されました。
PointのSizeを変更します。
Get Property From Object PathノードがRoof Border Wallの値を取得出来ないでErrorになり色々調べる羽目になりました。
原因はDA_RegularBuildingにはRoof Border Wallと書かれていますが、PDA_ModularBuildingにはRoofBorderWallと書かれていて、こっちが正しいProperty Nameだったんです。
うーん。
バカみたいな原因ですが発見するのに結構時間取られました。
BP_PCGBulidingにRoof Boarder WallのDepthを指定するVariableを追加します。
しました。
設定もTutorialと同じにしました。
Roof Border Wall Heightの初期値が先週のBlogには書いてなかったのでThicknessと同じ100にしました。
作成したVariableの値をPCG Scale Wall SizeノードのWidthとDepthに追加しました。
更にStatic Mesh Spawnerノードを追加します。
Static Mesh Spawnerノードは以下の設定を変更しました。
結果です。
なんかずれてる気がします。
Roof Boarder Wall に使用したMyPillerのPivotです。
私はPivotが一番下の真ん中にあるのが好きなので、これはこのままにしてPCG_Buildingの実装から直す事にします。
以下の様な実装を追加しました。
直してから気が付いたんですが、先週のBlogでも全く同じ実装していました。
結果です。
ぬぐ。
なんだこれは。
別なStatic Meshを使用する事にします。
流石にこれは変です。
以下のStatic Meshを新たに作成しました。
MyBorderWallと名付けました。
これをMyPillarの代わりに使用します。
変らない。
何で?
あ、X軸に長くする必要があったのか。
新しくMyBorderWall2を作成して
それを使用します。
結果です。
Materialが潰れるのは直りました。
ただ流石に100cmの高さは高すぎです。Roof Border WallのSizeを調整します。
結果です。
Corner Pillerの部分を実装します。
結果です。
CornerにPointが取れました。
PointのSizeを変更するための実装を追加します。
更にStatic Mesh Spawnerノードを追加しています。
結果です。
ずれがありますね。
このズレを直すためにRoof Border Wallの方を調整します。
以下の実装を追加しました。
TutorialはWall Sizeの値を2で割っていませんが、ここでは割らないと正しい位置に移動しません。
これは使用してるStatic MeshのPivotの位置がTutorialと違うために起きたと考えられます。
結果です。
Roof用の壁が出来ました。
Roof Wall同士の隙間は私のProjectでは発生していません。
この部分の実装は無視します。
その代り以下の部分で必ずStatic Meshが重なってしまいます。
これは来週検討する事にします。
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 [2]にあるControl Rig Quick Start [3]の実装を行いました。
簡単なTutorialでありながらControl Rigの目的とその基礎的な使い方をしっかり理解する事が出来ました。
Dragonの爪のAnimationをいじるためには、IKのControl Rigに関して勉強する必要があります。
Control Rig [2]にあるTutorialを見ると
というIKに関してのTutorialもしっかりありました。
ただかなり後の方で、途中を飛ばしてここだけ勉強すべきか、順番にここだけ勉強すべきか悩みどころです。
更に先週のBlogの最後には
と書かれていました。
これって今考えてみると、Startを押してGameとしてAnimationを使用した場合は、Collusionが働きますが、Level Sequenceから起動した場合のCollusionについてはどうなるのか全く分かりません。
結構調べる価値はあると思います。
これは今週調べます。
更に
とも書かれていました。
これも調べる事にします。
2.3.2 Level Sequence内のAnimationとCollusionの関係についての調査
まずはこれから調べる事にします。
ChatGPTに質問しました。
まあ、当然です。
ところがここからChatGPTの凄い所です。
以下の方法でCollisionをLevel Sequenceから使用する事が可能だそうです。
ここで説明されてる内容のどれも知りません。
こっちこそ勉強すべき内容だったのかも。
もっと具体的に説明しろと出て来ましたので以下の様に説明しました。
本当はAsphalt Concreteの上を歩いてるですが、岩と言った方が通じると思い岩に変更しました。
そしてChatGPTの回答です。
足IKが機能してない。となっていますがどういう事でしょう。足IKを指定する必要がそもそもあるのが分かりません。
解決策として以下の説明もしていました。
これってLevel Sequenceの話なんでしょうか?
Level Sequence上でIKを使用して歩けるのかどうかがですね。
もしIKを使用出来るならここで言ってる解決策がそのまま通用出来る可能性が高くなります。
更に以下の解決策も示していました。
最後に、今私が考えているControl Rigを使ってAnimationそのものを書き換えてしまう方法も出て来てますね。
ただしこのやり方は上級者専用と注釈がついていました。
そして結論として以下の様にまとめていました。
おお。
このやり方こそ今すぐやるべき内容かもしれません。
取りあえず、この話題はここで保留して、この続きは来週考えます。
2.3.3 Get Transform ControlノードのSpaceの値はGlobal Spaceで良いのか?
この問題について調査・検証します。
先週のBlogには以下の様に書かれています。
これは先週勉強したTutorialであるControl Rig Quick Start [3]で
しっかりそう書かれています。
つまりGet Transform-ControlノードのSpaceの値はGlobal Spaceで正しいです。
しかし2025-03-23のBlogを見ると以下の様に書かれえています。
Tutorialに書かれている以下の実装を
を試すと
となってしまいます。
しかしここで
Get TransformノードのSpaceをLocal Spaceに変更したら
以下に示した通り、直りました。
ああ、逆か。
TutorialにはGet Transform-ControlノードのSpaceの値はGlobal Spaceが正しいと書かれていたにもかかわらず、この値をLocal Spaceに変更しないと使用してるSkeletal Meshの3Dが変になってしまいます。という話です。
だったらこれはこの時の私の設定方法が間違っていたのか、もしくはこのModel特有の問題かのどちからです。
Control Rigそのものの問題では無いです。
はい。解決です。
2.3.4 Control Rig [2]の勉強
どのTutorialを勉強するかですが、Control Rigの全体の構成は以下の様になっています。
最初から順番に勉強しても大した量では無いです。
更にSpline Riggingのような役立ちそうなTutorialもその後に控えています。
順番に読んでいきます。
Rigging with Control Rig [4]を読みます。
ここはこれから始まる色々な節の全体的な説明で、特に何か具体的に説明する事は無さそうです。
<Create Control Rig Asset>
Control Rig Assetの作成方法が説明されていました。
Skeletal Meshを選択してCreate->Control Rigで生成する方法です。
このやり方は既に何回かやっています。
更に別な方法でControl Rig Assetを生成する方法も載っていました。
AnimationからControl Rigを選択して、その後でSkeletal Meshを指定しています。
こっちのやり方はやった事ないです。
<Rigging Features>
この節になったらなんと
以下に示したようにこれから勉強するTutorialがずらっと並んでいました。
そういう事か。
今週のControl Rig [2]の勉強はここまでにして、それぞれのTutorialは来週からやる事にします。
3. AIの勉強
AIの勉強の目的ですが、
生成AIが凄いTrendになってるので、最低限の基礎は知っておくべきと思いこの勉強を始めたんでした。
のでこれを勉強してどうしたいというのは無いです。
3.1 先週の復習
Lecture 3(Lesson 3: Practical Deep Learning for Coders 2022[5])の復習をしています。
Lectureで勉強したのが勾配降下法(Gradient Decent)である事を確認しました。
Lecture 3で勉強したのはこの勾配降下法(Gradient Decent)だけではありませんが、これが肝です。
この後にReLuの計算もしていますが、これはーの値は0に変換してるだけです。
今週はLecture3の内容を復習して勾配降下法(Gradient Decent)以外の話題をまとめて、それが終わったらLesson 4: Practical Deep Learning for Coders 2022 [6]を勉強します。
3.2 Lecture 3(Lesson 3: Practical Deep Learning for Coders 2022[5])の勾配降下法(Gradient Decent)以外の話をまとめる
まとめるに当たってNotebook LMが作成した以下のMindmapを使用します。
Lesson 0の話です。
これは確か動画かBlogでこのLectureを勉強するために必要なTipがまとめられていたはずです。
ただこのLecture自体がAIが補助教材としてこんなに強力な存在になる前に作られたものです。
今のような強力なAIのSupportがある時代にこのような資料が絶対必要かどうかは疑問です。
まあ気になったら復習する位で十分でしょう。
次はPaperspaceの話です。
これ電話番号を登録しないと使用出来ないんだような。
ここでJupyter Labの使用方法を一通り説明しているんですが、これもまあいいや。
Paperspaceが有名になったら、もしくは有名である事が確認出来たらここに戻って勉強し直します。
Lession 2の復習です。
TrainingはModelを生成するまでの過程で、DeployはそのModelを使用してAppを作成する過程を示します。
次です。
Modelを作成するに当たって使用するArchitectureの選択について説明しています。
これをするのにTimmを使用する必要があります。
これは一回ぐらいは試した方が良いですが、AIの強力はSupportがあれば必要な時にすぐ出来るはずです。
Passして問題無いです。
Model.pklの内容です。
これも結局は最後の計算方法を示すために何でこんな沢山の数字を保持してるのかを示しただけです。
敢えて覚える必要は無いです。
行列への変換です。
Parameterと式の数が多くなれば自然と行列で計算するようになりますが、行列特有の問題とその解決方法については全く知らないです。
この内容を見てるとLectureの内容を思い出してきましたがLectureでも行列特有の問題とその解決方法についての話はしてなかったはずです。
これもPassして問題ないです。
次のLessonの内容です。
以上でした。
はい。特に復習しないといけない内容は無かったです。
3.3 Lesson 4: Practical Deep Learning for Coders 2022 [6]を勉強する
で勉強方法ですがNotebook LMを最大活用します。
Mind Mapを生成しました。
お、今度は英語で出て来ました。
この違いは何なんでしょうね?
どっかの設定で言語を指定出来るならその方法を知りたいです。
<Introduction to NLP>
まずこれを勉強します。
最初のNLPの紹介です。
そうだHuggingFaceのLibraryを使用するんだ。
NLPはNatural Language Processing(自然言語処理)の略でした。
Introduction to NLPをClickしたら詳しい解説を作成してくれました。
- これまでのコースやFastAIライブラリではリカレントニューラルネットワーク (RNN) を使用したULMFiTという手法でNLPを扱っていましたが、Lesson 4ではトランスフォーマーを使用します
そうなのか。
Transformerって相当有名だと思ってたんですが、2年前のTutorialで初めて取り入れられたのか。結構最近の話なんですね。びっくりです。
これ。
以外に重要な内容です。Transformerが有効なのはそのAlgorithmにあると思っていたんですが、それだけじゃなくてGPUによるAcceleration Computingのお陰という意味に取れます。
となるとGPUの重要性がますます上がって来ます。
もうこれだけ読んだら十分な気がして来ました。
これ以上何を書く必要があるんでしょうか?
ここにまとめらてる事をScreenshotで貼る方が有用な気がします。
うん。
じゃそうすれば良いじゃない。
・・・
そうします。
今回のLectureはNLPのFine Tuningのやり方を勉強するのか。
Fine Tuningについて説明しています。
Fine Tuningは今までの学習でそれなりに理解していましたが、最後のLayerを削除してその部分に新しいRandomなLayerを追加していたのは知りませんでした。
次の節です。NLPの主要なTaskを説明しています。
NLPは現実の世界ではこんな事に使用されています。という紹介ですね。
次の節です。Text DataとDataの前処理について解説しています。
これがTokenと言うやつなのか。
ネットでAI界のGuruとして評価されるかどうかは、このTokenという単語を使いこなせるかどうかにかかっている訳と私は勝手に思っています。
そもそもTokenと言う概念自体が理解しにくいです。
Token化して数値化するのか。
次の節です。Kaggle Competitionを使用した実践だそうです。
非常に興味深い内容です。
アンカーとTargetか。ふつうに聞いたら全然違う意味ですが、この文脈だとどうなるんでしょうか?
Hugging Face datasets ライブラリを使用してPandasのデータフレーム云々の辺りは、今の時点では、遥か銀河系の彼方の話をしてるかのように聞こえます。
このLectureの勉強が終わった時には、これらの内容も自分の血肉の一部みたいは存在になってるんでしょうね。
次の節です。
またまた興味深い内容です。
これを基礎にしてAIに議論をしながら見識を高めていけるんだから、もう今までの学習方法は全部捨てて、ここの全賭けすべきですね。
では内容を一寸だけ読んでいきます。
データを訓練セット (Training set)、検証セット (Validation set)、テストセット (Test set) に分割する必要があるのは、今までの学習で知っています。
一寸前に公開されたある大手のテック会社の凄い性能のAIが、このTestセットを訓練Dataとして使用していた疑惑がありましたね。
過学習 (Overfitting) は、UE5のAIのEgo Centricで詳しく学びました。
メトリック (Metric) と損失関数 (Loss function) の違いですが、そもそもこういう文脈で、メトリックという言葉を初めて聞きました。当然ですが行列と言う意味では無いはずです。
ピアソン相関係数もその意味は知りません。
アウトライヤー (Outliers)ってそもそも何ですか。最後のLayerの事でしょうか?
これはAIに聞いてみましょう。
そういう意味なのか。
これはAIに質問して大正解でした。
次の節です。
ここは実装内容の説明ですね。
またメトリック(ピアソン相関係数)が出て来ました。
AIにこれについて説明してもらいます。
結構、長くて途中で訳分からなくなりました。
今の時点で理解出来る部分だけ以下に記しておきます。
まずメトリックの定義です。
じゃLoss Functionと同じじゃないですか?
ピアソン相関係数は以下の様に説明していました。
これだけ理解したら十分です。
要はLoss Functionを基準に最適化したら上手く行かなかったけど、ピアソン相関係数を使用したら上手く行ったという事でしょう。
後、興味深かったのは以下の意見です。
だそうです。
最後の節です。
ボット生成コンテンツを検出するモデルを構築することの難しさと書かれていますが、これこそ今一番使用出来る現実的な応用方法でしょう。
もう大体、このLectureで何を教えるのか理解してしまいましたが、一応Mind mapの方も見ていきます。
<Hugging Face Transformers>
FastaiのLibraryに既にIntegrateされたんでしょうか?
ここは特に理解出来ない箇所は無いです。
次に行きます。
<Fine-tuning Pre-trained Models>
ここで最後のLayerの調整を行う方法を勉強するんでしょうか?
<ULMFiT(Pioneering Approach)>
これはどうやらこのLectureを作成してるJeremy Howard氏が作成した手法の様です。
<Transformer vs RNNs(ULMFiT)>
Transformerと競合しています。
そら勝てんだろう。
最後に基礎的な考え方は似てると言ってます。
<Applying NLP to a Kaggle Competition>
Kaggle Competitionの意味を知らないです。
AIに聞きます。
ようは凄く上手く解けたらお金をくれるって事?
調べて良かった。
成程。
そうすると残りの要素の意味が理解出来ます。
この場合は、特許の用語のMatchingの検査という実際の問題にNLPを使用している訳です。
AnchorとScoreの意味の近さを決定しています。この場合文脈が重要であるとも書かれています。
次のTurning into Classification Problem(Proposed)の意味は不明です。
Concatenateの意味が分からん。
結合って意味でした。
AIに説明してと聞いたら、非常に細かく説明してくれました。
以下にその説明の最後の部分を示します。
以下の文だけ理解しておけば今は十分でしょう。
コンペティションのタスク(アンカー、ターゲット、コンテキストから類似度スコアを予測する)を、
NLPモデル(ここではシーケンスモデル)が扱える入力形式に変換するための具体的な前処理ステップを指しています
<Data Handling (Kaggle Notebook)>
ここはKaggleを使用して実際にNLPを実装してるんでしょうか?
この節の内容を説明してとAIに質問したら、Kaggleを使用して実際にNLPを実装する方法を説明してる事が判明しました。
<Text to Numbers Process(NLP)>
Token化して数値化してその後色々やってます。という事はここはNLPの手順を説明してると思われます。
Token化の内容です。
これは説明聞かなくても大体理解出来ますね。
Tokenにするに当たってSpaceの無い言語は難しい。とか文字の長さが問題になる。とかそりゃそうでしょう。って感じの事が書かれています。
そしてその解決方法としてSubwordと言う手法が取られている事が述べられています。
最後にこのToken化は前にTrainingされたModelのDeveloperを使用する必要がある事が述べられています。
今度は数値化してます。
全てののTokenに唯一のIDを当てるのは既に勉強しました。
最後の工程です。
ここはStep3と言うよりHuggingFace内ではこの手順でやります。と言う説明のようです。
<Model Selection(Hugging Face Model Hub)>
もう半分の勉強が終わりました。
速度で言えば今までの3倍は速いです。
ここはHugging FaceにあるModelからどれをどうやって選択すべきかについて解説してるようです。
この話はほとんど聞いたことがない話題なのでAIに説明してもらいましょう。
滅茶苦茶有用な情報を提供してくれたので、以下に全部記録しておきます。
ここでFastaiがTransformerに敗れた歴史が述べられています。
面白いですね。
それは兎も角、事前学習済みのNLPモデルをTuningする事で沢山のModelが生成され、
そのModelがHugging Faceに保存されてる事は理解出来ます。
沢山のModelから自分の目的にあったモデルを選択するための指針が説明されています。
まず大きさが小さいのを選択。
多くのTaskで上手く行くのを試して、自分の目的にあった特定のModelを試す。特定の目的のModelの方が性能良かった場合はそれを使用する
こんな感じでしょうか。
Token化の方法は選択したModelのToken化と同じ必要があります。
Hugging Face TransformerではAutoTokenizer.from_Preterined()関数を使用して選択したModelが対応するTokenizerをLoadするそうです。
今回の例の様に、Anchor、Target、そしてContextの間の類似度を0から1のScoreで扱う場合は回帰問題になるそうです。
のでModelも回帰問題に適したのを選ぶ必要があるそうです。
ここまでは理解出来ました。
残りの説明はまだ理解出来ないですね。
例えば配列の分類という表現がありますが、これが回帰と同義なのか、それとも違うのかとか、そういう事はまだ分かりません。
その後の説明に関してはこれって本当に証明されたやり方なのかすら疑問が生じます。
でも今の時点ではこれぐらい理解出来たら十分です。
<Validation and Test Sets>
ここでは生成されたModelのTestについて述べてるようです。
Overfittingは分かりますがUnderfittingはどういう意味でしょうか?
単にあってないことを指してるんでしょうか?
そうみたいです。
Validation Setの説明です。
これを見るとValidation Setはテスト用のDataを指してるようです。
<Metrics vs Loss>
ここは最初の節で説明があったMetricsとLossの違いについての説明ですね。
Metricが何なのかを説明しています。
Metricとは要するに人間からの評価です。
成程ね。
これはどういう意味なんでしょう?
興味あります。
これについてはAIに聞いてみます。
だそうです。
残りの解説はこの説の具体的な例による補足でした。
一応それも貼っておきます。
で
<Pearson Correlation Coefficient(R)>
の話になります。
この評価方法ってあれ、YouTubeの動画の評価方法に似てますね。
現実問題として役に立ってるんでしょうか?
<Training the Model(Hugging Face Transformers)>
これは何?
いきなりHugging FaceにおけるNLPの実装方法のまとめになったの?
Lecture4の宿題はこれになりそうですね。
Hugging FaceでTransformerを使用してNLPで何かの問題を解くみたいな。
<Making Prediction and Submission>
ここは何を言ってるのか全く理解出来ません。
AIに説明してもらいます。
説明読んだら理解出来ました。
そもそもこのPredictionとSubmissionとはKaggleのCompetitionの話なんです。
KaggleのCompetitionでは、学習した後にテストしてその結果(予測値)を提出する必要があるそうです。
だからこの節の名前がMaking Prediction and Submissionなんです。
それを理解すると後は何言ってるか全部分かりますね。
予測する方法とその後、その予測値がおかしかった場合に直す方法、そして予測値の提出方法なんかがここで要素にまとめられています。
<Opportunities and Concerns(NLP)>
NLPが今もっとも注目されている分野である事は誰でも知っています。
ここで面白そうなのは間違って使用する場合です。
以下の例が載っていました。
大体言ってる事は理解出来ますが、Botか人間かは問題じゃない気がします。
書いてる内容が正しいかどうかが問題です。
ここは非常に興味がある分野なのでAIに解説してもらいます。
Misuseは悪用という意味でした。
一つ目の例です。
これやったらそのSNSを見る人達が居なくなるだけでしょう。
これは書き込みできる対象をID制にする事で防げそうです。
AIの書いたものをAIが書いて対抗するから無理なんです。対応するAIはその書き込み元のMAC Addressを調べるとか、そういう対応に特化すべきなんです。
これ見ると大した問題は起きてないですね。
あ、これで全部です。
終わりました。
4. Nvidia Omniverseの勉強
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]を勉強する
4.1.1 先週の復習
Isaac SimのVersionが4.2の場合もAckermann Steeringノードは無い事を判明しました。
その後でROS 2 Ackermann Controller [7]を読んで勉強しました。
そして最後に以下の様に述べていました。
4.1.2 ROS and ROS 2 Installation [8]を勉強する
まずOSの種類に対応するROS2のVersionです。
ここで私の条件がWindows11なのかUbuntu 22.04なのかの説明はここには無いです。
<Getting Started>
<<1. ROS Installation:>>
Windowsの場合のROS2のInstallの方法です。
一文一句、Isaac Sim4.5のROS2 Installationと同じです.
一応、Link先も調べておきます。
Foxyが使用出来なくなった事の説明とその関連についての説明以外はほぼ同じでした。
続きです。
一字一句同じです。
つまりROS and ROS 2 Installationに関して言えば4.2.0と4.5.0の手順は全く同じです。
あー良かった。
これでやり直す必要が無い事が確認出来ました。
4.1.3 ROS 2 Ackermann Controller [7]を実装するために必要な事
これです。
これやってないです。
isaac_tutorials ROS2パッケージのInstallとROS2 workspace環境が正しくsetupされているかの確認する必要があります。
<isaac_tutorials ROS2パッケージのInstall>
これIsaacSim-ros_workspaces repo のLink先に移動すると
以下のGitHubのSiteに移動しました。
これはInstallしてません。
しかしどこにこれをCloneすれば良いんでしょうか?
そもそもROS and ROS 2 Installation [8]のどこかにWorkspaceのInstallに関しての記述があったんでしょうか?
ありました。
ここはIsaac Sim4.5.0でもIsaac Sim4.2.0でも同じでした。
Isaac Sim ROS Workspacesを開きます。
Setting Up Workspaces [9]を開きます
Isaac Sim 4.5.0用ですが4.2.0でも同じですのでこれで勉強します。
まず
Cloneを作成しろって書いてますが、どこにが書かれていません。
ChatGPTに聞いてみます。
うーん。
ROS2のあるUbuntu側に作成するのか、それともIsaac SimのあるWindows11側に作成するのかも知りたいです。
だそうです。
その理由として
と説明していました。
そもそもIsaacSim-ros_workspacesが何をするためのものなのかも知らないです。
と書かれていました。
え?
じゃ、これ入れないとROS2とIsaac Simって通信出来ないの?
今まで出来たと思ってたのは何だったんでしょう?
次の文です。
これ何をいってるのか全く理解出来ません。
ChatGPTに丸投げしてしまいます。
ROS2は自分でBuildはしてないはずですが、一応確認したいですね。
でもこういう意味だったのか。
一寸、頭の働きが鈍って来てるのかもしれません。
このへんで止めとくか。
そうだ。
こういう意味かもしれないとはChatGPTに聞く前に一寸だけ心によぎったんですが、
でもこれだとWorkspaceの話とは関係ないので間違った解釈だと判断したんでした。
それもChatGPTに確認します。
え?
そうなの。
あ、そういう事か。
でもそれならBuildする前に説明してくれないと。
ChatGPTは更に詳しく、SourceされたROS2環境にどのように影響されるのかを説明してくれました。
更に
ROS2 を aptでインストールしたのか、ソースからビルドしたのか を確実に見分ける方法も説明してくれました。
その中の一番簡単なのを試したら以下の結果になりました。
ChatGPTの回答は
だそうです。
次ぎの手順です。
この1の手順の時にさっきの、source /opt/ros/<ros_distro>/setup.bashの話をすべきでしょう。
例えば、source /opt/ros/<ros_distro>/setup.bash to open the Ubuntu 22.04 app(WSL2) in Windows. と説明して
注釈で
If you have built ROS 2 from source, replace the source /opt/ros/<ros_distro>/setup.bash command with source <path_ros2_ws>/install/setup.bash before building additional workspaces.
と繋げる訳です。
次のInstructionです。
今までは以下のWindowsの方を読んでいましたが、今度はUbuntuの方を読めって事ですね。
読んでいきます。
RosdepとColconが無いとInstall出来ないからその2つをInstallしろ。と言ってるようです。
ChatGPTで確認します。
ます最初のCommandですが、Rosdepだけじゃなかったです。
以下に示したPackageをInstallするためのCommandでした。
それぞれのPackageの役割です。
このCommand全体としては以下の役割を担っているそうです。
2番目のCommandは、
となっています。
更に実際に実行するには以下のようにやれと言って来ました。
これRosdepの初期化から後は、公式Siteの後からの流れと同じなのでしょうか?
先に公式Siteの方法を確認します。
ここでROS2を起動しています。
これは先程の説明の
と同じ目的でだと思われます。
でもこれCommandが微妙に違いますね。
ChatGPTに質問したら以下の様に解説してくれました。
これは大体は理解しました。
次のInstructionです。
これは先程のChatGPTの回答の以下の部分に対応してますね。
ChatGPTに解説してもらうと
だそうです。
これで完成です。
そしてこれからROS2を起動する時は、以下のCommandで起動しなければならないそうです。
大体理解出来ました。
公式Siteには以下のCommandは無いですね。
これは出来てると仮定してるんでしょうか?
まあでも理解出来ました。
来週、実装します。
4.2 Nvidia Omniverse Issac Sim [10]の勉強
4.2.1 先週の復習
ROS 2 Ackermann Controller [8]を勉強したんでした。そして実装するためにはWorkspaceをInstallする必要があります。
で最初のWorkspaceのInstallの勉強に戻ったんでした。
となると、WorkspaceのInstallが完了するまでこの勉強はPendingしないといけませんね。
今週のNvidia Omniverse Issac Sim [10]の勉強は無しにします。
5. Gaeaの勉強もしくはVroidとUE5の勉強
5.1 Gaea2のTutorialに使用するPowerPointの作成
UE5.6でPluginを使用しないでHeightmapをImportする方法を説明します。
ChatGPTに聞いたら結構正しい説明をしています。
しかしGaea2で作成したTerrainの寸法と同じ寸法でUE5内でLandscapeを作成する方法を説明します。
その前にGaea2でHeightmapを作成する方法を確認しています。
UE5内でGaea2のLandscapeを正しい寸法で再現するためには生成したTerrainの寸法を知る必要があります。
縦横の寸法はBuild Setting and Regionから知る事が出来ます。
高さは自分で測定する必要があります。
一つ目の測定方法はPick Heightを使用する方法です。
2つ目の方法はNodeを組んで行う方法です。
測定した値を使用してScalingの値を計算します。
これは実際には使用しなかったSlideです。
6. Houdiniの勉強
Houdiniの勉強を始めた理由は、これからの3D GraphicsはProceduralな3Dの生成だという風潮が2年前ぐらいに起きて、それで慌てて勉強を始めたんです。
生成AIブームが起きて、Proceduralな3Dの生成のブームはすっかりなくなってしまいましたが、Nodeを使用して3Dを生成する手法は、職人的な技術が無くても3D Objectの生成が出来るのでかなり便利という事に気が付きました。
のでHoudiniの勉強は続けています。
6.1 先週の復習
VEX Isn't Scary: Beginner Series [11]の総まとめをやる予定でしたが、あまりやる気が起きなかったので一寸だけやりました。
その後で海や滝などの水のSimulationを追加した実装についてのTutorialを探しました。
6.2 Houdiniの復習します
今の勉強結果ではHoudiniを使用しても自分が望んだ3D Modelを作成する事なんて到底出来ません。
それは生成したPointを望んだ3DのObjectの形状に変化する方法が全く分からないからです。
世の中に存在するObjectは非常に単純な存在、例えばコップとかPCのKey boardでも、その形状はかなり複雑です。
のでPointからどうやってそのObjectを生成したら良いのかが皆目見当付かないからです。
この観点から注目して VEX Isn't Scary: Beginner Series [11]の最後のProjectではObjectをどうやって生成したのかを復習する事にします。
このProjectで生成したObjectは3つあります。
まずは回転する球です。
これはその中央に窪みがあり、回転してるかどうかを可視で確認しやすい形状になっています。
次にこれらの球が転がるための器です。
球が転がるための溝が形成されています。
最後は器の周りを取り囲むように設置された背景用のObjectです。
こんなのどうやって生成したのか全く覚えていません。
それぞれのObjectの作成方法を復習します。
<Sphereの作成方法>
2025-02-02のBlogにまとめてありました。
以下の様に生成したPointにSphereノードをCopytopointノードで繋げています。
すると以下のようなSphereが生成されました。
2025-02-16のBlogでこのSphereに溝を追加していました。
これは実際の実装で確認した方が分かり易いです。
Sphereノードの結果です。
Groupノードを追加しました。
溝が入る部分だけ選択されています。
Polyextrudeノードを追加しました。
溝が出来ました。
これは簡単です。
Groupで指定した部分をPolyextudeノードで変形しただけです。
<器の作成方法>
2025-02-02のBlogは器の作成も開始していました。
といっても器そのものではなく、器の窪みを作るための実装です。
以下の実装から始まっています。
Linesと名付けたBlastノードにPolywireノードを繋げています。
Linesは以下のような形状でした。
でPolywireノードを繋げると
こうなります。
そしてSubdivideノードを繋げて
以下の形状に変更しました。
何でSubdivideすると端っこが丸くなるんでしょうか?
更に実際の器の方も作成していました。
まずTubeノードを配置して
以下の形状を作成し
Propertyの値を変更して以下の形状に変更します。
ここからこの器にヒトデ上のObjectの形状を引く事で溝を追加します。
しかしそのやり方はかなり複雑でした。
以下にまとめ直します。
まずVdb from polygonsノードを追加します。
次にConvertvdbノードを追加します。
Tube側も全く同じ実装をします。
これでそれぞれのObjectのPolygonが均等に分割されたそうです。
更にヒトデ上の形状のObjにNormalノードを追加しました。
Normalを変更する事で器に溝を刻む事が出来るようなります。
AttributeTransferノードでTubeとヒトデ上のObjを繋げます。
ここでAttribTransferノードのParameterを色々弄っていますが、そこに注目すると全体の流れが分からなくなるので、
今は無視します。
更にAttribwrangleノードを繋げました。
Attribwrangleノード内で、以下の実装をして
Multの値を増やすと
更にNormalノードを追加しています。
これは何のためにやったのか不明です。
結果です。
ふええ。
この部分の実装、全部理解する必要あるでしょう。
そしてAttribblurノードを追加します。
すると以下の様になりました。
うーん。
これの実装の意味を理解するだけで一回分の勉強時間がかかるじゃないですか。
これは来週やる事にします。
<BackgroundのObject>
器の周りのObjectの作成方法についてです。
これはObjにある以下のBACKGROUNDという名前のGeometryノード内で実装されていました。
この実装を見た方が何をやってるのか凄く分かり易いです。
まずGridノードが配置されました。
Blastノードを追加しました。
結果です。
真ん中に四角い穴が開きました。
Circlefromedgeノードを追加しました。
結果です。
穴が丸くなりました。
地味ですが結構重要なNodeです。
そしてPolyextrudeノードを追加しました。
ここでCircleのEdgeが
から
に変化しました。
そして次のPolyextrudeノードで
Circleを後ろ向きにExtrudeしました。
次にPolysplitノードを追加して
突き出した部分に切り込みを入れました。
その後、Subdivideノードを追加して
以下の様にPolygonの分割を変更しました。
形状が丸くなっていますね。
最後にTransformノードを追加して
全体のSizeを一寸だけ小さくしました。
以上です。
これも思っていたより複雑ですね。
6.3 Pointを置き換えるSphere以外の形状についての調査
今週はもっと簡単にPointをObjectに置き換えるNodeをまとめる事にします。
これらのNodeをまず使いこなせる事が大事です。
ChatGPTに質問したら以下の回答が返って来ました。
Platonic Solids、Front、そしてL-Systemはよく知らないです。
Houdiniで確認してみましょう。
Platonic Solidsノードです。
DefaultではTetrahedronになっていて以下の形状が表示されましたが
他にもいろいろな形状を選ぶ事が出来ます。
次はFontです。
Textには以下の様に書かれていて
以下の結果になっています。
これはどうやって3D化するんでしょうか?
Polyextrudeノードで押し出したら出来ました。
Polyextrudeノードの
にCheckを入れるとExtrudeの穴がCoverされました。
最後のL-systemです。
Defaultで以下の様になっています。
これって結構凄い。
メタセコイヤのような木も作れるんでしょうか?
試してみます。
ぱっと動かしただけでは出来ませんでした。
ChatGPTに以下の様に質問したら
詳しい説明が表示されました。
以下に示します。
そして以下の手順で作成できると回答し
それぞれのStepで詳しい説明が載っていました。
ただし実行しようとしたら全く役に立ちません。
アキシオムと言うParameterが見つからないで延々にそれを探しています。
これは駄目ですね。
L-System Introduction | Differential L-Systems Part 2 | Houdini 20 [12]を見たら氷解しました。
一回理解したら何でこんな簡単な事が分からなかったのか不思議なくらい簡単になります。
内容をまとめる時間はないので、内容に関しては来週やります。
7. AIについての調査(ComfyUIの勉強)
7.1 Learning to Drive (5.5) [13]を勉強する
<<Sports Car Actions>>
Learning Agents Interactorの最後の節です。
ここは勉強してません。
もちろん、2025-03-30のBlogでは勉強していますが、今それを読み直したらほとんど理解してなかったのでもう一回やり直します。
ここではAgentがObservationから得た情報を元に行うActionを指定します。
Specify Agent ActionをOverrideし、実装を追加します。
TutorialによるとSpecify Agent ActionはAgentの行うPerformanceを指定する関数だそうです。
以下の実装を追加していました。
おお、ここのSpecify Float ActionノードでSteeringとThrottleBrakeのPerformanceの設定を行っています。
実際にこのSteeringとThrottle Brakeが何をするのかは次のPerform Agent Action関数で指定すると思われます。
Perform Agent Actionの実装も見てみます。
うお、長い。
うーん。でもこれを見ると実際のActionを実行するための実装のようですね。
Tutorialに以下の様に書かれていました。
PerformAgentAction event where we actually take the action values from the neural network and apply them to our agents.
やっぱり実行するための実装ですね。
となると最初の
Specify Agent Actionの以下の実装が
何をするのかの指定をしてるって事になるんでしょうか?
でもこれだとSteeringとThrottle Brakeを操作しろという以上の命令は無い気がしますが?
あ、AIだからそれで良いのか?
SteeringとThrottle Brakeをどう操作するのかはAIが勝手に決めるのか。
一応このCodeをAIに見せて解説してもらいます。
ChatGPTの回答です。
何!
Float型の値を持つという事を指定してるだけ?
という事はこのFloat型の値を実際に指定するのはどこでやるの?
と思ったらそれも回答してくれてました。
そうか、ここで指定してるのはSteeringとThrottle BrakeのParameterを作成しろという事だけだったのか。
そしてPolicyはそのParameterの値を学習を通じて決定するのか。
納得しました。
となると次のPerform Agent Action関数が何をしてるのかがよく分からなくなります。
だってどんなPerformanceをするのかはPolicyが決定する訳じゃないですか。
ここでは実際は何をしてるのでしょうか?
ChatGPTに聞いてみましょう。
だそうです。
そうか。
私はPolicyの存在を忘れてたので、全体の流れを間違って解釈してしまっていたのか。
Sterringの処理の部分です。
以下の実装部分の説明です。
MapからSteeringのAction要素を探して来ます。
Get Float Actionノードで実際のFloatの値を取り出します。
最後にSet Steering Inputノードで車両のSteeringを操作します。
するとこのMapの中にPolicyがあるという事になります。
このMapは以下のGet Struct Actionノードから取得していました。
ここの部分はChatGPTは以下の様に説明していました。
Actionを取得と言っていてPolicyを取得とは言ってませんね。
このへんの違いはよく分かりません。
これもChatGPTに聞いてみます。
成程。
段々理解して来ました。
更に以下の様に整理してくれました。
分かり易い。
Throttle Brakeの方の実装ですがこっちも詳しく説明してくれました。
ここでは、BreakとThrottleの両方を踏む事はないので、
ThorttleBrakeの値からBranchを使用してThrottleを踏む場合とBrakeを踏む場合を分けて設定してるのが特徴である事が分かります。
うーん。
納得。
ここはLearning Agents Interactorの最後の節なので実装もやってしまいます。
Specify Agent Action関数に以下の実装を追加しました。
TutorialのCodeをそのままPasteしただけですが、何のErrorも起きなかったです。
Perform Agent Action関数も実装します。
こっちもそのままPasteしました。
Map Findノードが単なるFindノードになっていますね。
大丈夫何でしょうか?
Compileしてみます。
これがErrorになった。
Act Actorという変数がそもそもないからか。
Tutorialを読んだらLocal Variableとして作成して下さいと書いてありました。
しました。
もう一回CompileするとErrorも消えました。
出来ましたね。
7.2 Learning to Drive (5.5) [13]のLearning Agents Training Environmentを勉強する
これだけだと一寸短いので次の節であるLearning Agents Training Environmentも勉強する事にします。
<Learning Agents Training Environment>
training environmentはreinforcement learningのためのCodeを書く場所だそうです。
おお。
やっとReinforcement Learningそのものの実装をするのか。
いや、今週は理解するところでお終いかもしれませんが、兎に角このTutorialの核心に到達しました。
ここではReward FunctionとComplete Functionを作成するそうです。
LearningAgentsTrainingEnvironmentを親ClassとしてBPを作成するそうです。
Tutorialでは名前は“BP_SportsCarTrainingEnv”としていました。
中を開き、TrackSplineというVariableを作成しました。TypeはSpline Component (Object Reference)でした。
<<Rewards>>
RewardsはAgentのActionが良いか悪いかを知らせるFeedback Mechanismだそうです。
この値を調整する事でAgentは正しい反応が取れるようになるそうです。
Gather Agent Reward関数をOverrideして以下の実装を追加します。
結局ChatGPTに答えを教えてもらうのですが、一応自分でもCodeを見て何をやっているのか確認してみます。
まず以下の部分の実装です。
あ、これは2025-03-30のBlogでも勉強した記憶があります。
2025-03-30のBlogのこの部分の解説を読んだらかなり詳しく勉強していました。
それによるとこの部分の実装はVelocityの値を調整してるんですが、早ければ早いほどRewardが高くなるように設定されているそうです。
そして以下の部分の実装は
Trackの幅からはみ出した場合、減点するための実装だそうです。
本当でしょうか?
ChatGPTに聞いて確認してみましょう。
まず以下の実装についての回答ですが
以下の様に出ました。
Track Splineに沿った速度を計算してそれに対しての報酬を与えていたのか。
Make Reward From Velocity Along Splineノードがそれをやってるのか。
ってMake Reward From Velocity Along Splineノードの名前を見たら一目瞭然ですね。
ああ。
こういう所を見逃がしていたから今まで進むのが遅かったのか。
次に以下の部分の実装ですが
以下の回答でした。
だそうです。
という事は2025-03-30のBlogの解釈であっていたのか。
一応Trackの幅も確認しておきます。
1880cmなので18.8mです。片側9.8mだから8mならTrackからはみ出す事はないですね。
この部分も実装していまいます。
LearningAgentsTrainingEnvironmentからBPを作成しBP_SportsCarTrainingEnvと名付けました。
中を開き、VariablesにTrackSplineを追加しました。
そしてGather Agenet Rewardノードに以下の実装をOverrideしました。
Reward ActorはLocal Variableとして生成しました。
ここでTrack Splineの値は何もセットされてません。どうやってLevel上になるSplineを取得するんでしょうか?
Compileしたら成功しました。
<<Completions>>
このへんは2025-03-30のBlogが良くまとめてある事が分かったのでそれをまずしっかり読み直します。
Completionには2つあるそうです。
Terminationはこれ以上の良い結果を得る事は出来ない場合、TruncationはEpisodeを途中で終了する場合です。
読んだらこんな事を勉強した事を思い出してきました。
Gather Agent CompletionをOverrideして以下の実装を追加していました。
Trackから8m外れた場合は強制的にそのAgentを終了してしまうそうです。
この実装を見るとMake Completion On Location Difference Above ThresholdノードのCompletion TypeにTerminationと書かれています。
これってTruncationじゃないの?
ChatGPTに聞いてみます。
画像が新しくUpdate出来るのは明日までと回答されました。
うーん。
今週はここまでにします。
8. DirectX12の勉強
先週のblogには何が目的でDirectX12を勉強するのかが書いてなかったです。
そもそもDirectX12を勉強する目的ってなんだったのか全く覚えていません。
そうだ。
3D Graphicsを作成するのにOpenGLを使ってるとバカにされるからDirectX12の使い方も勉強しようとしたら、Windows 8ではDirectX12が使用出来なくてずっと勉強を我慢してたんだ。
で新しいPCを買ってやっとDirectX12を勉強できる環境になったら、もうDirectX12を勉強する人がいなくなっちゃってたんです。
のでこれも出来たら何したいというのは無いですね。
ああ、昔MMDを自分で作りたいというのはありました。それを目的にしても良いかもしれないですね。
8.1 Lötwig Fusel氏のD3D12 Beginners Tutorial [D3D12Ez]を勉強する
8.1.1 The Rendering Pipeline | D3D12 Beginners Tutorial [D3D12Ez][14]をNotebookLMで勉強する
今週から新しいTutorialの勉強が始まりますが、最初にNotebookLMで何を教えてるのかを整理して理解しておきます。
だそうです。
これってあれだ。
2024-02-12のBlogで勉強した
の事です。
こんなの勉強しなくても理解してます。
Mindmapを見てみます。
Input assemblerでやる作業の一覧がまとめられています。
うーん。
ここまで細かい内容は知らないです。
動画を見て確認します。
ああ、2024-02-12のBlogで勉強した
公式SiteのPipelines and Shaders with Direct3D 12 [15]が写っています。
これは一回しっかり勉強した方が良いかもしれません。
動画を見ます。
以下の図をずっと説明してるだけでした。
だけなんだけど頭に入って来ません。
入力アセンブラー (Input Assembler)についての解説をNotebookLMに頼んでみます。
そういう事だったのか。
これならInput Assemblerの役割が理解出来ます。
具体的には以下の内容を行うそうです。
以下に示した2番目の要素について
インデクシングとはIndexingの事で、つまりIndex Bufferを使用してるかどうかという意味です。
更に、これらの設定がCPUから送られてこないと、このInput Assemble内でデータをPipelineが通過できる形式に変更出来ないと言っています。
分かり易い。
というかこれを読まなかったら永遠に理解出来なかったです。
今週はここで気力が尽きました。
というか一寸風邪気味で頭がボーっとします。
ここで止めておきます。
8.2 「DirectX 12の魔導書」を勉強する
今週は中止です。
9. まとめと感想
10. 参照(Reference)
[1] Procedural Minds. (2024, August 18). Isolate corners with PCG to create pillars and roofs | UE 5.4 p3 [Video]. YouTube. https://www.youtube.com/watch?v=x0J_i56zaOw
[2] Control Rig. (n.d.). Unreal Engine. https://dev.epicgames.com/documentation/en-us/unreal-engine/control-rig-in-unreal-engine
[3] Control Rig Quick Start. (n.d.). Unreal Engine. https://dev.epicgames.com/documentation/en-us/unreal-engine/how-to-create-control-rigs-in-unreal-engine
[4] Rigging with Control Rig. (n.d.). Unreal Engine. https://dev.epicgames.com/documentation/en-us/unreal-engine/rigging-with-control-rig-in-unreal-engine
[5] Jeremy Howard. (2022, July 21). Lesson 3: Practical Deep Learning for Coders 2022 [Video]. YouTube. https://www.youtube.com/watch?v=hBBOjCiFcuo
[6] Jeremy Howard. (2022, July 21). Lesson 4: Practical Deep Learning for Coders 2022 [Video]. YouTube. https://www.youtube.com/watch?v=toUgBQv1BT8
[7] ROS 2 Ackermann Controller — Isaac SIM Documentation. (n.d.). https://docs.isaacsim.omniverse.nvidia.com/4.2.0/ros2_tutorials/tutorial_ros2_ackermann_controller.html
[8] ROS and ROS 2 Installation — Isaac Sim Documentation. (n.d.). https://docs.isaacsim.omniverse.nvidia.com/4.2.0/installation/install_ros.html#isaac-sim-app-install-ros
[9] ROS and ROS 2 Installation — Isaac Sim Documentation. (n.d.). https://docs.isaacsim.omniverse.nvidia.com/4.5.0/installation/install_ros.html#isaac-ros-workspace
[10] ROS 2 Ackermann Controller — Isaac SIM Documentation. (n.d.). https://docs.isaacsim.omniverse.nvidia.com/4.2.0/ros2_tutorials/tutorial_ros2_ackermann_controller.html
[11] VEX Isn’t Scary: Beginner Series. (n.d.). YouTube. https://www.youtube.com/playlist?list=PLhyeWJ40aDkVmhEHlCKRvy10lNobG0KZT
[12] Inside The Mind. (2024, July 10). L-System Introduction | Differential L-Systems Part 2 | Houdini 20 [Video]. YouTube. https://www.youtube.com/watch?v=YU3_SYB6j1s
[13] 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
[14] Lötwig Fusel. (2023, July 15). The Rendering Pipeline | D3D12 Beginners Tutorial [D3D12EZ] [Video]. YouTube. https://www.youtube.com/watch?v=53oJE9J_0EY
[15] Stevewhims. (2021, December 30). Pipelines and Shaders with Direct3D 12 - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/direct3d12/pipelines-and-shaders-with-directx-12