UE4の勉強記録

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

UE5の勉強などなど

1.今週の予定

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

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

それぞれの勉強の最初にその勉強をする目的を一寸だけ書いておきます。

2. 映像作成用UE5の勉強

2.1 PCGを使用した神社の作成

PCGで建物を作成する方法を勉強してるので、その応用としてPCGで神社を作成する事にしました。

最終的にはUEFNのMap内で神社を作成して、だれでも参拝出来るようにするつもりです。

今週は屋根をPCGで生成するためのPointの生成方法と、Static Meshの代わりにBPを生成する方法についての調査の2つを行います。

2.1.1 屋根を作る

今週は先週作成したBP内でStatic Meshを組み合わせて屋根を作成します。

これを元にして作成します。

以下の屋根を作成しました。

追加したStatic Meshです。

結果です。

デカすぎる。

サイズを調整します。

かなりマシになりました。

しかし2つ問題があります。

一つ目は屋根のMaterialが一寸でも遠くになると消えてしまう事です。

屋根のCullingはどこで決定してるんでしょうか?

2つ目は以下の様に重なって表示される部分です。

これらは来週検討します。

2.2 PCGの勉強

PCGを使用した建物の作成を勉強しています。

その理由ですが、Luma AIで作成した3D Gaussian SplattingをUE5にImportすると以下の様に、

奥にあるHigh-rise apartment Building(マンション)が歪んでいます。

気持ち悪くなる位曲がっています。

これ直さないと3D Gaussian Splattingは使用出来ない。との結論になりました。

でどのように直すかとなると、PCGを使用してHigh-rise apartment Building(マンション)を作成するしかないのかな。となりPCGで建物を作成する方法を勉強する事になりました。

2.2.1 Isolate Corners With PCG To Create Pillars and Roofs | UE 5.4 P3 [1]の残りを実装する

<16:00 - Override Floor Material>

ここでは床のMaterialを変更してるんですが、私の場合は今のMaterialで十分なのでこの部分はSkipします。

<16:26 - Adding the Roof>

Roofを追加します。

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

結果です。

天井が追加されました。

<17:48 - Roof Edge Railing>

屋上に柵を追加します。

以下のAssetを柵として使用します。

PCG_ScaleWallSizeをDuplicateします。

名前はPCG_ScaleWallLengthOnlyとしました。

これを開き、以下の部分を消してしまいます。

あれ?

先週のBlogのまとめと違う実装になっています。

あ、分かった。

このPCG Scale to Sizeと言うNodeの中身を変更してるんだ。

Tutorialを見て確認します。

分かりました。

TutorialではこのPCG Scale to SizeもDuplicateしていました。

そして名前を

PCG Scale Mesh Length Onlyに変更しています。

更に中の実装を先週のBlogでまとめたように変更していました。

PCG Scale Mesh Length Onlyの実装を以下の様に変更しました。

更にPCG_ScaleWallLengthOnlyの実装を以下の様に変更しました。

作成したPCG_ScaleWallLengthOnlyを使用して屋上に柵を追加します。

まず以下のTransform Pointsノードの結果をNamed Rerouteノードに繋ぎます。

名前はRoof Corner Pointsとしました。

Roof Corner Pointsノードを使用してPCG Scale Wall Length Onlyノードを以下の様に実装しました。

TutorialのPCG Scale Wall Length OnlyノードはInputにDepthとHeightが無くなっていたので消しました。

結果です。

あれ?

柵の場所にPointが出来てない。

あ、

床のPointをDuplicateしてた。

直します。

直しました。

次はStatic Meshの追加をしています。

PDA_Modular Buildingを開き

RoofRailingを追加しました。

更に

DA_RegularBuildingを開き

柵のMeshをセットします。

DA_RegularBuildingをUpdateしたので

PCG_Buildingに戻りDataAssetにDA_RegularBuildingを追加し直します。

今回は外れていました。

PCG_BuildingのGet Property From Object Pathノードを選択して

Property NameにRoofRailingをセットします。

更にPointを移動するために以下の実装を追加しました。

結果です。

X軸にもずらす必要がありそうです。

最後にMeshを追加して以下の様になりました。

端っこが重なっています。

これはWallも重なっているからで、この問題は来週直す事にします。

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のIK boneを利用したLevel sequence上における歩き方の設定方法を調査しました。

しかし結論は

となりました。

整理すると、この方法は以下の3つの課題があり

それぞれの課題の中で特に、3番目のこのControl RigをLevel Sequenceから呼び出し使用する方法に限っては可能なのか?すら不明と言う事です。

