
1. 今週の予定
今週は予定を見直す時間がありませんでした。ぶっつけ本番でやっていきます。
何時も通り以下の内容を勉強する予定です。
- 映像作品としてのLevelの作成
- AIの勉強
- Materialの勉強
- Nvidia Omniverseの勉強
- Gaeaの勉強
- 4の新しい機能について
- Houdiniの勉強
- UEFNの勉強
- DirectX12の勉強
2. 映像作品としてのLevelの作成
2.1 前回の復習
携帯のVideoの撮影条件の最適化について検証していました。
更に3つの撮影条件で撮影したVideoを3D Gaussian Splattingに変換してその結果を比較しました。
どれも端がボヤケテしまっていますが、携帯を横にした状態で撮影したのが一番マシでした。
2.2 携帯を横にして撮影した映像に両端を撮影したVideoを追加しました
前回の撮影に両脇を撮影した動画を追加して撮影してみました。
以下のように撮影しました。

まず道路の真ん中で普通に撮影しました。
図の①のところです。
そして②のように右側を撮影しながら元の位置に戻りました。
その後③のように左側を向いて進みながら撮影しました。
結果です。
まず正面のSceneですがほぼ完ぺきです。

進んでみます。

右端に一寸だけぼやけた箇所が出て来ました。
更に奥に進みました。

左上の木の枝が無くなると奥の建物が現れますが、そこがぼやけていました。
更に進むと以下のようになりました。

奥の建物のぼやけている感じがかなりはっきり写っています。
あと右側の電柱の後がボケています。
以上です。
結構良い感じになっています。
思っていたより10倍位綺麗になっています。
比較のために先週のBlogの結果を示します。

これが今週の結果です。

うーん。
全然違います。
これは使えそうです。
UE5にImportしてVFXを作成してみましょう。
2.3 UE5で再現する

かなり綺麗に写っています。
この状態で用事を思い出して別な部屋に行って作業して戻ってきたらPCが結構な音を立てていました。
全然気が付かなかったです。
結構PCに負担は掛かっているようです。
今週はここまでにします。
来週はここにCameraを追加してVFXを作成します。
3. AIの勉強
3.1 前回の復習
先週のBlogを読みます。
大体、何をしたのか分かりました。
Is it a bird? Creating a model from your own data [1]の「Step 1: Download images of birds and non-birds」を勉強しました。
かなり大変な思いをしましたが最終的には以下のBirdのImageを表示する事に成功しました。

簡単に解決した問題を以下にまとめます。
最初の問題ですが以下のCodeがErrorになります。
![]()
この原因はDuckduckgo_SearchというLibraryにはもうddg_imagesという関数が無くなっていたからです。
ので以下のようにCodeを変更し
![]()
更に実際にddg_images()関数を使用している部分をDDG().images()関数に変更しました。

これでこのCodeがError無しに実行出来るようになり
以下のBirdのImageがPrintされるようになりました。

ただし、前回のBlogの最後に
Fast.aiのAPIでは関数の説明においてParameterの説明がまったくない。と書いていました。

このせいでそれぞれの関数どんなParameterが必要なのかが今一理解出来ない。と書いてありました。
3.2 Is it a bird? Creating a model from your own data [1]の続きを勉強する
次は以下のCodeを追加して

ForestのImageを表示せよ。
と言っています。
やってみます。
取りあえずそのままCopyして実行してみます。

Errorになりました。
Download_url()関数が定義されてないって言っています。
ので以下のCodeを追加しました。

また実行してみます。
今度は以下のCodeがErrorになりました。

Search_Images()関数が定義されてない。と言っています。

Search_Images()関数を追加しました。

DDGS()関数がErrorになっています。
From duckduckgo_search Import *を追加しました。

From duckduckgo_searchがErrorになっています。
うーん。
以下のSessionをもう一回実行しました。

おお。
今度はErrorが消えました。

実行します。

今度はSearch_images()関数の最後の行がErrorになりました。
うーん。
以下の説明がついていました。

うーん。
これはLが問題じゃないでしょう。
原因が分からないのでGeminiに聞いてみます。

![]()
だそうです。
そう言う事なのか。
追加しました。

実行します。
このCodeを追加する前に一寸別な用事が出来て、一端Colabを閉じたんですが、

Duckduckgo_searchが無いとErrorになりました。
うーん。
Duckduckgo_searchはSiteを開くたびにInstallする必要があるみたいです。

Installしました。
Errorが消えました。

もう一回実行します。
以下の箇所がErrorになりました。
![]()
Errorの原因です。
![]()
以下のLibraryをImportする必要があるみたいです。
![]()
追加しました。

これで実行します。
結果です。

おお、ForestのImageが表示されました。
出来ました。
3.3 Is it a bird? Creating a model from your own data [1]の続きを勉強して分かった事と分からない事をまとめる
前回の勉強から以下のCodeを追加しただけですが、

かなり色々な事が判明しました。
まず
以下に示した様なLibraryのImportや

以下に示した様なLibraryのDownloadは

一回でもSiteを閉じると消えます。
もう一回最初からやる必要があります。
という事は今回追加した以下のCodeは

+

