1.今週の予定
今週もこの順序に従って勉強していきます。
- 映像作成用UE5の勉強
- AIの勉強
- Nvidia Omniverseの勉強
- Gaeaの勉強もしくはVroidとUE5の勉強
- Houdiniの勉強
- AIについての調査(ComfyUIの勉強)
- DirectX12の勉強
2. 映像作成用UE5の勉強
2.1 PCGの勉強
2.1.1 先週の疑問
先週、PCGの復習をしたらLoopの設定方法がオカシイんじゃないかと思うようになりました。
Loopの高さは普通の数字を代入するだけで良い気がします。
今週はこれを確認します。
2.1.2 Loopのテストを行う
PCG Copy Point Up AdvancedノードのLoopsに3のIntegerをPassしました。
結果です。
本来なら3階まで生成されるはずですが出来てません。
あれ?
元に戻しました。
という事はやっぱり以下に示したそれぞれの階の高さに分配したPointを配置する必要があるのか。
となるとこのPointの作成方法をしっかり理解する必要があるのか。
2.1.3 PCGGetFloorLoopsノードの復習
このPointを作成しているのは以下のPCG Floor Loopsノードでした。
このNodeの作成方法を復習します。
2024-12-01のBlogでこの部分の実装について勉強しているみたいです。
まずこれを復習します。
中々複雑です。
後、納得出来ない実装方法があります。
以下の部分の実装ですが、
最上階と一回の床の位置を計算しています。
その後で、その間をSplineに変換し
そのSplineをFloor数で割る事で、それぞれの階の床の位置にPointを生成しています。
確かにこれで良いんですが、この方法だとこの後に、以下に示したAttribute Partitionノードを使用して
生成したPointを別々のPoint Dataに分別する必要があります。
つまり面倒です。
もっと簡単な方法で各階のFloorの位置のPointを生成してみます。
色々試したんですが、Loop内で新しく生成したPointでLoop外まで維持できるのは一個だけです。
もしかしたら出来るのかもしれませんが、今の私の知識では以下のMarge Pointを使用して
2つまでしか増やせません。
一応、以下のLoopを使用して順々にPointを増やす方法を考えたんですが、増やしたPointが次のLoopで消滅してしまいます。
まじか。
だからこんな面倒な方法で実装していたのか。
納得。
これからはこういう普通のProgrammingと比較してPCGがどうなのかを勉強する必要があるのか。
でもこれが出来るようになったらPCGでも専門家になれますね。
2.1.4 Pointの生成方法を復習する
でもその前にPointの生成方法を復習します。
Blogを振り返って、今まで勉強したPCGの内容からPointの生成方法を抜き出し以下にまとめます。
始めてPCGの勉強をした週ですが、なんとこの時からPointの生成方法を勉強しています。
InputのLandscapeにSurface Samplerノードを繋いで
以下のようなPointを生成していました。
このBlogにはLandscapeではなくLandscape Heightを使用した場合はどうなるのかについての説明が元のTutorialにはあったけど、まとめには書かないという記述がありました。
それって結構重要な内容ではないのか。と思いましたが、今回はそれについての調査はしません。
今度は以下に示した様にSplineからPointを生成する方法を勉強しました。
ここでの説明はGet Started With PCG 5.4 By Creating a Full Building | UE 5.4 P1 [1]のやり方と一寸違うような気がします。
以下の実装を使用して
Pointの周りにPointを生成していました。
ここではCopy Pointノードを使用する事で、Targetに指定したそれぞれのPointに対してSourceで指定したPointを生成しています。
HoudiniのNodeで同じ機能のNodeがあります。
ここでは以下に示した様にBox Collusion内にPointを生成する方法や、
GeometryのSphere内にPointを生成する方法を示しています。
具体的なやり方は簡単にはまとめられないのでここにはまとめません。
Subgraphを使用している事だけはここに書いておきます。
指定したMeshの表面にPointを生成する方法を説明しています。
以下のMesh To Pointsノードを使用しています。
以下に示した様に指定したMeshの表面にPointsが生成されました。
以上でした。
2.1.5 Pointの生成方法のまとめ
Blogに書かれた全てのPCGのPointの生成方法を調査しましたが、以下の4つのNodeしか使用していませんでした。
追加で
を入れても5個のNodeです。
まずはこの辺のNodeの使用方法をしっかり理解する必要がありますね。
2.2 Level Sequence上でAnimationの編集をする方法
2.2.1 Creating and Modifying Control Rig [2]を勉強する
<Character Import Settings>
CharacterをImportする時に表示される以下のBoxのParameterについて説明しています。
Skeletonです。
ここをBlankにする事でImportしたSkeletal Meshが本来持つSkeletonがそのままImportされるそうです。
Skeletal MeshのCheckです。
これはImportするMeshがSkeletal Meshを持っているかどうかを指定します。
CheckがついていたらSkeletal Meshがついているという意味になります。
Defaultの設定のままで良いParameterはそのままにしておきます。
Use T0 As Ref Poseです。
ImportするCharacterがT Poseの場合はここにCheckを入れます。
ImportするCharacterがMorphを使用している場合は、
Import Morph TargetsをOnにします。
Normal Import Methodです。
これは好きなのを選べとしか、言っていませんでした。
Import Animationsです。
これはUncheckのままにしておけ。とだけ説明していました。
この状態でImportします。
SKM_Mannequinを開きます。
ここではSkeletal Meshが正しくImportされたのかどうかをCheckします。
まずMannequinの形状を見ます。
A PoseでImportされています。
のでOKだそうです。
次にSkeleton Treeを開きBoneのHierarchyをCheckします。
Rootに全てのJointが繋がっている事、EmptyのGroupや必要でないJointが無い事を確認します。
更にMaterialの設定や
LODの設定も確認します。
うーん。
この辺になると何を確認すれば良いのかの説明がありません。
最初の頃ほどの内容の濃さは無いですね。
<Control Rig Asset>
ここでCostume Rigを最初から追加する方法を教えるそうです。
まず以下のControl RigのPluginを追加します。
SKM_Mannequinを右Clickして以下のBoxを開き
Control Rigを作成します。
更に別な方法でControl Rigを作成するやり方も説明していました。
<Control Rig Editor>
ここはControl Rig EditorのUIを説明しただけでした。
はっきり言って要らないです。
<Bones, Controls and Nulls>
Control Rigがセット出来る要素は3つあるそうです。それがここの題であるBone、Control、そしてNullだそうです。
まずBoneの追加方法ですが、以下のBoxを開きNew Boneを選択します。
New Boneが追加されました。
次はControlの追加方法です。
ControlはCharacterを操作したり、Animationを追加したりするのに使用します。
先程、Boneを追加したのと同様の方法でControlを追加しました。
以下のような赤いSphereが追加されました。
これはControlのPropertyにある以下の部分で変更する事が出来るそうです。
ここではHexagon_Thickに変更して、色も紫に変更していました。
小さくて変更後の形状がHexagonになったのかよく分かりません。
表示されるIconのSizeですが、以下のScaleで変更するか
Preview画面上でCtrl+Pを押して
Manipulating Shape Transform Modeにして
Scaleを選択し
以下のIconでHexagonのSizeを変更します。
結果です。
ふーん。
Control Rigってこうやって追加していたのか。
後、このHexagonのIconってControlと言う名称だったようです。
以下のControl TypeでTypeをSetします。
この設定によって、このControlでは何が出来るのかが決定されるそうです。
Euler Transformでは以下の設定が指定出来るそうです。
Euler Transform以外のControl Typeの使用方法を説明するために以下に示した拳の開閉を調整するControlを作成するそうです。
値が0の時に拳を開いて、100の時に拳を閉じるそうです。
Control TypeをFloatに変更しました。
Valueの設定は以下のようになりました。
Currentの値を100に変更すると以下のように
矢印が右端に移動します。
ちなみにこの矢印は、以下のDraw Limitsをuncheckする事で消せるそうです。
このControlの位置を左の手に近づけます。
まず以下の設定をSetup Eventに変更します。
この状態になると、Controlの位置を以下のように移動させる事が可能になります。
左手の下に移動させました。
この後、設定方法の細かい部分の説明がありました。
この辺は、多分見たら分かるでしょう。
以下の設定だけ記録に残しておきます。
これにCheckが入ってないとLevel SequenceからこのControlを動かす事でAnimationの設定をする事が出来ないそうです。
最後にNullについてです。
以上でこのLectureは終わりでした。
これはかなり勉強になりました。
<Create Controls for Setup>
全部見ましたが、もう頭に入らなくなっています。
ここからは来週勉強します。
今週はここまでにします。
3. AIの勉強
今週は以下の2つを行います。
- Hugging FaceのAccountの作成とClone
- Jupyter NotebookにGradioを追加してUI付きのAIを作成
早速始めます。
3.1 Hugging FaceのAccountの作成
Sign inしてAccountを作成しました。
ConfirmationのE-mailの確認とかで一回閉じて開き直したら、このPageが表示されるようになりました。
まあ、Accountが作成出来た事は間違いないです。
3.2 Hugging FaceのCloneを作成する
Ubuntuの以下のDirectory内にCloneを作成する事にします。
Spaceに移動しました。
早速問題です。
以下のNewというButtonと
Create NewのButtonの
2つがあります。
先週のBlogには
とだけ書かれています。
Videoを見て確認しましたが、流石に2年前とはUIが全く違っています。
Newの方を押したらSpaceという選択肢があるBoxが開きました。
多分、これでしょう。
大当たりです。
以下のように打ち込みました。
Templateはどれを選択すべきなんでしょうか?
Tutorialを見直して確認しましたが、このような選択肢はTutorialのUIには無かったです。
Blankにしておきますか。
明らかに他のTemplateは違っていますから。
次です。
これはFreeのを選択しておきます。
当然、Privateにします。
あ、でもPrivateにすると確認するのに一々Loginする必要があるのか。
まあいいや。
Create Spaceを押しました。
以下に示したPageが作成されました。
おお。出来ました。
このCloneをUbuntuからCommandしたら完成か。と思ったらなんかAccess TokenをPasswordとして使用しろって書いてあります。
これはやらないといけないんでしょうか?
Tutorialを確認しましたが、TutorialのHugging FaceのSpaceにはこの文章はついてないですね。
Copilotに聞いてみます。
以下の回答が返って来ました。
やっぱしPasswordの設定をしないといけないみたいです。
もう少し具体的なやり方を知りたいです。
以下の質問をしてみました。
以下の回答が返って来ました。
これ通りにやったら出来そうですね。
でPasswordに使用するTokenって、私が保存しておく必要があるんでしょうか?
まあ、最初の一回は、どっかに保存しておいた方が良いかもしれませんね。念のため。
慣れたら、毎回Tokenを発行して変更する事にしましょう。
ではやってみます。
以下のSiteに移動します。
以下のSiteに移動しました。
Create New Tokenを押しました。
以下のPageに移動しました。
Writeを選択します。
Tokenの名前は自分で決定するのか。
Token NameはFastAI_HW_2にしました。
Token Valueが生成されたので一応、GoogleのPasswordにSaveしておきました。
ではCloneします。
PasswordじゃなくてUser Nameを聞いてきました。
なんか失敗したみたいです。
もう一回試します。
今度は出来たのかな?
出来てますね。
更に中を見たら、あれ?
README fileしかありません。
ああ。そうか全部作る必要があるんだ。
ぬぐぐ。
App.pyを作成する必要があるのか。
VS codeを開きます。
なんかAccess権限がうんたらかんたらと言っていますが、OKにしました。
VS Codeが開きました。
本当にREADMEしかありません。
これは不測の事態です。
が何とかなるでしょう。
まずここにapp.py fileを作成します。
VS Codeから作成しようとしたらUbuntuにAccess出来ません。何で?
Terminalから作成します。
Copilotに聞くと以下のCommandで作成出来るそうです。
やってみます。
出来ました。
そしたら以下の実装を貼り付けます。
貼り付けました。
で後はCommitしてPushするだけです。
VS Codeでやる方法はBlogにまとめてあるんですが、Passwordの問題があるかもしれないのでHugging Faceに書いてある
以下のCommandを試してみます。
最初のCommandを実行しました。
問題なかったです。
次のCommandを実行しました。
何これ?
Copilotに聞いてみます。
Gitに登録しないといけないのね。
更に以下の説明がありました。
オカシイ。
前にGitでCommitした事はあります。
その時のDataは無くなってるって事?
入れました。
ああ名前のところが大文字と小文字になってしまっています。
Copilotに聞いたらもう一回打つ直せば良いだけだそうです。
でもう一回、二つ目のCommandを実行しました。
出来たみたいですね。
最後のCommandを実行します。
またUser NameとPasswordを聞いてきました。
これはPasswordはTextかなんかに保存しておきます。
でも出来たみたいですね。
Hugging FaceのPageに入って確認します。
おお出来ました。
今週はここまでにします。
残りは来週やる事にします。
4. Nvidia Omniverseの勉強
4.1 NVIDIA Isaac Sim - MuSHR RC Car - Ackermann Tutorial [3]を勉強する
4.1.1「 3 - Joint Types - NVIDIA Isaac Sim - MuSHR RC Car - Ackermann Tutorial」 [4]を勉強する
やっと前回のTutorialが終わったので次のTutorialの勉強に入れます。
何とこのTutorial、たった3分しかありません。
まあ良いです。
勉強しましょう。
ISACには2つのTypeのJointがあるそうです。ContinuousとJointです。
以下の画面から
Joint Drive Typeを開くと
PositionとVelocityがあります。
え、さっきContinuousとVelocityって言ってなかったっけ。
今度はThrottleをClickします。
DampingとStiffnessを見ます。
Dampingの値は非常に高いです。
Stiffnessは0です。
この理由はこの2つの値はContinuousだからだそうです。
今度はSteerをCheckします。
以下のようになっていました。
Dampingが高くStiffnessが0です。
この値だとSteeringは効かないそうです。
何とこの動画ここで終わっています。
これじゃ何の事か全く分かりません。次の動画も見る事にします。
4.1.2「4 - Action Graphs - Part 1 - NVIDIA Isaac Sim - MuSHR RC Car - Ackermann Tutorial」[5]を勉強する
前回の動画が途中で切れているので続きから始まると思ったら、この動画はAction Graphについての話です。
えー。と思いましたが、仕方ない。続きを見ていきます。
Action Graphを開きました。
以下の場所にAction Graphが追加されました。
最終的には以下のようになるそうです。
今、流行のNode BaseなProgrammingですね。
おお、結構凄い。
SteeringのNodeがあります。
前回の動画のSteeringのDampingが高くStiffnessが0だとSteeringは効かないという話は、この辺に繋がっていくのかもしれません。
Nodeの組み方の説明です。
検索にPlaybackと打ち込んで、On Playback Tickノードを探し出します。
On Playback TickノードをGraph上に配置しました。
次にROS1 Subscribe AckermannDriveノードを追加しました。
で2つのNodeを繋げます。
更にAckermann Steeringノードを追加します。
更に以下のように繋ぎました。
Make Arrayノードを追加します。
このNodeの設定です。
Array Sizeの値を2にします。
更にCtrl + DでMake ArrayノードをDuplicateして、そっちはArray Sizeの値を4にします。
以下のようになりました。
以下のように繋げます。
上のArrayがSteeringで下のArrayがThrottleだそうです。
Articulation Controllerノードを追加しました。
Make Arrayノードの結果をArticulation Controllerノードに追加します。
もう片方のMake Arrayノードの結果もDuplicateして作成した別のArticulation ControllerノードのVelocity Commandに繋げます。
On Playback TickノードのTickをArticulation ControllerノードのExec Inに繋ぎます。
Tutorialでは、何でAckermann SteeringノードのExec Outから繋がないのか、説明していたんですが、よく理解出来ませんでした。
今度はJointの名前をPassする必要があるそうです。
これらがJointの名前だそうです。
またMake Arrayノードを使用して値をPassします。
Make ArrayノードにはConstant Tokenノードを使用して値(Steering Jointの名前)をPassします。
Constant TokenノードのInputsのValueには、以下に示した様にFront_left_wheel_steerがセットされています。
当然、二番目のConstant Tokenノードの
Input Valueにはfront_right_wheel_steerをセットします。
今度はThrottleの方の設定を行います。
Make ArrayノードのInputが4つある事以外はほぼ同じです。
それぞれのThrottleの名前です。
これらをConstant Tokenノードにセットします。
後、足りないのがAckermann SteeringノードのCurrent Linear Velocityの値だそうです。
これはIsaac Compute OdometryノードのLinear Velocityの値を使用するそうです。
ここでTutorialが終わっていました。
4.1.3 「 3 - Joint Types - NVIDIA Isaac Sim - MuSHR RC Car - Ackermann Tutorial」 [4]と「4 - Action Graphs - Part 1 - NVIDIA Isaac Sim - MuSHR RC Car - Ackermann Tutorial」[5]を勉強した感想
「 3 - Joint Types - NVIDIA Isaac Sim - MuSHR RC Car - Ackermann Tutorial」 [4]を勉強した時は、なんかこのTutorialを勉強して大丈夫なのかと思いましたが、
次の「4 - Action Graphs - Part 1 - NVIDIA Isaac Sim - MuSHR RC Car - Ackermann Tutorial」[5]はかなりVolumeがあって勉強になりました。
来週は実装してみます。
4.2 Nvidia Omniverse Issac Sim [5]の勉強
公式SiteのNvidia Omniverse Issac Sim [6]も読んでいきます。
のっけからアレなんですが、先週勉強したのはIsaac Sim 4.2で最新のVersionは4.5だそうです。
こっちを読むようにします。
Table of Contentの内容を確認します。
これは先週勉強した内容と同じです。
まずRelease Notesがあります。
Installationの内容です。
これは必要な時に勉強すれば良い内容でしょうか?
Help & FAQの内容です。
うーん。
勉強しないといけない内容なのかどうか判断出来ませんね。
次はGetting Startedです。
お、ここに今週勉強しようと思っていたWorkflowがありますね。
一寸見てみます。
なんか結構重要なConceptがここで解説されています。
これを勉強しようかと思ったんですが、もう頭が働かなくなって来ました。
これは来週やる事にします。
今週はここまでにします。
5. Gaeaの勉強もしくはVroidとUE5の勉強
5.1 PowerPointの作成
今回はMaskingの説明をします。
Gaea2のNodeにはMaskというInputがあるものが沢山あります。
これを説明します。
Gaea1で既に説明している内容である事、しかし今回は地形の追加に使用する事などを解説しています。
私のGaea Tutorial Seriesの核である3つの工程のどこ工程の内容なのかを説明しています。
プラモデルにおけるMaskingを説明しています。
Gaea2の粗削りな地形を作成するために使用するMaskingの一例を示しています。
Heightノードの機能を説明しています。
HeightノードはMaskingに使用する白黒のImageを生成しています。
5.2 質問に対する回答
草をどこまで表示するかは、
以下に示したLGT_MWAM_Grassで管理しているようです。
ここにあるStart Cull DistanceとEnd Cull Distanceの値を
上げると上げた分だけ遠くの草が表示されるようになります。
ただしその分計算Costが凄くなります。
5.3 これからの方針
Gaea2のTutorialも基礎編が終わって、中級編になりました。
中級編は、逆引き辞典のような動画にして、必要な動画だけ見れば良いような作りにします。
そして一回の動画も短く5分から10分で終わるようにします。
その代り、TutorialのComment欄に書いてある質問に回答するようにします。
視聴者の方で、分からない部分があったらComment欄に書き込んでください。
質問に回答するようになると、僅かにですが人間関係が生じます。
私も含めてですが、Game制作をする人は人間関係を築くのは結構苦手です。
知らずに相手の感情を傷つけてしまったり、相手を怒らせてしまうのは結構あります。
そこで、そのような事態をなるだけ避けるために以下のRuleを設けます。
<お互い先生と呼びあう>
同じようなTypeである漫画家志望の人達がコミケとかでわりかし人間関係が上手く行っているのは、お互い先生と呼び合っているからではないか。と思っています。
先生と呼んでおけば、まあ失礼な事を言ったとしても、悪意が無い事は相手にも伝わります。
喧嘩になったり二度と口を利かない事態になったりする確率はずっと下がるはずです。
のでここでは、質問者も先生と呼びます。
私も先生です。
そしてコメント欄に書き込んでくれた人も全員、先生です。
<Easy Come Easy Go>
いつ来ても大歓迎ですし、いつ去ってもOKです。
時間は有限です。自分にとって必要でないと判断したら勉強を止めるのは当然です。
その後で、やっぱりアレ必要だったわ。となった時はいつでも帰って来てOKです。
一回、勉強会から抜けたら裏切者とか、そういうのは禁止です。
5.4 ABP_MannyのAnim Graphを調査する
ABP_MannyのAnim Graphにある以下の実装について調べます。
Main Statesの中味です。
Landノードを開くと以下のようになっていました。
あれ?
ここにあるMM_LandがAnimationをを担当してるっぽいです。
中身を見てみます。
あれ?
Animation SequenceだけどVroidのCharacterが写っていて何の動きもしてません。
これって普通のProjectでもAnimationが無いのかな?
別なProjectで確認します。
普通に動いていました。
先週無いと思ったJumpのAnimationも
普通にありました。
では以下の部分は何をしているんでしょうか?
結局その部分は不明です。
Copilotに質問してみます。
この質問は難しいのでThink Deeperで聞く事にします。
回答です。
まず一般的な前提知識の確認から始まっています。
Anim Graphが何を管理している場所とか、曖昧にしか理解してなかったです。
Control RigノードをAnim Graph内で使用する事で、CharacterのSkeletonを直接、Anim Graph内で動かす事が出来るのか。
納得です。
かなり理解が進みました。
どのようにControl Rigが働くのかの簡単な解説をしています。
なんかControl Rigがどうなっているのかの全体像が見えてきました。
Control Rigを使用する長所の説明です。
どうやってControl Rigをセットするのかの簡単な説明です。
勿論、これを元に実際に作成する事は出来ませんが、全体の流れみたいなものは感じれます。
具体的にControl Rigを使用したAnimationの例が紹介されています。
Tipです。
うーん。
何となく理解は出来ました。
しかし同時に、この部分はControl Rigの勉強がもっと進んだ後で勉強しないと理解出来ないという事も判明しました。
これはControl Rigの勉強が進んでから勉強し直す事にします。
6. Houdiniの勉強
今週は先週のErrorを直していきます。
6.1 Normalの確認
一番、間違ってそうなの名Normalの設定です。
これから確認していきます。
Normalノードの設定は以下のAdd Normals to の値をPointsに変更してるだけでした。
では次のNodeであるAttribute Transferノードを見てみます。
そうだ。
このNodeで本当にPolywireのNormalが上書きされているのか確認しましょう。
うん。
思っているよりかなり太いですが、一応、Normalは正しくPassされているようですね。
Distance Thresholdの値をTutorialと同じにしました。
おお、Normalが前よりきれいになりました。
出来てるっぽいです。
次のNodeであるAttribute Wrangleを調べます。
あ、VEXのCodeが間違っていました。
直します。
+が抜けていました。
結果です。
multの値を小さくしたら行けるかも。
ほとんど0に近づけました。
結果です。
分からん。
更にNormalノードを追加してみます。
Normalノードの結果です。
薄っすらと筋のようなものが見えます。
Attribute WrangleのMultの値を上げてみます。
出来てるのか。
Tubeの端から飛び出すのが気になります。
Tutorialのを見直すとそんなのは無い事が分かります。
これは単純にTubeのSizeが小さいからかもしれません。
Tubeノードの
Radiusの値を0.5から0.6に変更してみました。
結果です。
真っ黒でよく見えませんが、
Tutorialと同じような結果になってそうです。
近づいて確認しましたがなっていました。
真っ黒なのはLightの位置の問題だと思います。
先程のImageの明るさとContrastを変更したら以下のようになりました。
これでOKでしょう。
6.2 2025-02-02のBlogの続きをやる
Attribute Blurノードを以下の場所に追加します。
以下のように設定しました。
結果です。
見えにくいので明るさとContrastを調整しています。
以下のIconの値を変更すると
Preview画面の表示が変わる事が分かりました。
Tutorialでは以下の設定になっていました。
同じのをセットしました。
結果です。
まだ一寸見た目が違います。
TutorialにおけるPreview画面の右わきのTool barの設定です。
Gridを表示しないとこ以外は同じでした。
うーん。
Tutorialの結果はこんな感じで
私の結果はこんな感じです。
あれ?
突然、Tutorialとそっくりな画像になりました。
分かりました。
Preview画面の左端のTool Barにある以下のIconをいじっていたら
突然、こんな画像に変化しました。
でも今度は前の状態に戻せません。
まあいいや。
これで先週のErrorが直った事にします。
6.3 VEX Isn't Scary Project - Part 3: Geometry [7]の続きを勉強する
流石にこれだけだと短いのでTutorialの次の10分も勉強します。
<Blur Normal>
この実装方法だとCircle SetupノードのLinesの値を変更しても
直ぐにBlurが対応してくれるそうです。
<Tube Size>
TutorialではAttribute Blurノードの以下のParameterを更に調整していました。
Normal2ノードの後にNullノードを追加して
名前をBASE_GEO_OUTに変更しました。
<BaseGeoOut>
Geometry Layerに戻ってGeometryを2つ追加します。
それぞれBASEとSPHERESと名付けます。
BASEを開き、中にObject_mergeノードを配置します。
そしてObject1にBASE_GEO_OUTをせットします。
以下のようになります。
SPHERESの方も同様に、Object Mergeノードを配置して
SPHERES_GEO_OUTを追加しました。
結果です。
動かしてみると色々な問題がある事が判明します。
まずBack方向にPlay出来ません。
いや、出来ますが再生速度がものすごく遅くなります。
その理由ですが、以下のNodeで
緑のClockが表示されているのは時間に影響されるNodeで
それらが全部、影響するからだそうです。
Sphereを再生するのに、Lineノード以下のNodeは必要ありませんが、Houdiniはその事は知りません。
ので全部計算しているんだそうです。
この問題を解決するために、以下のTime Shiftノードを追加します。
Frameを右Clickして以下のBoxを表示させ、Delete Channelsを選択します。
更にFrameに1をセットします。
以上です。
この状態で、Play Backすると非常にSmoothに再生されるようになります。
うーん。
成程、でもPlay Backって逆再生の事なんでしょうか?
なんかこのやり方を見てると普通の再生でも早くなる気がします。
<Poly WireとTransform Node>
次の問題ですが、Ballが浮いています。
これを直します。
この直し方は簡単で、Spheresノードの後にTransformノードを追加するだけです。
Previewの左端のTool Barから以下のIconを選択して
Sphereの位置を移動させます。
更に溝を超えて移動するSphereの問題を解決するために
<Transform LinesとIncrease Tube Size>
以下の場所にTransformノードを追加して
Uniform Scaleの値を大きくします。
これで以下に示した様になりました。
<Add Base Group>
Sphere1ノードの以下の値を増やします。
更にGroupノードを追加して
Group Nameの値をLightにします。
Space +Num3でFront Viewにしました。
<Add Face Group>
そしてBase Groupの矢印を押します。
そして以下の部分を選択して
Enterを押します。
Poly Extrudeノードを追加して
Distanceの値を-0.005に変更します。
以下のように変化しました。
<The Problem>
この状態で、実行すると
Sphereが転がってないのが分かります。
<The Circle Setup>
どうやってSphereを転がすのかについての説明です。
まず上下にSphereが動く場合です。
左右に動く場合です。Sphereは以下のように回転します。
これも簡単です。
しかし以下のようにその中間にLineがある場合はどうでしょうか?
これは結構難しいそうです。
しかしこれも以下の実装で計算出来るそうです。
ちなみにCross()関数は以下のように説明していました。
後、どれくらい回転するかですが、
2回転なので720度でOKだそうです。
ここで丁度10分たったので、今週のVEX Isn't Scary Project - Part 3: Geometry [7]の勉強はここまでとします。
来週は今週勉強した内容を実装します。
7. AIについての調査(ComfyUIの勉強)
7.1 ComfyUIについてこれから調査する事
これから調査しないといけない事をまとめておきます。
Onnxが無いと言っています。
これについて調査します。
次にControl Netについて調べます。
どうもこれが凄いAnimationを作成出来るみたいです。
次はFLUXです。
これは凄いみたいですが、なんなのか全く知りません。
これについて調べます。
7.2 Control Netについて
Copilotに聞いてみました。
これじゃ何の事か分かりませんね。
人力に頼る事にして、ネットで調べます。
以下の動画がありました。
https://www.youtube.com/watch?v=fhIGt7QGg4w
Control Netの使い方を説明するのではなく、Control Netとは何かを説明してくれるそうです。
でも初っ端からControl NetのPaperの話とかして初心者には一寸難しいLevelの内容です。
そうだ。
AIに要約させてみます。
https://krisp.ai/youtube-video-summarizer/のSiteで要約しました。
成程。
この動画の言いたい内容は理解出来ました。
でもControl Netって以下のようなBoneを追加する機能じゃないの?
あ、そう言えば、2025-02-02のBlogで以下の問題にぶつかりましたが
これもControl Netって書かれています。
Boneを追加してAnimationを生成する方法は何と言うんでしょうね。
調べてる途中で凄いTutorialを見つけました。
3D+ AI (Part 2) - Using ComfyUI and AnimateDiff [8]です。
一言で言うと、兎に角見やすいです。
紹介されている情報も当時の最先端って感じがします。
ただこの動画ではBoneを使用したAnimationについてはあまり紹介していませんでした。
一応、著者の名前も記録しておきます。
1littlecoder氏のControl Netの解説動画がありました。
https://www.youtube.com/watch?v=6yCaXLh7hz4
これが結構分かり易かった。
先程のSiteで要約させると
これ。
つまりControl Netは今あるModelを強化するための機能だって、断言しています。
これで理解しました。
で次の解説です。
ここでPoseの話が出て来ます。
だからControl NetとBoneによるAnimationは同じだと思ったのか。
動画でも以下の画像を使用してPoseの説明をしています。
更に、このControl Netの応用で有名なのが3つあるそうです。
まずBlenderなどで3DのModelであるPoseを指定して
それにControl Netで同じPoseをしている別な人に変更する方法、
次がControl NetとNerfを併用して、ScreenshotのImageをDroneで撮影したかのような映像に変換する事だそうです。
確かにDroneで撮影したかのような映像が生成されていました。
最後の応用は以下のようなImageの
EdgeをControl Netに認識させて
以下のようなそのImageに似たPhoto-Realisticな映像を生成する事だそうです。
成程。
だからAnimationとControl Netの検索から上手く引っかからなかったのか。
でもControl Netのこの話を聞くと、AIによる画像生成も色々な問題点がある事が分かりますね。
7.3 Fluxについて
Fluxについても調べます。
だそうです。
うーん。
まあ、Stable Diffusionとは違う画像生成用のModelみたいですね。
これ使ったらアニメ調の映像が非常に上手く作成出来るとかはないみたいです。
7.4 Onnxについて
これは、今週はいいや。
別な事を調べます。
7.5 CivitaiにあるAnimationに使用されているModelを調べる
CivitaiのVideosのAnimeを選択すると以下のようなAnimationが表示されます。
最初、これの作り方を見たら最新のAIによるAnimeの作成方法が判明する。と思ったら流石に作成方法は説明していませんでした。
ただし使用したModelは書いてありました。
のでそれをここにまとめる事にします。
最初はこれです。
CounterfeitXLを使用して作成したそうです。
何と、このCounterfeitXLはSDXLを元にして作成したModelです。
SDXLから作成したAnimationはしょぼいのしか出来ないと聞いていたんですが、そんな事は無いみたいです。
次はこれです。
こっちはFlat-2D Animergeを使用していました。
これはSD1.5を使用していますね。
不思議なのはBackのImageが一定な事です。
私のWorkflowではBackのImageはなんかの抽象画のようになっています。
うーん。
これやってもあんまり意味無いか。
中止します。
たまたまお勧めに出て来たComfyUI Hunyuan Video to Video: Using video to create LONG AI videos by Latent Upscale Guidance [9]を見てたら
最新のComfyUIの使用方法ってのはこういうんだ。
って感じで説明されていて圧巻されました。
やっぱりあまり古いのは勉強しないようにします。
今週はこれを軽くみて終わりにします。
その後でこれからどうするか一週間かけて考えます。
見て分かったのは今Videoを生成するModelで最も注目されているのは、HUNYUANという事です。
HUNYUANのTutorialがありました。
来週はこの辺を勉強します。
8. DirectX12の勉強
8.1 Lötwig Fusel氏のD3D12 Beginners Tutorial [D3D12Ez]を勉強する
8.1.1 Render Target View & Descriptor Heap | D3D12 Beginners Tutorial [D3D12Ez] [10]の最初の10分を勉強する
この動画では3つの新しいConceptを勉強するそうです。
- Render Target
- Descriptor
- Descriptor Heap
これらは既に勉強した概念ですが、Render Targetに関してはどんな概念なのか忘れてしまいました。
Blogを見直して確認します。
2023-11-26のBlogに以下のように書かれていました。
これです。
Render Targetの意味自体は覚えていなかったんですが、Render Targetの定義を調べた事は覚えていました。
DescriptorはViewの一種で指定したBufferの目的とかそういう色々な事をDescribeするものなはずです。
Descriptor HeapはそのDescriptorの塊なはずです。
一応、Copilotにも聞いておきます。
うん。
私の解釈は大体あっていますね。
ではLectureの続きを聞きます。
Render Target Viewについて解説しています。
Render Target ViewはDescriptorだとか言っています。
そらそうだけど、Render TargetとDescriptorとDescriptor Viewの定義を説明するのにRender Taret ViewはDescriptorです。はあんまりにもひどすぎる解説でしょう。
このDescriptorをallocateするのにDescriptor Heapが必要と言っています。
これはまあ及第点の説明ですね。
もう少し詳しく説明するそうです。
前に実装したBeignFrame()関数とEndFrame()関数です。
これらの関数はResource Barrierの設定を行っています。
ここでBeginFrame()関数では以下に示した様にResource Barrierの位置を
PresentからRender Targetに移動せよ。
と指定しています。
そしてEndFrame()関数では逆にResource Barrierの位置を
Render TargetからPresentに移動せよ。と書かれています。
ふーん。
これは知らんかった。
更にTutorialでは、これは単にGPUにそうすべきだというHintを与えているだけで実際にGPUがこの通りに実行するかどうかはGPU次第だとも説明していました。
ふーん。です。
次にこのBeginFrame()関数内で以下のm_buffers[]を
Render Targetとして扱うようにする実装を追加します。
この後、Tutorialでは非常に分かり易いViewやDescriptorの解説をしていたんですが、実装とは関係ないのでここではSkipします。
今まで理解出来なかったのが、理解出来るようになってきて分かり易く説明だという事に気がつけるようになったんでしょうか?
実装する部分だけ以下にまとめます。
まずDescriptor Heapを作成します。
Window.hに以下の実装を追加します。
そしてWindow.cppの以下の場所で初期化します。
ここで最初の10分が経ちました。
ので今週のLötwig Fusel氏のD3D12 Beginners Tutorial [D3D12Ez]の勉強はここまでとします。
8.2 「DirectX 12の魔導書」を勉強する
8.2.1 先週の復習
先週はDescriptor Rangeについて勉強したんですが、あまり内容を覚えていません。
復習します。
先週のBlogによると、Descriptor Rangeの機能はDescriptor Heap上に存在する同じ種類のDescriptorを一個にまとめる事だそうです。
全く覚えていません。
Blogを読み直します。
思い出しました。
Descriptor Heap内にDescriptorを保持させ、GPUは必要に応じてそれを読み込みます。
同じTypeのDescriptorは同時に読み込んだ方が速いので、GPUに同時に読めるDescriptorが何個あるのかをDescriptor Rangeで教えるそうです。
CopilotのThink Deeperではこれを図書館の本を取りに行くことに例えて説明していました。
この後は、実際の実装方法が説明してありました。
ではDescriptor Rangeを実装していきます。
8.2.2「 5.8.3 Descriptor Range」を実装する
まず以下の箇所でDescriptor Rangeの初期化と設定のセットを行います。
もしTextureが複数あって、Texture用のDescriptorも複数ある場合は、これらの設定はどう変わるんでしょう?
NumDescriptorsの値が複数になるだけなんでしょうか?
この辺は全然分からないですね。
更に、設定したDescriptor RangeをRoot Parameterにセットします。
これでDescriptor Rangeの実装は完成です。
9. まとめと感想
特になし。
10. 参照(Reference)
[1] Procedural Minds. (2024, July 28). Get started with PCG 5.4 by creating a full building | UE 5.4 p1 [Video]. YouTube. https://www.youtube.com/watch?v=oYNA24tcYc0
[2] Creating and Modifying Control Rig. (n.d.). Unreal Engine. https://dev.epicgames.com/community/learning/courses/5vL/unreal-engine-creating-and-modifying-control-rig/DnO1/unreal-engine-creating-and-modifying-control-rig-overview
[3] NVIDIA Isaac Sim - MUSHR RC Car - Ackermann Tutorial. (n.d.). YouTube. https://www.youtube.com/playlist?list=PL60qgWqGu6k82AJ2SDWOscEKLjCc5tdEW
[4] Berk Tepebağ. (2024, August 20). 3 - Joint Types - NVIDIA Isaac SiM - MUSHR RC Car - Ackermann Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=3y8cEWXtuUg
[5] Berk Tepebağ. (2024, August 20). 4 - Action Graphs - Part 1 - NVIDIA Isaac Sim - MUSHR RC Car - Ackermann Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=pqE2y8YVdGI
[6] What is Isaac Sim? — Omniverse IsaacSim. (n.d.). https://docs.omniverse.nvidia.com/isaacsim/latest/index.html
[7] Nine Between. (2021, February 12). VEX isn’t scary Project - Part 3: Geometry [Video]. YouTube. https://www.youtube.com/watch?v=uYC-tBtCtLA
[8] enigmatic_e. (2024, January 29). 3D+ AI (Part 2) - using ComfyUI and AnimateDiff [Video]. YouTube. https://www.youtube.com/watch?v=hy9TLp-xIBo
[9] AI Artistry Atelier. (2025, January 10). ComfyUI Hunyuan Video to Video: Using video to create LONG AI videos by Latent Upscale Guidance [Video]. YouTube. https://www.youtube.com/watch?v=aDDU3p72mkQ
[10] Lötwig Fusel. (2023, July 11). Render Target View & Descriptor HEAP | D3D12 Beginners Tutorial [D3D12EZ] [Video]. YouTube. https://www.youtube.com/watch?v=6XxTkoNg_KU