次にLevel SequenceからAnimation State(State Machine)を呼び出せるかどうかを調べていました。

これはAnimation State(State Machine)から歩くAnimationを呼び出した場合は、障害物に対してAnimationを変更して歩く事が可能だから、その方法でDragonのAnimationを制御しようと考えたからのようです。

でも冷静になって今一度この方法を考えると、これが可能だったらControl Rigは全く使用しないって事ですよね。この戦術の方向性は間違ってますよね。

でも検証はやっておいた方が良いという事だったのかもしれません。

で結論は、Level SequenceからAnimation State (State Machine)を直接Controlする事は出来ないがEvent Trackを呼び出す事は可能だそうです。

しかしお勧めで出て来たTutorialはせいぜいDoorの開閉をLevel SequenceからControlする位でとてもDragonを自動で歩かせるような事な複雑な事は試していません。

で無駄な事を調べてしまったとなっています。

まあ、そうですね。

しかしその調査の途中で

UE5.6から追加された新機能であるLocomoterが、私が望んでる機能そのものである事が判明しました。

なんと、このNodeを使用すると歩行時のAnimationを地面との高さから勝手に計算して作成してくれるそうです。

このNodeに関しての調査は今週もやる事にします。

そして最後に以下のようにまとめています。

つまりこんな調査しても時間の無駄だった。から来週からは地道にControl Rigの基礎的な勉強に戻る。と言っています。

うーん。

確かにこれも一理あります。

というかControl Rigの勉強はまだ必要です。

でもそればっかりやってると、今までの勉強、特にUE5のMaterialやNiagaraの勉強と同じになってしまいます。

別な方法で取り組む事も必要です。

それは兎も角、先週の取り組みの内容はこんな感じでした。

2.3.2 今週からどうするのか?

Control RigのIK Boneを設定してLevel SequenceからIK Boneの位置をProgrammingで設定する方法、つまり以下の

手法が可能と仮定して

Control Rigの勉強をやる事にします。

その上でLocomoterノードの使用方法についても調査する事にします。

2.3.3 Full Body IK: Procedural Dragon Animations [3]を勉強する

たまたまこの動画がお勧めに表示されました。

で、思い出したんです。

前にこの動画を見て、以下の様に説明してるのを覚えていたんです。

ここで確かにFoot Locationだけを使用して凸凹したLandscape上を歩いています。

このControl Rigの実装を再現して、

そのControl RigをLevel Sequenceから呼び出したら、

私のDragonも爪が地面に食い込まないで凸凹した地形の上を自然に歩けるようになると思ったんです。

しかし、前にこのTutorialを見た時は何を言ってるのか全く理解出来ませんでした。

のでこのTutorialが理解出来るようになる位のControl Rigの知識を身に付ける事が先だと思い、Control Rigの勉強を始めたんでした。

これの勉強もやる事にします。

ずっと前ですが、この動画を見た時は何をしてるのか全く理解出来なかったです。

ので今回は、まずNotebookLMに分析してもらいます。

成程。

この動画の目的はFull Body IK Solverを説明してたのか。

Tutorialを見ると以下のNodeを使用していました。

Full Body IK Solverを使用したらProceduralなAnimation作成が出来るそうです。

そしてその後で、Physics Simulationや複数のControl Rigを組み合わせてDragonの尾や翼のAnimationを追加する方法も説明してるそうです。

更に、Proceduralな歩行システムの実装方法も説明しています。

この時点で、前にこの動画を見た時に何で理解出来なかったのかの理由も分かりました。

そもそもFull Body IK Solverが何なのかを知らないからです。

Mind MapにはFull Body IK Solverについてのまとめがありました。

最初の2つの要素の意味は分かりますね。

次の5本の腕を持つヒトデは何の事でしょう。

そういうSkeletal Meshがあるんでしょうか?

Display Axes On Selectionは何の事か全く不明です。

残りの要素はFull Body IK Solverノードの設定の説明です。

おお、大体理解出来ましたね。

2.3.4 Full Body IK Solverについての調査

更に、Control Rig [2]のTutorialの中に以下のFK Control Rigがある事も分かりました。

このTutorialではFull Body IKノードの使用方法を教えています。

軽く最後まで見てみます。

うーん。

分からん。

ChatGPTにまとめてもらいました。

普通のIKノードどどう違うんでしょうか?

だそうです。

成程。

結構分かって来ました。

YouTubeでue5 Full body IKで検索したら以下のTutorialが表示されました。

懐かしい名前がありました。

軽く見てみます。

うーん。