これ単体で動いています。
これ以前に書いた実装はまったく関係ないという事です。
もう一回このCodeを一行ずつ読んで内容を理解します。
先週、Search_images()関数の実装内容については勉強したと思ったんですが、
以下の部分の意味が分かりません。

この辺から勉強します。
まず先週のBlogを見直します。
何とこの関数の実装に関しては全く勉強してなかったです。
L()関数から調べますか。
この関数はFastcore.all Libraryにある関数のようです。
Copilot先生に聞いてみます。

まずLはClassで関数じゃなかったです。
Listに関係する機能があるようです。
以下のようにして使うそうです。

Listを作成するのか。
これはIntでやっていますがImageのListの作成も出来そうですね。
次はこのLの()内の値である以下の実装です。
![]()
DDGS().images()関数です。
これは先週勉強しました。
と思ったら勉強してなかったです。
Copilot先生に質問しました。

要はDuckDuckGoを使用して指定したImageを探してくれる関数という事です。
次の説明です。

まずDuckduckgo_SearchをInstallする必要があると書いてあります。

これの事ですね。
今になってみれば当たり前の話です。
しかし2週間前はこのCodeの意味するところは全然理解出来なかったのですから、まあ重要な内容ではあります。
次です。

おお、Parameterについて解説がありました。
CopilotはGeminiより優れているからなのか、Duckduckgo_Searchはfast.aiではないからなのか。は分かりませんがParameterの説明がありました。
これは助かります。
Termは検索に使用する単語の様です。
Max_Imagesは結果に表示するImageの数のようです。
となると
![]()
と書かれているSample CodeのParameterの値は、
Search_images()関数のParameterであるTermとmax_imagesになるみたいです。
![]()
これTermはそのまま代入されていますから問題ないですが、
Max_Imageの方はよく分かりません。
Max_Imageに30が入っていますが、これって30以上の数字を入れたら30に変換されるって事でしょうか。
それとも何も入れなかったら30になるって意味でしょうか。
Python101ですね。
調べます。
Python Functions [2]のDefault Parameter Valueに解答が載っていました。

上記の例では何もInputしなかった場合はNorwayがPrintされていました。

DDGS.Image()関数の勉強に戻ります。
Outputです。

これは分かります。
これでDDGS.Image()関数の勉強はおわりです。
次のCodeを読みます。
![]()
うーん。
ここが分からん。
先程のDDGS.Image()関数のReturn ValueはImageのURLです。
これはImage_URLというそれ専門のClassがあるのか、それとも単なるStringなのかが不明です。
そしてItemgot()関数はPythonに普通にある関数なのかそれともDDGSに属する関数なのかが分かりません。
うーん。
多分、Python一般の関数でしょう。
まずCopilot先生に質問してみます。

Fastcore Libraryの関数でした。
目的と使い方です。

分かり易い。
使い方の例が載っていました。

よし。
これで全体像が見えて来ました。
DDGS.Image()関数のReturn ValueはStructかClassでその中の要素にImageがあるんです。
そしてそのImageの中にはそのImage元であるURLが保持されています。
最後の2行です。

Download_url()関数ですが、これは先週勉強しました。
最初のParameterはURLのAddress、二番目にはDownloadしたImageの名前、三番目は途中経過を示すかどうか、を指定します。
最後のCodeですが、Forest.jpgと言う名前のImageを256x256pxで開くように命令しています。
このImageと先程のItemgot(‘image’)のImageは全く違うImageです。
Copilot先生に質問したらこのImage.open()関数はPILの関数だそうです。

これで大体の謎は理解出来ました。
まだ全然進んでいませんが、これだけ理解するだけでも結構疲れました。
今週のAIの勉強はここまでにします。
やっぱりCopilot先生は凄いです。
こっちが勘違いしている部分を指摘したうえで、正解を示してくれます。
4. Materialの勉強
今週もPwnisher氏のMaterialの機能をMega ScanのDefaultのMaterialに追加する作業を行います。
4.1 Pwnisher氏のMaterialの続きを勉強する
今週はRoughnessにImperfectionを追加します。
まず以下の切り替えの実装を追加します。

しました。
次にRoughnessにImperfectionを追加する場合の実装を追加します。

これです。
これをそのままCopyして追加します。
しました。
最後にImperfectionのTextureのSizeをControlするための
以下の実装を追加します。

しました。
Testしてみます。


使用しているTextureが良くないせいか、全く変化が見られません。
Textureを別なのに変更してもう一回Testします。

結果です。
Imperfectionアリです。

無しです。

今度は木枠の汚れの部分に大きな違いが生じました。
明らかにImperfectionがある方がPhoto-Realisticです。
実際にLevel上に配置した場合ですが、

木の部分が写真のようにRealに見えます。

4.2 再現したい質感
先週、以下の質感の再現方法をこれから調査すると決定しました。

これについて調査します。
今週は金属について調査します。
MegascanからChromiumのMaterialをDownloadしました。

実装を見てみます。
何と元になっているMaterialは他のMaterialと同じでした。

Textureは単なる色ですね。

MetalnessにTextureが使用されていますね。
Materialの実装を確認します。

