UE4の勉強記録

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

UE5の勉強 -映像作品としてのLandscapeを作成する-

1. 今週の予定

1.1 映像作品としてのLevelの作成

Olli Huttunen氏のMy observations on Gaussian Splatting and 3D scanning [1]を見ると屋内における3D Gaussian Splattingの撮影方法やUE5にImportしてからの調整方法などが詳しく説明されています。

今週はこれを勉強します。

1.2 AIの勉強

Jeremy Howard氏の Practical Deep Learning for Coders: Lesson 1 [2]の宿題の続きをやります。

先週は教科書を読んでるだけで終わってしまいました。

今週は最後まで読み切ります。

勉強する環境ですが、GoogleのColabが断トツで良い気がして来ました。

他のTutorialがこぞってGoogleのColabを使用しているし、日本語の教科書もGoogleのColabを使用しています。

のでColabでfast.aiが使用出来るか調べます。

その上で、Jupyterについて調査し、KaggleとColabのどれを使用するのかを決定します。

1.3 Materialの勉強

先週は急な予定が入って何も出来なかったです。

先週の予定をやる事にします。

1.4 Nvidia Omniverseの勉強

今週からOmniverseの勉強もやる事にします。

今週は先週調べたTutorialの中から簡単そうなのを一個勉強する事にします。

1.5 Gaeaの勉強

先週はBuildについてのTutorialの作成方法を検討しました。

以下のように作成すると決定しました。

今回は最初のSizeとHeightの設定についてのTutorialを作成します。

1.6 UE5.4の新しい機能について

2024-05-05のBlogには以下の勉強をすると書いていました。

今週はOfficial Android Support for Unreal Engine Virtual Camera [3]を実装します。

更に公式のSequencer Editor [4]とSequencer EditorCine Camera Actor [5]の勉強も行います。

1.7 Houdiniの勉強

Houdini 19 - Wall Tool 14 [6]の勉強を行います。

1.8 UEFNの勉強

先週勉強したExtension Functions? Fortnite UEFN/Creative 2.0 Verse Tutorial [7]を実装します。

1.9 DirectX12の勉強

Lötwig Fusel氏のD3D12 Beginners Tutorial [D3D12Ez]は Creating a Window | D3D12 Beginners Tutorial [D3D12Ez] [8]の最後の10分を勉強します。

DirectX 12の魔導書」の勉強は、「4.11 三角形ポリゴンを四角形にしてみる」の「4.11.2 Indexを利用する」を実装します。

先週のBlogの予定には「4.11.2 Indexを利用する」を実装する。と書いていますが、

これは勉強するの間違いです。

2. 映像作品としてのLevelの作成

Olli Huttunen氏のMy observations on Gaussian Splatting and 3D scanning [1]を勉強します。

この人の動画には3D Gaussian Splattingの撮影方法についての役に立つKnow-Howが沢山詰まっています。

どうやって撮影したら背景が歪まないように撮影出来るのかとかも知っているかもしれません。

ただしこの人の動画の中から、この動画を選択した理由は単にお勧めに出て来たからです。

2.1 Olli Huttunen氏のMy observations on Gaussian Splatting and 3D scanning [1]を勉強する

<Introduction>

PostshotというProgrammingを使用していました。

マジで?

調べたらこれの事みたいです。

このSoftの仕様方法を勉強したらGaussian Splattingの3D Modelをより良く作成するために必要な撮影の条件について、更に理解を深めた。と言っていました。

そう言う事なのね。

<Welcome>

ここで、Olli Huttunen氏、3D Gaussian SplattingがEnvironmentを生成するのに非常に有効であると考えている。と述べています。

これ。

これが私が思っている事なんです。

3D Gaussian SplattingでLevelの環境を作成出来たら、Levelの作成に掛かる時間が90%位縮小出来ます。

ただ、前回私が試した限りでは遠くの建物は歪んで生成されてしまうので、そのまま利用するは無理である。となりました。

で、外での撮影方法について説明してくれるのかと思ったら、今回は室内での撮影方法のコツについてやる。と言っていました。

そうなの?

まあいいです。

それでも何かしらの勉強にはなるでしょう。

まず、3D Gaussian Splattingの最新情報について知りたかったら以下のBlogをCheckすべきだ。と言っていました。

見てみます。