結構Full Body IKノードの基礎が理解出来ました。

それなりに分かり易かったです。

ついでに以下のTutorialも見てみます。

https://www.youtube.com/watch?v=FPW8vrP-e3w

Full Body IKノードでは無いですが、なんか分かりやすそうなTutorialです。

分かり易かった。

障害物があるとAnimationを変更するIKとしてFull Body IKが紹介されていました。

更に視線の合わせて体を動かすControl Rigも紹介されていました。

これをLevel Sequenceから呼び出して使える方法が判明したら全て解決するのか。

このTutorialは使えそうです。

しかもControl RigのTutorial Seriesもありました。

https://www.youtube.com/playlist?list=PLzJIbZSWGGtK6tCMJ18raCtj-7_I4T2m2

2年前なので一寸古いですが、基礎を勉強するには丁度いい量です。

記録しておきます。

取りあえず今週のControl Rigの勉強はここまでにします。

3. AIの勉強

AIの勉強の目的ですが、

生成AIが凄いTrendになってるので、最低限の基礎は知っておくべきと思いこの勉強を始めたんでした。

のでこれを勉強してどうしたいというのは無いです。

3.1 先週の復習

 Lesson 4: Practical Deep Learning for Coders 2022 [4]の勉強をしました。

Notebook LMを使用してMind mapを作成し、その内容をまとめました。

今週は実際にLectureを見て内容の確認を行います。

先週のBlogを読み直して気になったところを以下に示しておきます。

実際にLectureを見る時の参考になるかもしれません。

Outlierについてです。

Kaggleと言うかHugging FaceのLibraryを使用して実際にNLPを実装する方法はLectureで勉強するとまとめています。

3.2 Lesson 4: Practical Deep Learning for Coders 2022 [4]を見る

それではLectureを見てみます。

<00:00:00 - Using Huggingface>

NLPを実装するのでHuggingafceのLibraryを使用する事を説明しています。

NLPとTransformerの違いがよく分かりません。

これはNotebookLMとChatGPTで確認します。

ChatGPTにはつながりません。

NotebookLMの回答では、

となりました。

ChatGPTが回答してくれないのでDeep Seekに同じ質問をします。

分かり易!

<00:03:24 - Finetuning pretrained model>

Fine Tuningについて前回のLectureで勉強した以下のGraphを使用して説明しています。

Aの値は完全に分かっていて、Bの値もほぼ判明していますが、Cの値は全く分かりません。

このModelの事をPre-Trained Modelと呼び、BとCの値を特定するの行為をFine Tuningと呼びます。

<00:05:14 – ULMFit>

ULMFitのやり方を簡単に説明しています。

ここで注目すべき点は、学習に使用した教材にLabelが要らない点です。

大量の教材を安価で用意する事が可能になります。

<00:09:15 – Transformer>

ここでTransformerのModelの説明です。

Wikipediaの文章を抜き出して、その中の単語を一個か二個消して、AIにその単語を予測させる学習をさせたそうです。

<00:10:52 - Zeiler & Fergus>

Queensland大学からJohn William教授がLectureに参加しています。

その教授からの質問ですが、あまりにSpecificなのでここには書きません。

その質問の回答としてZeiler & Fergusの論文の内容(以下に示した図)が紹介されていました。

ここで最後のLayerを別にTrainingするというFine Tuningの話が紹介されていました。

<00:14:47 - US Patent Phrase to Phase Matching Kaggle competition>

Kaggle competitionについて説明していました。

<00:16:10 - NLP Classification>

NLPの応用としてのClassificationについて説明していました。

こんなのNotbookLMの要約には無かったはずです。

確認します。

よく分からんので質問しました。

だそうです。

更に詳しい解説が続きます。

これはさっきLectureに表示された内容ですね。

次です。

これは知ってます。

残りの話も知ってる内容でした。

の部分で、Documentは数個の単語でもDocumentであると言っていました。

数個の単語を書いただけでその著者を特定できるAIが出来たら素晴らしいですね。ネットの誹謗中傷もすぐに誰が書いたのか判明します。

この後、特許の例でAnchorとTargetを使用した例が出て来ますが、全く何を言ってるのか分かりません。

NotebookLMで既に勉強してるのに全く理解出来ません。

口ポカンです。

<00:20:56 - Kaggle configs, insert python in bash, read competition website

Kaggleを使用して実際のやり方を示すそうです。

ただしPaper Spaceの方が無料で使用出来るServiceは上だそうです。

以下の場所で実際のCodeは確認出来るそうです。

こっちがKaggle CompetitionのSiteです。