あれ?
Metallicなんて項目がありました。
こんなのあったの覚えてなかったです。
ここに以下の実装が繋がっていました。

以下のような簡単な実装でMetallicの値とMaterialの金属っぽさを確認します。

以下のような結果になりました。


金属っぽいか?


こっちはplasticのようになりました。


これは石膏のように見えますね。


Metallicが1.0でもRoughnessが1.0だと金属には見えないです。
以上です。
5. Nvidia Omniverseの勉強
今週は何を勉強しますか。
取りあえず先週の勉強の内容を確認します。
5.1 先週の復習
Exploring the NVIDIA Omniverse World, Including IsaacSim [5]を勉強しました。
結構、内容が整理されていてOmniverseの全体像が理解出来ました。
でもそれだけで次に何をやるかとか、ここが不明だから来週調査するとかは無いですね。
実際のOmniverseのSiteを見ながら先週勉強した内容を振り返る位ですかね。
出来るのは。
やってみます。
<00:00 Intro>
OmniverseのHomepageです。

<01:54 Use cases (Digital Twins)>
Use CasesをClickすると以下のBoxが表示されました。

Digital Twins、Robotics Simulation、Synthetic Data Generation、そしてVirtual Factoryがありました。
先週勉強した内容と全く同じでした。
Digital Twinsを選択します。

以下の箇所に仮想空間に現実とまったく同じ世界を再現する事でSimulationや最適化などを行う事が、簡単ですが説明されていました。

本当に簡単な説明で、先週の트윅 tweak氏の解説を聞いてなかったら理解出来なかったです。
FreeのE-bookがあるそうです。
一応、もらっておきますか。
Clickしたら以下のPageが開きました。

うーん。
なんかDownloadするとかそういう感じではないですね。
Exploring the NVIDIA Omniverse World, Including IsaacSim [5]で出て来た街の画像もありました。

これらのBuildingはHoudiniなんかのProceduralな手法で生成したんでしょうか?
次にこのDigital Twinsを利用している会社の例が紹介されていました。

次にEcosystemです。

先週の트윅 tweak氏の説明ではこれらの会社の技術を平行して使用する事でDigital Twinsの仮想空間内におけるSimulationなどが可能になるそうです。
Developer Use Casesです。

ここでは産業界などで実際にどのようにDigital Twinsが使用されているかを説明しています。
興味があるので少し詳しく見る事にします。
<<Automotive>>
<<<BMW Group Develop Custom Application on NVIDIA Omniverse for Factory Planners>>>
BMW社の例が紹介されていました。
簡単にまとめると、工場を建設する前にDigital Twinsで仮想空間上に工場を建設して、どこにRobotを配置したら最も効率的かなどを検証しているそうです。
<<<Deploying Next-Gen 3D Car Configurators>>>
これは3Dの車をPC上で見るためのSoftのようです。

ただ実行しようとしたらErrorになりました。
Denzaは中国の電気自動車の会社でした。
<<<Revolutionizing Automotive Design and Manufacturing>>>
これはYouTubeの動画で、単なるPromotion Videoでした。
<<Data Center>>
次はData Centerの例です。
一個だけしか紹介されていません。

<<<Building Digital Twins of the World's Most Advanced AI Supercomputers>>>
紹介されているDemoを見ました。
NvidiaがAI用のSuper Computerを設計するのにこのDigital Twinsを使用したという話でした。
GPUを冷やすために最も効率の良い配置を見つけるためのSimulationとかは激熱な内容でした。
<<Energy>>
Energy部門です。
以下の3つの例が紹介されていました。

Siemensは2つも例が紹介されています。
よっぽどOmniverseが好きなんでしょうね。
<<<Reducing Downtime and Unplanned Maintenance>>>
発電所における例です。
Turbinを回すための液体の流れを最適化するためにDigital Twins内に以下のような設備を再現したそうです。

このSimulationのお陰でDowntimeの時間を70%減らす事に成功したそうです。
<<<Optimizing Wind Farm Design and Electricity Generation>>>
風力発電用の風車を建てるのにどの程度それぞれを離したらもっとも効率が良いのかをDigital Twinsを使用してSimulationしていました。

<<<Accelerating Fusion Reactor Design and Development>>>
Digital Twinを使用して核融合炉を正確に再現する事で核融合炉で発生するPlasmaをSimulationしていました。

<<Manufacturing>>
以下の3つの例が載っていました。

3つの例が全てDemoしかないですね。
<<<Training Robots and Streamlining Assembly With NVIDIA AI>>>
Digital Twinを使用して工場を建設する様が紹介されていました。

更にDigital Twinを用いてTrainingしている2種類のRobotの例が紹介されていました。

<<<Fuse Real and Digital Worlds With NVIDIA Omniverse and Generative AI>>>
Siemens社のXceleratorとNvidia社のOmniverseを同時に活用する事で

PBRを製品の設計に活用できるようになったそうです。
具体的な例として以下の造船が載っていました。