このSite(https://radiancefields.com/)の事のようです。

取りあえず登録だけしておきますか。

E-mailを登録したら以下のPageに飛びました。

え、登録するのにお金がかかるの?

と焦って取り消しを選択しようとしたら取り消しがありません。

よく読んだら月額料金がFreeのNoneが選択されていました。

ああ、そう言う事なのか。

それは兎も角、このBlogに以下のArtistのInterview記事が載ってたそうです。

この人が以下の室内の3D Gaussian Splattingを作成したそうです。

これがかなり凄いらしくて、その作成方法について先程のBlogのInterviewで語っているそうです。

それについて今回は解説してくれるって事?

https://current-exhibition.com/laboratorio31/に行くとYulei He氏が3D Gaussian Splattingで撮影して作成したこの室内を実際に見れるそうです。

行ってみます。

確かに凄いですが

画面の下のButtonで見る位置と角度を固定しています。

これだったら単なる写真で良くない。と思いました。

と思ったら自由に移動出来ました。

かなり意地悪に部屋の端っこまで移動してみましたが、それなりに綺麗に生成されています。

ただし上下に視点を変更する事は出来ませんでした。つまり天井や床だけを見る事は出来ないって事です。

うーん。

しかし凄い事は凄いです。

やっぱり室内から撮影して、正確な3D Gaussian Splattingを作成出来るようになってから、屋外の撮影に挑むべきなのかな。

Yulei He氏は以下のように撮影したそうです。

<Parking Carriage>

そのInterview記事を元に以下の駐車場の撮影をしたそうです。

む。

この駐車場のTutorialは前に見た記憶があります。

2024-03-10のBlogで勉強していました。

Experience combining a 3D Gaussian Splatting model from Postshot to Unreal Engine.[9]を勉強していました。

こっちはUE側の加工方法についての解説ですね。

Directional Lightの調整方法や床をStatic Meshで置き換える方法について解説していました。

途中でTutorialの勉強を止めています。

動画の続きを見たら先程のExperience combining a 3D Gaussian Splatting model from Postshot to Unreal Engine.[9]が紹介されていました。

この動画はExperience combining a 3D Gaussian Splatting model from Postshot to Unreal Engine.[9]の次に作成した動画だそうです。

成程。

この辺の知識があったら3D Gaussian Splattingの動画を作成出来るようになるのか。

<Gaussian Splatting>

何と、Postshotでは複数の動画を使用してGaussian Splattingを生成する事が出来るそうです。

これは少し解説が必要で、

今までは被写体の周りをグルグル回る必要が有ったんですが、

今度は、適当に背景を撮影するだけでAIがどこを撮影したのかを自動で推測してPoint Cloudを生成してくれるって意味だそうです。

ふええ。

それは凄い。

Luma AIはどうなんでしょう。

多分Luma AIも出来ると思います。

しかしそれでも生成されたGaussian Splattingには沢山のHazeがあったり、おかしな点があったりします。

特に床が変だと。言っていました。

で、Olli Huttunen氏の結論としてはGaussian SplattingとStatic Meshを使用した今までのLevelの作成は混合して使用すべきだ。というものでした。

それは100%同感です。

<Overhead 4D>

このやり方で凄い3D Modelを作成しているのがSlovakiaにある会社のOverhead4Dだそうです。

うーん。

有効な情報が沢山ありますね。

Slovakiaってスロバキアの事でしょうか。それともスロベニアの事?

こういうのって良く調べておいた方が良いですよね。

一寸調べます。

スロバキアの方でした。

何と、以下の例で解説していますが、

城の部分はPhotogrammetryで作成したものを使用しているそうです。

ふええ。

Photogrammetryの勉強も必要になるのか。

空や水はUEで追加しているそうです。

空ってUltra Dynamic Skyの事でしょう。

これって有料なんだよな。

あれ、似た名前でCode Like Me氏が作成した

ってのもあります。

どっちがみんなが使用しているやつなの。

星の数からして最初のやつでしょうね。

でも私は雲についてはかなり勉強したので自分で全部作成するのも有りかもしれません。

Tutorialの話に戻りますが、

Olli Huttunen氏、360度Cameraを使用してもう一回駐車場を撮影しています。

Exposureは固定しているのは分かりますが、Auto WBはどんな機能なんでしょうか?

成程。

こういうのが邪魔になるのか。

<Insta360 Studio>

ここは360度Cameraで撮影した映像をInsta360 Studioを使用して編集しています。

ここはまとめる必要ないかなと思ったら結構重要な情報を言っていました。

まずImageは4x3のAspect Ratioに変更しています。

携帯で撮影したような縦長のImageよりこの正方形のImageの方がよい3D Modelを生成するみたいです。

更に、FIS Eye Distortionを消すそうです。

これは以下に示した様に

Prospectiveな線がこの段階の映像で真っすぐになっている事だそうです。

これってどういう設定で撮影すればいいの?

これ以外も色々な設定をしていますが、それはPostshotの設定に関する事なのでここではSkipします。

結果です。

あれ。

まるで写真。

Hazeがまったくない。

<Increasing Iteration>

Iterationの回数を3万回にしていましたが、増やせば増やすほど少しずつですがHazeな部分が消えるそうです。

最終的には30万回まで試したそうです。

ふええ。

こんなのこれ専用のPCが必要になりますね。

10時間かかったそうです。

結果です。

凄い。

しかしこれ力技ですね。

比較した画像がありました。

<Conclusion>

結論としては30万回のIterationはやりすぎだそうです。

それよりもFrameの数を減らしてIterationの数を減らした方が良いと言っていました。

Frameってのは以下のImagesの事だと思います。

<Game Level Experiment>

最後は前回の動画からGameを作成した話が紹介されていました。

もうGameは良いです。

ここはSkipします。

以上でした。

2.2 Olli Huttunen氏のMy observations on Gaussian Splatting and 3D scanning [1]を勉強した感想

Postshotに限ってですが、撮影方法を変更する事で3D Gaussian Splattingの質を劇的に向上出来る事は判明しました。

以下の要素が重要のようです。

  • 撮影した動画の量(多い方が良い)
  • Exposureは固定
  • Auto White BalanceはOff
  • Aspect Ratioは4x3
  • Fish Eye Distortionを無くす

これらを有効にする設定については後で調べる事にします。

Postshotについても調査する事にします。ただしPostshotで生成したGaussian SplattingはUE5では使用出来ないので、こっちを深堀しても金は出てこないと思います。

それよりも今あるGaussian Splattingを使用してUE5内で優れたVFXを作成する方向を頑張っる方が良いはずです。

のでPostshotについては簡単な調査だけする事にします。

後はOverhead4Dについてです。

この会社のYouTube Channelは今見てみます。

2.3 Overhead4Dについての調査

これですね。

Castle Holic VR Sunrise [10]と言う名前でした。

見てみます。

空に関してはUEの典型的な空です。

別にUltra Dynamic Skyを買わなくてもこれなら生成する事は可能です。

城の脇を流れる川ですが、

これはどうやって作成したのか全く分かりません。

Decalで作成したにしては波が大きいです。

城の部分です。

この部分だけPhotogrammetryで作成したんでしょうか?

この手前の木のボケ方が絶妙すぎます。

以下の箇所が僅かに歪んでいます。

この辺は3D Gaussian splattingで作成したんでしょうね。

しかし全体を見ると凄い。の一言です。

こんな凄い動画を作成しても500回しか再生されてないの?

ひょっとしてこの動画しかUploadしてないの?

5年位前から動画が上がっていました。

どれも質は凄いです。

うーん。

やっぱりYouTubeの動画は時流に乗らないとこんなものか。

この動画を目標にしてこれからUEのLevel Designをやっていきますか。

3. AIの勉強

Jeremy Howard氏の Practical Deep Learning for Coders: Lesson 1 [2]の宿題の続きをやります。

週は最後まで読み切ります。

その後でGoogleのColabでfast.aiが使用出来るか調べます。

更にJupyterについて調査し、

Kaggle、JupyterそしてColabのどれを使用するのかを決定します。

3.1 GoogleのColabでFast.aiが使用出来るか調べる

Copilot先生に聞いてみます。

やり方まで解説してくれています。

Fast.ai Colab Notebookを開きました。

色々説明書いてありますがよく分かりません。

5個のセルが非表示と書かれている箇所を表示させようとしましたが出来ません。

まあ良いです。

まずはColabを使えるようにします。

2024-05-26のblogにColabの使用方法を説明したTutorialが紹介されていました。

Codemy.com氏のIntro To Deep Learning With PyTorch - Deep Learning with Pytorch 1[12]です。

それを見ます。

まずGoogle Colabを開きます。

以下の画面が表示されました。

Tutorialでは新しいNotebookを作成していました。

ので作成します。

出来ました。

名前を以下のように変更しました。

ここで2 +2を打ち込んでいます。

Tutorialでは以下の結果になっていますが、

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

何これ?

Enterを押しても実行してくれません。

左端の三角を押したら計算してくれました。

TutorialではすぐにPytouchをImportしていますが、

もう少し使い方を理解するまで止めておきます。

後、結構遅いです。

Tutorialによると有料版に変更したら早くなるそうです。

うーん。

まあいいです。

今週は一寸、このColabで遊んでみます。

Shift+Enterで実行するそうです。

やってみます。

お、少しはましな結果に。

うん。

普通に動きました。

これは問題ないですわ。

イキナリPCの画面が真っ暗になってAudioの設定が変更しましたって出て来ました。

ナニコレ怖い。

うーん。

もしかしてPCの掃除とかしてないからホコリが溜まってShortとか起きかけているのとか?

とりあえずPytouchだけは使用出来るようにしました。

Fast.aiはどうやったら良いでしょうか

Build state-of-the-art image classifier | fastai | google colab | pytorch [13]の5:02辺りを見たら

Fast.aiは既にPre-installしてあるって言っています。

ただし古いVersionなのでUpdateする必要があるそうです。

それがlpip install fastai --upgrade --quiet

だそうです。

本当かどうかCopilotに聞いてみました。

LpipじゃなくてPipって書いてますね。

最後のQuietは書かなくても良いみたいです。

どうもLじゃなくて!のようです。

以下のCommandを打ってみました。

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

あ、そうだ。

Runtimeの設定をGPUに変更します。

しました。

更に以下のCodeを追加しました。

これで設定は完成したみたいです。

本来ならテストして試すんですが、そのTest用のCodeすら分からないのでここまでとします。

来週、実際のLecture1で勉強したCodeを打ち込んでみます。

3.2 教科書の続きを読む

<What Our Image Recognizer Learned>

ここまで勉強した結果、Deep Learningで生成したModelの中身がどうなっているのかは全くの不明です。

ここではその中身を確認する方法について勉強しているようです。

Neural NetworkのWeightのそれぞれのLayerの可視化です。

可視化されたLayer1のWeightです。

いや可視化されても何が何だか分からないですよ。これじゃ

説明がありました。

まず左上に一個だけ別に表示されているGray調のImageはReconstructされたWeightだそうです。

そのImageの下に表示されている沢山のImageはそれぞれのWeightに最もMatchするImageだそうです。

ふーん。

でもこれ見ても何も分からないですよ。

この中からこのImageおかしいんじゃね。なんて分からないですよね。

はい。

教科書にその部分の説明が書いてありました。

以下にその部分をまとめます。

このLayer1の可視化されたWeightを見ると、ある共通点がある事に気づきます。

それは対角、水平、もしくは垂直方向のEdgeが存在する事です。

ふーん。

言われてみればそうです。

でも

これはないじゃん。

という事はこのWeightの値はまだ改善の余地があるって事?

うーん。

教科書はその後すぐにLayer2の解説に入ってこのImageについては何の説明もなかったです。

Layerが高くなっていくにつれて最もMatchしたImageがもっと高次元のConceptに変っています。

Layer1ではEdgeという極めて低次元のConceptでしたが、Layer4や5では犬とか車のタイヤのような高次元のConceptに変っています。

<Image Recognizers Can Tackle Non-Image Tasks>

Image RecognizerはImageの分析以外にも使用する事が出来ます。

以下の例ではSoundをSpectrumに変更してImage Recognizerを利用して音の分析をしています。

このImageでは無い物をImage化してImage Recognizerを使用して分析する方法は、Image化の手法が分析の性能に直結するそうです。

ある生徒は30のDataしか学習させなかったにも関わらず、Image化の手法が独特であったため、その分析の精度が最新の研究成果と比較してもほとんど遜色ない精度だったそうです。

凄い。

ここは注目すべき所です。

<Jargon Recap>

ここでは今まで出て来たDeep Learningに関しての専門用語の定義をまとめ直しています。

今までずっとなやんでいたFine Tuneの定義も載っていました。

こういう意味だったの。

これだと先週のBlogでCopilot先生の回答の意味が理解出来ます。

他の定義も良くまとまっています。

必要に応じて参照する事にします。

一応、以下にScreenshotを貼っておきます。

この後に、これらの定義を説明しながら今まで勉強した内容を簡単にまとめています。

結構、理解してない所がありました。

例えば、Image RecognizeはDeep Learningの一つの手法である。って説明していましたが、Image RecognizeがDeep Learningそのものだと思っていました。

Deep Learning Is Not Just for Image Classification>

ここでSegmentationについての説明がやっと出て来ました。

ここはSegmentationの説明に終始していました。

<clean>

"CUDA out of memory error"について説明しています。

もしこのErrorが表示されたらmenu Kernel,をClickしてRe-Startしろって書いてありました。

それでもダメな場合はBitch Sizeを32から16に下げろ。って書いてありました。

Sidebar: The Order Matters>

Jupyter notebookではExcelとは違いCellの順番は結果に影響します。

色々具体的なCodeで説明していましたが、これは実際に使用しないと実感が湧かないです。

そう言えばGoogleのColabはJupyter notebookをネットで流しているだけだそうです。

<End sidebar

End Sidebarってどんな意味。て結構悩みました。

これって前のThe Order Mattersの話はもう終わりです。って意味でした。

はあ。

となるとこの部分の話はCleanの続きって事になりますね。

その関数の機能が分からない時は以下のように打ち込むと

Windowが開き以下に示した内容が表示されるそうです。

うん。

これ先程のGoogle Colabでfast.aiが本当に使用出来るようになったのかの確認に丁度いいです。

お、表にあるDataからModelを生成する方法についての解説がありました。

Tabularという用語についての解説がありました。

この教科書って本当に高校生でも理解出来るように書かれていますね。

ここまで親切に説明している教科書は見た事ないです。

TabularにはFine tuneを使用しない理由がもう少し詳しく解説されていました。

そもそもTabularを扱うPre-TrainされたModelが無いそうです。

Pre-TrainされたModelが無いならFine Tuneする意味も無いですね。

Sidebar: Datasets: Food for Models>

以下のDataが有名だそうです。

MNIST, CIFAR-10, そして ImageNet.

どれも聞いたことがありません。

これからDeep Learningを勉強していったら馴染みの名前になるんでしょうか?

<Validation Sets and Test Sets>

Training用のDataと検査用のDataの説明です。

特に重要と思われる事は無かったです。

まあ実際にTestの設定をしたこと無いので実感が湧かないだけかもしれませんが。

<Use Judgment in Defining Test Sets>

検査用のDataをData全体からRandomに採取するのは最善ではない場合があります。

以下のように時系列で売上を示すDataがあったとします。

検査用のDataをRandomに取ると以下のようになります。

これだとこのGraphの大まかな特徴である曜日ごとの売り上げのバラつきに対応していません。

ので以下のようにDataを採取します。

これなら検査用のDataが曜日毎に対応しています。

うーん。

こういうのって統計学のセンスを問われていますね。

でそういうセンスのない私はこれが正しいのかどうかよく分からないんです。

最初のRandomにData取った方が、正直な結果が出るような気がします。

2番目の例の方が分かり易かったです。

どうしても学習に使用するDataには偏りが生じてしまいます。

教科書の例では運転中に食事、運転中に電話、運転中にText、運転中にジュースを飲む、などのDataがありましたが、このDataでは全部同じDriverが登場していました。

実際には色々な人が運転します。

しかしAIは同じ人でしかこれらの行動を学習していません。

この差が問題になる場合が多々あるそうです。

<A Choose Your Own Adventure moment>

特になし

<Questionnaire>

何と問題がついていました。

これは来週やります。

一応、最後まで読み切りました。

3.3 Deep Learning for Coders with Fastai and PyTorch」の第一章、Introを読んだ感想

思ったより10倍位良かったです。

まず内容が容易で誰が読んでも理解出来るように細部に渡って丁寧に説明されています。

次にLectureで説明されなかったが重要な情報が結構ありました。

特に画像以外のDataの可視化の方法に関しての説明は、BusinessとしてAIで成功したい人には重要な内容だったと思います。

更に言うと、全体像の把握にも役に立ちました。

Machine learningとDeep LearningとさらにImage Recognitionの関係はこの部分を読んでやっと理解しました。

Internetの発達は、最新かつ正確な情報の伝達と言う意味での本の価値を劇的に下げました。

しかしこの本に書かれた内容は、Internetの情報と比較しても優位なものが多々ありました。

こういう専門書を読むのは結構大変ですが、これからもコツコツ読む事にします。

3.4 Practical Deep Learning for Coders [14]と言うSiteがありました

これ見たらもっと理解が深まりますね。

これも参考にする事にします。

4. Substance Designerの勉強について

これについてすっかり忘れていました。

4.1 Adobeに関する問題

日本ではほとんど広がっていませんが、今英語圏では利用者からAdobeに対する強烈な批判が広がっています。

しかしこれ、結果がどうなるのか不明なんです。

アメリカでは一部の会社や個人が強大な力を持って一見、非合法な事でも合法になってしまっています。

Adobeがどれくらいの力を持っているかは未知数ですが、結果的にはこれらの批判は力業で潰されてしまうかもしれません。

これに関して簡単に以下にまとめます。

まずAdobeがSubscribeを利用している消費者に対して、Adobe製品を使用して作成した作品は全部生成AIの学習用に利用します。と発表します。

これに対してものすごい反発が起きます。

でネットで炎上するかと思ったら、流石古豪のAdobe、ネット対策は完璧だったらしく小炎上で終わってしまいました。

その後、多数のAdobe利用者がSubscriptionをCancelしますが、なんとCancelするとCancel料がかかる事が判明。

ドイツやCalifornia州ではOnlineで何かを購入する時は、それをCancelする時も同じ同じ手軽さで出来るようにしないといけない法律があります。

つまり、One Clickで購入出来たら、One ClickでCancel出来るようにしないといけません。

Adobeの契約は100%これに反しています。

でまたプチ炎上しています。

まあ、この辺の経過を見てると、Adobe製品は使用しない方が良いですね。少なくともこの4~5年の間は。

4.2 Substance Designerの勉強について

Substance Designerを使用する事は永遠にないでしょうが、このTutorialの勉強は役に立つでしょう。勉強はしたいです。

がもう勉強する科目が多すぎます。

どうしよう。

5. Materialの勉強

5.1 Unreal Engine Materials in 6 Levels of Complexity [11]を応用して自分用のMaterialを作成する

Mega ScanでDownloadしたMaterialに使用出来るような設計にします。

こっちがPwnisher氏のBase Materialです。

こっちがMega ScanのSurfaceで使用されているBase Materialです。

そのMaterialの実装です。

これは今までDownloadした全てのSurfaceで共通の結果でした。

という事はこのM_MS_Surface_Materialの実装を向上させればそれだけで凄いMaterialを作成出来るって事になります。

これをやって行きます。

Project、Test5_3のPwnisherTutorialのMaterial内に新しいFolder、MyImprovedMaterialを作成しました。

あくまでPwnisher氏のTutorialを勉強する一貫として作成します。

M_MS_Surface_MaterialをCopyしました。名前はM_MS_Surface_Material_Meとしました。

まずは実装から見ていきます。

使用しているTextureは4つです。

ここで注目すべきTextureは以下のARDです。

RにAmbient Occlusion、GにRoughness、そしてBにDisplacementのTextureが入っています。

ただしこの実装ではBは使用していません。

Pwnisher氏のTutorialの方です。

Ambient Occlusionに使用するTextureはなくてその代りにSpecularにTextureを使用しています。

残りのTextureは一緒です。

次はTiling用のMaterial Functionです。

Pwnisher氏のMaterial Functionです。

同じような機能かと思ったら結構違ってそうです。

実装を見てみます。

まずはMF_Tilingから見ます。

うん。一緒か?

こっちはPwnisher氏の実装です。

一緒のようです。

以下のMaterialでTestしてみます。

Rotation Angleを変更してみます。

結果です。

見事に回転しています。

今度はTiling/Offsetの値を変更してみます。

色で管理されているので分かりにくいですが

RとGがTextureのSize、BとAがTextureのOffsetを管理しています。

以下のようにRGの値を2倍にしてみました。

結果です。

TextureのSizeが半分になっています。

Pwnisher氏の機能と全く同じです。

ただこっちは色で管理しているので分かりにくいです。

特に色で1以上の値を代入する事は稀ですので。

次はAlbedoのParameterです。

Tintは色を追加しているのは分かります。

Controlsは何を管理しているのでしょうか?

こっちのMaterial Functionにその答えがあります。

中を見てみます。

うわ。

結構複雑です。

Albedoの所から見ていきます。

以下の実装部分がAlbedoのParameterを管理しています。

Albedo Controlsありました。

Saturation、Brightness、そしてContrastが全部あります。

以下の場所にはParameterの名前がしっかり表示されていました。

Saturationから試してみます。

Saturationの値を下げたら

灰色になりました。

Brightnessも試してみます。

0にしました。

模様が見えなくなりました。

5にしました。

今度は白くなりました。

その状態で、Contrastの値を15まで上げてみました。

出来てますね。

Pwnisher氏のMaterialの機能は、Mega ScanのMaterialには最初から備わっていそうです。

Base Colorに関して言うとPwnisher氏のMaterialにあってMega ScanのMaterialにないのは

Enable Base Colorだけです。

正直、要らんでしょうこの機能は。

Mega ScanにあるParameterで以下のSSSが何をしているのか不明です。

これを調べます。

MF_MapAdjustmentsの中に以下のMF_Transmissionと言う名前のMaterial Functionがあり

その中で

などのParameterがありました。

なんとこのParameterはOpacityとSubsurface Colorの値を決定していました。

これは来週以降、調査するようにします。

今週のPwnisher氏のTutorialの勉強はここまでとします。

後、Ben Cloward先生のTutorialを見ましたが、数年前と同じ内容をやっている気がします。

のでしばらくやらない事にします。

6. Nvidia Omniverseの勉強

うーん。

これもやる必要があるのか。

仕方ないやります。

2024-06-17のBlogを見ると「Getting Started in NVIDIA Omniverse」で勉強するのが良さそう。と書いていました。

6.1 Setting Up A Project in NVIDIA Omniverse Create Part 1: Getting Started [15]を勉強する

これでOmniverseのSetupのやり方を勉強しましょう。

いきなりOmniverse Launcherを開いています。

これってどこでInstall出来るでしょうか?

Libraryの説明をしています。

Appに既にCreateやMarbles RTXとか入っています

更にFile ManagementにはCacheやDriveが入っています。

Exchange Tabに移動しAppsを選択すると以下の画面が表示されます。

ここからCreateなどのAppをDownloadする事が出来るそうです。

NucleusではNvidiaが用意しているServerを利用出来るような設定に変更出来るそうです。

このTutorialではこの部分は簡単にしか説明してなかったです。

本当のやり方を知りたい場合は他のTutorialも調べる必要がありますね。

一応、このTutorialにおけるこの部分の紹介は以下にまとめておきます。

Localhostを押します。

押してなかったかもしれません。

よく分かりません。

次にLibraryのDriveを選択します。

Launchを押します。

以下のBoxが表示されます。

Localhostの番号を入力します。

そしてSign Inを押します。

すると以下のBoxが代わりに表示されます。

OKを押します。

この部分はUE5とOmniverseを接続する時にも使用するそうです。

LibraryのCreateに移動してLaunchを押します。

以下のEditorが開きました。

これがOmniverseだと思っていたんですが、これはOmniverse Createなのかもしれませんね。

以下のCreateからMeshを選択してPlaneを配置しました。

結果です。

移動、回転、拡大縮小のやり方について解説していました。

こういうのは実際に使用しないと覚えないので具体的なやり方はここにはまとめません。

次に

以下のTool barからSnappingの機能について解説していました。

Snappingって何の事だと思ったら指定した値の幅で移動したり回転したりする機能の事でした。

更にCubeも追加しています。

以下の場所からAssetにAccessしました。

これってこの人が勝手に持っているAssetですよね。

別にOmniverse Createに付属のAssetって訳ではないですよね。

ここでUSD Fileについて初めて紹介しています。

以下のSlot MachineのAssetを配置しました。

FBXからUSDに変換するには

以下のようにFileを右ClickしてBoxを表示させ

「Convert to USD」を押すだけです。

もしくはFileをDouble Clickして以下のBoxを表示させ

USDへの変換の設定を細かく指定して変換する事も出来ます。

Import OptionにあるImport As Simple USDについての解説です。

FBXで以下のように沢山のMeshで構成されているAssetの場合、

これらのMeshをGroup化して一個のUSDにします。

Merge Static MeshesというOptionもあります。

こっちは文字通り全てのMeshを結合して一個のMeshにするそうです。

Saveする場所ですが先程のSeverとの接続が出来てると

以下のように

OmniverseのLocalhost内にSaveする事も可能だそうです。

でもこれってLocalhostになってますよね。

本当にOmniverseのServerに繋がってるんでしょうか?

FBXからUSDに変換したAssetを開くと

以下のようにMaterialが単なる白になっています。

まずMaterialを生成します。

Materialを生成するUSDを選択した状態で

CreateからMaterial、そしてOmniPBRを選択します。

以下のようにStageにOmniPBRが生成されます。

うわ、これは分かりにくいです。

このMaterialってこのAsset専用なんでしょうか?

その辺も気になります。

Propertyは以下のようになっていました。

Albedo MapにBase Color用のTextureをDrag & Dropします。

このPropertyでTextureの設定を行うのか。

これは結構大変そうです。

以下の設定を見ると

一応、Photo-RealisticなRenderingに必要なParameterは設定されているみたいです。

TextureをAlbedo Mapにセットした結果です。

何も起きていません。

これは先程のAssetを選択して

このAssetのPropertyの

Strengthが

Weaker than Descendantsにセットされています。

このせいです。

この意味はこのAssetのDescendantsにセットされているMaterialの方がこのAssetにセットされているMaterialより優先される。という意味だそうです。

はい。

Strengthの設定をStronger Than Descendantsに変更します。

これでこのAssetにセットされているMaterialの方が、このAssetのDescendantsにセットされているMaterialより優先されるようになりました。

ORM MapにもTextureを追加しました。

Ambient Occlusion、Roughness、そしてMetallicは一つのTextureとしてまとめるのに納得いきます。

しかし何でMega ScanはAmbient Occlusion、Roughness、そしてDisplacementでまとめるようにしたんでしょうか?

この部分はOmniverseの方が正しいですね。

Map Color Spaceで色の設定を指定しています。

UEではMaterial Editorで独立して指定している内容を、Omniverse Createでは全部ここで指定しているのか。

これはかなりきつそうです。

最後にORM TextureをEnableします。

Roughnessの以下の値について解説していました。

AmountはTextureの値を使用しない場合のRoughnessの設定です。

Map InfluenceはTextureの値をどれだけ考慮するかを指定します。0ならAmountの値を100%、Textureの値を0%にします。

この後、Normalの設定も同様に行います。

最後にTextureの位置を正しく設定します。

Albedo Mapに戻って

以下のように書き直します。

ここは何をやっているのか不明ですね。

結果です。

全部のTextureも同様に直しました。

ーん。

そんなに綺麗じゃないですね。

以上でした。

6.2 Setting Up A Project in NVIDIA Omniverse Create Part 1: Getting Started [15]を勉強した感想

まず量が普通にあります。

何かの間にやるのは無理があります。

この勉強は一週間の内で月曜日以外の空いている時間にやる事にします。

どうしても時間が取れなかった時は日曜日にやる事にします。

勉強して分かったのはこれはOmniverse CreateのTutorialという事です。

RobotのSimulationとは関係ないかもしれません。

そこだけ今、確認します。

よく分かりませんが、Omniverse LauncherさえInstallしたらIsaac Simだけで出来そうです。

来週、Omniverse LauncherをInstallして確認します。

7. Gaeaの勉強

Tutorial用のPowerPointを作成しそれを元に録画をしました。

今週はBlogの長さが通常より大分長くなっているので、具体的な内容はここには書きません。

YouTubeの動画を見れば何をやったかは確認出来ますし。

8. UE5.4の新しい機能について

Official Android Support for Unreal Engine Virtual Camera [3]を実装します。

更に公式のSequencer Editor [4]とSequencer EditorCine Camera Actor [5]の勉強も行います

8.1 Official Android Support for Unreal Engine Virtual Camera [3]を実装する

やっとこのTutorialを勉強出来る時間が取れました。

2024-04-28のBlogにこのTutorialのまとめがあります。

これを参考にやっていきます。

<What up what up>

特になしです。

<Setting Up VCam App>

Unreal VCamを携帯にInstallします。

しました。

開くと以下の画面が表示されました。

まだUnreal Engineの方の設定はしていないので、この結果で良いはずです。

今度はUE5.4を開きます。

TutorialではFilm/Video & Live EventsからBlankを選んでいました。

今使用している5.4のProjectはどのTemplateで作成したのか覚えていません。

新しいProjectを作成して同じTemplateを選択する事にします。

Project名はStudyWINBUSHとでもします。

このProjectに追加するEnvironmentを探します。

どうせならPhoto-Realisticなのが良いです。

これなんかよさげです。

これを追加します。

Overviewを開きました。

かなりRealです。

近づくと以下のような地面が表示されました。

地面がテカっています。

実際の地面でこんなSpecular Lightの挙動を示す物体は雨などで濡れた岩だけです。

土のMaterialでは無いですね。

まあ良いです。

Pluginを開いて以下のPluginを追加します。

既に追加されていました。

Project Settingを開きます。

以下に示したPlugin - UDP Messagingを選択します。

ここでの値を指定します。

3つありますが、どれを選択したら良いんでしょうか?

一つは0.0.0.0:0です。

これってそのまま使用出来たのか覚えていません。

同じPC内でTCP使って繋がるかどうかを調べてるときによくこのPort Number使っていました。

Copilot先生に聞いてみます。

うーん。

とりあえず0.0.0.0:0以外の番号を選んでおきます。

<Finding you IP Address>

ここに書きこむ番号について詳しい解説がありました。

やっぱりIV Addressを書き込む必要があるみたいです。

打ち込む番号が不明な場合は以下のCommandで調べられるそうです。

こんなコメントが書かれていました。

今やってみます。

確かに全部違う値が出て来ました。IPv4のIP Addressと同じ値が、Plugin - UDP Messagingで表示された3つの値の一つと一致しています。

これを選択する事にします。

<VCam Camera>

UEの編集画面に戻ってVCam Actorを追加します。

以下の画面が表示されました。

<Connect to your Android Device>

ここでAndroidとUEを繋ぎます。

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

駄目だった時はこの辺の調査をする事にします。

この状態で携帯のAppを開くと以下のように接続できるUEが表示されると書かれていました。

Appを開きます。

この画面のままでした。

うーん。

Routerの問題か

調べました。

これは理解しています。

Wifiと同じって事?

それも聞いてみます。

Wifiは規格でRouterは実際の装置って事か。

まあ納得しました。

公式FourmのUE 5.4, Vcam on adroid can’t connect to my pc ip address [16]に全く同じ結果になっている人がいました。

これを読んでみます。

最後まで読みましたが、繋がったというCommentは無かったです。

という事は今の時点ではまだこの機能は使えない。まあ公平に言って使えない機種がある。って事だと思います。

はい。

という事でここで中止します。

8.2 Official Android Support for Unreal Engine Virtual Camera [3]を実装した感想

よくよく考えたらIP Addressを介して別のPC同士をInternetを使用してDataのやり取りをする方法は、普段のInternetの回線で普通にやっています。

これが出来ないのはAppに問題があると考えるべきです。

更に言うと、Dragonと自転車の撮影を通じて、

このCameraで撮影しないとRealな映像が取れない訳では無いという事も判明したので、

このTutorialを勉強する優先順位もそんなには高くなくなりました。

のでこれで一端中止します。

誰かがこの問題を解決した後で、もう一回試す事にします。

8.3 Sequencer Editor [4]を勉強する

またTimelineの操作を勉強します。

右ClickしたままTimelineに沿ってDragすると、水平方向と垂直方向にPanすることが出来る。と書いてありました。

これ試してみます。

出来ました。

次はScrollです。Timelineを上下にPanすると書いてありました。

しました。

Shiftを押しながらScrollです。Timelineを左右にPanするそうです。

しました。

これは結構楽です。使うようにします。

CTRLを押しながらScrollすると、TimelineをZoomするそうです。

これが

こうなりました。

うーん。

これがZoomなのか。

左右にしか縮小してないじゃん。

ALT + Shiftを押した状態で右ClickしてMouseを動しても同じ結果になるみたいです。

こっちは非常にやりにくいです。

CTRLを押した状態でTime Barを右にDragするとZoomする場所を指定出来るそうです。

やってみます。

簡単に出来ました。

CTRLを押した状態でTime Barを左にDragすると、元に戻るそうです。

これも簡単に出来ました。

これは使えそうです。

こういう操作は一遍に勉強すると全部忘れてしまいます。

今週はこの位にしておきます。

8.4 Sequencer EditorCine Camera Actor [5]を勉強する

今週はどれを勉強しようかな。

Focus Settingsの欄のCurrent Apertureの説明です。

という事はFStopの値はここで管理されているって事ですか。

だから先週の結果は何も変わらなかったのか。

これは確認します。

後、Focal Lengthについて前に調べた記憶があります。

結構、重要な内容だったはずです。

調べて復習します。

ありました。

2023-09-11のBlogにまとめられていました。

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

つまりFocal LengthはZoom + Orthogonalに近づくProjectionの効果があるわけです。

これで指定していました。

後、Lens Settingsに以下の設定がありました。

うーん。

これはApertureの設定と同じです。

以下の設定で

Current Apertureの値を変更してみます。

2.8の時です。

4.0に変更しました。

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

他のLandscapeでも試してみます。

Current Apertureが1.2になっていました。

2に変更してみます。

ああ、暗くなりました。

全然違います。

おお、

これは先週のBlogでまとめてた

この部分の変化が表れています。

やっとApertureの機能が一寸理解出来ました。

9. Nvidia Omniverseの勉強 Part2

Official Android Support for Unreal Engine Virtual Camera [3]の勉強が途中で中止となったため、時間が空きました。

代わりにOmniverseの勉強の続きをやる事にします。

まず色々動画を見て判明したんですが、やっぱりOmniverse Isaac SimをやるのにOmniverse Createを勉強する必要は無いみたいです。

しかしOmniverse自体の構造を理解するためにはUE5と極めて構造が似ているCreateを通して理解するのが一番の早道な気もします。

そしてOmniverse自体のInstallにはHow to Setup Nvidia Omniverse [17]が一番分かり易く説明しているみたいです。

のでこれを勉強します。

9.1 How to Setup Nvidia Omniverse [17]を勉強する

以下のTutorialを勉強します。

Omniverseがどんなものかについて簡単に説明しています。

こんな意味だと解釈しました。

世の中にはいろんなSoftwareがあります。例えばUnityとUE5です。

Unityで作ったものはUnityでしか動きません、UE5で動かす事は出来ないです。逆もまたしかりです。

しかしOmniverseではUnityで作ったものをOmniverseで動かす事が出来ます。そしてUE5で作ったものもOmniverseで動かす事が出来ます。

Omniverseを通してUnityで作ったものとUE5で作ったものを同時に動かす事が可能になります。

でその説明そのものは理解出来たんですが、現実的にそんな事が可能なんでしょうか?

いやUnityとUE5は可能でしょう。

どっちも有名なSoftですから、でも例えば私はDirectX12かなんかで非常に狭い範囲の需要を満たすようなGame Engineを作成したとします。

そういうのでもOmniverseと繋げる事は出来るんでしょうか?

多分、そのためのCodeを書かないと出来ないでしょうね。

つまりOmniverse(有名なソフトだけ)が本当のところでしょうね。

まあ全然弄ってもいないのに文句を言っても始まりません。

続きをみます。

Nucleus>1:31

こっちの説明の方が的を射ている気がします。

要するにAssetを管理するのにPixarがOpen Sourceで開発したUSDを使用しているから今ある全部のSoftwareのDataをOmniverseで表示出来る。

という事です。

でも具体的にどんなDataをUSDで管理するでしょうか。

Static MeshやSkeletal Meshの管理が出来るのは分かりますが、MaterialやLightの性質なんかもUSDで全部管理出来るんでしょうか?

この辺はUSDがどんな仕組みなのかを理解したら理解出来そうです。

Omniverseは以下の要素で構成されているそうです。

Nucleusは核って意味です。

ここがOmniverseの中心って事ですね。

説明ではModelをここで管理するって言っていました。

ConnectはOmniverseと別のSoft、例えばUE5とを繋ぐためのSoftをまとめて管理しているみたいです。

KitはおそらくOmniverse独自のSoftを管理する場所で、SimulationはSimulationに特化したSoft、最後のRTX RendererはRendering専用のSoftをまとめた所でしょう。

CreateはKitかRTX Rendering、Isaac SimはSimulationに管理されていると思われます。

説明聞いたら、Kitは自分で作成したものを保管する場所って言っていました。

いやこれを読むと自分で作成したAppをここでSaveするのか。

ここからOmniverseのDownloadの仕方を説明しています。

でもこれ2年前のTutorialなので今ではかなり違っていると思われます。

それなりに役に立つでしょう。

以下のPageからDownloadを押します。

以下のFileを書き込む必要があるそうです。

うーん。

ずっと前にNvidiaのAccountは作成しました。

が登録した内容全く覚えていません。

これ、前に登録した記録を探さないと駄目かもしれないのか。

Installが完成すると以下のLauncherが開きます。

ここでLibrary PathとData Pathを指定していますね。

ここはD driveを指定しよう。

いやAppDataだからそのままにしておかないといけないのか。

CacheをInstallするか聞いています

これって後からInstallする事も出来るはずです。

以下の画面になりました。

ここでOmniverse Accountを作成する必要があるといっています。

さっきのAccountとは別なの?

Loginすると以下の画面になりました。

Nucleusを選択して

Local Serviceを選択します。

うーん。

これって

さっきのOmniverse Createでやってたのと同じ事のようです。

ここでDataをSaveするためのLocationを選択しています。

これがよく分からん。

何で一々Serverを経由してLocal hostに接続する必要があるんだ。

そのままSaveするのとどう違うんでしょうか?

一緒な気がします。

そしてAdministration Accountを作成する必要があるそうです。

はあ、

Passwordまで決定しないといけないのか。

この辺はどうなっているのかよく分からないです。

この設定が終わるとNucleusがDownloadされるそうです。

うーん。

Nucleusって一種のServerなのかもしれません。

それだとさっきのAdministrationの設定とかそのためのPasswordの設定を別に行うのも納得出来ます。

Installが終わると以下の画面が出て来ます。

ここで先程の設定でLoginする訳か。

成程、

OmniverseのLauncherをDownloadするのにNvidiaのAccount、Omniverse Launcherを開始するのにOmniverseのAccount、そしてOmniverse Nucleusを開始するのにNucleusのAccountが必要になるのか。

今もってこんな複雑な構造になっているか不明ですか、一応3つのAccountを作成する必要があるかもしれない事は理解しました。

Loginしたら以下のような画面になっていました。

Windowの一番下の箇所にDriverをInstallしろって表示されています。

以下のPageに飛ばされていました。

うーん。

一応、Video CardのDriverは最新のやつを入れています。

ここは問題ないでしょう。

以下のIconをClickすると

Brower版が開くそうです。

こんなのが開きました。

またLoginしないといけないのか。

URLが以下のようになっています。

これって外から攻撃される可能性もあるって事。

この辺の仕組みはよく分かりません。

同じ結果が表示されています。

Omniverse Nucleusは一種のServerなのか。

Networkの事はよく分からん。

どんなPortが開いてるかとかどんな情報が外から見えるのかとか、そう言う事を心配しないといけないかな。

Libraryを開いています。

何もありません。

これからここにAppをInstallして行きます。

Exchangeに移動します。

ここで一番最初にInstallするAppはCreateかViewだそうです。

はは。

やっと最初のTutorialと話が繋がって来ました。

その前に以下のOmniverse DriveをInstallするそうです。

うん。

これは前のTutorialでやったような気がします。

一寸見て来ます。

やってなかったです。

これらの設定は既に終わっている前提でTutorialが始まっていました。

このTutorialに戻ります。

DriveをInstallしました。

ここで10:13秒になりました。

一端中止し、残りは来週勉強します。

<Installing the Applications>13:47

<Send to View Settings>16:38

<Show Hide Stage Hierarchy>19:59

<Sky Browser>21:46

<Live Sync>22:05

<Publish this Project>24:36

<Show Publish Options>24:55

10. Houdiniの勉強

Houdini 19 - Wall Tool 14 [6]の勉強を行います。

10.1 Houdini 19 - Wall Tool 14 [6]の勉強をする

以下に示した様な先週の最後の状態から始まっています。

OpenGL Viewportに変更する方法の説明から始まっています。

こんなの必要なのかと思ったんですが、TutorialではOpenGL Viewportに変えるべきとはっきり言っていました。

やり方は

以下のLights and Cameras Tabを選択して

Environment Lightを選択し

Ctrlを押した状態でClickします。

するとEnvironment Lightノードが追加されるそうです。

Environment Mapの右端のIconをClickして

好みのHDRIをセットします。

うん。

このHDRIはHoudiniに付属のAssetなんでしょうか。

それとも自分で探してこないといけないの?

そして以下のIconを押して

High Quality Lighting with ShadowsをEnableします。

結果です。

成程、

ここでOpenGL Viewと言っているのは単なる光の環境の追加って意味でした。

おそらくOpenGLも使ってないでしょう。

なんとここまで説明したら、Environment Lightノードを消してしまいました。

<Curve Input>1:45

Brick Wall Tool_Buildをもっと機能的にします。

まずCurve Inputが出来るようにします。

Top Viewに変更しました。

以下のIconを押して、Create in ContextをEnableします。

そしてCurveを選択します。

結果です。

Curve toolの取説のようなのが左に表示されました。

以下のように適当なCurveを書きました。

更に以下に示した様に、Curveノードが生成されています。

Brick Wall Toolノードを見ると

以下のParameterをInputする事になっています。

この値をCurveで入力出来るようにしたい訳です。

Brick Wall Tool Buildノードの中に入ります。

以下の場所に来ます。

この上にSub-Network Input#1ノードとSub-Network Input#2ノードがあります。

こんなの無かったはずですが、先程のCurveを追加した時に生成されたのでしょうか?

今度はSwitchノードを追加しました。

以下のようにそれぞれのNodeを繋ぎました。

SwitchノードのInputの順番が以下のようになっている事を確認します。

一個上の階層に戻って確認すると

Brick Wall Tool BuildノードのInput1には何も繋がっていません。

これが一つ下のSwitchノードにErrorが表示されている原因です。

その証拠にSwitchノードのSelect Inputの値を1に変更すると

SwitchノードのInput先がLine Widthノードに変更され

Error表示が消えます。

このSwitchが自動で行えるようにするための実装をこれから追加するようです。

Select Inputを選択し、Expressionを選択しEdit Expressionを選択します。

以下のWindowが表示されます。

Inputの内容を見ます。

もし何かがあったらCurveの結果を使用します。

何もない場合はLine Widthノードの結果を使用します。

<Script Expressions>4:37

Tabの+を選択、New Pane Tab Typeを選択、Miscを選択、そしてTextportを選択します。

今までBrickが表示されていた画面が以下のようになりました。

よく見るとTextport Tabが追加され、更に選択されていました。

これはCommand Line Interfaceだそうです。

ここからHoudiniの全てのScript ExpressionにAccessする事が出来るそうです。

<Tech Support>4:53

Exhelpを打ちます。

Opoinputpathと打ちます。

以下の結果が出て来ました。

Opoinputpathは以下の内容を返す事が判明しました。

次にEdit Expressionに以下の実装を追加します。

<String Compare>6:07

今度はTextportでStrcmpについて調べています。

こういうのって知っているとスゲーて周りから思われますが、どうなんでしょう。

LaTex覚えるとスゲーって周りから思われるかもしれないけど、実用性は実際は0でしょう。

同じ感じに思えます。

こういう検索して調べる技術は全部生成AIに取って代わられると思われます。

そっちの方が便利だからです。

以下のCodeを追加しました。

Opinputpath()関数ですが、この設定だとこのNodeの親のNodeの0に繋がっているNodeの値を返すそうです。

Dotが親Nodeと言う意味だそうです。

そしてその値と無(””)を比較します。

つまり親nodeであるBrick Wall Tool BuildのInput0に何もない場合はStrcmp()関数は同じStringであるとみなす訳です。

同じであるとStrcmp()関数が判断した場合は1を返します。

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

これは、Strcmp()関数のReturn Valueが1だった場合は0を、それ以外の場合は1を返すという意味だそうです。

一つ上の階層に移動しました。

更にCodeを書いていたEdit Expressionも閉じてしまいました。

Brick Wall Tool Buildを選択して

Build ModeをEnableします。

この状態でCurveノードの結果をBrick Wall Tool Buildノードの左側のInputに繋ぎます。

一つ下の階層のSwitchノードの結果をCopy To Pointノードに繋ぐ事もします。

以下のOutput_BrickWallOutputノードを可視化します。

結果です。

何と、Brick WallがCurveを描いています。

凄い。

今度はCircleノードを追加しました。

CircleノードのOrientationの値をZX Planeに変更します。

以下のような表示に変化しました。

Uniform Scaleの値を5.35に変更しました。

結果です。

紫色の円盤が大きくなりました。

この設定のCircleノードをCurveノードの代わりにBrick Wall Tool Buildノードに繋ぎました。

結果です。

なんか一個、飛び出してるBrickがあります。

それ以外は綺麗なCircle上のBrick Wallになっていますね。

飛び出しているBrickはCircleノードの設定から

以下のArc Typeの設定をOpen Arcに変更したら

直りました。

<Second Input>11:11

これは次のTutorialで勉強するそうです。

以上でした。

11. UEFNの勉強

先週勉強したExtension Functions? Fortnite UEFN/Creative 2.0 Verse Tutorial [7]を実装します。

11.1 Extension Functions? Fortnite UEFN/Creative 2.0 Verse Tutorial [7]を実装する

今週はExtension Functionの実装を行います。

その前に先週のBlogで

と書いていました。

これについて調べます。

Copilotに質問しました。

Kolinではとの但し書き付きでしたが、あってそうです。

ではやって行きます。

Verseは前回のTutorialで使用したCustom_model_deviceを使用します。

いきなり問題発覚です。

PlayerというConstantをここでは使用していません。

ので以下のようにして初期化しようとしたら

Errorになってしまいました。

困った。

調べるとtop_camera_deviceではplayerを使用していました。

更にTutorialを見直すと以下のようにしてPlayerを初期化していました。

どうもplayer ClassからInstanceを作成するにはIf節が必要のようです。

いきなりIf節を書くわけにもいかないので

関数を一個作成してその中でTestします。

いや、動画を見たらOnBegin()関数内に書いていました。

OnBegin()関数内に実装してみます。

Errorになっています。

以下に示した方法でExtension Functionを追加しました。

結果です。

確かにErrorが消えました。

うん。

出来てますね。

今週は既に通常のBlogよりかなり長くなってしまっているので短いですがこれで終わりにします。

11.2 公式のTutorialを見つけました

公式のSiteにProgramming with Verse [18]という講座がありました。

NPCのBehaviorを作成するVerseのTutorialとかあって

Pi Equals Three氏のTutorialにはない技術が紹介されていました。

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

12. DirectX12の勉強

Lötwig Fusel氏のD3D12 Beginners Tutorial [D3D12Ez]は Creating a Window | D3D12 Beginners Tutorial [D3D12Ez] [8]の最後の10分を勉強します。

12.1  Creating a Window | D3D12 Beginners Tutorial [D3D12Ez] [8]の最後の10分を勉強する

<Updating Window>

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

これで生成したWindowの位置を変えたりSizeを変更したり出来るようになりました。

TutorialでもTestして確認しています。

この後、Windowを閉じますが、VSの実行はそのまま継続しています。

それはWindowを破壊するための実装がされてないのでVSではWindowが表示されなくなっただけで内部では更新され続けているからです。

のでWindowを破壊するための実装を追加します。

Window.cppのShutdown()関数に以下の実装を追加します。

これでWindowを閉じた時にVSで実行しているProgram内でもWindowが破壊されるはずです。

Testしています。

Windowを閉じてもVSの実行はそのまま継続しています。

これは、Windowは閉じたんですが、それをこのVSで実行しているProgramが知る事が出来ないからです。

Windowが閉じた事をこのProgramに教えるようにします。

そのためには、以下の実装を追加します。

ああ、成程。

これは実行しているProgramというよりWindowのOSが知らないと言うべきでした。

MsgのMessageがWM_CLOSEの場合、このProgrammingを終了しろ。

って事ですね。

Testします。

何と、今度はWindowを閉じる事が出来ません。

一生懸命右上のXを押していますが、Windowは閉じません。

何で?

Tutorialの説明がありました。

何と先程の以下の実装は

このEventが起きたら全部自分達でやる内容を決定するのでWin32は何もしないでね。

と言う意味もあるんだそうです。

ふーん。

なんか今週のLötwig Fusel氏のTutorialは非常に勉強になります。

ので、Main.cppにProgrammingの実行を止めるように命令するための実装を追加します。

まずWindow.h fileに以下のBool型の変数を追加します。

更にWindow.cppの以下の場所に以下の実装を追加します。

以下の関数の宣言をWindow.hに追加しました。

この辺はゴリゴリのC++ですね。

Main.cppの以下の場所に以下の実装を追加しました。

はい。

更にWhile Loopの後にWindow::Get()Shutdown()を追加します。

これでWindowを閉じる訳か。

成程。

Testしています。

今度はX Buttonを押したらWindowが閉じました。

更にVSの実行も停止しました。

これで完成です。

一個だけBugを修正するそうです。

それはいつも間違ったMonitorでWindowが開く事だそうです。

うーん。

そうだったのか?

Tutorialを見てる限りではこれはよく分かりません。

よく分かりませんが、説明を聞いてまとめておきます。

どうやってWindowの生成場所を直すのかと言うと、今のMouseの位置を取得してその場所にWindowが生成されるような実装を追加するそうです。

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

まず追加した場所ですが、Window.cpp Fileです。

おそらくinit()関数だと思います。

そしてGetCursorPos()関数を使用してCursorの位置を取得しています。

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

この関数、MonitorFromPoint()、でどっちのMonitorを使用しているのか判明するみたいですね。

さらにHMONITOR型の変数、monitorでこの関数のReturn Valueを取得していました。

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

GetMonitorInfoW()関数を使用しています。

そしてCreateWindowExW()関数の以下のParameterの値を変更しました。

これでCursorのある方のMonitorにWindowを生成するようになったんでしょうか?

Testしています。

なっていました。

ここでTutorialは終わっていました。

うーん。

今週も勉強になりました。

12.2 DirectX 12の魔導書」の勉強

12.2.1「4.11 三角形ポリゴンを四角形にしてみる」の「4.11.2 Indexを利用する」を実装する

先週のBlogには実装すると書いてありますが、

先週したのは勉強でした。

今週実装を行います。

<Indexを使う理由>

特に実装する場所はありません。

<Indexの実装方法>

ここから実装が始まりっています。

まずIndicesを指定します。

次にBufferを作成します。

BufferはCreateCommittedResource()関数を用いて作成します。

ただしParameterの一つであるResdescのWidthは前の場合と値が違うので

以下に示した方法でそこを直します。

更にBufferのAddressを保持するための変数を作成します。

そしてCreateCommittedResource()関数を使用します。

次に作ったBufferにIndexのDataをCopyします。

このMappedIdxが何のAddressを表しているのか分かりません。

先週勉強した時はかなり理解した気になっていたんですが、なんか先週の理屈だとオカシイ箇所があります。

まあ良いです。

最初から全部理解するのは不可能ですから。

<<Index用のBuffer Viewを作成>>

以下の方法で作成しました。

<<Index Bufferのセット命令を設定(描画時)>>

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

<<DrawInstanced()関数をDrawIndexedInstanced()関数に交換する>>

しました。

これで完成です。

IASetPrimitiveTopology()関数のArgumentの値をD3D_PRIMITIVE_TOPOLOGY_TRIANGLELISTに直しておくのを忘れてました。

直しました。

それではTestします。

まずDrawInstanced()関数を使用して

三角形が表示されるか確認します。

されました。

今度はDrawIndexedInstanced()関数を使用して四角形が表示出来るか確認します。

結果です。

出来ました。

一寸、お腹が痛くなってしまったので、深く考える事が出来なくなってしまいました。

今週の「DirectX 12の魔導書」はこれでお終いにします。

4章のまとめは来週やるか、もしくはやらないで5章の勉強をする事にします。

以上です。

13. まとめと感想

なし

14. 参照(Reference)

[1] Olli Huttunen. (2024, March 3). My observations on Gaussian Splatting and 3D scanning [Video]. YouTube. https://www.youtube.com/watch?v=pfCZeJHfjVs

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

[3] WINBUSH. (2024, April 24). Official Android support for Unreal Engine virtual camera [Video]. YouTube. https://www.youtube.com/watch?v=bzFM0HdLYSU

[4] Sequencer Cinematic Editor Unreal Engine | Unreal Engine 5.4 Documentation | Epic Developer Community. (n.d.). Epic Developer Community. https://dev.epicgames.com/documentation/en-us/unreal-engine/sequencer-cinematic-editor-unreal-engine

[5] Cinematic Cameras in Unreal Engine | Unreal Engine 5.4 Documentation | Epic Developer Community. (n.d.). Epic Developer Community. https://dev.epicgames.com/documentation/en-us/unreal-engine/cinematic-cameras-in-unreal-engine?application_version=5.4

[6] Rick Banks. (2022, June 28). Houdini 19 - Wall Tool 14 [Video]. YouTube. https://www.youtube.com/watch?v=VXu44VS91s8

[7] Pi Equals Three. (2023, June 15). Extension Functions ? Fortnite UEFN / Creative 2.0 verse tutorial [Video]. YouTube. https://www.youtube.com/watch?v=Crenr9EClZw

[8] Lötwig Fusel. (2023, June 5). Creating a Window | D3D12 Beginners Tutorial [D3D12EZ] [Video]. YouTube. https://www.youtube.com/watch?v=yBKQLxkcXz4

[9] Olli Huttunen. (2024, February 26). Experience combining a 3D Gaussian Splatting model from Postshot to Unreal Engine. [Video]. YouTube. https://www.youtube.com/watch?v=DXU38EJ_sL4

[10] Overhead4D. (2024, January 13). Castle Holic VR Sunrise [Video]. YouTube. https://www.youtube.com/watch?v=Ne0xCRTsSHY

[11] pwnisher. (2024, May 11). Unreal engine materials in 6 levels of complexity [Video]. YouTube. https://www.youtube.com/watch?v=iZgbzwBQTPY

[12] Codemy.com. (2023, April 24). Intro To Deep Learning With PyTorch - Deep Learning with Pytorch 1 [Video]. YouTube. https://www.youtube.com/watch?v=kY14KfZQ1TI

[13] aiadventures. (2020, November 6). Build state-of-the-art image classifier | fastai | google colab | pytorch [Video]. YouTube. https://www.youtube.com/watch?v=WVICPYTXO20

[14] Practical Deep Learning for Coders - 1: Getting started. (n.d.). Practical Deep Learning for Coders. https://course.fast.ai/Lessons/lesson1.html

[15] NVIDIA Studio. (2022, January 8). Setting up a project in NVIDIA Omniverse Create Part 1: Getting started [Video]. YouTube. https://www.youtube.com/watch?v=j-JPMgcyfvI

[16] UE 5.4, Vcam on adroid can’t connect to my pc ip adress. (2024, May 14). Epic Developer Community Forums. https://forums.unrealengine.com/t/ue-5-4-vcam-on-adroid-cant-connect-to-my-pc-ip-adress/1854901/1

[17] Architecture Vanguard. (2021, September 27). How to setup Nvidia Omniverse [Video]. YouTube. https://www.youtube.com/watch?v=j4_-yush6pc

[18] Programming with Verse. (n.d.). dev.epicgames.com. https://dev.epicgames.com/documentation/en-us/uefn/learn-programming-with-verse-in-unreal-editor-for-fortnite