<00:24:51 - Pandas, numpy, matplotlib, & pytorch>

Pandasの話です。

Data Libraryの一つだそうです。

ChatGPTが使用出来ないのでDeepSeekに質問しました。

この後も、色々な細かい情報がずらっと表示されていました。

更にnumpy、matplotlibそして pytorchの説明もしていました。

  • Numpy: 数値解析用のLibrary
  • Matplotlib: Plot用のLibrary
  • Pytorch; DeepLearning用のLibrary

だそうです。

一応、DeepLearningにも聞いてみます。

長いので最初の部分だけ載せます。

NumPyです。

Matplotlibです。

Pytorchです。

Deep Seekの説明は長いです。

Lectureの内容ですが、この後はKaggleのCodeの説明が続きます。

しかしこのCodeの説明は聞いただけでは理解出来ません。

Getting started with NLP for absolute beginnersは

https://www.kaggle.com/code/jhoward/getting-started-with-nlp-for-absolute-beginners

にありました。

こっちはこっちでしっかり読み込む必要がありますね。

<00:29:26 – Tokenization>

Tokenizationのやり方を説明しています。

DatasetはHugging FaceのLibraryにもPytorchのLibraryにもあるので紛らわしいそうです。

ここでは当然Hugging FaceのDatasetを使用しています。

IDをそれぞれのTokenに追加する事もここで説明しています。

ここでTokenizationのやり方は使用するModelと同じである必要を説明していました。

<00:33:20 - Huggingface model hub>

でModelの説明になりました。

以下のSiteでHugging FaceのModelの数が載っています。

これHugging Faceに載ってるから、ビビッて凄いって思うけど、やってる事はcivitaiと同じです。

色んなModelを紹介してましたが、結局以下の無難なModelを使用する事にしてました。

そしてAutoTokenizerを使用してます。

<00:36:40 - Examples of tokenized sentences>

先程得たTokenizerを使用してTokenを作成しています。

なんか想像してたのと違います。

Commaとか!を一つのTokenとしていますね。

<00:38:47 – Numericalization>

以下の方法でTokenizationする事でそれぞれのTokenのIDも同時に生成出来るそうです。

以下のCommandでそれぞれのTokenのIDを表示しています。

以下の方法でToken、“_of”のIDを表示していました。

<00:41:13 - Question: rationale behind how input data was formatted>

これはSkipします。

<00:43:20 - ULMFit fits large documents easily>

膨大なDataを使用して学習する場合は、ULMFitの方がTransformerより優れてると主張していました。

その後でLabelの話をしていました。

TransformerってLabelが要らないんじゃないの?

この部分はよく分からないです。

更にTest用のDataの紹介もしていました。

<00:45:55 - Overfitting & underfitting>

まず以下の例を示しています。

この場合、Modelは実験Dataを再現するに足る複雑さを持っていません。

この例のような場合をUnderfittingと呼ぶそうです。

次の例です。

一見、非常に実験Dataと一致してるように見えますが、もし実験Dataの量を更に増やしてみたら、ここで一致してる幾つかの実験DataがOutlierである事が判明するはずです。

つまりそのようなOutlierのDataにも一致するようなModelを作成してしまったので、このModelでTestした場合、精度が単純なModelよりも悪くなる訳です。

この例をOverfittingと呼びます。

<00:50:45 - Splitting the dataset>

Underfittingの場合はGraphを見ればすぐに判明しますが、Overfittingの場合は判別は難しいです。

Overfittingを判別するのに、実権Dataの20%を外して、残りだけでFittingをします。

そして完成したModelの性能を確認するために外した20%のDataを使用します。

<00:52:31 - Creating a good validation set>

ただしどのDataを外すのかは簡単では無いです。

以下の例で説明すると

Randomに点を排除した場合、値が真ん中の点しか排除出来てないです。

<00:57:13 - Test set>

Test Setについての説明です。

Metricに使用するためのDataだそうです。

<00:59:00 - Metric vs loss>

Metricの評価にKaggle CompetitionではPearson Correlation Coefficientを使用します。

ここで頭にLectureの内容が入ってこなくなってきました。

クソ、限界か。

今週のAIの勉強はここまでにして残りは来週やる事にします。

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]の勉強

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 UI and Workflow Tutorials [7]のIsaac Sim Interface [8] を勉強しました。

最後に以下の様にまとめてありました。

となると

Assemble a Simple Robot [9]を今週は勉強する事にします。

4.2.2 Assemble a Simple Robot [9]を勉強する

まず以下のように書かれていました。