たった3分の説明では何がどうなっているのかよく分からないのは当然かもしれませんが、
そもそも船の設計をするに当たって仮想空間にこの船をそっくり再現するに必要なDataは既に存在しているみたいです。
それをSiemens社のXceleratorが整理してOmniverseにおくり、Omniverse側で3Dを生成しているみたいです。
その結果、どうなったのか例えば生産性が上がったとか、その辺は分かりません。
その辺を強調して主張していないって事は上がってないと見るべきです。
<<<Accelerating Design and Operations in Manufacturing>>>
こっちも工場の設計にDigital Twinsを使用した例ですね。

工場の建設でDigital TwinsのDataを実際の工場の建設予定地にVR/AR Gogglesを使用して確認しているImageが紹介されていました。

うーん。
本当かいな。
今のVR/ARにそんな性能があるとは思えません。
こっちは工場の建設時間がOmniverseを使用する事で半分になったとその成果がはっきりと述べられていました。
AIがどこに使われたのかはよく分からなかったです。
<<Retail>>
以下の3つの例が紹介されていました。

<<<Training Autonomous Warehouse Robots>>>
Amazonの倉庫で働く以下のRobotの開発にDigital Twinsが使用された例が載っていました。

このRobotのAI学習にDigital Twinsが使用されたそうです。
流石にAmazonとの共同で作成しただけあってAIの学習にどのようにDigital Twinsが使用されたかの説明がしっかりされていました。
<<<Reinventing Home Improvement Retail>>>
Lowe'sと言う名前のホームセンターのお店の設計をDigital Twinsを使用して行った例が紹介されていました。

Simulationの例を見るとこのお店はCostcoのように倉庫型の店舗を展開しているようです。
その倉庫のような棚にどのように商品を並べると最も売り上げが伸びるのかを検証しているようです。

ここでもVR/AR Goggleを使用して実際に商品を配置した場合、どうなるかの確認をしていました。
<<<Optimizing Distribution Center Throughput>>>
PepsiCo社の例が紹介されていました。
流通センターの設計などをDigital Twinsを利用して行ったようです。

この話で興味深かったのは、新しい商品の流通をAIに学習させるのにOmniverseを使用すると現実と変わらないLevelのPhoto-Realisticな3D Modelが使用出来るので、学習した内容をそのまま流通センターで使用出来るという話でした。

<<Science and Research>>
今度は科学分野におけるDigital Twinsの利用例です。
以下の3つが載っていました。

ほとんどが気象関連ですね。
<<<Accelerating Carbon Capture and Storage>>>
CO2を液化して地下の貯蔵する話でした。

この地下のどの辺に貯蔵するのがBestなのかをDigital Twinを使ってSimulationしているみたいです。
<<<Visualizing Global-Scale Climate Data>>>
地球上の気象を正確に可視化する事は気象学者の研究を非常に助けるそうです。

Digital Twinでそれを行っています。
<<<Accelerating Climate Research>>>
これは珍しくBlogでした。
アメリカ政府のProjectでDigital Twinsを使用して地球規模の気象を再現するそうです。
<<Telecommunication>>
以下の3つの例が紹介されていました。

<<<Accelerating 5G Network Simulation>>>
これは5G用のアンテナをどのように配置するかを決定するのにDigital Twinで再現した町を利用したという話でした。
Digital Twinを使用して作成した町は実際の町と寸分たがわない精度なので、
以下のようにどのようにアンテナが反射するのかを走行中の車からSimulationする事ができるそうです。

ここでAIを使って最適化をするそうです。
凄い。
<<<Transforming Telco Network Planning and Operations>>>
これも5Gのアンテナを建てるのにDigital Twinsを利用してる話でした。

こっちの仮想空間上に作成された町は最初のVideoに出てきたやつです。
<<<Design and Test 5G and 6G Networks>>>
これも他の2つ同じで、携帯用のアンテナを配置するためにDigital Twinsを利用して町を再現しています。

なんか東京っぽいんですが、どうなんでしょう?
NTTとかがやってるのかもしれませんね。

Electromagnetic Waveを可視化しているそうです。
これでDigital Twinsの例は全部みました。
見直したら、先週の復習として初めてOmniverseのSiteを見る事になってDigital Twinsの例を全部確認し始めていました。
話が大分散らかってしまったので、次節でまとめます。
5.2 Digital Twinの例を勉強した感想
Automotive、Data Center、Manufacturing、Energy、Retail、Science、そしてTelecommunicationの分野におけるDigital Twinsの使用例を勉強しました。
Automotive、Data Center、Manufacturingは倉庫Levelの大きさの建物内における仮想空間の再現を行っていました。
Energyではそれよりも大きな地形を再現していました。
Telecommunicationでは町全体を再現していました。
Scienceでは地球の一部とか非常に大きなLevelでの再現を行っていました。
今、活用されているDigital Twinsはこの3つのSizeが主なようです。
これを勉強した思ったのは、この分野はもっと勉強しないといけないというか勉強する価値がある内容だという事です。
今週のOmniverseの勉強はここまでにする予定でしたが、もう少しだけ勉強する事にします。
その代り「7. UE5.4の新しい機能について」の今週の勉強はお休みします。
5.3 Robotic Simulationを勉強する

なんとこのWebsiteの名前をまだ書いてなかったです。
NVIDIA Omniverse [3]です。

