UE4の勉強記録

UE4の勉強の記録です。個人用です。

UE5の勉強などなど

1. 今週の予定

今週もこの順序に従って勉強していきます。

  • 映像作成用UE5の勉強
  • AIの勉強
  • Nvidia Omniverseの勉強
  • Gaeaの勉強もしくはVroidとUE5の勉強
  • Houdiniの勉強
  • AIについての調査(ComfyUIの勉強)
  • DirectX12の勉強

2. 映像作成用UE5の勉強

今週の月曜日は用事があって勉強時間を取る事が出来ませんでした。

のでこの節はお休みです。

3. AIの勉強

今週は先週のErrorの原因を突き止めます。

3.1 先週の勉強内容を整理する

まずErrorの内容とAIがその原因の解説をしている回答をここに整理します。

先週のBlogを読みます。

最初の方はPngをPushするための方法を試行錯誤して解明しています。この辺は必要ないのでSkipします。

ではErrorの部分の説明です。

Errorは2つあります。

一つ目です。

これは前から出てたWarningで厳密に言うとErrorではありません。

理由ですがapp.pyでLoad_learnerを使用してるからです。

解決策ですが、

Learner.loadを使用すれば良いそうです。

これはこれで直す事にします。

2つ目のErrorです。

Fastcore.transformのImportに関するErrorです。

これがPngのIllustrationをPushするまでは起きなかったErrorです。

あ、そういう事はImage関連のCodeの部分が関係してるのか。

しかもTransformって事はImageのSizeをいじってる箇所のCodeが関係してるのかも。

でその理由ですが、

Fastcore.transform Moduleにある関数を使用してるんですが、その関数はfasttransform Packageに移動してしまってるので、その関数にaccess出来ません。

となっていました。

分かり易い。

もう原因が半分位理解出来ました。

解決方法です。

これは通常のCodeを書く時は正しい解決方法ですが、HuggingFace上で動かす場合は正しくないです。

で、更に質問するとRequirements.txtに以下のLineを追加すれば出来ると判明しました。

で試すと

同じErrorが返って来ました。

これは当たり前で、App.pyの方のCodeにImport fasttransform何とかを追加する必要があります。

で次に何をしたかとと言うと、だったらHuggingFaceで使用してるFastAIのVersionをDowngradeすれば良いんだ。と考えました。

これは今読み返してもその通りで、何でこの方法で駄目だったのか知りたいです。

続きを読みます。

Jupytor notebookのfastaiのVersionを調べました。

2.7.17でした。

Requirements.txtのfastaiのVersionも同じにしました。

これで解決だ。

と思ったらまた同じErrorが出て来ました。

原因をCopilotに質問すると

Model.pkl内で使用してる関数が原因で起きてるからだ。と回答しました。

そして解決策としてModel.pklを同じVersionのfastaiで作成し直す事を提案していました。

以上です。

3.2 Errorを直す方法のまとめ

<原因がModel.pklの場合>

Modelを作成した時に使用したfastaiのVersionを調べます。これをJupyter Notebookと同じ2.7.17に変更すれば良いはずです。

しかしこの方法には幾つかの疑問があります。

まず今のModelでもJupyter Notebookでは普通に動いている事です。

もしModelの生成に使用したFastAIのVersionが違っている事が原因だったら、Jupyter Notebook上で既にErrorが起きるはずです。

Requirement.txtの要請通りのFastAIのVersionがHuggingFaceにInstallされてない可能性もあります。

更にImage Fileを読み込むまでこのErrorが表示されなかった事の説明も出来ません。

<原因がImage FileのSizeの変更に使用する関数の場合>

こっちの方が問題の原因な気がしています。

のでまずRequirement.txtの要請通りのFastAIのVersionがHuggingFaceにInstallされているか確認します。

その後で、app.pyのCodeを見直してFasttransform Packageの関数を使用してないか確認します。

3.3 Errorの原因を特定する

Errorの原因がApp.pyにあるのかそれともModel.pklにあるのかを特定します。

どちらにしても最初にHugging FaceのRequirements.txtのFileの記載が正しくされているかを確認する必要があります。

これはHuggingFaceのFileのRequirement.txtをClickしたらすぐに確認出来ました。

次はModelを作成したColabを開きModelを作成した時のFastAIのVersionを確認します。

ありました。

久しぶりすぎてどうしたら良いのは分かりません。

今いじるとなんか破壊してしまいまそうです。

新しいFileを作成してテストする事にします。

はい。2.7.19 でした。

Jupyter NotebookのVersionは2.7.17になっていますね。

Perplexityの回答では

となっています。

2.7ならFastcore.transformはまだFasttransform packageに移動してないと思われます。

この回答があってればですが。

Model.pklを直す前に色々調査する事がありますので、一端Colabから離れます。

今度はUbuntuからVS Codeを開きApp.pyのCodeを確認します。

この中にFastcore.transform Moduleにある関数が使用されているはずです。

どの関数がそれにあたるかを調べます。

使ってない。と回答が返って来ました。

成程。

段々Errorの原因が判明してきました。

今度はModel.pklのCodeを確認します。

Copilotに全部のCodeを確認しましたが。Fastcore.transform Moduleにある関数やUtilityは使用してないそうです。

つまりどこにもFastcore.transform Moduleに含まれる関数なんて使用してないにも関わらず、このErrorが表示されている事になります。

うーん。

謎。

この問題がLocalな条件で再現できないのが問題です。

3.4 Load Learner()関数のErrorを直す

こっちは単なる警告ですが、こっちを先に直す事にします。

以下のCodeに直せば良いそうです。

これはまずJupyter Notebookでも動くのか試してみます。

Jupter NotebookのCodeです。

普通に動いています。

調べたら以下の回答が返って来ました。

だそうです。

じゃこれも直せないですね。

うーん。

困った。

3.5 原始的な方法でErrorを発してるCodeを特定する

こうなったらApp.pyのCodeを下から一個ずつComment OutしてどのCodeでErrorになるか調べます。

何故かと言うと、この改良ってもしかしたら先週から変わった気がしてるからです。

そしてまだBugがあってそのせいかもしれないです。

はい。

と思ってこれをやろうとしたら以下のError Messageのところに