ChatGPTに訳してもらいました。

このチュートリアルでは、3つのリンクと2つの回転ジョイントを持つシンプルな「ロボット」にリギングを行い、

ジョイントとアーティキュレーションの基本的な概念を紹介します。

「Add Simple Objects」でステージに追加したオブジェクトを使用し、

長方形のボディと2つの円筒形の車輪を持つモックの移動ロボットに変換します。

このステップは、「Importing your Onshape Document」や「URDF Importer」からインポートしたロボットには必要ありませんが、

ロボットの調整やアーティキュレーションを用いたオブジェクトの組み立てを理解する上で重要な概念です。

Articulationの意味が分かりません。

だそうです。

Rigが何をするのか?

Riggingと言うとUE5ではBoneを追加する事を指しますが、ここでも同じでしょうか?

静的なオブジェクト(動かない形状)に、ジョイントやリンクを設定して、動かせるようにすること

だそうです。

あ、分かりました。

3つのリンクと2つの回転ジョイントを持つシンプルな「ロボット」にリギングを行い、

が間違っているんです。

これは

ロボットに3つのリンクと2つの回転Jointを追加する事でRiggingを行います。

と言う意味でしょう。

<Learning Objectives>

このTutorialでは

rig a two-wheel mobile robot

を勉強します。

更に

を勉強するそうです。

<Getting Started>

特に無いです。

<Add Joints>

7つのStepによって構成されています。

やってみますか。

Isaac Simを起動します。

mock_robot_no_joints.usdの場所が分かりません。

以下の場所にありました。

Importしました。

ReferenceとしてImportすると編集出来ないそうです。

ChatGPTによると

Xformと表示されていれば、編集可能になってるそうです。

次のStepです。

作成しました。

Tutorialでは述べていませんが、その下の動画ではScopeの名前をJointsに変更していました。

次のStepです。

やってみます。

Bodyを選択した状態で、Ctrl+Shiftを押してWheel_leftを選択しました。

更にRevoluteJointを追加しました。

結果です。

動画の画像と一寸違いますね。

Z軸の向きが逆になっています。

何故でしょう?

名前を変更しました。

動画を見ると

作成したPhysics Revolute JointをScopeに移動していました。

これは後から考えます。

次の手順です。

確認しました。

次の手順です。

これは何をやってるのか分かりません。

動画で確認します。

まずLocal PositionやLocal Rotationの値を、以下の様に変更しています。

確認します。

このParameterの意味はまだ分かりません。

分かりませんが、Tutorialと同じにしてみますか。

ChatGPTに質問してみました。

はい。

はい。

うーん。

Positionは分かりますが、Rotationは何を決定してるのか可視化出来ません。

例が載っていました。

やっぱりRotationは可視化出来ないです。

大変なBugを見つけました。

Parameterの方の数字をいじってもViewの青・赤・緑の矢印と円は変化しませんが、青・赤・緑の矢印と円をいじるとParameterの値は変化します。

これ以上深入りするのは止めます。

そしてAxisをYに変更しました。

この部分を説明していたのか。

動画で見たら一発で理解出来ました。

しました。

軸の表示が以下のようになっていて

Jointの軸も同じようになっているので、

円柱が転がるような軸を作成するには軸をYに変更する必要があるという事です。

次のStepです。

これは既にやっています。

次の手順です。

しました。

これで完成のようです。

Simulateします。

下に落ちていきました。

うーん。床を追加する必要がありますね。

Grand Planeを追加しました。

これで試してみます。

Shiftを押してRobotを引っ張ったら動きました。

円柱部が回転してるように見えますが、はっきりとは分かりません。

Bodyは円柱を通した軸で傾いているので、その部分に軸が出来てるのは間違い無いようです。

4.2.3 色々試してみる

Local Rotationの意味が分かりません。

値を変えて試してみます。

wheel_joint_leftとwheel_joint_rightのLocal Rotation 1の値を0にしてみました。

結果です。

何にも変わってないです。

一応Simulateしてみます。

何これ?

Simulateしたらタイヤの向きが上方向に変化しました。

Shiftで引っ張っても回転しません。

そういう事か。

分かりました。

これは軸と言ってもBodyとWheelを繋ぐ軸とかは全く関係ないです。

単にWheelのObjectの向きを決定してるだけです。

Wheelの元のObjectの向きが円柱だったんです。のでWheelとして使用するためにはX軸で-90度回転させる必要があったんです。

それだけです。

まだTutorialは途中ですが、もう疲れてしまいました。

残りは来週やります。

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

なし