今度はDigital Twinsを選択します。
何とNVIDIA Isaac SimのPageに飛びました。

先週のBlogで以下のようにまとめていました。

そうだった。
ではIsaac Simについて勉強します。

まずReference Applicationって言っています。
これはOmniverseにあるModuleを組み合わせて作成したApplicationって意味だと思います。
次の文章です。

Isaac SimはOmniverseにあるModuleを組み合わせて作成したのでBuild on NVIDIA Omniverseと言っているのだと思います。
次の文章ですが、
USDを使用しているのでDeveloperが独自のSimulatorをIsaac Sim上に作成出来るし、今まで作成したSimulatorにIsaac Simの技術を追加する事が可能になっています。
と言っています。
成程。
これって結構凄い事です。
もしこれからSimulatorを開発したい会社はIsaac Simを利用した方が速く正確なSimulationが出来るようになります。
既にSimulatorを開発している会社は、Isaac Simを取り込む事で更に早く正確なSimulationが出来るようになります。
まさしくOmniverseの力の凄さを体現しています。
次に以下の図が載っていました。

小っちゃくてよく見えません。
拡大します。
左端のIsaac SimにImportするためのDataです。

Sim-Ready Assetsは何の事が分かりません。Simulationに関係する(例えば風速とか、温度とか)の事でしょうか?
残りは3DのModelとそのModelが動くためにEnvironmentです。
これらのDataは仮想空間でRobotが学習するには絶対Importする必要があるので、まあ納得です。
次に上部を見てみます。

HIL/SILが何なのかは不明ですが、SimulationやAIによる学習の結果を出力しているんでしょう。
この図に乗っているIllustrationは、それぞれの産業で使用出来る事を示しています。
中央の図です。

Isaac Simは、ここに載っている外部のSoftやDataや、OmniverseにあるModuleと、共同で作業する事が出来る事を示していると考えられます。
左端の図です。

これはDeveloperがIsaac Simを使用、もしくは利用して独自のRobotのSimulationを作成出来る事を示していると思われます。
何言っているのか全然不明というLevelではないですね。
次に行きます。

これはIsaac Labについての解説です。
Isaac Simの簡易版で、Robotの学習に特化したAppのようです。
となるとRobotのAI学習に興味のある私が勉強すべきなのはLabの方かもしれません。
ここからIsaac LabのSiteに飛べますが、Isaac LabのSiteは後で勉強する事にします。
次の節です。
Key Benefits of Isaac Simです。
以下の3つのBenefitsが紹介されていました。

Realistic Simulationは、NvidiaのPhysX Engineを使用出来る事を言っていますね。
もう何年も前になりますが自作の3D EngineにNvidiaのPhysXを追加して坂に円柱を落としたら転がって落ちたのを覚えています。
兎に角PhysX Engineは凄い物理Engineです。
こういうのを自社で持っているのもNvidia社の強みですね。
次のModular Architecture for a Variety of Applicationsです。
これはOmniverseがModuleで構成されている事を示していると思われます。
更にManipulation、Navigation、そして学習用のDataを合成して生成する場合などに対応出来るように設計されているそうです。
Seamless Connectivity and Interoperabilityについてです。
USDを使用しているので他のSoftのDataをそのまま使用する事が可能です。
次の文が問題です。
以下のように述べています。
Isaac ROS/ROS 2 Interface、フル機能のPython、Robotや環境ModelのImport用Pluginを通じて、ロボットの頭脳を仮想世界に簡単に接続することができます。
ここで紹介されているInterfaceやPluginが具体的に何を指しているかは不明ですね。
この辺はこれから勉強する事にします。
次の節です。

先程、よく分からないと言ったROSの説明がありました。
それぞれ簡単に読んでみます。
Pre-populated Robots and Sensorsです。
市販されているRobotのSimulation用のModelは既にあるみたいですね。
ROS/ROS 2.0 Supportです。
そもそもROSが何なのかが分かりません。
のでこの説明を読んでもチンプンカンプンです。
これは後で勉強する事にします。
Scalable Synthetic Data Generationです。
この説明を読むとAIの学習用のDataなんだけど、Labelの無い画像みたいな感じじゃなくて、Lightの位置を変えたり、色を変更したりなどの3D的な内容のようです。
これらを合成して作成するそうです。
細かい点では勘違いしてるかもしれませんが、AIの学習用のDataを合成して作成する技術である事は間違いないはずです。
SimReady Assetsです。
テスト用に使用できる3DのAssetが用意されているそうです。
Developer Resources and Supportです。

Isaac Simを勉強するのにこんなSupportがありますよ。と書いてあります。
まあUE5のTutorialとほぼ同じですね。
OSMOについてです。

何言っているのか全然理解出来ません。
完全に推測ですが、Isaac SimをCloud展開する事でAIの学習時間を短くしたりする技術なんでしょうか?
これも後で勉強する事にします。
Robot関連のNewsが紹介されていました。

一番最新と思われる左端のNewsを開いてみます。

今年の6月に発表されたNewsですね。
その前のNewsは去年の12月でした。
不定に発表されるみたいです。
最後に以下のOmniverseをInstallするためのButtonがありました。