File "/home/user/app/app.py", line 11, in <module>

    learn = load_learner('model.pkl')

  File "/usr/local/lib/python3.10/site-packages/fastai/learner.py", line 457, in load_learner

    res = torch.load(fname, map_location=map_loc, pickle_module=pickle_module, **load_kwargs)

  File "/usr/local/lib/python3.10/site-packages/torch/serialization.py", line 1471, in load

    return _load(

  File "/usr/local/lib/python3.10/site-packages/torch/serialization.py", line 1964, in _load

    result = unpickler.load()

  File "/usr/local/lib/python3.10/site-packages/torch/serialization.py", line 1953, in find_class

    return super().find_class(mod_name, name)

  File "/usr/local/lib/python3.10/site-packages/fastcore/transform.py", line 2, in __getattr__

    raise ImportError(

どこがErrorになってるかの解説が書かれているじゃないですか。

よく読んでなかったです。

でも途中のつながりがよく分かりません。

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

最初の行です。

Load_learner()関数が呼ばれます。

Load_learner()関数内でTorch.load()関数が呼ばれました。

PyTorch LibraryのTorch.load()関数から_loadが呼ばれました。

PyTorchのFind_class内で

Deserialization processとはDataをLoad出来る形に変更する手続きの事らしいです。

あるClassかModuleをLoadしようとして

Errorになりました。

という事はLoad_Learner()関数が問題を起こしてるという事になります。

だったらapp.pyに直接

を追加すれば解決しそうです。

試してみます。

以下の場所に追加しました。

これをPushします。

しました。

結果です。

あ、出来ました。

Testします。

出来てます。

3.6 Lecture2の宿題が終わって

やっと出来た。

このErrorを解決出来たのは、AIのお陰です。自分ひとりではこのErrorを解く事は出来ませんでした。

やっぱりAIは凄いです。

AIのせいで通訳・翻訳の仕事の価値がほとんどなくなってしまいましたが、その代りProgrammingの技術が爆上げしました、

時代の変化に上手くついて、負け組でなく勝ち組に入るべき時代の変化に注目していきます。

4. Nvidia Omniverseの勉強

4.1 NVIDIA Isaac Sim - MuSHR RC Car - Ackermann Tutorial [1]を勉強する

ROS and ROS 2 Installation [2]の勉強の続きをやります。

先週の最後でGetting Startedの3の手前まで勉強しました。ので今週は3を勉強します。

4.1.1 Getting Startedの3を読む

以下のように書かれています。

ここでPublishingとSubscribingという言葉が使用されていますが、これは出版すると購読するという一般的な意味ではないはずです。

まずはこの2つの言葉の意味から調べます。

Copilotに質問しました。

やっぱり特別な意味がありました。

まずPublishingの意味です。

A Specific Topicってある特定のNodeの事でしょうか?

この場合のTopicの意味も不明です。

あるDataをまわり中に拡散してる感じでしょうか。

Subscribingの意味です。

ここでもTopicって言っています。

あ、Topicの意味が分かりました。

この場合でもある特定の話題と言う意味で通ります。特定の話題だけ聞くようにするって意味です。

となるとさっきの文章

の意味は、

ROSに関しての話題をPublishingとSubscribing出来るようになった後は、ROSのTutorialを勉強して下さい。

と言ってるって事でした。

しかしTutorialをやる前にIsaac SimのROS WorkspacesのSetupをやっておくようにと言っています。

このSetupって今まで勉強した環境構築の事?

そして以下の手順が始まります。

このIsaac Sim ROS WorkspacesのLink先を見ればWorkspaceが何を指してるのかが分かります。

以下の章に飛びました。

最初のNoteに書かれている文章を読むと、この設定は2までの環境設定を終わった後にやる内容のようです。

まずWorkspace RepositoryをCloneしています。

これは単にCloneすれば良いんでしょうかね。

どのFolderにCloneすれば良いんでしょうか?

次の文です。

ROS PackageってROSのExtensionみたいなものでしょうか?

source /opt/ros/<ros_distro>/setup.bashはROS2を開始するためのCommandです。

具体的には何をするんでしょうか?

ROS2を開始するときにはsource <path_ros2_ws>/install/setup.bashを代わりに使用しろって事でしょうか?

次の手順です。

WSL2からUbuntuを開いたら

以下の設定に従えって言ってます。

これらのCommandはPackageをInstallするだけです。

これはROS2を起動させるCommandのはずです。

次のCommandです。

これはWorkspaceからのPackageの依存関係を正しくするためのCommandでしょうか?

それぞれのCommandの意味です。

Packageの依存関係を正しく認識するための何かをInstallするのは間違いなさそうです。

ここでWorkspaceをBuildしています。

以下のCommandでROS2のPackageを使えるようになるそうです。

4.1.2 Getting Startedの3を読んだ感想

読んだけどあんまり意味が分かりませんでした。

これはWorkspaceが具体的に何を指すのかが分からないからかもしれません。

まずWorkspaceが何なのかをはっきりさせるようにしましょう。

Copilotに質問しました。

WorkspaceってFolderの事ですか?

とかなり大胆な質問をしてみました。

こうはっきり言った方がAIもどう説明したら良いのかがはっきりするはずです。

Copilotの回答です。

あれ?

瓢箪から駒です。

WorkspaceはFolderであってるみたいです。

ただしある目的と構造を持ったFolderだそうです。

ROSのProjectを管理するためのFolderって事か。

しかもSandboxとしての役割も担うのか。

Src 、BuildそしてConfiguration用のFolderがあるみたいですね。

BuildやConfiguration用のFolderがそれぞれのProject毎にあるのは理解出来ますがsrcもそうなのか?

Srcってどんなものを入れるFolderだったけ?

作成したProgrammingを保存するためのFolderのようです。それならそれぞれのProject毎に必要になりますね。

これを理解した後で、もう一回、Setting Up Workspacesを読み直したら、今度はもう少し理解が増してきました。

まずUbuntuのどっかのDirectoryにいます。

これはどれでも良いはずです。

ここにまずIsaac Sim ROS Workspace RepositoryのCloneをします。

このCodeをBuildするにはRosdepとColcon Build Commandが使用出来る必要があります。

ので以下のCommandでそれぞれをInstallします。

以下のCommandでROS2を起動させます。

次ですが、まずCloneしたIsaac Sim ROS Workspace Repositoryにある

に以下のCommandで移動します。

そして先程InstallしたRosdepを使用して以下のCommandを実行します。

このCommandが何を実行してるのかが分からん。

これは最初に勉強した時に調べたはず。

ありました。

あ。分かった。

これでProjectをSaveするのに必要なFolderなどを全部生成するんだ。

でCloneしたIsaac Sim ROS Workspace Repositoryを先程InstallしたColconでBuildします。

で最後の5ですが、

Workspace上でROS2のProjectを保管する場合は、このCommandで始めるようにしてくださいと言う事です。

これは最初に書かれていた以下の文の内容と同じ事を言っています。

以上です。

4.2 Nvidia Omniverse Issac Sim [2]の勉強

4.2.1 前回の復習

先週はJensen Huang氏のGTCの講演をまとめました。ので先々週の勉強の内容を復習します。

 Quickstart with a Robot [3]を勉強していました。

これ勉強しただけで実装はしてないんか。

今週はこれでもやるかな。

後、以下の2つのTutorialを読む。と書いてありました。

こっちの勉強の方をやるかな。

4.2.2 Reinforcement Learning Policies Examples in Isaac Sim [4]を読む

何でこのTutorialを読む事にしたのかと言うと、Isaac Simを勉強する目的は、RobotのReinforcement Learningの具体的なやり方を勉強するためです。

でROSの使用方法とかが入って来て、全然進まない現状があります。

のでこのTutorialを勉強する事でRobotのReinforcement Learningの全体像を理解したいんです。

はい。

つまりこれを勉強する事がもっとも重要であると判断した訳です。

<About>

isaac_sim_policy_example Extensionの使用方法についての説明のようです。

isaac_sim_policy_example Extension は、Isaac Lab Reinforcement Learning PoliciesをIsac Sim上で使用出来るようにするためのExtensionだそうです。

このExtensionはDefaultで使用できるようになってるそうです。

もしなってなかったらExtension Managerの

Windows > Examples > Robotics Examples

からRobotics Examples tabを開いてisaacsim.robot.policy.exampleをEnableすれば良いそうです。

<Unitree H1 Humanoid Example>

UnitreeのRobotが使用出来るみたいです。

凄いですね。

まず新しいStageを作成します。

Robotics Examples > POLICY > Humanoidを選択してLOADを押します。

するとSceneがLoadされるそうです。

Robotの操作方法です。

<Boston Dynamics Spot Quadruped Example>

今度はBoston Dynamicsの四足歩行のRobotを使用する場合の説明です。

Robotics Examples > POLICY > QuadrupedからLoad出来るそうです。

以下の方法で操作できるそうです。

<Policies Files>

ここから使用できるPolicies Fileの説明が始まっています。

いやいきなりPolicies Fileです。と言われてもPolicyって何の事ですか?ってなります。

以下の説明が書かれていました。

どうもIssac LabでReinforcement Learningをしてその結果がPolicyとして保存されてるようです。

Copilotにも聞いてみます。

やっぱりそのようです。

これだけ理解しただけも収穫です。

Isaac Lab内でReinforcement LearningをしてPolicyを作成して、Isaac Simでは、そのPolicyを使用して何かをするみたいです。Fine Tuningみたいな事をするんでしょうか?

API Documentation>

ここはAPIのDocumentがある場所のLinkが紹介されているだけでした。

<Standalone Examples>

<<h1_standalone.py>>

ここからIsaac SimにおけるPolicyの使用方法の説明が始まると思ったら、h1_standalone.pyの説明が始まりました。

これってPolicyの名前かも。と思って確認したら

全然違います。

???となっていると閃きました。

このPolicyをDownloadしたら、そのFileの名前がh1_standalone.pyになってました。

紛らわしい。

以下の説明がついていました。

ああ。成程。

このFileはPolicyそのものではないみたいです。

Flat terrain policyによって制御されたUnitree H1が表示されるみたいです。そしてその制御はあらかじめ決められた一連のCommand Sequenceによっているそうです。

で以下のCommandで実行出来ると書いてあります。

./python.sh standalone_examples/api/isaacsim.robot.policy.examples/h1_standalone.py --num-robots <number of robot> --env-url </path/to/environment>

うーん。

このCommandの意味が分かりません。何を命令してるんでしょうか?

次に具体的に5体のUnitree H1を表示する場合のCommandを示しています。

./python.sh standalone_examples/api/isaacsim.robot.policy.examples/h1_standalone.py --num-robots 5 --env-url /Isaac/Environments/Grid/default_environment.usd

お、これなら前のCommandと比較する事である程度の意味が分かるようになりました。

いや。その前にIsaac Sim内からPythonのCommandを実行する方法が分りません。

前にIsaac Simの勉強した時にGUIで操作する方法しか勉強しませんでした。Pythonから操作する方法も勉強しとくべきでした。

結果です。

5体のRobotが動いています。

<<spot_standalone.py>>

今度はspot_standalone.pyの例です。

以下のCommandで動かしていました。

./python.sh standalone_examples/api/isaacsim.robot.policy.examples/spot_standalone.py

<<anymal_standalone.py>>

まだあるの?

と思ったらこれは前の2つとは違い、地面が凸凹しています。

以下の解説がありました。

まずNeural Networkで学習させたって書かれています。Robotの学習は全部Reinforcement Learningだと思っていたんですが違うんでしょうか?

興味深いです。

そしてRobotの状態、指令された基本速度、および周囲の地形を入力として受け取り、関節位置目標を出力します。と書かれています。

ふーん。

こういうDataを元に学習させるのか。勉強になります。

この後PythonのCommandと操作方法が載っていました。

以上です。

4.2.3 Reinforcement Learning Policies Examples in Isaac Sim [4]を読んだ感想

これは勉強になりました。

まずIsaac SimとIsaac Labの機能の違いが理解出来ました。

そしてIsaac Lab内でAIの学習をさせる事も理解出来ました。

ただ、この程度の内容だったら、YouTubeの動画だったら10分位で、ぼーと見てても理解出来ますね。

やっぱり読んで理解するのは効率が悪いです。

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

5.1 Gaeaの勉強

今週はWarpノードの使用方法について解説しました。

前回のTutorialでDrawノードを使用した粗削りな地形を作成する方法を説明しましたが、

結果をそのまま混合すると結構酷い地形になります。

前回はBlurノードを使用してごまかしましたが

この方法だとDrawノード+Distanceノードで作成した地形の形状はほとんど反映されなくなります。

ここでBlurノードの代わりにWarpノードを使用します。

こんな結果になります。

Drawノードで作成した形状をある程度残して混合したい場合はこのやり方がお勧めです。

6. Houdiniの勉強

6.1 VEX Isn't Scary Project - Part 4: Rendering [5]の次の10分を勉強する

Sphere Setup>

Materialノード内のSPHERE_BODYノードを選択して

以下の歯車のIconを選択して

更にBlack Rubberを選択します。

Base Colorの値が以下のようになりました。

Renderした結果です。

黒いゴムのような質感になりました。

しかしよく見ると緑が一寸だけ入っています。

これはUse Point ColorがOnになってるからで

このParameterの値をOffにすると

僅かにあった緑が無くりました。

今度はSphere Lightノードの値をセットします。

Base Colorの値を以下のように変更しました。

結果です。

SphereのRingの緑色が明るくなりました。

しかし実際はこの部分の色は発光させたいんです。

そのやり方ですが、以下のEmission LightのEmission Colorの値を変更する事で出来ます。

例えばEmission Colorの値を以下のようなOrange系の赤に変更すると

SphereのRingの色も以下のようなOrangeになります。

しかし我々は、SphereのRingの色にはSphereの元々の色を使用したいんです。

どうやってSphereの元々の色を取得すれば良いのでしょうか?

はい。

そのやり方を示します。

まず以下に示したBindノードを追加します。

そしてBindノードのParameterのNameとTypeを以下に示した様に変更します。

そしてBindノードのCdの結果をSphere LightノードのEmit colorに繋ぎます。

結果です。

このやり方はCdの値だけでなく全てのAttributeの値を取得する事が出来るそうです。

例として前に作成したRampの値を取得する方法を紹介していました。

Bindノードを新しく追加しました。

Nameの値をSpectrumに変更しました。

Rampノードを追加して

Bind2ノードのSpectrumの結果をRamp1ノードのInputに追加します。

更にRamp1ノードのRampの結果をSphere LightノードのEmitcolorに繋げます。

うーん。

Rampノードの設定は何もいじらないんでしょうか?

やっぱりRampノードの以下の設定をInfra-Redに変更していました。

Infra-Redはこういうやつです。

最後のBaseノードですが、SPHERE_BODYノードと同じBlack Rubberを選択していました。

Obj Layerに戻ってArea Lightを追加しました。

Render Viewで確認すると以下のようになっています。

Area LightのEnable Spot Lightの値をOnにして

更に以下の値を調整しました。

更に別なArea Lightを追加しました。

そのArea Lightの設定です。

これらの処置は見た目を良くするためのもので、まああんまり真剣に記録する価値はないです。

それなりに聞いて先に進みます。

結果です。

BackgroundのBaseが一寸平ら過ぎる気がします。

そこを調整するそうです。

Materialノード内に戻り、Turb Noiseノードを追加しました。

更にRampノードを繋げて

その結果をBaseノードのRoughに繋げます。

Turb NoiseノードはPositionを指定する必要があります。

Global Variableノードを追加してPositionを指定します。

以下のようにセットしていました。

このNodeをTutorialでは一貫してGlobal Attributeと呼んでいましたが、名称はGlobal Variableになっていました。

Houdiniの定義ではVariableはNode内だけで使用されるものでNode間を超えて値が保持されるのはAttributeです。

のでこのNodeをGlobal Variableと呼ぶのは間違っていて、TutorialのようにGlobal Attributeと呼ぶべきです。

公式は何でこんなへんな名称をつけたんでしょうか?

Tube NoiseノードのFrequencyの値を少しだけ上げました。

更にRoughnessの値も上げました。

更にRoughnessの値が0である場所は無いので

RampノードのRamp Defaultの0の位置の値を黒から灰色に変更しました。

更にBump Noiseノードを追加しました。

Pの値をGlobal Variableノードから持ってきて

Bump NoiseノードのDispNの値をBaseノードのBaseNの値に繋げました。

Renderの結果です。

Backgroundが凸凹してますね。

Plasticのような質感を出すには、凸凹の大きさを凄く小さくすると良いそうです。

Bump NoiseノードのFrequencyの値を以下のように大きくしました。

結果です。

おお、Plasticのように見えるかと言われると一寸疑問ですが、明らかに質感が前から変わりました。

NomalのParameterをいじる事で質感を表現してるのか。

これは勉強になりました。

<Trail Node>

VEX_PROJECT内の

以下の場所にTrailノードを追加しました。

Result Typeの値をCompute Velocityに変更しました。

結果です。

うん?

よく見ると以下のIconにCheckを入れで表示していました。

これは何を生成しているんでしょうか?

GeometryのSphereを選択して

SamplingのGeometry Velocity BlurからVelocity Blurを選択します。

そしてOut Layerに移動し

Mantra_iprノードを選択します。

このNodeは無料版のHoudiniには無かったかもしれません。

無かったらこの部分の実装はしません。

今回の勉強で終わりにします。

Mantra_iprノードのRendering TabにあるAllow Motion BlurにCheckを入れます。

そしてOutput PictureにSaveする場所を指定します。

あ、これは最後にImageを生成するんだ。

以下のようにSaveしていました。

そしてFrame毎に動きの無い実装部分にRestノードを追加します。

これでRest Attributeが生成されました。

今度はMATERIALSノード内に移動して

Pの代わりのRestを使用します。

Sphere Bodyノードを消してしまいます。

そしてBaseノードの実装をDuplicateします。

そして名前をSphere_Bodyに変更します。

さらにBindノードを追加して

そのParameterにあるNameの値をRest、Typeを3Floatに変更します。

このNodeをGlobal Variableノードの代わりに使用します。

Renderingした結果です。

うーん。

これは何をしてるの?

更にLightを追加します。

Object LayerにあるCircle_Setupノードの最後に

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

これでouterと言うPoint型のAttributeが生成されました。

そしてBlaskノードを追加して

Group名にOuterを追加します。

こんな点が出来ています。

更にTransformノードを以下の位置に移動させ

以下の値に変更しました。

結果です。

Pointが端に移動しました。

次にCopy To Pointを追加して

このPointにSphereを生成します。

最後にNullノードを追加して名前をRING_LIGHTにしました。

そしてObj Layerに戻ってきて

Geometry Lightを

追加しました。

Geometry LightのGeometry Objectに先程作成したRING_LIGHTを追加し

ColorとExposureの値を変更しました。

このLightを追加した結果、どうなるかをTutorialは見せてくれません。

この辺の説明は不親切です。

更にArea Lightを追加しました。

後から照らしています。

<Outro>

最後に結果を示しています。

以上でした。

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

7.1 Learning Agents (5.5)[6]の勉強

何とUE5でもReinforcement Learningが出来るそうです。

知らなかった。

調べたらこのSiteにやり方がまとめられていました。

ので今週は予定を変更してこれを勉強する事にしました。

Bot用のMachine LearningをするPluginだそうです。

<What is Learning Agents?>

Imitation Learningって何でしょう?

始めて聞きました。

それは兎も角、UEでNPCの行動を未だにIf節で管理してこれがAIだと言うのはどうかとずっと思っていましたが、一寸とは言えやっとこういうPluginが出て来たのはうれしいです。

<Who is Learning Agents for?>

ML Botを作成する人向けにこのPluginは作成されたそうです。

以下のBeginner用の説明で

Policyって言葉が出て来ました。

Reinforcement LearningにおいてPolicyと言うのは標準的に使用されてるみたいですね。

<How does it work?>

ここの説明は実際に実装した後じゃないとCommentしようが無いです。

先に実装してみます。

<Getting Started>

TutorialのLinkが載ってるだけです。

7.2 Learning to Drive (5.5) [7]を勉強する

流石にこれだけでは何も勉強した事にならないので、Tutorialの方も見てみます。

このTutorialではそれぞれのLearning Argentをどうやって繋げて使用するのかを教えるみたいです。

以下の車の運転を、Neural NetworkでTrainingしてなるだけ早くTrackを走れるようにするそうです。

<Initial Setup>

流石にここはいらんわ。

<Playtest>

ここは車の操作方法を説明しています。

このTemplateは去年作成したGameで使用したので、操作方法に関しては勉強する必要ないです。

次に行きます。

<Clean Up the Map>

以下のAssetは要らないので消します。

<Enable Learning Agents Plugin>

Learning Agents pluginをEnableします。

やっとAIの勉強らしい事が始まった。

<Learning Agents Manager>

Learning Agents Manager classについての解説です。

色々説明していますが、まあやりながら理解していきましょう。

<Create the Manager Blueprint>

Learningと言う名前のFolderを作成しています。

その中にActorをParentにしたBPを作成しています。名前はBP_SportsCarManagerです。

そしてComponentにLearning Agents Managerを追加しました。

Class Defaults buttonを押してTagに以下の値をセットします。

BP_SportsCarManagerをLevel上に配置します。

<Registering Agents with your Manager>

だそうです。

ここでいうAgentは学習するAIを搭載した車の事でしょうね。

それぞれの車をManagerに登録する必要があるのか。

以下の実装をSportsCar_Pawn blueprintに追加する事でそれぞれの車をManagerに登録します。

成程ね。

<Logging>

AgentがManagerに追加されたら以下のLogが発するそうです。

<Manager Listeners>

ManagerのListenerについて簡単な説明をしています。

以下の事をするそうです。

  • gathering observations,
  • performing actions,
  • training,
  • recording data to files

あれ?

Listenerなんだから。Performing Actionとかは違うような気がしますが。

Eventとかの関係を忘れてしまいました。

これって前に沢山勉強したはずです。

Blogを調べます。

2024-03-31のBlogにまとめてありました。

これです。

これってUEFNの勉強でやってました。

UEFNの勉強しても無駄でしたね。今思えば。

この説明を見るとEvent ListenerはEventの発生に対して何らかの反応をするものとなっています。のでEventに対してperforming actionsしても良いのか。

納得。

そして3つのComponentを使用すると書かれています。

  • the Interactor
  • the Policy
  • the Trainer.

はい。

Policyが出て来ました。

<Learning Agents Interactor>

Interactorについての解説です。

だそうです。

更に以下の4つのFunctionから構成されるそうです。

  • SpecifyAgentObservation
  • SpecifyAgentAction
  • GatherAgentObservation
  • PerformAgentAction

のでInteractorの作成手順は、まずInteractorのBPを作成し、その後でこの4つのFunctionを実装する事になるそうです。

まずLearningAgentsInteractorをParentにしたBPを作成します。Tutorialでは名前はBP_SportsCarInteractorにしていました。

<<Observation Example>>

話の流れ的に、ここでは4つのFunctionの内の最初のFunctionであるSpecifyAgentObservationの実装方法の説明が始まると思っていたんですが、

何故かLearning Agentsの話が始まっています。

ここで言うLearning AgentsはLearningAgentsInteractorを指してるんでしょうか。それとも全く別なLearning Agentと言うものがあるんでしょうか?

しかもこの文の次の文はObservation Objectが具体的にどんなDataを扱えるかについての解説になっています。

要するにPositionとかVelocityがObservationで扱うDataになる訳です。

そしてそれがこの節の題であるObservation Exampleに当たるのか。

Observation Exampleが何なのかは理解しました。

でそれと話の流れ的にここで勉強するはずである「SpecifyAgentObservationの実装方法」と何の関係があるの?となりますが、

今度はEgocentric Reference Frameとは何であるかの説明が始まります。

この文脈で言う所のFrameとCoordinateは同じ意味です。

でこの説明を見るとOffset CoordinateとEgocentric Coordinateは同じに見えます。

Copilotにこの2つの違いを聞いてみました。

Egocentric Coordinateは観測者の位置が常にOriginになっています。

つまりLocal Coordinateを使用してるって事か。

はい。理解しました。

でEgocentric CoordinateがGlobal Coordinateより優れている具体的な例として目的地に移動するAgentが紹介されています。

この説明では、Global Coordinateを使用した場合、目的地が変わった時に全く対応出来なくなる事が述べられていますが、

実際に自分で確認した訳ではないので、本当なのかな?という感想が偽らざるところです。

先を読むために一応納得しておきます。

はい。

 

この実装はその通りだと思います。

EgocentricなCoordinateを追加する実装の説明です。

LocationをSpecifyしています。

しかし具体的にLocationをどうしてるのかの説明がありません。GlobalなCoordinateで表されるLocationをObserverからのRelativeなLocationに変更したんでしょうか?

次の実装例です。

こっちはGlobalなCoordinateで表されるLocationをObserverからのRelativeなLocationに変更してますね。

うーん。

最初の実装は何をしてるのか分からん。

ここで考えても分からんので先に進みます。

次の文章を読みます。

いきなりSpecify Agent Observationの話が出て来ました。

これ読むと何のためにやっているのか不明な最初の実装の部分をSpecify Agent Observationと呼ぶみたいです。

そしてこの実装が最初の説明であったEgocentricなCoordinateに変換するために必要なParameterを追加する部分のようです。

成程。

話の流れ上、ここはSpecify Agent Observationについての解説になるのに、何故か(Egocentricとかの)別な話に飛んでると思ったら、初心者にSpecify Agent Observationの説明をするのに具体的な例を示す必要があったら、こうなったのか。

やっと理解出来ました。

次の文です。

今度はGather Agent Observation Functionについてです。

先程の4つの関数では

何故か3番目に紹介されています。

でも名称的には2番目の手順って感じがします。

更に言うと2番目の実装の図の最初のNodeがGather Agent Observationになっています。

そしてこの実装の内容が次の文章で説明されています。

ここは2番目の実装を説明しただけだと思います。

そんなに深く考えないで次の文に行きましょう。

どうやってNormalizeすべきなのかは分かりません。

Get Agentノードについての解説です。

これは別にObservationノードに限りません。UE5のNodeならどのNodeでもそうなっています。

あ。

分かった。

この節は単に以下の2つの実装について説明してるんです。

ところが、前節で以下のような4つの機能に分かれてるとか

Egocentric Coordinateについての説明もここでやっとくようにとか上司に言われたので、こんな構成の文章になったんです。

じゃなかったら、こんなあちこちに話題が飛んでる内容にはならないです。

このTutorialは軽めに読んだ方が良いかもしれません。

そういえば前にWorld Partitionの勉強をした時も同じ経験をしました。

公式の説明は抽象的で初心者向きではありません。

理解した後なら、ああそういう事が言いたかったのか。と分かりますが、初心者にそんな説明の仕方するの?とか、そもそもその言いたかったことが重要でない場合が多いです。

他にTutorialが無いか探しますか。

7.3 他のTutorialを探す

UE5におけるReinforcement Learningの事をLearning Agentと呼ぶ事が判明したので、それをKeywordにして探します。

いきなり出て来ました。

https://www.youtube.com/playlist?list=PLTBLEEbeh50vDKpwuqxAGF9JZDPZgBKpy

こんなにたくさんのTutorialがあります。

あれ?製作者の名前が違います。

こっちか。

この人が製作者なのか。

https://www.youtube.com/watch?v=387ym_2VLUA

何なんでしょうか?

この人のChannelは検索に全く引っかかりません。

軽く見てみます。

あ。さっき勉強してたSiteを参考にして作成してるって言ってます。

うーん。

という事は結局、さっきのSiteは読む必要があるのか。

7.4 Learning to Drive (5.5) [7]の続きを勉強する

やっぱり他のTutorialを勉強するにしてもこのTutorialは一回は読んでおく必要があるのか。

仕方ない。

続きを読みます。

<<Creating a Spline>>

今度はSplineを配置する話か。と思ったら

まだDataの取得の話でした。

AgentがTrack内を運転するためには、Trackに対してどこにいるのか、とかVelocityの値などの情報が、必要になると言っています。

うん。

これは前節でやったAgentに必要な情報を集める話でしょう。

Specify Agent ObservationかGather Agent Observationのどっちの話か分かりませんけど。

Spline Observationを使用すればSplineに対しての位置情報を得る事が出来るそうです。

ところが、TemplateでTrackを形成しているのは、LandscapeSplineで作られているので、通常のSplineをTrackの位置に配置する必要があるそうです。

はい。

そのために新しいBPを作成します。ParentをActorにして名前はBP_SportCarTrackSplineにしていました。

そして以下のようにSpline Componentを追加していました。

名前はTrackSplineに変更していました。

更にClosed LoopをEnableしました。

このActorをLevel上に配置しました。

以下のようにSplineをTranckに重ねるように生成しました。

この後はどうやってSplineをTrackと同じ形状にするかの手法が紹介されています。

この辺のSplineの操作方法はWater SystemのRiverの生成やPCGでのSplineの使用方法などで既に何回も勉強しているのでここにはまとめません。

<<Sports Car Observations>>

BP_SportsCarInteractorに戻ります。

FunctionsのOverrideからSpecify Agent Observationを追加します。

Specify Agent Observation functionを開き、以下の実装を追加します。

この実装が終わったら。以下に示したSet Obs ActorノードのLocal Variableを作成します。

さっきのObservation Exampleでの実装もこれと同じ事やってるだけだろ。

Observation Exampleの説明はなんかおかしいですから。

<<Sports Car Actions>>

やっとActionが来ました。

以下の4つのFunctionで構成されると言っておきながら、

今までやったのは全部Observationです。

やっとActionの機能の実装方法が勉強出来ます。

以下の説明がありました。

Specify Agent ActionとPerform Agent Actionの2つの説明が書かれていました。

  • Specify Agent Action: Agentが可能なActionが宣言されている
  • Perform Agent Action: EventでNeural NetworkからAction値を受け取る。

ここでは簡略化をして、throttle(加速)/braking とハンドルの操作だけをActionにするそうです。

先程のSpecify Agent Observation の追加と同じようにSpecify Agent Actionを追加します。

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

同じ様にPerform Agent Actionを追加して

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

これは長すぎる。

実際に実装する時は、元のSiteを見ながら実装します。

ActActorをLocal Variableに追加するそうです。

これですね。

Interactorの設定はこれで終わりだそうです。

今度はTrainer blueprintを作成するそうです。

<Learning Agents Training Environment>

training environmentにはreinforcement learningに必要なtraining codeを保持しています。

具体的には

  • reward function
  • completion function

などです。

training environmentはBPで作成します。

LearningAgentsTrainingEnvironmentを親としてBPを作成し、名前はBP_SportsCarTrainingEnvと名付けます。

中を開き、Spline Component (Object Reference)型のVariableを作成します。名前はTrackSplineとします。

<<Rewards>>

別にUE5に限らずどのTutorialでもReinforcement LearningのRewardの説明をする時に以下のように書いています。

でもこれって凄い不思議です。

だってComputerは別にテストで高い点数をとっても嬉しくないからです。

これは近年やっとやり方が理解出来た、液体の動きをSimulationするのに粒子のSimulationから液体を生成する方法と同じ位不思議です。

次の文です。

具体的にAIはどうやってCorrect Actionを学ぶんでしょうか?

そしてGathering RewardはGathering Observationと同じように働くがSpecify Stepは無いと書いてあります。

うーん。

まだこの謎が解けるのは先のようです。

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

これはかなり先になってから必要になる知識のようです。

今はまだこの話はどうでも良いです。

先に進みます。

Gather Agent Reward FunctionをOverrideします。

そしてGather Agent Reward Functionを開き、以下の実装を追加します。

解説を読む前に一寸だけCodeを読んでみましょう。

まずInputとOutputのNodeがあります。

Get AgentノードでAgentを取得してそれをReward Actorノードにセットしています。

このReward Actorは後でVariableに指定するんでしょうね。

Return ノードのOut Rewardの値は、

以下の2つのFunctionの値を足して計算していました。

Track内の速度に対して報酬を与えるMake Reward From Velocity Along Splineノードと位置の違いに対して報酬を与えるMake Reward On Location Difference Above Thresholdノードです。

うーん。

Track内にいて速度が高いAgentに高い報酬を与えるのは理解出来ます。

しかし次の位置の違いに対して報酬を与えるのは向きの問題はどうするんでしょうか。逆走しても高い報酬が出てしまうんじゃないでしょうか?

Make Reward On Location Difference Above ThresholdノードのInputを見るとLocation Bの値は、

以下に示したFind Location Closest To World Locationノードから得ています。

更にFind Location Closest To World LocationノードのInputは以下のようになっています。

あ、分かった。

これはそのAgentからもっとも近いTrackの境界線までの距離を測っているです。

更に以下のInputは

その距離が8mまでは関係なくて、8mを超える(もしくは下回ると)-10の罰を受ける事になるんです。

多分、こんな感じの報酬の設定をしてるんだ。

次の文で以下のように解説しています。

We want the car to stay on the track.

つまりTrackの端より8m以内に近づくとその距離に応じてNegativeな報酬を受けるようになる訳です。

<<Completions>>

Episodeという新しい概念が出て来ました。

これを読むと、Episodeとは一回の学習が始まって終わるまでを指すようです。

これを何回も繰り返すのか。

あ、そう言えばよく遺伝的アルゴリズムとか言ってReinforcement Learningのような事を沢山のAgentで何世代も繰り返すのを見ますが、これもReinforcement Learningの一種なんでしょうか。それともこれは全く違う話なのでしょうか?

これは後で調べる事にします。

更に次の文で、

追加の条件を追加する事について述べています。

確かにTrackから外れてしまったAgentにその続きを強要しても学習の足しになる事はなさそうです。そういうAgentのEpisodeはさっさと消してしまうのが学習上、効率が良さそうです。

次の文です。

突然というか、この節の題の話題がやっと始まったというべきか、Completionについて解説しています。

Completionには2つあって、Terminationはこれ以上の良い結果を得る事は出来ない場合、TruncationはEpisodeを途中で終了する場合です。

この2つの定義から推測するに、Episodeを最後まで行った場合はCompletionとは言わないみたいです。

Gather Agent CompletionをOverrideして追加します。

そしてその中に以下の実装を追加します。

これはあれだ。Trackから8m外れた場合だ。

そうなったAgentは強制的に終了させるわけだ。

何故、こんな設定にしたのかについての説明がされていました。

この辺の設定の匙加減は実際にやってみて調整するのが一番です。

次に行きましょう。

<<Resetting Episodes>>

いきなり以下のように述べていました。

はい。

この例では以下の事をする必要があるそうです。

そのためのFunctionを作成したら、Reset Agent Episode Functionからそれを呼ぶような実装を作成するのか。

SportsCar_Pawn BPを開きます。

ResetToRandomPointOnSplineと言う名前のFunctionを追加します。

このFunctionを開き、InputノードにSpline Component (Object Reference)型のSplineと言う名前のInputを追加します。

全体の実装は以下のようになっていました。

長い。

一応、軽く読んでおくか。

まずInputノードですが

先程追加しろと書かれていたSplineがありました。

次のNodeはWhile Loopノードです。Boolean型のVariableであるInvalid Transformノードがついています。

このVariableの値はどこで指定されるんでしょうか?

Loop Bodyの方から見てみます。

Candidate Transformと言うVariableと先程出て来たInvalid Transformの値はここでSetされていました。

Transformが何をさしているのかが不明なのでこの時点では、まだ何も分かりません。

先へ進みます。

ここの実装は全部のAgentに対してそれぞれこの作業を行うという事です。

何と、以下の条件に合ったらInvalid TransformをTrueにするという作業でした。

あ、納得。

Invalid TransformはCompletionつまり駄目だしをしてるんだ。

うーん。でもこの実装だと、別に一個一個のAgentに対してInvalid Transformがあるわけじゃないし。

どうなってるんだろう。

まあ良いです、今回は軽く読んでどんな内容が書いてあるか理解出来れば十分なんで。

次に行きます。

Candidate Transformの型が書いてない。

まあSet Candidate Transformノードから作成すれば何とかなるか。

今度はBP_SportsCarTrainingEnvを開きます。

もうこんなBPを作成した事も覚えてなかったです。

中を開きReset Agent Episode functionをOverrideします。

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

はい。

これはTrack上にRandumなPointを生成するFunctionですね。

これでTrainingのための実装は完成だそうです。

次からManagerの実装に入ります。

<Implementing the Manager>

BP_SportCarManagerの実装を完成させるそうです。

<<Begin Play>>

ここでは全てのall the listenersを作成し、Setする必要があるそうです。

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

成程ね。

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

ひええ。

今週は一個だけ確認します。

最初の実装です。

うーん。

これってMake Functionなの?

よく見たら3番目の実装はMake Functionになってました。

この実装をした後に、この実装が動くためにしなければならない一覧が書かれていました。

はい。

なんとCodeの一部を説明してくれるそうです。

これはありがたい。

最初の実装部分の解説です。

Splineは?

Splineについての解説は無いですね。

あ、次の文で解説してました。

これは長いので読んで終わりにしてしまいます。

と思ったら以下の解説でPolicyについてやっていました。

これは重要なので記録しておきます。

うん。

Policyが何なのかの説明はなさそうですね。

PolicyをMakeするための実装方法を説明するのか。

MiscellaneousからData Assetを選択してLearning Agents Neural Networkを指定します。

DA_SportsCarEncoder, DA_SportsCarPolicy, そしてDA_SportsCarDecoderの3つを作成します。(多分)

Mak Policyノードの以下の場所にそれぞれをセットします。

以上です。

<<Tick>>

今度はTickの方の実装です。

Run Trainingノードについて簡単な解説が書かれていました。

<Finishing Touches>

そろそろ飽きて来た。と思ったんですが、これが最後の章なので終わらせてしまいます。

Finishing Touchはまあ、豆知識って意味ですね。

あれ心配になって来た。一応調べます。

最後の仕上げって訳が出て来た。

まずこれです。

もう疲れたのでDeep Lで訳します。

アクションはシミュレートされた物理を使ってリアルタイムで発生するので、アクションがゲームステートに影響を与えるには、ある程度の時間を経過させる必要がある。

はい。

言われてみればその通りです。

でこの事を考慮するためには以下の方法があるそうです。

managerのTick Rateを下げる

そうなのか。

うーん。

検証はまた実装する時にやりましょう。

やり方ですが、

  1. manager blueprintを開く
  2. class defaults buttonをClickし
  3. Actor -> Tick Interval (secs) を1にセットします。

だそうです。

追加で

LearningAgentsManagerをComponentから選択して

MaxAgentNum を32にセットします。

更に以下の解説がありました。

はい。

MaxAgentNumを32にしたので、

以下に示した様に32台のSportsCar_Pawnを配置出来ます。

数えたら31台しかないですね。

説明に最後の一個は実行したらSpawnするって書いてありました。

次に車同士のCollideはDisableするって書いてありました。

SportsCar_Pawn BPのClass Default’s Collision sectionのCollision Presetsの設定を以下のように変更すれば出来ます。

はい。

<<Training>>

変化が見れるまで15分ぐらいかかり、完全に学習が終わるまでに2時間はかかるそうです。

ふえー。

Neural network Assetなんて作ったかな。

Policyは?

Policyが生成されるじゃないの?

それよりもこんなのがあるそうです。

これは面白そうです。

こっちも後で勉強する事にします。

もし途中で学習を停止してまた後で継続したい場合は、

ManagerにあるRun TrainingノードのReinitialize Encoder、Policy、Decoder NetworkをDisableすれば良いそうです。

同様にMake CriticノードのReinitialize Critic NetworkもDisableする必要があるそうです。

気をつけないといけないのは、もしReinitialize Network = Trueとなっていると前のTrainingしたDataは全部消える事だそうです。

成程。

これば役に立ちそうな情報です。

Trainingを開始した後は、Output LogでErrorが出てないかのCheckをすると良いそうです。

これはまあ当然ですね。

このOutput Logの中にRewardの平均やReturn ValueそしてBehaviorの値が表示されるみたいです。

それらしきものを見つけましたが、Behaviorはどれなんでしょうか?

これらの値は、学習時間が増えるにつれ向上するそうです。

はい。

<<Inference>>

inference mode(推論Mode)てAIの専門用語ではどういう意味なんでしょう?

と言うのは、ここは学習が完成したModel(Policy?)をGame内で使用する方法を説明してるんだと思ったんですが、なんか違う事が書かれていました。

理解した範囲で、まとめるとどうも別なProjectにこの学習したModelを移動する事は出来なくて、このProject内で使用する必要があるみたいです。いや出来るのかもしれませんがここの短い説明ではその辺はよく分かりません。

兎に角、Inference ModeをOnにすると学習した結果を使用して車が走るそうです。

そのやり方はBP_SportsCarManagerの Run InferenceをEnableするだけだそうです。

そんだけです。

<<Next Steps>>

特になし。

以上でした。

7.5 Learning to Drive (5.5) [7]を勉強した感想

大体は理解しました。

最初は、このTutorialは勉強したら駄目なやつだ。と思ったんですが最後まで勉強したら以外に良かったです。

後、このTutorialに限らないんですが、UE5の公式Siteは章と節の題が、ほとんど同じ大きさで読んでいて、別な話をしてるのか、更に深く解説してるのかが分からなくなります。

それを解消する方法を見つけました。

右端に表示されているON THIS PAGEですが

節の場合は1Tab分だけ下がっています。

これで節と章の区別を簡単につける事が出来ます。

全体像を把握するのにこの情報があるかないかで結構、差がでます。

ここから章を見直すと、Learning Agents Interactorの部分で一寸理解出来なかった箇所が在る事を思い出しました。

ここは後でもう一回読み直す事にします。

これは今、Copilotに聞いてしまいます。

全然違うそうです。

それぞれの定義です。

こうやって説明されると全然違うものという事が分かりますね。

最後にCopilotのまとめも貼っておきます。

だそうです。

8. DirectX12の勉強

8.1 Lötwig Fusel氏のD3D12 Beginners Tutorial [D3D12Ez]を勉強する

8.1.1 Render Target View & Descriptor Heap | D3D12 Beginners Tutorial [D3D12Ez] [8]の20分からの10分を実装する

先週は実装すると書いていましたが、実際にしたのは勉強の方でした。

ので今週は、先週勉強した内容を実装します。

m_rtvHandles[i]を追加します。

Testします。

以下の場所にBreak Pointをセットして

m_rtvHandles[i]の値がしっかりPassされている事が確認出来ます。

はい。

出来ました。

これでRender Target Viewが作成されたのでそれをcommand Listにセットします。

Window.cpp内のBeginFrame()関数内に

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

またTestをします。

特にErrorとかは無いです。

Clear Render Target View()関数も追加します。

Clear Renderの色はSample Codeの色と同じにしました。

またまたTestします。

指定した色になりました。

これで実装部分はお終いです。

短いけどまあ良いです。

気長にやる事にします。

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

8.2.1「5.10 Pixel ShaderのProgramを変更」を勉強する

Textureを表示出来るように、Pixel Shaderの実装を変更します。

以下の変数を作成します。

まず最初の問題として教科書には、BasicShaderHeader.hlsliと書いてありますが、

Sample CodeにはそんなFileはなく、以下のBasicPixelShader.hlslに同様の記載がありました。

FileのExtensionを見ると、以下のBasicType.hlsiこそが

この実装にふさわしい気がしますがどうなんでしょう。

この辺、何故この変数を作成する必要があるのかを少しでも先に説明してくれると、こっちでどっちのFileに実装した方が良いのかとかの判断が下せるんですが、そういうのはどの教科書にも書いてありません。

そもそもDirectX12の教科書は分厚いだけで中身が無いです。

更にPixel値を返す関数内の実装を以下のように書き換えます。

以上でした。

9. まとめと感想

なし

10. 参照(Reference)

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

[2] What is Isaac Sim? — Omniverse IsaacSim. (n.d.). https://docs.isaacsim.omniverse.nvidia.com/latest/index.html

[3] Quickstart with a Robot — Isaac Sim Documentation. (n.d.). https://docs.isaacsim.omniverse.nvidia.com/latest/introduction/quickstart_isaacsim_robot.html

[4] Reinforcement Learning Policies Examples in Isaac SIM — Isaac SIM Documentation. (n.d.). https://docs.isaacsim.omniverse.nvidia.com/latest/robot_simulation/ext_isaacsim_robot_policy_example.html#isaac-sim-policy-example

[5] Nine Between. (2021, February 13). VEX isn’t scary Project - Part 4: Rendering [Video]. YouTube. https://www.youtube.com/watch?v=SYxlVqwvONE

[6] Learning Agents (5.5). (n.d.). Unreal Engine. https://dev.epicgames.com/community/learning/courses/GAR/unreal-engine-learning-agents-5-5/bZnJ/unreal-engine-learning-agents-5-5

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

[8] ötwig Fusel. (2023, July 11). Render Target View & Descriptor HEAP | D3D12 Beginners Tutorial [D3D12EZ] [Video]. YouTube. https://www.youtube.com/watch?v=6XxTkoNg_KU