6. Houdiniの勉強

Houdiniの勉強を始めた理由は、これからの3D GraphicsはProceduralな3Dの生成だという風潮が2年前ぐらいに起きて、それで慌てて勉強を始めたんです。

生成AIブームが起きて、Proceduralな3Dの生成のブームはすっかりなくなってしまいましたが、Nodeを使用して3Dを生成する手法は、職人的な技術が無くても3D Objectの生成が出来るのでかなり便利という事に気が付きました。

のでHoudiniの勉強は続けています。

6.1 先週の復習

 VEX Isn't Scary: Beginner Series [10]の総まとめをやっています。

そしてその中でHoudiniで望んだ3Dの形状を作成するには、生成したPointを望んだ3DのObjectの形状に変化する方法をどれだけ知ってるのかが重要であると理解しました。

のでVEX Isn't Scary: Beginner Series [10]の最後のProjectで使用した3つのObjectの生成方法を復習しています。

先週はその中で器の作成方法の復習を行いました。

器は溝を追加して作成されていますが、この溝の作成方法が今一理解出来てないです。実装方法は理解したのにです。

ので先週はこの溝をどうやって追加したのかを実装に使用したNodeの機能を一個一個復習して確認しました。

先週、確認したNodeの機能を以下にまとめます。

<Vdb from polygonsノード>

Polygonを消してVolume Dataに変更します。

<ConvertVDBノード>

Volume DataをPolygonに変更します。

この2つのNodeで溝を生成するための作成したMeshのPolygonを細かく生成し直しました。

<Normalノード>

指定されたMeshのNormalを振り直します。

このProjectの例ではPrimitive毎に設定されていたNormalが、Point毎に設定され直されました。

<Attribtransferノード>

更に、この後にAttribtransferノードが追加されていますが、このNodeで溝を作成してると思われたんですが、

このNodeを追加した結果を確認したところ、何の変化も起きていません。

と言って終わっていました。

6.2 器の作成の続き

Attribtransferノードの機能を調べます。

ChatGPTに聞きました。

成程。

これで器のGeometryに溝を生成するためのGeometryのNormalを移してるんだ。

AttribtransferノードのPointsにNが指定されています。

これで溝を生成するためのGeometry のPointのNormalを器に移してるわけです。

次のNodeはAttribblurノードです。

ChatGPTに聞いてみました。

先程、PassしたNormalを滑らかにするためのNodeだそうです。

そしてAttribute Wrangleノードに繋ぎます。

ここでは以下の実装を追加しています。

成程。PointのPositionにNormalの方向*0~1の値を足しています。

これで溝が出来るのか。

やっと理解出来ました。

その後の実装ですが、Normalノードをもう一回追加していました。

Normal2ノードの実装を見ると

NormalをPointからVerticesに戻してるようです。

その後、Materialノードを追加してNullノードを追加していますが

これらのNodeはGeometryの生成には関係ないので無視します。

以上でした。

6.3 器の作成の復習の感想

やっと器の生成方法が理解出来ました。

器のGeometryから溝のGeometryを引いてるだけですが、実際の手順は非常に複雑です。

  1. Vdb from polygonsノードを使用してPolygonをVDBに変更
  2. ConvertVDBノードを用いてPolygonに戻す。この作業でPolygonが細かく生成される
  3. NormalノードでNormalをPoint毎に振る
  4. Attribtransferノードで生成したPoint毎のNormalをAttributeとして器側のGeometryに移す
  5. Attribblurノードで器側に移したNormalのAttributeを滑らかにする
  6. Attribute WrangleノードでPointをそのNormal*Aだけずらす実装を追加
  7. Normalノードをもう一回追加してNormalを元に戻す

という行為を行っていました。

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) [11]の<<Resetting Episodes>>を実装しました。

ここの実装は、SportsCar_Pawn blueprint内に行ったんですが、

以下の部分の実装に納得がいかず、

それについてずっと調べていました。

結論としてはこの実装は正しいらしいという事は判明しました。

以上です。

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

<Implementing the Manager>

2025-03-30のBlogの内容も復習しながら勉強していきます。

ここではBP_SportCarManagerの実装をします。

<<Begin Play>>

うん。

実装してみましょう。

まずTutorialのCodeをそのままPasteしました。

そして以下の手順をやっていきます。

Make Interactorノードです。

ClassにセットされているBP Sports Car Interactorを確認しました。

更にMake Training EnvironmentノードのClassにBP_SportsCarTrainingEnvがセットされている事を確認しました。

次です。