Forumsへもここから行くことが出来るようになってました。
流石にこんなもんですか。
今週のOmniverseの勉強はここまでにします。
6. Gaeaの勉強
6.1 Tutorialの作成
今週はBuildで作成するTextureの指定方法を勉強します。
Buildについての解説です。

GaeaにおけるBuildとは何かをまだ説明してなかったです。
HeightmapとMaskについての解説です。

Heightmapについての解説です。

HeightmapはTerrainの形状を表すためのTextureです。
Maskについての解説です。

Coloringのところで散々Maskingを勉強しましたが、その時に使用したMaskをTextureとして作成します。
Textureを出力するための設定方法についての解説です。

Nodeを右ClickするとTextureを作成するためのBoxが表示されます。
出力が複数あるNodeの設定です。

まとめです。

結構、簡単に終わってしまいました。
7. UE5.4の新しい機能について
今週はお休みします。
8. Houdiniの勉強
8.1 Houdini 19 - Wall Tool 15 [4]を実装する
CirculeノードとBrick Wall Tool_Buildノードの線を切ります。

切り方忘れました。
調べます。
Y Keyを押しながら線を切るんでした。
やってみます。

出来ました。
先週のBlogには以下のようなSphereを配置していますが、

これの作成方法が書いていません。
Houdini 19 - Wall Tool 15 [4]を見て確認します。
Sphereを追加しているだけでした。

Sphereを追加しました。

何も表示されません。

Sphereノードを選択します。

Sphereが表示されましたが、TutorialのImageとは違います。
色々試しましたが、
左端にある以下のToolbarの
赤で囲ったIconをEnableすると

以下のようにTutorialと同じ表示になる事が判明しました。

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

試してみます。

このやり方でも表示されました。
Brick Wall Tool_Buildを開きます。
そしてAttribwrangle_ShuffleBricksを選択します。

じゃなくてその下のConvert Line1ノードを選択します。

Convertline1ノードとその下のNodeの間に隙間を作成します。

表示を以下のように変更しました。

やり方は先週のBlogにまとめた通りです。
一つ注意しないといけないのが、以下に示した様に12がついているIconが2つある事です。

今回、Enableしたのは12の下にPlateがある方です。
こっちはPrimitiveのNumberを表示します。
上の12の下のPointがあるIconをEnableした場合はPointのNumberを表示します。
Groupノードを追加します。

Groupノードを可視化しましたが、

何も変わりません。
先週のBlogには

と書いてありました。
表示されている内容は同じなので、多分大丈夫でしょう。
先に進みます。
Group NameをblastBrickに変更します。

Group Typeの値はPointsに変更します。

Base GroupのEnableをOffにします。
そしてKeep in Bounding RegionsをEnableします。

Tutorialの言った通り以下のBoxが表示されました。

そしてBounding Typeの値をBounding Object{Point or Vertices Only}に変更します。

<Bounding Regions>3:11
この状態でGroup 5ノードの右端のInputにSub-Network Input #2を繋げます。

Group5ノードはErrorを表示していますが、一個上の階層に戻って、Sphere1をBrick Wall Tool_Buildノードに繋げると

Errorが消えます。

Blastノードを追加します。

BlastノードのGroupの値をBlastBrickに変更します。

以下のようになりました。

おお、Pointが消えています。
ここでTutorialは

と言っています。
私のWallはこのような独立したPointはありません。
Sphereを移動して確認します。

結果です。

おお、今度は独立したPointがあります。
このPointはPolygonを形成しないので消します。
Facetノードを追加します。

Remove DegenerateをEnableします。

結果です。

Polygonを形成しないPointが消えました。
もしくはAttribwrangleノードを追加して
以下の実装を追加します。

結果ですがErrorになりました。
NeighbourCountのSpellが間違っていました。

直しました。
結果です。

Polygonの無いPointが消えました。
Switchノードを追加します。

Convertline1ノードの結果をSwitchノードに繋ぎます。

更にattribwrangle2ノードの結果を繋ぎます。

<Expression Editor>8:17
Select Inputを選択した状態でAlt+Eを押します。
何も起きません。
Select Inputの値を選択してAlt + Eを押します。

今度はEditorが開きました。
以下の実装を追加しました。

以下のようになりました。

今度は別なErrorを直します。
それは以下のようにBrick Wall Tool_BuildノードのInputに何も繋がってない状態にすると
以下のようにErrorになる事です。

<Add an Expression>10:18
このErrorを直すにはExpressionを追加する必要があります。
Group5ノードを選択してKeep in Bounding RegionsのEnableを右Clickして以下のBoxを表示します。
そしてEdit Expressionを選択します。

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

Errorが消えました。

Switchノードの結果を以下に示したForeach_Begin1ノードに繋げます。

結果です。

Sphere1ノードを繋げます。

結果です。

おお、Sphereのある場所のBlockが消えています。
Circleも繋げました。

結果です。

おお、凄いです。
これでこのTutorialは終わりです。
今週はここで終了して来週はこのTutorialの復習をやる事にします。
9. UEFNの勉強
今週は先週作成したmy_first_npc_behavior.verseのDefaultで生成されるCodeを勉強する事にします。
9.1 NPC BehaviorのTemplateを読む
以下のModuleが使用されていました。

Fortnite.com/AIとかVerse.org/Simulationとかは初めて見ます。
Websiteが紹介されています。

以下のSiteに飛びました。

VerseのTutorialがまとめられているPageです。
前に何回が来たことがあります。

ここからCodeが始まります。
Debug_draw_ChannelってどんなClassなんでしょう?
と思ったら上の解説でDebug用のClassって書いてありました。

今度はModuleを作成しました。
このModuleはDebugした時に役に立つMessageを返す関数があるそうです。

これはMessage型のConstantを作成しているようです。

こっちは関数でしょうか?

同じような設定が更に3つありました。

今度はNpc_behaviorのClassからObjectを生成しています。

これはUEFN上で設定できるParameterを指定してるはずです。
はずですが、こんな書き方は初めてみました。
結構分からない事だらけです。
次のCodeです。

これも前のCodeと全く同じ構造です。
その次のCodeです。

おお、これは理解出来ます。
いつも書いていたCodeです。
ShowAIDebugはどういう意味なんでしょう?
この部分は初めてみる書き方です。

これらも同じ構造です。

今度はDebug Drawを作成しています。
このDebugの作成方法もまったく理解出来ません。
どこかにTutorialとかあるんでしょうか?

Float型のConstantですね。

OnBegin()関数がここから始まっています。

If節です。
ここは先々週に勉強した内容です。
特に疑問はないです。

Debugの内容を表示するためのCodeとCharacterの位置を保持するためのConstantを作成しています。

この後からLoopが始まります。
Loop内の最初のCodeは移動先のPointを計算しています。

Debug内容を表示するための実装です。

この辺のCodeは先週勉強したところです。

Debug Flagが目的地にBoxが書けるならNPCがその場所に移動します。
うーん。
このCodeではそうならない気がします。

こっちがNPCに目的地に移動するように命令するCodeですね。

If節内の実装の<>が不明ですね。

これはDebugですよね。
ShowDebugがEnableになってたらDrawDebugLocation()関数を表示するって意味ですね。

あ、思い出しました。
RaceってMulti-Threadのやつです。
Verseの勉強の最初の頃に勉強した記憶があります。

うん。
ここでLoopが終わっていますね。

Agentが取得出来なかった時の対応だそうです。

表示されるBoxの設定をここでしています。

表示されるArrowの設定です。

Textの色やDurationの設定です。

NPCが消えた時に発動する実装です。
以上です。
うーん。
最後まで見たら全体像がやっと見えて来ました。
細かい点はうーん。分からないです。
来週、細かい点は検証する事にします。
10. DirectX12の勉強
10.1 Lötwig Fusel氏のD3D12 Beginners Tutorial [D3D12Ez]を勉強する
10.1.1 先週の復習
SwapChainについて勉強していました。
SwapChainを初期化するためにはFactoryが必要です。
通常、DirectX12ではDeviceから必要な機能を初期化しますが、SwapChainだけはFactoryから生成します。
これは以下に示した様に

SwapChainの機能は通常のDirectX12の機能を担当するD3D10ではなく、その下層になるDXGIが担当しているからです。
10.1.2 SwapChain | D3D12 Beginners Tutorial [D3D12Ez] [3]の最初の10分を実装する
それでは先週勉強した内容を実装していきます。
Window.h Fileを開き、以下の場所にComPointerを使用してIDXGISwapChain3型のObjectである m_swapChainを宣言します。

Window.cppに移動してCreateWindowExW()関数の後に以下の実装を追加します。

Factoryを作成します。
DXContext.h Fileに移動して
ComPointerを使用してIDXGIFactory7型のObject、 m_dxgiFactoryを宣言します。

既に宣言されていました。
DXContext.cpp Fileに移動して
以下の実装を追加します。

これも既に実装していました。
これでFactoryを初期化しました。
更に生成したObjectをReleaseするための実装も追加します。

これも既に追加されていました。
またDXContext.h Fileに戻って来て、今度はFactoryのGetterを作成します。

これも既に作成されていました。
どうやらDXContext FileはSample CodeをまるまるCopyしたようです。
なので全部の関数や変数が既に実装されているようです。
Window.hに移動します。
Window.hからDXContent.hが使用できるようにします。

これは実装してなかったです。
Window.cppに以下の実装を追加します。

今、気が付いたんですが、このCodeの書き方よく知らないです。
これで初期化されたFactoryを得る事が出来るんでしょうか?
これは後で調べる事にします。
CreateSwapChainForHwnd()関数を追加します。
![]()
ここに使用するParameterを作成します。

生成したArgumentを追加します。

その後にnullptrを追加します。

今度はComPointerを使用してSpwapChain1を作成します。
![]()
以下のようになりました。
![]()
QueryInterface()関数を使用してSwapChain3であるm_swapChainに値をPassします。

これで先週の勉強が終わっています。
10.1.3 SwapChain | D3D12 Beginners Tutorial [D3D12Ez] [3]の最初の10分を実装した感想
先週しっかり勉強したお陰で、特に分からない箇所は以下の部分だけでした。