これはLocalとは書いて無いので普通のVariableで作成します。

しました。

あれ?

TutorialにはCommunicatorとかPROTrainerとかが無いです。

しかしTutorialの方には、Trainer Settings、Run Inference、Critic Settings、Policy Settings、Shared Memory Settings、そしてEtcとかがあります。

CompileしたらErrorになりました。

このErrorを直してから考え直します。

Actor ClassにBP Sport Car Track Splineをセットしました。

同様に直していったらVariableは以下の様になりました。

Etcはなどなどと言う意味なのでTutorialの言ってるVariable+αなら問題ないはずです。

これであってるでしょう。

今度はそれぞれの実装の解説を読んでいきます。

と思ったら急にお腹が痛くなって寝込んでしまい、時間が無くなってしまいました。

今週はこれだけです。

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

先週は、The Rendering Pipeline | D3D12 Beginners Tutorial [D3D12Ez][12]をNotebookLMで要約してその内容を勉強しました。

その過程で、

Root Signatureの定義が

以下の図のInput AssemblerからOutput Mergerまでの縦の流れに沿うDataの移動以外の

Dataの横の流れを管理する機能である事が判明しました。

これ、今までRood Signatureの定義を何回も勉強しましたが、目から鱗の説明でした。

更にDescriptor Tableについての解説も以下の様に書かれていました。

これも目から鱗の説明です。

Samplerについても以下の説明がありました。

これも知らんかった。

となって終わりました。

8.1.2 Root Signature、Descriptor Table、そしてSamplerの定義を見直す

DirectX 12の魔導書」のこれらの定義を見直します。

Root Signatureです。

Descriptor TableやSamplerをまとめるものと書かれていました。

以下の図のRoot Signatureの機能の部分を見ると、

確かにこの説明は間違ってはいませんが、この説明では視覚的な理解を全く助けませんね。

Descriptor Tableの説明です。

DirectX 12の魔導書」では以下の様に説明していました。

  • Root Signature内で記述するもの。
  • Descriptor HeapとShaderのRegisterを関連付けるもの

と書かれていました。やっぱりこの説明よりも

  • Root SignatureのSizeは小さい必要がある。
  • 多くのDescriptorを直接Root Signatureに置くとそのせいでSizeが大きくなってしまうので、Descriptor Tableを使用してRoot SignatureのSizeを小さくします。
  • それがDescriptor Tableの役目です。

という説明の方が初心者には分かり易いです。

最後にSamplerですが、

DirectX 12の魔導書」では

何故か、Samplerだけは重要な専門用語の一覧に入って無く、P169にSamplerを設定する時にその機能を一寸だけ解説してるだけです。

そこでは、「UV値によってTexture Dataからどう色を取り出すかを決めるための設定。」とだけ書かれていました。

これは、まあその通りですが、

NotebookLMの説明のような

何故、Samplerが必要なのかと言う部分には踏み込んではいません。

8.1.3 The Rendering Pipeline | D3D12 Beginners Tutorial [D3D12Ez][12]の動画を見る

NotebookLMの要約だけ見たのでは本当の内容を勉強したとは言えないので、動画を見ます。

以下に内容を簡単にまとめます。

<Output Merger>

Rendering Pipelineの最後のStageです。

ピクセルデータの結合を担当しています。ピクセルシェーダーから出力されたピクセルデータを受け取り、レンダリングターゲットに結合します。

OmSetRenderTargets関数("OM"はOutput Mergerの略)を呼び出すことで設定され、レンダリングターゲットビューや深度ステンシルビュー(depth stencil view)をバインドします。

深度ステンシルビューは、ピクセルレンダリングターゲット上に配置すべきか、どのように配置すべきかを示す追加のテストとして機能します。

レンダーターゲットに既存のコンテンツがある場合、新しいピクセルデータと既存のコンテンツをどのようにブレンドするか(上書きするか、計算して結合するかなど)を決定するための設定パラメータを多数持っています。

レンダリングパイプラインの複数の設定、または特別に設定された実行方法を持つことができますが、最終的にこれらすべてを単一のリソースにマージする必要があります。出力マージャーは、これらのマージ処理を扱います。

出力マージャーは非常に重要であり、その設定が正しくないと多くの問題が発生します。

シェーダーなど他のすべてが正しく設定されていても、出力マージャーの1つの設定ビットを忘れるだけで出力が得られないことがあります。これは大きなエラーの原因となり、問題解決に時間を要する可能性があります。

最も単純な設定は、生成されたピクセルをそのままレンダリングターゲットに配置することです

<Input Assembler>