前にSingltonの作成でこの部分を勉強した記憶があります。
調べます。
2024-01-21のBlogを読むとDXContext ClassがSingletonでした。
DXContext.h Fileの中に以下の実装がありました。

ここでDXContentのObjectを生成していました。
成程。
これで以下の部分の実装の意味が分かりました。

しかしDXContentのInit()関数を実行するCodeはありません。
これを実行しないとFactoryの中身はnullのままだと思うんですがどうなんでしょうか?
調べたらMain()関数でDXContent ClassのInit()関数を呼び出していました。

しかもDXWindow ClassのInit()関数の先に呼び出しています。
これならDXWindow Class内でDXContentの変数を呼び出してもNullになる事は無いはずです。
はい。
理解しました。
10.2 「DirectX 12の魔導書」を勉強する
10.2.1 「5章 PolygonにTextureを貼り付ける」を読む
今回は軽く読んで全体像を何となく把握します。
<「5.1 DirectX12におけるTexture」>
ここではこの5章で勉強する内容が簡単にまとめられていました。
DirectX12では以下の手順でTextureを貼り付けるそうです。
- Vertex情報にUV情報を追加する
- Vertex Shaderを書き換える
- Pixel Shaderを書き換える
- CPU側のMemory上にTexture用Dataを作成する
- GPUが利用出来るように転送先Bufferを作成する
- CPU側にあるTexture DataをGPU側のBufferに転送する
- Descriptor Heapを作成する
- Descriptor Heap上にShader Resource Viewを作成する
- Root SignatureのDescriptor TableにTexture用の設定(Slot番号範囲など)を書く
- 描画の際にDescriptor Heapをセットする
このそれぞれの手順を具体的に以下の節で解説していました。
<「5.2 Vertex情報にUV情報を追加する」>
UV情報の記述方法について説明しています。
<「5.3 ShaderにUV情報を追加する」>
追加したUV情報が利用出来るようにLayout設定とShaderのCodeの変更について解説しています。
<「5.4 Texture Dataの生成」>
なんとここではTextureを読み込んでそれを表示するのではなく、Textureを自作してそれを表示するそうです。
こっちの方が、Texture Dataの仕組みが理解出来るそうです。
この節では、TextureをProgrammingで自作しています。
<「5.5 Texture Buffer」>
Texture Bufferの作成方法について説明しています。
<「5.6 ID3D12Resource::WriteToSubstance() MethodによるData転送」>
ID3D12Resource::WriteToSubstance() Methodを使用してTextureのDataを転送します。
そのやり方が説明されています。
<「5.7 Shader Resource View」>
Texture用のViewを作成します。
<「5.8 Root SignatureにSlotとTextureの関連を記述する」>
Descriptor Table (Root Signature)を作成しています。
<「5.9 描画時の設定」>
ここでは、
- Root Signatureの指定
- Descriptor Heapの指定
- Root Parameter IndexとDescriptor HeapのAddressの関連付け
を行うそうです。
<「5.10 Pixel ShaderのProgramを変更する」>
Textureを表示出来るようにPixel ShaderのProgrammingを変更します。
<「5.11 画像Fileを読み込んで表示する」>
DirectX Texを利用して画像FileをTextureとして取り込む方法を説明しています。
<「5.12 ID3DD12GraphicsCommandList::CopyTextureRegoin() Methodによる転送」>
ID3D12Resource::WriteToSubstance() Methodで転送する方法を勉強していましたが、このMethodでは転送出来ない場合があるそうです。
その場合はID3DD12GraphicsCommandList::CopyTextureRegoin() Methodを代わりに使用して転送するそうです。
ID3DD12GraphicsCommandList::CopyTextureRegoin() Methodで転送する方法は公式でも勧められている方法だそうです。
ここではID3DD12GraphicsCommandList::CopyTextureRegoin() Methodで転送する方法を説明しています。
<「5.13 d3dx12.h(CD3DX~)の導入」>
d3dx12.hというLibraryが紹介されていました。
このLibraryの使用方法が説明されていました。
10.2.2 「5章 PolygonにTextureを貼り付ける」を読んだ感想
今度はDirectX12でTextureを使用する方法を勉強します。
なんか全体像がはっきりしたので、今までの章より簡単に思えました。
この本は全部で18章もあるので、早く進めたい気持ちもあるのですが、まあこれは焦っても何も生みません。
ゆっくりやって行きます。
ゆっくりだけど確実に進歩していく。
これでやっていきます。
来週は、「5.1 DirectX12におけるTexture」を勉強します。
11. まとめと感想
なし
12. 参照(Reference)
[1] Jhoward. (2022, August 15). Is it a bird? Creating a model from your own data. Kaggle. https://www.kaggle.com/code/jhoward/is-it-a-bird-creating-a-model-from-your-own-data
[2] W3Schools.com. (n.d.). https://www.w3schools.com/python/python_functions.asp
[3] NVIDIA Omniverse. (n.d.). NVIDIA. https://www.nvidia.com/en-us/omniverse/
[4] Rick Banks. (2022, June 28). Houdini 19 - Wall Tool 15 [Video]. YouTube. https://www.youtube.com/watch?v=VVuTImH7V5g