Input Assemblerの主な役割は、画面に描画されるべき全てのサポートデータ(例:キューブ、三角形、キャラクター、地形など)を受け取ることです。

具体的な作業で説明すると、適切なメモリ位置から適切なレイアウトのデータを取り込み、レンダリングパイプラインで処理可能なフォーマットに変換します

更にジオメトリデータのレイアウト、レイアウトのパラメータ、インデックス(indexing)の使用有無の設定を指定したり、

頂点バッファビュー(vertex buffer views)とインデックスバッファビュー(index buffer views)を利用して、メモリ内のデータがどこに配置されているかを把握したりします。

このStageからPrimitiveがDataとして出力されます。

Primitiveは「頂点ストリーム」または「頂点(vertices)」として生成されます。

Primitiveには様々な種類があり、

  • 点(Point): 1つの頂点が1つの点を定義します。
  • 線(Line): 2つの頂点が1つの線を定義します。
  • 三角形(Triangle): 最も一般的に使用されるモードで、3つの頂点が1つの三角形を構成します。入力アセンブラは、データを三角形に組み立てます。

などが生成されます。

ここまでで最初の10分が経ちました。

残りは来週まとめる事にします。

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

8.2.1 「5.11.1 DirectXTexの準備」を実装する

先週勉強したDirectXTexを実装します。

以下のSiteからDirectTexのZip FileをDownloadしました。

以下のFileを開きます。

Solution PlatformとSolution構成の値をDebug、x64に変更します。

最初からなっていました。

Windows SDKのVersionも確認します。

Projectで使用してるWindows SDKと同じVersionです。

SolutionのBuildを行います。

成功しました。

以下のFolderに

DirectXTex.libも作成されました。

環境変数の設定をします。

DirectXTex.hは

"D:\2025\DirectX12_Study\DirectXTex-main\DirectXTex-main\DirectXTex\DirectXTex.h"

にありますが、

DirectXTex.libは

"D:\2025\DirectX12_Study\DirectXTex-main\DirectXTex-main\DirectXTex\Bin\Desktop_2022\x64\Debug\DirectXTex.lib"

にあります。

どっちをDXTEX_DIRにセットすべきなのか分かりません。

ChatGPTに聞いてみます。

はい。

ではやってみます。

追加しました。

これでDirectXTex側の設定は終わったのか。

今度は自分のProjectを開きます。

まずHeader FileをIncludeしました。

ConfigurationがAll Configurationsになっていますが、まあいいです。

どうせDebugしかしないでしょう。

今度はDirectXTex.libの場所をセットします。

ChatGPTによるとこっちはConfigurationの設定をDebugに変更しておいた方が良いとの事。

ただしDebugしか使用しない場合は、問題ないそうなので、今回はこのまま行きます。

うーん。

これで出来たはずです。

Testします。

Main.cppに以下のCodeを追加しました。

Buildします。

Errorなく普通に作動しました。

DXGIのWarningが凄い出てました。

これは、後で直す必要がありますね。

それは兎も角、これでDirectXTexが使用出来るようになったはずです。

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] Unreal Engine. (2021, August 24). Full Body IK: Procedural Dragon Animations [Video]. YouTube. https://www.youtube.com/watch?v=Z8eqaFG7lZQ

[4] Jeremy Howard. (2022, July 21). Lesson 4: Practical Deep Learning for Coders 2022 [Video]. YouTube. https://www.youtube.com/watch?v=toUgBQv1BT8

[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 UI and workflow Tutorials — Isaac SIM Documentation. (n.d.). https://docs.isaacsim.omniverse.nvidia.com/4.2.0/introductory_tutorials/index.html#

[8] Isaac SIM Interface — Isaac SIM Documentation. (n.d.). https://docs.isaacsim.omniverse.nvidia.com/4.2.0/introductory_tutorials/tutorial_intro_interface.html

[9] Assemble a simple robot — Isaac Sim Documentation. (n.d.). https://docs.isaacsim.omniverse.nvidia.com/4.2.0/gui_tutorials/tutorial_gui_simple_robot.html#isaac-sim-app-tutorial-gui-simple-robot

[10] VEX Isn’t Scary: Beginner Series. (n.d.). YouTube. https://www.youtube.com/playlist?list=PLhyeWJ40aDkVmhEHlCKRvy10lNobG0KZT

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

[12] Lötwig Fusel. (2023, July 15). The Rendering Pipeline | D3D12 Beginners Tutorial [D3D12EZ] [Video]. YouTube. https://www.youtube.com/watch?v=53oJE9J_0EY