UE4の勉強記録

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

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

1. 今週の予定

このBlogは結構重要な内容がまとめられているんですが、読み直さないとその重要な内容を発展させる事が出来ない事に気が付きました。

後で検索すると、同じ事を三回位言ってその後何もしてないって事がありました。

ので先週のBlogを読み直しながら今週の予定を決定します。

今週は以下の2つの勉強について検討もします。

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

この後、更に映像を改良して一応音ありの映像が出来ました。

その内容をまとめます。

後、3D Gaussian Splattingで生成したPlyをUEに配置し、そこにStatic Meshを配置した場合、Static Meshの影が映らない問題はあまり重要ではなかったです。

でこれは一応調査はする事にします。

1.2 AIの勉強

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

まず教科書の続きを読みます。

後、Jupyterについて調査します。

Kaggleとどちらを使用すべきかを決定します。

教科書をJupyterで読めるらしいのでその辺はしっかり調べる事にします。

そしてKaggleかJupyterで宿題をやってみます。

1.3 Materialの勉強

先週、Pwnisher氏のUnreal Engine Materials in 6 Levels of Complexity [2]の実装を行いました。

そしてこのまま勉強して終わりにしてしまうと今までと同じになってしまうから、ここからどうやって発展させていくのかを考えました。

これを今週はやります。

Mega ScanでDownloadしたSurfaceのAssetのTextureは全部同じです。

それらに使用されている元のMaterialの実装をPwnisher氏のMaterialの良い部分を追加して改良します。

後はBen Cloward先生の勉強か。

これも一応やる事にします。

1.4 Gaeaの勉強

今週からBuildについてのTutorialを作成します。

今週はBuildについて勉強をします。

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

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

それで本来は先週はOfficial Android Support for Unreal Engine Virtual Camera [3]を実装する予定だったんですが、諸事情によりUnreal Engine 5.4 Plant Growth Effect Tutorial In Under 5 Mins [4]を勉強しました。

今週はどちらかを実装します。

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

1.6 Houdiniの勉強

Houdini 19 - Wall Tool 13[7]の実装を行います。

1.7 UEFNの勉強

Pi Equals Three氏のTutorialを勉強します。

1.8 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を利用する」を勉強します。

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

2.1 先週の更にやった内容

先週開いている時間を利用して音をWav FileとしてExportし、それをDavinci Resolveで映像と合成しました。

更にDavinci ResolveのEffect機能を利用して映像を更に加工しました。

結果です。

youtu.be

これは完成度が高いので公開する事にします。

題は、

Unreal Engine 5 + 3D Gaussian Splatting(Luma AI)_Test1 自転車とドラゴン

とします。

Descriptionには

撮影した映像を元にLuma AIでGaussian Splattingを作成しました。

そのDataをUnreal Engine 5にImportし3D Modelと組み合わせてVFXな映像を作成しました。

ただしこの時点では映像は以下の点がおかしく写っていました。

  • Dragonが背景から浮いて見える
  • 背景の建物が歪んでいる
  • Dragonの影が地面に写らない

更にその映像をDavinci ResolveでEffectを追加するなどの編集をして、それらの欠点が目立たないようにしました。

と記す事にします。

Descriptionの英訳です。

Deep Lで直しました。

Gaussian splatting was created by Luma AI based on the video footage taken by me.

The data of Gaussian splatting was imported into Unreal Engine 5 and combined with a 3D model to create a VFX video.

However, at this point, the following points were not correct in the video.

  • The dragon appears to float out of the background.
  • The buildings in the background are distorted.
  • Dragon's shadow does not appear to be on the ground

We further edited the footage in Davinci Resolve, including adding Effects, to make these flaws less noticeable.

Copilotで文法のCheckをおこないました。

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

Gaussian Splatting was created by Luma AI based on video footage. The data was imported into Unreal Engine 5 and combined with a 3D model to create a VFX video.

However, at this point, the following issues were observed in the video:

  • The dragon appears to float out of the background.
  • The buildings in the background are distorted.
  • The dragon’s shadow does not appear to be on the ground.

We further edited the footage in DaVinci Resolve, including adding effects, to make these flaws less noticeable."

うーん。

Float outって浮いてるって意味でした。これは直訳になってしまっていますね。

Video FootageってVideoの事なのか?

Appear to be on the groundというと地面には現れなかった。と言う意味になって地面以外には影があると受け取られかねない。と思います。

後、自分で撮影した映像を元にGaussian Splattingを作成したという説明が抜けています。

しかしAI凄すぎます。

通訳、翻訳業は完全に廃業になりますね。

更にDeep Lでこの英語を日本語に訳してみました。

ガウス・スプラッティングは、ビデオ映像を基にLuma AIが作成しました。このデータをUnreal Engine 5にインポートし、3Dモデルと組み合わせてVFX映像を作成しました。

しかしこの時点で、映像に以下のような問題が確認されました:

  • ドラゴンが背景から浮いているように見える。
  • 背景の建物が歪んでいる。
  • ドラゴンの影が地面に映っていない。

これらの欠点を目立たなくするため、エフェクトの追加を含め、DaVinci Resolveで映像をさらに編集しました。"

最初の日本語です。

撮影した映像を元にLuma AIでGaussian Splattingを作成しました。

そのDataをUnreal Engine 5にImportし3D Modelと組み合わせてVFXな映像を作成しました。

ただしこの時点では映像は以下の点がおかしく写っていました。

  • Dragonが背景から浮いて見える
  • 背景の建物が歪んでいる
  • Dragonの影が地面に写らない

更にその映像をDavinci ResolveでEffectを追加するなどの編集をして、それらの欠点が目立たないようにしました。

この最初の文章を少し直します。

自分で撮影した映像を元にLuma AIでGaussian Splattingを作成しました。

そのGaussian SplattingをUnreal Engine 5にImportし3D Model(Dragon)と組み合わせてVFXな映像を作成しました。

ただしこの時点では映像は以下の点がおかしく写っていました。

  • Dragonが合成したのがはっきり分かる
  • 背景の建物が歪んでいる
  • Dragonの影が写らない

更にその映像をDavinci ResolveでEffectを追加するなどの編集をして、それらの欠点が目立たないようにしました。

これをもう一回翻訳します。

Deep Lの翻訳です。

 I created Gaussian Splatting with Luma AI based on the footage I shot.

The Gaussian Splatting was imported into Unreal Engine 5 and combined with a 3D model (Dragon) to create a VFX video.

However, at this point, the following points were not correct in the video.

  • It is clearly visible that the Dragon was composited.
  • The buildings in the background are distorted.
  • Dragon's shadow is not captured

I further edited the footage in Davinci Resolve, adding Effects and other edits to make those flaws less noticeable.

これをCopilotで校正します。

The Gaussian Splatting was imported into Unreal Engine 5 and combined with a 3D model (Dragon) to create a VFX video.

However, the following issues were observed:

  • The Dragon appears composited.
  • Background buildings are distorted.
  • The Dragon’s shadow is missing.

I further edited the footage in DaVinci Resolve, minimizing these flaws.

今度は完璧でしょう。

この文章をDeep Lで日本語に訳しました。

ガウス スプラッティングをアンリアル エンジン 5 にインポートし、3D モデル (ドラゴン) と組み合わせて VFX ビデオを作成しました。

しかし、以下の問題が発生しました:

  • ドラゴンが合成されて見える。
  • 背景の建物が歪んでいる。
  • ドラゴンの影が欠けている。

さらにDaVinci Resolveで映像を編集し、これらの欠点を最小限に抑えた。

後は合成されて見えるの訳がCompositedであっているかを調べます。

調べても分からないのでCopilotに質問しました。

2つの別のFilmを合成する事をCompositionと呼ぶそうです。

読み直してみるとCopilotの英文は重要な情報まで削ってしまっています。

Deep Lの訳を一寸だけ加工して載せる事にします。

Gaussian Splatting is created with Luma AI based on the footage I shot.

The Gaussian Splatting was imported into Unreal Engine 5 and combined with a 3D model (Dragon) to create a VFX video.

However, at this point, the following points were not correct in the video.

  • It is clearly visible that the Dragon was composited.
  • The buildings in the background are distorted.
  • Dragon's shadow is not captured

I further edited the footage in Davinci Resolve, adding Effects and other edits to make those flaws less noticeable.

公開しました。

2.2 Luma AIのGaussian Splattingに影を追加する方法を調査する

影が出る方法が判明しました。

Luma AIのDownloadに行くと以下のように

Gaussian SplatとLuma Fieldの2つのDownloadがあります。

Gaussian Splat からDownloadすると以下のPly FileがDownloadされます。

Luma FieldからDownloadすると以下のluma FileがDownloadされます。

このLuma Fileは影を追加する事が出来ます。

正し以下に示した様にLuma FileからUEにImportした3Dは映像がブレます。

youtu.be

ここから調整したらこのブレが直るのかどうか不明です。

今週出来るのはここまでです。

ので来週以降試したい事を以下にまとめておきます。

  • ブレは直るのか
  • ピントを自転車に合わせるには
  • 影を調整する
    • 色を薄くする(Skylight、Directional Lightの調整)
    • 背景の影と一致させる

以上です。

3. AIの勉強

今週は一寸用事が出来てあまり勉強出来なくなってしまったので、出来るだけやる事にします。

3.1 Jeremy Howard氏のTutorialを勉強

3.1.1 教科書の続きを読む

<What Is a Neural Network?>

これの意味がよく分からなかったです。

YouTubeで検索したら沢山、Neural Networkについて説明している動画が出て来ました。

一端読んで、やっぱり意味が分からなかったらこれらの動画を見るようにします。

前回読んでよく意味が分からなかった理由が分かりました。

Checkersと言う言葉が最初に出て来ますが、これは以下のGameを指す言葉でした。

このGameで勝つためのProgrammingの話を最初にしていました。

このGameを知らなかったから意味が分からなかった。

今度は理解出来ました。

まずこのCheckersのようなGameならModelをどのように作成するのかは何となく想像出来ます。

幾つかの戦略をModelに組み込んで、状況によってどの戦略を選択するのかを選択出来るようにします。

しかしImageを認識したり、Textを読み込むためのModelはどうやって組んだらいいんでしょうか?

そのためのModelがNeural Networkです。

そしてそのModelのWeightをよりよくするための調整方法がstochastic gradient descent (SGD)になります。

そんだけでした。

ここではNeural Networkやstochastic gradient descent (SGD)が具体的にどうやっているのかについての説明は全く書いてなかったです。

色々なModelがあり、そのModelの一つがNeural Networkである事は先週の段階で推測していました。

理解したら別に特別重要な話をしているわけではなかったです。

<A Bit of Deep Learning Jargon>

ここはDeep Learningで使用される専門用語の簡単な解説がしてありました。

以下にそれらの専門用語をまとめます。

<<Architecture>>

Modelの事を言う場合と、Modelを関数として表したものを言う場合の2通りがあるそうです。

<<Parameters>>

Weightの事だそうです。

これは説明されなくても分かります。

<<Predictions>>

PredictionsはLabelを使用しない独立した変数を使用して計算されたものを指すそうです。

これの意味はまだ完全には納得出来ないですね。

ここで言うLabelは犬とか猫を指すそうです。

それを使用しないってどういう事何でしょう。

更に、学習が終わったModelの事もPredicitionsと呼ぶそうです。

<<Loss>>

Predictionsがどれだけ正確な解答が返せるのかを測定する事をLossと言うみたいですね。

でもこれ後の説明だと一寸違う使い方をしているみたいな気もします。

<<>>

その後で以下の図が紹介されていました。

これを見るとModelがArchitecture、WeightがParameterになっています。

この部分は名称が変わっただけです。

この後、特定のParameterを持つModelが完成する訳ですが、それをPredictionsと呼んでいます。

それにLabelを追加して結果の成否を検証しています。

この部分がLossですね。

そのLossの結果からParameterを調整しています。

うーん。

まあそれぞれの専門用語の解釈はそれなりにあっているでしょう。

<Limitations Inherent To Machine Learning>

ここではMachine Learningの限界について簡単な説明をしていました。

DataにはImageだけでなくそのImageに正しいLabelがされている事が必要です。

このDataが無いとModelを作成するためのInputをする事が出来ません。

そして正しくLabelされたDataはあまり無いです。

InputされたDataからPatternを抽出するだけです。提供されたDataに偏りがあった場合は直しようがありません。

つまりこの方法では正解を予測する事は出来ても、お勧めの行動を決定する事は出来ません。

だいたいこんな感じでした。

この話の中で特に重要だと私が思うのは「この方法では正解を予測する事は出来ても、お勧めの行動を決定する事は出来ない。」と言う部分です。

この部分は、具体的な例を用いて詳しく説明されていました。

それはネットショッピングのお勧め欄の表示です。

これだいたい既に知っている商品やもしくは前に買ったことのある商品しか出て来ません。

優れた店員だったら、この顧客なら今度販売された新商品も興味があるはずだ。と推測してその新商品をお勧めしますが、Machine learningはそういう新商品が顧客が興味を持つかどうかの判断をする事は出来ない。

とありました。

勿論、それが出来るModelもあるそうですが、基本的にはPredictionしか出来ない。そうです。

うーん。

そう言う意味で「この方法では正解を予測する事は出来ても、お勧めの行動を決定する事は出来ない。」って言ってたの。

私はてっきり、Machine Learningの予測を元に行動を決定しても最適解にならない。って意味だと解釈していました。

何て言うか、こんなImageです。

今日はどんな予定で行動するのがBestかを生成AIに聞く訳です。

「生成AIが今日は休日ですので、午前中は喫茶店に行って読書、午後から公園を散歩したらどうでしょうか。」とお勧めの行動を答えます。

それを聞いてその通りに行動しようかと思ったら、喫茶店から帰ってきたらで眠くなってしまって公園には行かずに寝てしまいました。

夜、Newsを見たら、その公園に雷が落ちて大けがした人も出た。とやっていました。

結果的には公園に行かなくて良かった。

みたいな感じです。

うーん。

でもこの2つって原理的には同じ気もします。

それはInputされたDataが偏っている。つまり全部のDataがInputされてないから起きる偏差を表している気がします。

どうでしょうね。

<How Our Image Recognizer Works>

ここは具体的にImageを識別するための実装の仕方を説明しています。

何でこんな事を今更。と思ったらそれはLectureを見た後だからであって、この教科書だけで勉強している人はここで初めてFast.aiのCodeを勉強する事になる訳です。

まずImageの識別をするために必要なLibraryをImportします。

次に以下のCodeでFast.aiにあるDataをDownloadします。

ここで言うDataとはImageとそれにつけられたLabelを指しているはずです。

次のCodeです。

これはIs_Cat()関数を作成しているようです。

XにはどんなTypeが代入されるのか不明ですが、そのTypeはisupper()というMethodは持っているのは分かります。

教科書にはこの関数の機能を以下のように解説していました。

うーん。

xのClassが分からないと何をしているのかCodeから推測するのは無理ですね。

この説明を信じるしかありません。

次のCodeです。

このCodeはLectureの勉強で散々やりました。

Labelの名前を指定するのに先程のIs_Cat()関数が使用されています。ただしParameterはここでは指定していません。

これはPythonの仕様なのか、それともここでは関数だけ指定すればいいのか、うーんよく分かりません。

何とこの最後のParameterは使用するTransformerを指定していました。

生成AIの動画を見てるとTransformer、Transformerと呪文のように唱えていましたが、一体何の事かと思っていました。

既に一部とは言え勉強していたとは。

ここではTransformerについては以下の説明がありました。

TransformerとはTraining中に適応されるCodeの事だそうです。

ここではItem_tfmsを使用していました。

過去のBlogを確認したらLectureでもItem_tfmsを使用していました。

ClassificationとRegressionの違いについてのTipもありました。

ClassificationはClassつまり犬とか猫とかをPredictするためのModelでRegressionは温度や場所などの数字を予測するためのModelだそうです。

このTipの後に先程のIs_Cat()関数で何をやっていたのかの説明がありました。

まずIs_Cat()関数で使用されているXはFile名でした。Fast.aiではFile名の最初の文字は猫なら大文字、それ以外なら小文字になっています。

Isupper()関数は、そのFile名の最初の文字が大文字かどうかを調べて大文字だったらTrueを返す訳です。

元々File名が大文字になっているのは猫なので猫のFileがTrueを返すようになります。

valid_pct=0.2についても説明していました。

この設定だと20%のDataは学習した結果が正しいかどうかを確認するためだけに使用されるそうです。

そしてOverfitting(たぶん過学習の事)について解説しています。

次の実装です。

お、Learnerが出て来ました。

ここで使用しているResnet34の34は34のLayerを作成する事を示しているそうです。

MetricはPredictionの正確性を示すためのParameterだそうです。

後、隠れParameterとしてPretrainというのがあるそうです。

既に前に学習した内容を使用する事が出来るParameterだそうです。

これって一番おいしい所じゃね。

と思ったら少なくともこの教科書が書かれた時点ではこの分野はほとんど研究されてないそうです。

うーん。残念。

多分、今は違うと思いますが、この教科書でその分野について勉強する事は出来ないって事ははっきりしました。

ただこの分野をTransfer learningという事は分かりました。

次のCodeです。

お、やっとFine Tuneについての説明が来ました。

Parameterを結果からUpdateする工程を指しているみたいです。

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

うーん。

どっちが正しいのか。

Copilot先生に聞いてみます。

これ見ると、今回勉強した教科書の説明があっているようです。

<What Our Image Recognizer Learned>

もう時間が無くなってしまいました。

ここからは来週勉強する事にします。

3.1.2 Jupyterについての調査

これは来週やります。

3.2 Nvidia Omniverseの勉強

これがしたかった。

私の専門は3D Graphicsです。

仮想空間で生成AIを使用したRobotのTrainingを勉強すれば他の生成AIの専門家に差をつける事が出来るはずです。

これについて調べたらNvidiaのOmniverseにNVIDIA Isaac SimというPluginを入れてTrainingしているらしい事が判明しました。

今回はNvidiaのOmniverseのTutorialについて調べます。

YouTubeにあるTutorialだけ調べます。

Nvidia Omniverseと言うChannelがありますね。

更にNvidia StudioのGetting Started in NVIDIA OmniverseというTutorial Seriesがありました。

NVIDIA omniverseにある動画を見てみました。

こっちはOmniverseの最新の機能の紹介が主みたいです。

最新の動画が4カ月前のものですね。

次にGetting Started in NVIDIA Omniverseを見てみます。

こっちもNvidia Studioが制作した動画でした。

その中で初心者向けのモノをひとまとめにしたみたいです。

最初の何本かのTutorialを軽くですが、見ました。

基本的な操作はUE5とほぼ同じです。

UIが違うのと、ProgrammingにPythonを使用するのが違います。

これだけ見た感じではOmniverse単体の仕様方法を覚えるのはそんなに難しくなさそうですね。

次にNvidia Omniverseを使用した仮想空間におけるRobotのTraining方法(NVIDIA Isaac Sim)について調査します。

こっちもYouTube先生に聞く事にしました。

これもNvidia StudioのTutorialがありました。

更に下を見たら

sentdex氏のTutorialがありました。

その次に表示されていた

Skyentific氏のFrom Reality to Simulation with Isaac Sim (+ RTX3080Ti raffle) [9]は軽く全部見たんですが、非常に分かり易かったです。

ただしこのTutorialではRTX3080Tiを使用してSimulationしていました。

Simulationに必要なPCの要求はかなり高そうです。

その次のTutorialもかなり興味深いですね。

これぐらい簡単なModelで大体の全体像を理解したいですね。

4. Materialの勉強

今週はMaterialの勉強をする時間は取れませんでした。

これらは来週やる事にします。

4.1 Pwnisher氏のTutorialの勉強

4.2 Ben Cloward先生のTutorialの勉強

4.3 Substance Designerの勉強について

 5. Gaeaの勉強

5.1 Buildについて今まで勉強した内容をまとめる

兎に角Blogを徹底的に調査してBuildについて述べている箇所をここにまとめます。

2023-11-19のBlog

TerrainのSizeの設定方法について説明しています。

更にPixelに対してのSizeについての解説もここで説明しています。

この辺の内容は忘れていました。

2023-08-06のBlog

ここでは今までのBuildの勉強をまとめていました。

の内容がまとめられていました。

ここでは実際に作成したTerrainの高さを調べる方法や、Height MapはPng、それ以外のMaskはpng8でExportするとかが書かれていました。

それ以外の設定については以下のようになっていました。

それぞれのParameterについてもColor Space以外は詳しく解説されていました。

Color Spaceに関しては公式SiteのBuild Manager [10]に以下の解説がありました。

後、高さを調べる方法でm単位で高さを指定する方法も説明されていました。

全部見なくてももうBuildの設定の大半はこれでまとめられていますね。

後必要なのは、どのNodeをBuildに追加するかです。

5.2 どのNodeをBuildに追加するか

Final Terrainの結果を追加します。

そしてそれぞれのMaskの結果も追加します。

Maskに使用するData GroupのNodeはOutputが複数あるNodeもあります。

その場合は全部のOutputの結果が出力されてしまいます。

それを防ぐには上記の様にFxノードを追加してそれを出力するか、以下のBuildの設定を変更する必要があります。

Maskに使用しているNodeは全部Gray ScaleなのでFxノードを使用すれば良いです。

5.3 Klaus氏のTutorialでExportするNodeの指定方法を確認する

一応、Klaus氏のTutorialで確認します。

How To BUILD AN ISLAND In 20 mins | Unreal Engine 5 Tutorial [11]で確認しました。

あっています。

PngとPng8の違いは

Copilot先生によると

となっています。

Height MapとMaskは両方、Gray ScaleなのでPngとPng8における違いは無い気がします。

5.4 Tutorialの作成する順番

BuildのTutorialの作成する順番についてまとめます。

  • SizeとHeightの設定について解説します。
  • HeightmapとMaskの指定方法について
  • とそれ以外のBuildのParameterについての解説とBuild

の3本で行う事にします。

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

6.1 Unreal Engine 5.4 Plant Growth Effect Tutorial In Under 5 Mins [4]を実装する

今週は時間が無いので簡単なこっちのTutorialを実装する事にします。

まずLevelの作成を行います。

先週のBlogを見るとLevelの作成方法については何の説明も無いと書かれていました。

いつもの設定を追加して空を作成しました。

Mega Scanを利用して使用するAssetを追加します。

以下の3つのAssetを追加しました。

Tutorialと同じ名前のAssetが何個もあったのでその中から近そうなのを選びました。

まずStatueを配置します。

これらのAssetから以下のPlantをLevel上に追加しました。

以下のように原点に配置しました。

Scaleは0.2にしました。

Motion Designに入りました。

Actorを選択して、更にClone Actorを選択します。

ClonerにCubeを消して以下のAssetを追加しました。

CloneのParameterの設定を変更します。

Layout NameをMeshに変更しました。

Sample ActorにStatueをセットしました。

結果です。

あれ?

草がStatueから離れた位置に生成されていますね。

ひょっとするとこの後の調整でこの問題も解決するかもしれません。

続きをやってみます。

LocationのZの値を0.01に変更しました。

結果です。

む。

先週のBlogに書いた通りGrassの色が劇的に変化しました。

今度はEffectorを追加します。

Effector Rotationと名前を変更しました。

Typeの値をUnboundに変更しました。

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

Clonerに戻り、ClonerのEffectsにこのEffect Rotationsを追加しました。

結果です。

やっぱり隙間があいています。

Grassの向きを以下のように変更しました。

結果です。

Statueより離れた位置から草がはえていますが、それなりにそろって生えるようになりました。

Countの値を4000に変更しました。

結果です。

うん。

これなら良いでしょう。

新たなEffectorを追加します。

間違えて以下のPanelを閉じてしまいました。

このPanelの名前が分かりません。

色々調べたらどうやってこのPanelを表示するのかが分からないです。

Copilotに質問しました。

全然、検討違いの回答をしています。

分かりました。

以下の赤の部分の設定をMotion Design Modeにする必要がありました。

すると先程のPanelが表示されます。

Effectorを追加しました。

名前はEffector Animationに変更しました。

更にTypeをPlaneに変更しました。

更にEasingの値をIn Out Cubicに変更しました。

Scaleを0にしました。

CloneにこのEffectorを追加しました。

PCが動かなくなりました。

再起動しました。

分かりました。

EffectorAnimationには2つのLocationがあります。

それぞれのScaleの値が違っていました。

まず以下のScaleの設定は0です。

こっちはXYZがあります。

次に以下のScaleの値は0.1にセットしていました。

またUEが動かなくなりました。

Countの数が4000なのが多すぎるんですよ。

1000位に下げます。

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

Effector Animationの向きを以下のように変更しました。

Effector AnimationをSequencerに追加しました。

位置を指定しました。

これで草が生えるようになりました。
Tutorialはここで終わっていますがCameraを追加してRenderingして映像としてまとめます。

youtu.be

Davinci ResolveにImportしたら12秒の動画になっていました。

この辺の編集方法は勉強したんですが、理解したやり方で直そうとしたら直らなかったです。

今回はSpeedを編集する事で直しました。

6.2 Unreal Engine 5.4 Plant Growth Effect Tutorial In Under 5 Mins [4]を実装した感想

まさかEffectorにLocationを示すParameterが2つあるなんて想像もしなかったです。

後、私のPCのSpecではCloneのCountの値が4000では処理しきれなかったです。

RTX3070Tiなのでそんなに悪いとは思ってないですが、やっぱりVRAMが少ないからなんでしょうか。

予想していた時間の3倍位消費してやっと完成しました。

でも出来た時はかなり感動しました。

6.3 公式のSequencer Editor [5]を勉強する

これ見てください。

先週勉強したCameraのIconがありません。

何でなんでしょう。

まだSequencerには分からない事が沢山あります。

<Outliner>

以下の部分の事です。

ここには特に情報な情報は書かれていませんでした。

もしOutlinerのもっと細かい情報を勉強したい時は別なPageで解説しているそうです。

<Timeline>

以下の部分はTimelineと呼ぶそうです。

ここで赤い線をEnd Marker、緑の線をStart Markerそして白い線をPlayheadと呼ぶ事を知りました。

<<Navigation>>

このTimelineの操作の仕方を説明しています。

と言っても右端と下にあるBarの操作方法の説明だけです。

右端のBarは単に移動させるだけですが、下のBarはPanとZoomの機能があります。

下のBarの真ん中の濃い灰色の部分にCursorを抑えて移動すると、PanになりTimelineはHorizontallyに移動します。

両端の薄い灰色の部分をCursorを合わせて移動すると、Barの長さが変化してTimelineがZoomします。

更にMouseの右Clickをした状態でTimeline上を移動すると上下左右に移動する事が出来るそうです。

6.4 Sequencer EditorCine Camera Actor [6]を勉強する

今週はLens Settingについて勉強します。

これ。

今回はFStopについて勉強します。

Apertureって何の事でしょう?

それ以前にFStopってCameraの世界では普通に使用している言葉なんでしょうか?

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

By KoeppiK - Own work, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=78136658

Cameraには上記のような絞りの機能がついています。

この絞りの大きさを指定するのがApertureでした。

ただWikipediaの説明は専門的すぎてよく分かりません。

CopilotにApertureについて質問しました。

Exposureの値が変わるのは理解出来ます。

そもそもLensに入って来る光の量が変化しますから。

次のDepth of Fieldの値が変化するのはかなり複雑な内容です。

Apertureの値を大きくした場合(F-Numberの値は小さくなるそうです。)背景がBlurになるそうです。

えー。

そうなの。

以下のCameraで試してみます。

Max FStopの値を10まで下げてみました。

結果です。

うーん。

なんの変化も無いですね。

Gaussian Splattingは元々背景がぼやけているからかもしれません。

以下のLevelでもう一回試してみます。

Max FStopの値を10に下げました。

結果です。

うーん。

変わってないですね。

この値は無視して良い気がします。

7. Houdiniの勉強

7.1 Houdini 19 - Wall Tool 13 [12]を実装する

<Intro>

Type Propertiesを開き以下のようにExisting ParametersにFolderを追加しました。

名前はMaterialsとしました。

そしてそのMaterialの下にBrick Face、Brick ChipそしてGroutの3つのFolderを追加しました。

MaterialsのFolder Typeの値をSimpleに変更しました。

更にFileのImageをBrick Faceに追加しました。

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

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

さらにDuplicateして4つに増やしそれぞれの名前を以下のように変更しました。

Brick Chipも同じようにしました。

Groutにも同様のFileを作成しました。

次にEditorに戻り、Material Networkノードを追加しました。

先週のBlogでまとめた時と同じように名称がMatnet1になりました。

Matnet1ノードをDouble ClickしてそのNodeの中に入り込みました。

Principle Shaderを追加しました。

先週のBlogには

とまとめてあったので、

試してみました。

以下のIconを押したら

以下のWindowが開きました。

はい。

ここから説明を読む事が出来ます。

次は以下の機能を解説していました。

これも確認出来ました。

ただ実際にCopperを選択して試すとかまではやりませんでした。

BrickFaceと名前を変更しました。

Alt+Dragでもう2つ同じNodeを作成しました。

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

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

これもう一回Tutorial見てみますか。

<<Use Point Color>>

多分だけと分かりました。

OpenGLを勉強した時に以下の疑問があった事を思い出しました。

それぞれのVertexって色の情報を保持する事が出来たんですが、実際の色はShaderで指定していました。

じゃあVertexが色の情報を持っていても意味なくない。と思ったんですが、その疑問は解決される事はなかったです。

その代りOpenGLの内容なんかほとんど忘れてしまった今でもその疑問を持ったことは覚えていました。

ここで言うPoint ColorとはそのVertex一つ一つが持つ色の情報の事のようです。

その情報も使用するというのがこのParameterの機能みたいです。

<Linking Parameters>8:30

ここから作成したNodeとType Propertiesを繋げるための設定を行うそうです。

Brick Faceノードを選択します。

Textures Tabを選択します。

Base ColorのUse TextureにCheckを入れます。

Type Propertiesを開いて、MaterialsのBrick FaceからDiffuseを選択します。

Tabから以下に示したChannelsを選択します。

以下に示したVEX BuilderのBrick FaceノードのParameterであるTextureをDrag して

Type Propertiesの以下の箇所にDropします。

しました。

結果です。

Tutorialと同じ結果になりました。

Type PropertiesのApplyを押してしばらく待つと、VEX BuilderのBrick FaceノードのParameterのTextureの部分が以下のように変化しました。

Tutorialでは以下のように変化しています。

色は変化しましたが、Codeは表示されませんね。

うーん。

分からん。

このまま先に進みます。

Ambient OcclusionとRoughnessも同様に行います。

次にNormalの設定を行います。

Nodeの方のBrick FaceのPropertiesのTabをBump & Normalに変更します。

以下のParameterを使用しました。

まずEnableをCheckします。

そしてTexture PathをType PropertiesのNormalの

Drop Parameters here to add new linksにDropします

するとLinked ChannelsにそのPathが表示されます。

更に以下のApplyを押して

数秒待つと

BrickFaceノードの方のPropertiesのTexture Pathの色が緑色に変化しました。

<Adding Textures>10:45

ここで使用するTextureをTextures.comから取得します。

このSiteは使用した事はありません。

兎に角やってみましょう。

一端、Houdiniを閉じます。

Textures.comを開きました。

Freeのところを見たんですが結構凄いです。

試しにDownloadしてみます。

これをDownloadしてみますか。

あれ?

なんかCreditが必要とか出てます。

調べます。

RedditTextures.com no longer free? [13]に以下の質問がありました。

これ5カ月前の掲載ですね。

という事は半年前にTextures.comはその方針を変更したみたいですね。

Poly Havenと言うSiteがFreeでTextureをDownload出来るそうです。

そっちを見てみます。

このSiteです。

Havenは避難所で、Heavenが天国です。

そしてHavenの読み方はヘエイヴンでHeavenの読み方はヘヴンです。

以下のTextureをDownloadしてみました。

別に登録しなくてもDownload出来ました。

開くと以下のようになっていました。

NormalとRoughはexrというExtensionですね。

調べます。

うーん。HoudiniはExrは普通に使用出来るみたいです。

Ambient Occlusionが無い代わりにDisplacementがあります。

うーん。DisplacementをAmbient Occlusionとして使用しますか。

このTextureはBrick Faceに使用します。

Brick Chip用のTextureもこれで良いです。

Grout用のTextureを探します。

これをDownloadしました。

こっちも同様です。

Textureを取得したのでHoudiniに戻ります。

今、この階層にいますが、

Uを押すと一つ上の階層に移動出来るそうです。

試してみます。

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

これは便利です。

更にもう一回Uを押してもう一つ上の階層であるBrickwall_tool_buildに移動しました。

Brickwall_tool_buildのPropertyを見ると

以下に示した様に

Materialsの項目が追加されています。

ここに先程DownloadしたTextureを追加します。

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

あれ?

VEX BuilderのBrick ChipとGroutの設定はやって無いですね。

まあ先に進みます。

後で、既にやった事になっていたらその時にやる事にします。

以下のTextureをEnableします。

結果です。

何も変化していません。

これはTutorial通りです。

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

Propertiesを見ます。

あHoudiniだからParameterか。

以下の赤で囲ったTabを3つに増やします。

上のNumber of Materialsの値に3を入れたら3つに増えました。

それぞれのGroupにBrickFace、BrickChipsそしてGroutを追加しました。

次にMaterialをセットします。

以下のBoxを開いて

BrickFaceを追加しました。

結果です。

おお凄い変化している。

でもこのTextureはBrickには見えませんね。

この後、Brick ChipとGroutにも同様の作業を行うそうですが、VEX BuilderのBrick ChipとGroutの設定はやって無いので何も表示されないはずです。

VEX BuilderのBrick ChipとGroutの設定を今やります。

まずはLinking Parameterを行います。

ここはやっている事は同じなので最後の結果だけ記録しておきます。

Brick ChipのNormalのTexture Pathです。

GroutのNormalのTexture Pathです。

今度はBrickWallTool_BuildノードのParameterの設定を行います。

それぞれ以下のようにSetしました。

結果です。

あれ?

Textureが適応されていません。

これはなんかの作業を忘れていますね。

今週はここで時間が無くなってしまったので、VEX BuilderのBrick ChipとGroutの設定の確認は来週やる事にします。

調べるまでも無かったです。

Material1ノードの以下の部分の設定を忘れていただけでした。

結果です。

うーん。

これは後から沢山直す必要があります。

どう見てもBrickとGroutではないです・

後、Specular Lightが金属のそれです。Roughnessの値をもっと高くしてSpecular Lightを下げる必要があります。

<Adding Global Scales>15:00

後、この節だけなのでやってしまう事にしました。

TextureのSizeを変更するための機能を追加します。

Type Propertyを開いてFloatをMaterialに追加しました。

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

RangeのMinの値に0.1をセットしました。

VEXの階層に移動して

BrickFaceノードを選択して

Scaleを

先程のType PropertiesのUV Scaleの

以下のChannelにセットします。

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

で、ここからが問題です。

同様に残り2つのNodeのScaleもType Propertyのこの値とBindさせる必要がありますが、

Tutorialは色々な方法で試したんですが、出来なくて最後は以下のCommandを追加していました。

これは最終手段として別な方法を試してみます。

無理やり3つとも追加してみました。

BrickFaceノードの結果は以下のようになっていますが、

BrickChipノードとGroutノードの結果は以下のようになりました。

うーん。

PathのAddressがTutorialと違う。

これで出来るのかTestしてみます。

テストしようとBrickwall_tool_buildの階層に戻ってきたら

以下のように既に変化していました。

TextureのSizeが10分の1に変化していました。

Brickらしくなってきました。

出来てますね。

ここでTutorialは終わっているので今週のHoudiniの勉強はここまでとします。

8. UEFNの勉強

今週からPi equals Three氏のTutorialは以下のUEFN Tutorialsではなく

全部やる事にします。

何故からそうしないと話が繋がらないからです。

例えば、今週勉強する予定だった以下のTutorialですが

Part2となっていてPart1を既に勉強した前提で話が進んでいます。

しかしこのTutorialのPart1と思われる以下のTutorialはUEFNのPlaylistには入っていません。

本当に勉強しにくい。

こんな感じで並んでいます。

緑が先週まで勉強していたTutorialで、赤がPlaylistの次のTutorial、オレンジが赤で囲ったTutorialのPart1と思われる動画です。

するとその間にExtension Functions? Fortnite UEFN/Creative 2.0 Verse Tutorial [14]があります。

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

8.1 Extension Functions? Fortnite UEFN/Creative 2.0 Verse Tutorial [14]を勉強する

ここでは以下のようにそのClassが本来持っていないFunctionを追加する方法を勉強します。

うん。

これって結構重要な内容じゃない。

こうやって本来はそのClassに存在しない後から追加したFunctionの事を

と呼ぶらしいです。

ここでらしいというのは

Documentで確認したら見つからなかったと言っています。

まあ、それはどうでも良い事です。

実際のやり方を勉強しましょう。

まず普通にFunctionとして作成する場合です。

PlayerをParameterとしてPassしています。

で、Extension Functionとしてこの関数を作成すると以下のようになります。

最初にExtensionするClassとそのObjectの名前を指定します。

その後に関数名、で後は普通の関数の作成と同じになります。

関数名の前にDotがありました。

Cursorで見えなかったです。

以上でした。

う、短い。

でもまあいいでしょう。

今週のUEFNの勉強はこれで終わりです。

9. DirectX12の勉強

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

9.1.1 Creating a Window | D3D12 Beginners Tutorial [D3D12Ez] [15]の次の10分を実装する

<Shutdown Method>

DXWindow ClassのInit()関数の最後にReturnを追加しました。

Shutdown()関数にUnregisterClassW()関数を追加してw_wndClassを開放します。

<Creating the window>

Main.cpp fileに戻って作成したDXwindow ClassのInit()関数が動くか確認します。

まずWindow.h FileをIncludeします。

DXwindow ClassのInit()関数を実装しました。

これでこのProjectを実行したらDXwindow ClassのInit()関数は呼び出されるはずです。

WhileにBreak Pointを追加してTestしてみます。

結果です。

ErrorにならずWhile LoopのBreak Pointのところまで実行されています。

という事はDXwindow ClassのInit()関数は普通に呼び出されて実行されたという事です。

出来てます。

Window.cppに戻ります。

Init()関数の最後に以下の実装を追加しました。

これで実際のWindowを作成しています。

<Creating the window handle>

Windows Handle型の変数を作成します。

こっちはNullptrを使用していますね。

何でATOM型の変数を宣言した時は0を使用したんでしょうか?

Copilot先生にNullptrと0の違いを聞いてみました。

出来るだけNullptrを使用しろって言っています。

ATOM型は形無しともいえるので0しか使用出来ないのかもしれません。

Copilot先生に聞いてみました。

成程、Classを後から指定するがその指定に失敗した時は0を返すから最初は0にしておいたほうがいい。

からか。

後の理由はよく分かりませんね。

作成したHWND型のVariableであるm_windowで先程作成したCreateWindowExW()関数のReturn Valueを受け取ります。

更に正常なReturn Valueを受け取れたのかどうかのCheckをするための実装も追加します。

M_windowの値がNullptrでなければTrueを、NullptrであるならFalseを返すはずです。

<Testing the window>

実行します。

巨大なWindowが表示されました。

出来てますね。

今度はこのWindowと対話できるようにしていきます。

Window.h FileのDXwindow ClassにUpdate()関数の宣言を追加します。

更にWindow.cpp fileにこの関数の実装を追加します。

ここで先週の勉強は終わっていました。

ので今週の実装はここまでとします。

9.2 DirectX 12の魔導書」の勉強

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

PrimitiveのTopologyの設定がD3D_PRIMITIVE_TOPOLOGY_TRIANGLELISTのままで四角形を作成する方法を勉強します。

<Indexを使う理由>

簡単にまとめると、Indexを使用した方が呼び出しCostが減るからです。

<Indexの実装方法>

ここが難しそうな所です。

3つのIndexで1つ、という事と時計周りに指定する。の2つの規則があるそうです。

これをIndexのDataとしてGPUに送ります。

まずBufferを作成します。

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

CreateCommittedResource()関数はVertexのBufferを作成する時も使用したそうです。

うーん。

そうなのか。

憶えていません。

Sample CodeでCreateCommittedResource()関数を探してみました。

うーん。

確かに使用しています。

しかい全く覚えていませんね。Blogから調べてみます。

2023-12-03のBlogにまとめられていました。

まずCommittedのSpellを間違えて書いていた。と書かれています。

ああ。

思い出した。

この関数か。

この関数のParameterとして使用する2つのStructについて以下のように説明していました。

Index用のCreateCommittedResource()関数見直すと、確かにここで説明されている2つのStructを使用していました。

Heappropは以下のように指定されていました。

Resdescの設定です。

教科書の内容に戻りますが、この後の説明がかなり複雑です。

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

以下の4つの作業を行っています。

  1. Mapを利用してBufferにDataをCopy
  2. Index用のBuffer Viewを作成
  3. Index Bufferのセット命令を設定(描画時)
  4. DrawInstanced()関数をDrawIndexedInstanced()関数に交換する

それぞれについて簡単に解説します。

<<Mapを利用してBufferにDataをCopy>>

そもそもCreateCommittedResource()関数のVertBuffがBufferじゃないの?

と思ったらVertBuffは

ID3D12Resourceという型で、BufferとしてGPUには遅れないみたいです。

うん。

何でVertBuffって名前になってるの。

あ。

VertexをBufferとしてGPUに送る方の実装をみてた。

IndexをBufferとして送る方の実装は以下のようになっていました。

ResdescのWidth以外の値はそのままで、HeappropとResdescはVertexのBufferを作成した時のモノを使用していました。

ID3D12Resource型の変数の名前はIdxBuffとなっていました。

ではMapを使用してBufferにDataをCopyします。

うーん。

薄っすらとこれを勉強した記憶はありますが、何を勉強したのかはまるで覚えていません。

2023-12-10のBlogを見たら、VertexのMapを使用したCopyについてしっかりした解説がまとめられていました。

しかもこの時のBlogを読むと、先程のCreateCommittedResource()関数は、GPU側にこれからBufferとして送るDataが保存できるように、Memoryを確保する。と説明していました。

でMap()関数がその領域にBufferのDataを書き込むそうです。

しかしもっと正確に言うと

だそうです。

ああ、理解しました。

こういう事だと思います。

まずGPU側のBufferのDataを保持するためのMemoryのAddressを保持するための変数を作成します。

Map()関数を利用してそのGPUのAddressをこの変数に保持させます。

Copy()関数を利用してそのGPU側のAddressにBufferの情報をCopyします。

最後にMapを解放します。

うーん。

でもこの解釈だと最後にUnmap()関数を呼び出す必要ってあんまり感じないですね。

だってMappedIndexがGPU側のこのBufferのAddressをずっと保持していたって別に問題ないですよね。

うーん。

これは思っていたより問題は複雑そうです。

教科書の「4.4.1 ID3D12Resource::Map()Method」を読み直します。

大体はこの説明であっている気がしますね。

とりあえずはこれで良しとします。

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

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

これもVertexの時の勉強を確認します。

2023-12-10のBlogでは以下の事しか書いてなかったです。

「4.4.2 Vertex Buffer Viewの作成」も読み直してみます。

分かりました。

これは単にBuffer Viewの設定を指定しているだけでした。

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

Buffer Viewは作成しただけではGPU側に伝わらないので

描画時にIASetIndexBuffer()関数を使用してIndex Bufferをセットします。

これもVertexの時にどんな勉強したのかを調べます。

2024-05-12のBlogで勉強していました。

何と、教科書の「4.10.3 描画命令」でこれを勉強していました。

とんでもなく後になってBuffer Viewの情報をGPU側に送ったのか。

「4.10.3 描画命令」を勉強した時は、これがVertex Viewの情報をGPU側に送っているなんて認識は全くなかったです。

2024-05-12のBlogでは特に重要な内容は書かれていませんね。

一つだけ面白かったのは以下に示した

Sample CodeにはIASetIndexBuffer関数が書かれているが、教科書にはこのCodeの説明がまったく書かれてない。というくだりです。

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

Sample Codeには以下のように2つとも書かれていました。

Indexの数は6個なので6が指定されています。

一応、公式のID3D12GraphicsCommandList::DrawIndexedInstanced method (d3d12.h) [16]を読みます。

Syntaxです。

それぞれのParameterについても簡単にまとめます。

これはIndexの数を指定するだけですね。

Instanceの数を指定するそうです。

どのInstanceを指しているのか今一分かりませんが、一個しか存在しないと思いますので、ここは常に1になると思われます。

これは0以外から始まる場合もあるんでしょうか?

これも0以外を指定しないといけない場合が思いつきません。

これに関しては何故、こんな値を指定する必要があるのかすら分かりません。

0でいいでしょう。

以上でした。

なんと、ここで4章は終わっていました。

車を適当に走らせていたら突然海岸に出た感じです。

来週実装して、4章のまとめ、並びに4章を勉強した感想を書く事にします。

10. まとめと感想

特になし。

11. 参照(Reference)

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

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

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

[4] Unreal Katya Fedak. (2024, April 10). Unreal Engine 5.4 Plant Growth Effect tutorial in under 5 mins [Video]. YouTube. https://www.youtube.com/watch?v=JJyJD_QDLy0

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

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

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

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

[9] Skyentific. (2022, September 19). From Reality to Simulation with Isaac Sim (+ RTX3080Ti raffle) [Video]. YouTube. https://www.youtube.com/watch?v=KDG4d97DdI4

[10] Build Manager - GAEA Documentation - QuadSpinner. (n.d.). QuadSpinner Gaea Documentation. https://docs.quadspinner.com/Guide/Build/Manager.html

[11] Klaus. (2022, May 21). How To BUILD AN ISLAND In 20 mins | Unreal Engine 5 Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=Obfq-Zh3iXs

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

[13] Textures.com no longer free? (n.d.). Reddit.com. https://www.reddit.com/r/gamedev/comments/196fr11/texturescom_no_longer_free/

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

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

[16] Stevewhims. (2024, February 22). ID3D12GraphicsCommandList::DrawIndexedInstanced (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-id3d12graphicscommandlist-drawindexedinstanced

 

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

1. 今週の予定

先週のBlogを読み直して今週の予定を建てます。

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

先週作成したDragonと自転車の映像に影が何故無いのか?を調査します。

後、SmokeのEffectを直します。

Pwnisher氏のTutorialの勉強はMaterialの勉強で行う事にします。

1.2 AIの勉強

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

1.3 Materialの勉強

Pwnisher氏のUnreal Engine Materials in 6 Levels of Complexity [2]の実装をおこないます。

1.4 Gaeaの勉強

今週は無しです。

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

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

この予定で進める事にします。

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

1.6 Houdiniの勉強

先週のBlogで書いたように

次のTutorialを勉強します。

今週はHoudini 19 - Wall Tool 13[4]を勉強します。

1.7 UEFNの勉強

もうしばらくはPi Equals Three氏のTutorialを勉強する事にします。

 CUSTOM Fortnite Character Pt 2 (Animations) - UEFN / Creative 2.0 Tutorial [5]を実装します。

1.8 DirectX12の勉強

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

DirectX 12の魔導書」の勉強は、「4.11 三角形ポリゴンを四角形にしてみる」の「4.11.1 Primitive Topologyを変更する」の実装を行います。

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

今週はDragonと自転車の映像を直してもっとRealにします。

2.1 Dragonが着地した時のSmokeのEffectを直す

まずParticle Spawn StageのSphere Location Moduleの設定から変更します。

Sphere Radiusの値を100から10に変更しました。

結果です。

www.youtube.com

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

更に直していきます。

youtu.be

Smoke Effectを本当にDragonの足の下に置いたら、Smokeがまったく見えなくなってしまいました。

Cameraから見るとDragonの足元に見えますが、実際は全然違う位置に配置しています。

3D Gaussian SplattingもNiagaraを利用して生成しているのでEffectと被ったらEffectが見えなくなってしまうのかもしれません。

3D Gaussian Splattingで背景を生成する時には、こういうDemeritがある事が分かりました。

youtu.be

もうこれでSmokeはほぼ完成と言ってもよさそうです。

youtu.be

Velocityを微調整してSmokeが少しだけ上に舞い上がる様にしました。

後はCameraの調整だけです。

まずCameraのFocusを調整します。

今はこうなっていますが、

遠くにいるDragonにFocusがあっているのにその周りの建物にはFocusが外れています。

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

Dragonが遠くにいる時にはピントが合わないようになっています。

結果です。

youtu.be

確かにDragonがピンボケしています。

その結果、映像的に良くなったと言えるのかはうーん。分かりません。

Cameraの位置を変更してDragonの全体像が写る様にしました。

youtu.be

Cameraの角度が変わったらSmokeのEffectがしょぼく見えるようになってしまいました。

SmokeのEffectを派手にします。

youtu.be

Smokeの部分を派手にしました。

うーん。

Smokeは横にもっと広がっても良い気がします。

後、Dragonが登場する時が、画像を張り付けた感じが凄いします。

背景とDragonの間に白い線があるかのように見えます。

実際には白い線はないですが、多分lightness(輝度)がDragonと背景で違っているんでしょう。

Directional LightのIntensityの値を10luxから1luxに下げました。

結果です。

youtu.be

Dragonが周りの背景から浮いている感じがなくなりました。

こんな簡単な調整で他の映像を埋め込んだ感じが無くなるなんて不思議です。

後はDragon登場時にCameraが少しだけShakeすると更にRealになりますね。

これはDavinci Resolveで追加しますか。

調べたらCamera SHAKE Effect - DaVinci Resolve [7]でCameraをShakeする方法が説明されていました。

Camera Shake Effectを追加するだけみたいですね。

やってみます。

以下のようにDragonが登場するのFrameを抽出しました。

ここにCamera Shakeを追加します。

追加したけど使用出来ないですね。

もしかしたらImageからImportしたからかもしれません。

別なProjectを作成してYouTube用にExportしたVideoをImportしてそれで試してみます。

駄目でした。

他のEffectでも出来ないのか確認したら出来ました。その後でもう一回Camera Shakeを試したら今度は出来ました。

あれ?

前のProjectに戻って同じように試したら今度は普通に追加出来ました。

色々試した結果、以下の設定でOKとしました。

結果です。

youtu.be

良い感じです。

後は音を追加します。

あれ?

音ってExportできるの?

取りあえず今までのようにImageを生成しました。

うーん。

JPEGに音なんか保存出来ないですよね。

調べたら以下の動画でやり方を説明しているみたいです。

Export an Audio Track in the Movie Render Queue (Unreal Engine) [8]

軽く見たんですが、結構知らない事をやっていてしっかり勉強しないと間違えて操作してしまいそうでした。

うーん。

今からこれを勉強したらこれの勉強で今週の「映像作品としてのLevelの作成」の勉強は終わってしまいますね。

まあ良いか。

これを勉強します。

2.2 Export an Audio Track in the Movie Render Queue (Unreal Engine) [8]を勉強する

OutlinerにあるLevel Sequenceを選択します。

Level Sequenceが開いている箇所に別なTab、Movie Render Qと言うのが表示されていて

そこにLevel SequenceをDrag & Dropしました。

ここからDrag and Dropしていました。

これって左脇にあるので、なんだか分からなかったですが、いつもの以下の部分にあるやつでした。

するとMovie Render Qは以下のような表示になりました。

これはRenderingする時に開くWindowとまったく同じ内容です。

あのWindowの名前がMove Render Qだったみたいですね。

SettingにあるMRQなんとかを押して以下のWindowを開きました。

これもLevel SequenceをRenderingする時に開くWindowです。

ただSettingの内容が違いますね。

私のProjectは以下のようになっています。

これしかないです。

このTutorialでは

こんなに沢山あります。

しかも沢山あるだけじゃなくて.exr Sequenceのような直接Videoを生成してくれそうなSettingも表示されています。

うーん。

この辺を表示するための設定から勉強しないといけないのか。

これは簡単ではなさそうです。

お、Output Resolutionの値は以下のようになっていました。

これは4Kの設定みたいですね。

やっぱり4Kにしないと駄目か。

ここでこの設定でRenderingするとSoundの生成をする事は可能ですが、非常に時間がかかるので以下のようにMovie Render Qに同じLevel Sequenceの項目をもう一個作成します。

これ具体的にどうやって2つの同じSequenceを追加したのかは説明していませんでした。

そしてこっちのSettingは以下のようにします。

なんと以下の+を押してWav.Audioを追加しました。

一瞬しか開きませんでしたが、以下に示した様に

沢山の項目が表示されていました。

ここで何をRenderingするのかを指定みたいですね。

以下の設定も少しだけ変更しています。

この変更で重要なのはFile Name Formatの最後にFrame Numberをしている箇所があるので、それは削る。という事だけです。

右上のMRQ何とかと書かれている箇所をClickして以下のWindowを開き

Save As Presetを選択します。

以下のWindowが開きました。

この設定をPresetとして保存するみたいです。

MRG_AUDOとして保存していました。

またMovie Render Qに戻ってきました。

上の項目はRenderingしないので、Offにしました。

Outputの所の以下の三角をClickして先程保存したMRG_AUDOを選択していました。

成程、作成したPresetはこうやって使用するのか。

この設定で右下にあるRender(Local)を押していました。

これで以下のようにAudio Fileが生成されました。

以上でした。

うーん。

大体は理解しました。

これは来週試す事にします。

3. AIの勉強

今週はJeremy Howard氏の Practical Deep Learning for Coders: Lesson 1 [1]の宿題をやります。

先週のまとめでは宿題は以下のようになっています

Kaggleの登録が完了すればPyTorchも勝手に使用出来るようになるみたいですし、まずはKaggleの使用方法を勉強する必要があります。

教科書の第1章を全部読むのは結構大変です。

これは出来るだけやるようにします。

3.1 第一回の講義を復習する

教科書を読む前に今まで勉強した講義の復習をやります。

その方が教科書の内容も頭に入るでしょう。

2024-05-19のBlog

写真を見て鳥かどうかを判断するCodeをPythonを使用して書いています。

こういうやつです。

ぶっちゃけ、この辺の講義で説明に使用されたCodeをそのまま使用して探すImageだけ変更すれば今週の宿題は終わりでしょう。

Python初心者でも出来て、宿題の要求をPass出来る現実的なGoalはその辺でしょう。

その辺の事が出来るための情報を集中して復習する事にします。

途中まで読みましたが簡単にはまとめられる内容じゃなかったです。

紹介されたCodeと、そのCodeが何をやっているのかだけまとめる事にします。

Data Blockを作成しています。

作成したData BlockをパスしてCNN(Convolutional Neural Network)と言う手法で学習させています。

その後でFine Tuneを3回行っています。

Predict()関数を使用してテストしています。

今、Blogを読み直してみるとCopilotのお陰でかなりしっかりまとまっているのでこれらのCodeが何をやっているのかかなりしっかり理解出来るのですが、

以下の部分を調べるのは忘れていました。

これCreateと言っているんだからImageを生成していると思われます。

生成したImageに対してこのImageがBirdかどうかを予測しているみたいですが、自信はありません。

そうだ、Copilotに質問してみます。

だそうです。

ホントにCopilot役に立つ!

結果です。

まずはこの部分のCodeを自分で再現出来るようにする事ですね。

この後はそれ自体は重要な情報ですが、Codeを実際に書けるようになるための知識とはほとんど関係ない話でした。

2024-05-26のBlog

この週はKaggleは使用したくないので、PyTouchをLocalで使用する方法を調べていました。

KaggleのTutorialも調べていました。

KaggleのSettingはこの辺のTutorialを一個勉強した方が安全ですね。

肝心のCodeの解説ですが、以下のようになっていました。

まずDataBlockのそれぞれのMemberについての解説がありました。

それぞれのMemberの機能については実装する時に復習します。

ShowBatch()関数について解説していました。

これはBatchにあるImageから6個表示して。と言う意味です。

そして以下のLearnerについてです。

あれ?

ここではVision_Learnerを使用していますね。

Fine_TuneはModelに今までTrainしたDataとこれから学習するDataがどれくらい違うのかを示すそうです。

Predict()関数が来ました。

これで新しい画像が鳥であるかどうかをAIに聞いて、答えがあっているかどうかを確認しています。

以上でした。

先週のBlog

Segmentationについて説明しています。

Segmentationは画像に写っているObjectを分割する機能の事です。

Segmentation用のDataのLoadのやり方です。

この後、ずっとこのCodeの説明が続きます。

次はSegmentationにおけるLearnerの説明です。

Segmentationの実装はこれで終わっていました。

どうやってAIが勉強した内容をTestするんでしょうね。

この辺は教科書を読んで学習しないといけない部分のようです。

次にTableの分析について解説していました。

いきなりLearnerから始まっています。

でもDlsがあるから何らかのDataの塊は作成しているはずです。

あ、これでTableに使用するDataを読み込んでいました。

TableはAIが学習する必要は無いのでFine_Tuneは使用しないそうです。

Collaborative Filteringという個々のUserが望む項目でTableを作成する方法も紹介していました。

なんとこのCollaborative Filteringという手法でTableを作成した場合の例では

Fine_Tuneを使用していました。

さっき言っている事と違います。Collaborative FilteringはFine Tuneを使用する事も出来るそうです。

成程。

TableだからShow_Results()関数を使用するのか。

後は、重要ですがCodingとは関係ない話ばかりでした。

以上でした。

3.2 講義の復習をした感想

今回はCodingに関しての話だけまとめましたが、それ以外の話も結構重要で、内容も濃い話ばかりでした。

後、Blogを読み直すと結構勘違いして理解している箇所がありました。

それが今は分かるという事はそれなりには勉強になっているという事だと思います。

3.3 教科書の第一章を読む

以下の教科書を読みます。

と言ってもGitHubに公開されている方ですが。

だらだら読んでいてもしょうがないので休憩を含んで4時間だけ読む事にします。

まあ実質3時間だけ読むという事になります。

今軽く見たら大した量じゃなかったです。後書かれている内容も講義の内容とほぼ一緒でした。

これなら1時間で読めそうです。

それぞれの項について簡単にまとめます。

<Your Deep Learning Journey>

重要でない

<Neural Networks: A Brief History

Neural Networkの簡単な歴史がまとめられていました。

Neural Networkそのものについてはあんまり理解出来なかったです。

もしそれを理解する必要がある時はもう一回読み直す事にし、次に行きます。

<Who We Are>

重要でなし

<How to Learn Deep Learning

うーん。

重要な情報があるかもしれませんがとりあえずSkip

<The Software: PyTorch, fastai, and Jupyter>

ここで気になっているのはKaggleではなくJupyterを使用している点です。

この節だけはしっかり読む事にします。

どのSoftwareを使用しても関係ないって結論でした。

そう言う訳で今回はKaggleを使用する事にします。

<Your First Model>

うーん。

Jupyterからこの教科書を読むと読みながらCodeを改良出来る仕組みになっているみたいですね。

一寸Jupyterも調べてみる必要があるかもしれません。

結構長い文章でJupyterについて解説していました。

<What Is Machine Learning?>

ここは先週勉強したMachine Learningが従来のProgrammingとどう違うのかの説明をやっていました。

こういうやつです。

一応、しっかり読む事にします。

うーん。

前に勉強した以上の情報は拾えなかったです。

後このModelはMachine Learningの説明でDeep Learningではないみたいです。

<What Is a Neural Network?>

ここで集中力が切れました。残りは来週読む事にします。

4. Materialの勉強

Pwnisher氏のUnreal Engine Materials in 6 Levels of Complexity [2]の実装をおこないます。

4.1 Unreal Engine Materials in 6 Levels of Complexity [2]の実装をする

Materialを生成しました。

Material Instanceを生成しました。

Materialを開いて実装していきます。

やっぱりMaterial Instanceを右端に表示する方法は分かりません。

Material Instanceは別Tabで開いてそこで確認する事にします。

まずは適当なTextureを使用して簡単な実装を作成します。

それぞれのTexture SampleノードをParameterにConvertします。

Pwnisher氏のTutorialでは以下のTexture SampleノードをParameterに変更していました。

同じにしました。

更にMIの結果も確認しました。

Albedo Brightness Parameterを追加しました。

Powerノードを追加してContrastを調整出来るようにしました。

Desaturationノードを使用してSaturationを追加します。

Albedo Tintを追加しました。

これがBrightnessと同じじゃないのかと疑問に思っていますが試してみます。

Brightnessの結果です。

Brightnessが1の時です。

Brightnessが0の時です。

Tintが(1,1,1)の時です。

Tintが(0,0,0)です。

全く同じです。

しかしTintは色を追加する事が出来ます。

Tintは色を追加する。

Copilotの言うShader, TintはBrightnessの事。と専門用語の解釈を変更すればPwnisher氏の説明でもあいます。

おそらくそういう解釈をする流派もあるんでしょう。

Specularの設定です。

Roughnessの設定です。

今気が付いたんですが、Textureの設定ってそれぞれのMaterialで違っています。

例えばMegaScanからDownloadした以下のTextureはORDpと称していて

RにAmbient Occlusion、GにRoughness、BにWorld Displacementが入っています。

次のMegaScanからDownloadしたTextureは

DpRでRがDisplacement、GがRoughnessとなっています。

更にSketchfabからDownloadした3D Characterについて来たTextureは

RがAmbient Occlusion、GがRoughness、BがMetallicだったり

以下のような

RがAmbient Occlusion、GがRoughnessであったりします。

つまりそれぞれのMaterialによってTextureの構成がまったく違っています。

これを一個のMaterialで全部代用してしまおうというのはかなり無理があります。

うーん。

どうしましょう。

まずは基本として全部が別のTextureとしてセット出来るMaterialを作成しますか。

いやそれだと自分で試す事が出来ません。

やっぱりORDpを基本とすべきか。

うーん。

今回はORDpにそろえます。

とりあえずNormalの設定を先にやる事にします。

Normal Intensityの値が1の時です。

Normal Intensityの値が10の時です。

凄い凸凹しています。

とりあえず最後までやってそれから考える事にします。

今度はLevel3です。

今まで作成したAlbedoの実装と単純なColorをSwitch Parameterノードで切り替える事が出来るようにします。

同様の機能をSpecularとRoughnessにも同様に追加します。

Base SpecularのDefault値は0にしました。

更にSpecular値のRangeは0~1としました。

Base RoughnessのDefault値は0.5にしました。

更にRangeは0~1にしました。

MetallicにもParameterを追加しました。

あ、追加したParameterのGroupとSort Priorityの設定を忘れていました。

しました。

Checkを入れると以下のような画面に変更します。

Level4です。

Material Functionを作成しています。

Textureを回転させるやつです。

このMaterial Functionは色々な場面で使えるはずですので早速作りましょう。

出来ました。

以下のように繋ぎました。

このParameterの所属するGroupがまだ不明なのでNoneにしてあります。

Testします。

回転しています。

出来てます。

今度は先程のMaterial FunctionにScaleを管理するためのParameterを追加します。

しました。

Master Materialに戻ってそれぞれのParameterを追加します。

Testしてみます。

一応全部動きました。

全部のParameterをPSR Groupに追加します。

Level 5です。

以下の場所にあるSurface Imperfectionを追加します。

これは無いので、適当なTextureで代用します。

これで代用します。

まずSurface Imperfectionの実装を以下のように組みました。

次にSurface Imperfection Blendを以下のように組みました。

テストします。

色々弄ってみましたが正直変化があるのかどうかすら分かりません。

Materialに使用するTextureがMetallicやGlassの時には役に立つのかもしれません。

以下のようにSurface Imperfection用のPSRも作成しました。

そもそもRoughnessって金属とそれ以外を示すための機能ですから非金属ではそんなに重要でないのかもしれません。

Level 6です。

Dirtを追加します。

以下のように組みました。

LerpノードのAにはBase Colorの結果が繋がっています。

Lerpノードの結果を示します。

こっちは結果がはっきりしています。

DefaultのTextureに、白黒がはっきりしているのを使用したのが良かったのかもしれません。

もうここでParameterのTestをしてしまいましょう。

Dirt Brightnessの値を1から10に上げました。

おお、結果が変化しています。

今度はDirt Contrastの値を0.1に下げました。

これも結果が変わっている

今度はLerpのAとBの値を変更してみます。

Dirt Maxの値を10にしました。

私の中ではこれはBrightnessの値と同様の効果しかないと思っていますがどうなんでしょうか。

以下に先週のBlogで私の意見を書いた部分を示します。

結果です。

うらああー。

やっぱしそうだった。

でもMinの値を弄った場合はどうなるんでしょう。

Dirtの数が減るのかな。

Minの値を0.8、Maxは1で試してみました。

結果です。

これはContrastの値を小さくしたときと同じ効果になっていますね。

これは計算式できちんと示したら同じ事をやっている事、証明できそうです。

うーん。

今はやらない。

今回はいかのようなCommentを付けとくだけにします。

更にEnable Dirtを追加しました。

結果です。

先程のImperfectionの結果がまったく見えなかったのはImperfection PSRの以下のParameterのDefault値が0になっていたからでした。

もう一回テストします。

やっぱり差は分かりませんでした。

これで実装は終わりです。

うーん。

どうしよう。

4.2 Unreal Engine Materials in 6 Levels of Complexity [2]の実装をしました。その後どうするか

このままで終了したら、今までの勉強と同じでUE5の筋トレしただけになります。

この先に繋げる何かを作成する必要があります。

以下のIdeaを考えています。

Mega ScanでDownloadしたDefaultのMaterialにこのPwnisher氏のMaterialを統合してMega ScanのDefaultのMaterialを改良します。

後は、SketchfabのMaterialか。

うーん。

後、Pwnisher氏のTutorialだけやってBen Cloward先生のTutorialは全くやらないのは一寸問題がある気がして来ました。

Ben Cloward先生のTutorialは直接の役には立たないかもしれませんが、Material作成の基礎力は確実につきます。

あ、そうだ。

今回の機能でSurface Imperfectionは要らないですね。

これは省きます。

後は整理の仕方か。

それぞれのGroupはAlphabet順に並ぶようです。

DirtやSurface Imperfectionが使用出来るようになった場合の並びです。

DirtとDirt PSRは並んでいるので分かり易いですが、Imperfection PSRはSurface ImperfectionともSurface Imperfection Blendとも離れた位置に配置されていて関連性がまったく不明です。

Surface Imperfection PSRと名付ければ丁度いい位置に並びます。

5. Gaeaの勉強

今週は無しです。

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

6.1 Texture Graphについて

何と、UE5.4のUpdateが来ました。

Texture Graphを試したら開けなくなったProjectが開けるようになりました。

UE5.4のRoadmapを見たら

Texture Graphが無くなっています。

最初から別な名前だったのか不明ですが、兎に角ここには載っていません。

Texture Graphは普通に開けました。

これは一寸勉強しようかな。

YouTubeSubstance DesignerのTutorialがあります。

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

これを勉強してTexture Graphで実装したら結構行けそうです。

うーん。

勉強しますか。

6.2 Unreal Engine 5.4 Plant Growth Effect Tutorial In Under 5 Mins [9]を勉強する

今週はOfficial Android Support for Unreal Engine Virtual Camera [3]の実装をする予定でしたが、今、携帯を家族に貸してしまっているのでこの実装は来週にします。

代わりにUnreal Engine 5.4 Plant Growth Effect Tutorial In Under 5 Mins [9]を勉強します。

以下の画面から始まっています。

画面中央のSculptureはMega Scanから入手したそうです。

それは兎も角としてこのTemplateはFilmからEmptyを選択したんでしょうか。

その後で空のための一般的な設定を追加したのかな。

Outlinerの設定はLightingのFolderに内容が隠されてしまっていて

どうやって空の設定を追加したのかはここからでは分からないですね。

以下の3つのAssetを使用したそうです。

これらのAssetから以下のPlantをLevel上に追加しました。

こんな感じです。

配置した全てのMeshのLocationを原点にしました。

こんな感じになりました。

PlantのSizeが大きすぎるのでScaleを0.1に変更しました。

そしてここからMotion Design Modeに変更します。

Actorを選択して、更にClone Actorを選択します。

そしてLevel上に配置します。

これか。

これなら前に使用しました。

原点に移動します。

ClonerについているCubeを外して、配置した全部のPlantをClonerに追加します。

LayoutのLayout Nameの値をMeshに変更します。

更にSample Actorの値にSculptureをセットします。

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

よく見ると2つのおかしな事が起きています。

一つ目はGrassのTextureの色がGrayになっています。

二つ目はGrassがおかしな方向を向いています。

一つ目の問題を直すためにClonerのLocationのZの値を0.01に変更します。

二つ目の問題を直すには、以下のEffectorにSculptureを追加して

いや、このEffectorっていつ追加したの?

おそらくActorsにあるEffector Actorを追加したと思われますが、

ここは説明を省いては駄目でしょう。

名前をEffector Rotationと変更しました。

そしてTypeをUnboundに変更します。

更にRotationのYの値を-90とします。

Clonerに戻り、ClonerのEffectsにこのEffect Rotationsを追加しました。

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

そしてLayoutのCountの値を4000に変更しました。

また新たなEffectorを追加しました。

Effectorを追加するのはLevel上にDrag & Dropする必要は無いんでしょうか。

なんか一瞬で追加しています。

そして名前をEffector Animationと変更しました。

そしてTypeをPlaneと変更しました。

更にEasingの値をIn Out Cubicに変更しました。

この辺の設定は何を指定しているのか、皆目見当がつかないですね。

実装する時に勉強します。

Scaleを0にしました。

こうする事でPlantが成長する事が出来るようになるそうです。

え。

じゃあ、ここの設定が一番重要って事?

またClonerに戻って

EffectorsにこのEffectorを追加します。

Effector Animationに戻り、Transformの設定を以下のようにします。

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

KeyboardのGを押します。

すると以下に示した様な赤と青の四角い枠が表示されます。

このIconを動かすと、

以下に示した様にPlantの生える位置が変化します。

回転させて上下に草が生える位置が変化するようにします。

こんな感じにです。

向きが逆だったと以下のように直しました。

この2つの四角の枠の幅で、Plantの大きさの変化を管理しているみたいです。

2つの四角の枠の幅は、以下のParameterで調節していました。

Plane Spacingの値を150に変更しました。

Sequencerを調整します。

もしVideo Sequencerが表示されてない場合は追加します。

これって後から追加出来るものなんでしょうか?

以下のIconを選択して

Add Level Sequenceを選択すると追加出来るそうです。

何!

これは知らなかったです。一つ勉強になりました。

SequencerにEffector Animationを追加しました。

これはOutlinerにあるEffector AnimationをDrag & Dropして追加しました。

Effector Animationにある+を押してTransformを追加しました。

あ、もうこの辺から大体やり方は想像つくようになりました。

0.00の位置にKeyを追加しました。

6の位置に白いBarを移動します。

白いBar。そういえばこれの正式名称を先週勉強しました。

Play headでした。

あ。

公式のSequencer Editor [10]やCine Camera Actor [11]を読んで勉強するのを忘れていました。

これはこのTutorialの勉強が終わったらやります。

Effector Animationの位置を以下の場所に移動します。

Keyを追加しました。

Level SequenceのPlayを押すと以下のようにPlantがSculptureの表面を生えていきます。

以上でした。

6.3 Unreal Engine 5.4 Plant Growth Effect Tutorial In Under 5 Mins [9]を勉強した感想

Unreal Katya Fedak氏はこのTutorialが最初に作成したTutorialだそうです。

それだと凄い才能の持ち主ですね。

これだけの内容をこんな簡単に短くまとめて教えられるなんて凄いの一言です。

一つだけ改良して欲しい点をあげるとParameterをTweakする時は、そのParameterの機能を一寸でいいので解説して欲しかったです。

LocationとRotationなんかはどんな機能なのかは流石に分かっていますが、

以下のEffectorの設定なんかは何を指定しているのかまったく見当つかないです。

この辺は一寸説明して欲しかったです。

6.4 公式のSequencer Editor [10]を勉強する

携帯が戻ってきたのでOfficial Android Support for Unreal Engine Virtual Camera [3]の実装を使用かと思ったんですが、公式Siteを読んで勉強する事もしないといけない事に気が付きました。

Official Android Support for Unreal Engine Virtual Camera [3]の実装は来週以降にやる事にします。

全部を一変に勉強しても全部忘れてしまうので、少しずつ勉強する事にします。

まずそれぞれの名称です。

まず1の名称はTool Barです。

これはまあ当然ですね。

次は2ですが、Outlinerと呼ぶそうです。

3はTimelineでこれもまあ順当な名称でした。

4はPlayback Controlsだそうです。

うーん。

Tool Barから勉強していきます。

このIconで使用した事があるのは、

これは当然ですね。

これは一回ぐらい使用したはずです。

Cameraを追加するんだったっけ。

RenderingしてImageを生成するためのIconです。

後はこれです。

Fpsを指定します。

これはKey Frame間の補間の仕方をどうやるかをGraphを使用して指定する機能だったはずです。

うーん。

この使用した事のあるIconの機能を勉強します。

<Create Camera>

やっぱり新しいCameraを追加するって書いてありますね。

もしTrackにCameraが無い場合はこのCameraがReferenceされるそうです。

うーん。

Referenceって何をReferenceするんでしょうか?

Renderingする時に使用されるCameraの事を指しているのかもしれません。

<Render>

Render Movieを開きます。

と書いてありました。

やっぱりExport an Audio Track in the Movie Render Queue (Unreal Engine) [8]で勉強した以下のWindowと

このIconを押すと開くWindowは同じものでした。

Export an Audio Track in the Movie Render Queue (Unreal Engine) [8]は今週勉強したのか。なんかかなり昔の気がします。

<Frames Per Second>

FPSの指定をするIconであっていました。

<Curve Editor>

あのKey Frameの補間方法を指定するためのGraphはCurve Editorと呼ぶそうです。

うーん。

毎週勉強する予定なので今週はこんだけにします。

6.5 Sequencer EditorCine Camera Actor [11]を勉強する

先週、Filmbackの設定が何を指定しているのか不明です。と書いていながら

それについてSequencer EditorCine Camera Actor [11]で調べる事はしませんでした。

今回はFilmbackについて調査します。

これを読むとFilmbackってCameraの世界では一般的な用語のようです。

Copilot先生に質問してみましょう。

うーん。

これ図に示してくれないと意味が分からんやつです。

色々参考文献を読んだら以下のようなものだと理解しました。

一般的に言ってCameraのLenzを通して入って来た映像は、Filmもしくは電気的なセンサーの上に投影してそのImageを画像として保存します。

このFilmや電気的なSenserの事をFilm backというそうです。

でこのParameterの設定には以下の種類があるそうです。

要するにFilmの大きさの事を言っていた。って事です。CameraがDigital化したのでFilmも天気的なSensorに変って概念が掴みにくくなったって訳です。

そんだけでした。

7. Houdiniの勉強

今週はHoudini 19 - Wall Tool 13[4]を勉強します。

7.1 Houdini 19 - Wall Tool 13[4]を勉強する

<Intro>

今回はTextureを追加する方法を勉強するみたいですね。

まずDigital AssetのParameter Systemを作るそうです。

Type Propertiesを開きました。

Parameterを開きます。

こんな風にParameterが追加されていました。

むー。

凄い。

まずFolderが3つあります。

あとRampが追加されています。

ここに新しいFolderであるMaterialを追加しました。

Materialsに3つのFolderを追加します。

それぞれの名前は、output_BrickWallOutputノードにある3つのPrimeの名前を使用しています。

MaterialのFolder Typeの名称をSimpleに変更しました。

今度はMaterialのSub FolderにTexture MapをPlugin出来る機能を追加するそうです。

By TypeからFile-ImageをDrag & Dropします。

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

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

さらにDuplicateして4つに増やしそれぞれの名前を以下のように変更しました。

NormalはTextureの設定を変更する必要があるのでは?

Brick Chipsにも同様の処置を行います。

Groutも同様に行うそうですが、TutorialではSkipしていました。

今度はHoudiniの方でMaterial Networkを実装するそうです。

まずMaterial Networkを追加しました。

Nodeです。

小っちゃくて文字は読めませんね。

Matnet1と書かれていました。

何と、Matnet1ノードをClickしてそのNodeの中に入り込みました。

これってNodeを自作しているの?

分からん。

兎に角続きをやって行きます。

Principle Shaderを追加します。

こういうやつです。

うーん。

なんか凄い事になって来ました。

以下のHelp Buttonを押して

以下のWindowを開きます。

このDocumentにこのNodeの使用方法の詳しい説明があるのでここで勉強すると良いそうです。

次は以下のIconの説明です。

このIconをClickすると以下のBoxが表示されます。

このLabsのところに色々なMaterialが既に組んだ状態(Preset)で存在しているそうです。

名前をBrick Faceとしました。

Alt+Dragで複製を作成しました。

複製の作成方法がUEと同じですね。

名前はBrick Chipsとしました。

当然、Goutも作成しました。

Brick Faceを選択して

ここでPoint Colorについて解説しています。

が何が出来るのかよく分からなかったです。

<Linking Parameters>8:30

ここから作成したNodeとType Propertiesを繋げるための設定を行うそうです。

Texture Tabを選択します。

Base ColorのUse TextureにCheckを入れます。

Type PropertiesのDiffuseを選択します。

Channelsを選択します。

TextureをDrag して

以下の箇所にDropします。

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

Type PropertiesのApplyを押して

しばらく待つと

Textureの部分が以下のように変化しました。

Roughnessの部分も同様にします。

Occlusionも同様にします。

Normalはと思ったら

Normalの設定は別なTabでやっていました。

成程。

Normalは以下のTexture PathをDragしていました。

これで以下の4つのParameterとNodeをLinkする事が出来ました。

<Adding Textures>10:45

ここで使用するTextureをTextures.comから取得したそうです。

ああ、

UEじゃないからTextureをQuixel Bridgeから入手する事が出来ないのね。

一寸Textures.comを見てみます。

おお、結構凄そうです。

Uを押して上の階層に移動します。

BrickWallTool_Buildノードまで戻って来ました。

Propertyを見ると

以下に示した様に

Materialの項目が追加されています。

ここに先程Textures.comからDownloadしたTextureをセットします。

以下のIconをEnableしてTextureを表示します。

結果です。

何も変化していません。

これはまだMaterial Assignmentをセットしてないからだそうです。

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

まず以下のXを押してGroupのTabを3つに増やします。

それぞれのGroupにBrickFace、BrickChipsそしてGroutを追加しました。

次にMaterialをセットします。

以下の右端のIconをClickすると

Boxが表示されるので

そこからGroup名と同じOperatorを選択します。

すると以下のようにTextureが表示されるようになります。

全部セットした結果です。

普段、UEでMaterialをいじっている身からするともう一寸工夫の余地がある。と言わざる得ませんが、まあ最初はこんなもんでしょう。

今度はTextureのSizeを変更するための機能を追加するそうです。

<Adding Global Scales>15:00

Type Propertiesに戻って来ました。

Floatを

Materialに追加しました。

DragしてTopに移動します。

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

RangeのMinの値に0.1をセットします。

TextureのSizeが0になっては問題だからだそうです。

これでApplyを押してType Propertiesは閉じてしまいました。

次にMatnet1ノードをClickして

中の階層に入りました。

BrickFaceノードを選択して

Settingを選択します。

Scaleがありました。

せっかく閉じたのにまたType Propertiesを開きました。

もう何をやるのか大体分かっていますが、一応まとめます。

UV Scaleを選択してBrickFaceノードのScaleを追加しました。

はい。

他のNodeのScale Parameterとの整合性はどうするんでしょうか?

最初は以下のようにSizeの値を3にしてそれぞれのScaleを追加しようとしましたが、

出来ませんでした。

なのでScaleに以下のCommandを追加して

直接Pathを示していました。

このPathはそれぞれのNodeのScaleにも写していました。

以上でした。

7.2 Houdini 19 - Wall Tool 13[4]を勉強した感想

想像していたのより3倍位内容が濃かったです。

それぞれのNodeのParameterは簡単に言ってしまえば、InstanceのParameterと同じでそのInstanceが指定しているRangeないでしか参照する事が出来ません。

しかしそのInstanceのParameterが他のInstanceが必要とする場合が多々あり、Instance同士のParameterのPassをどうやって行うのかというのは、Programmingの大きな分野の一つです。

C++ではEventやSignalとSlotなど、色々な方法を用いてInstance同士でParameterの情報をやり取りしています。

今回はHoudini内で別なNode同士でParameterをPassする方法を勉強しました。

更にNodeの中に入ってそのNodeの機能を追加するなど、今までやった事のない設定方法も勉強しました。

TextureのImportはShaderの基礎で、そういう意味ではHoudiniにおいて今回初めてShaderに関係した勉強をしたとも言えます。

8. UEFNの勉強

8.1 CUSTOM Fortnite Character Pt 2 (Animations) - UEFN / Creative 2.0 Tutorial [5]を実装する

<Intro>

特になし

<Creating Verse File / Editable Prop>

Verse Fileを作成します。

名前はCustom Model Deviceとしました。

Visual Codeで開きました。

Prop用のConstantを初期化します。

<Creating Main Update Model Function>

次にFreddyがPlayerを追いかけるためのFunctionを作成します。

FortniteのCharacterを使用するために以下のModuleを追加します。

UpdateModel()関数の実装を追加しました。

<Setting up Mutator Zone to Transform into Custom Character>

Mutator ZoneをLevel上に追加します。

名前はChangeToFreddyに変更しました。

Verseに戻ってConstantのMutatorを作成します。

Event Handlerを追加します。

先週のBlogには以下のように書いていましたが、

これは間違っています。

まずEventは先程のMutatorのRange内に侵入したら発生します。

そのEventを受け取る関数がEvent ListenerもしくはEvent Handlerになります。

それがこのMutator.AgentEntersEvent()関数になります。

Event HandlerはEventの発生を受け取った時に実行する関数を指定する事が出来ます。

この実行する関数の事をCallbackと呼びます。

Mutator.AgentEntersEvent()関数におけるCallbackを指定するための関数が、Subscribe()関数になります。

そしてCallbackはHandleAgentTriggerになります。

はい。

HandleAgentTrigger()関数を追加します。

Suspendのある関数をSuspendの無い関数から呼び出す場合は、Spawn:を追加する必要があります。

UEFNに戻ってVerseをBuildしたりDeviceをLevel上に追加したりします。

DeviceのFreddy Propに

以下のSkeletal Meshをセットしようとしたら出来ませんでした。

そうだPropを作成する必要があったんでした。

今から作成します。

しました。

DeviceのFreddyPropにこのPropをセットしました。

<First Result>

それではTestします。

横向きになってる。

Propに行って向きを直しました。

Testします。

向きは直っていますが浮いています。

これも直します。

まだ一寸浮いている様にも見えますが、これ以上下を向くとFreddyがうつ伏せになってしまうので、これでOKとします。

<Creating Animation Sequence>

Level Sequenceを追加します。

Sequenceを開いてFreddyを追加します。

歩いているAnimationを追加しました。

End Markをあわせました。

秒表示に切り替えます。

Sequenceを表示するためにCinematic Sequence Deviceを配置します。

しました。

そこに先程作成したLevel Sequenceをセットします。

Look PlaybackもEnableしました。

<Cinematic Sequence in Verse / Setting up Animation Update Loop>

はい。

Verseに戻って来ました。

先程配置したCinematic Sequence DeviceをVerse側から管理するためのConstantを作成します。

UpdateModel()関数を改良します。

Brachを追加しました。

Branch内の実装は実行されますが、それと同時にBranchの次に書かれているCodeも実行されるそうです。

<Using SprintedEvent to Change Animation States>

Branchの後に実行するCodeを追加しました。

SprintedEvent()関数が発動すると、止めていたCodeを実行するそうです。

それ以外の時はAnimationを停止しています。

UEFNに戻ってDeviceにRunning CinematicにCinematic Sequence Deviceをセットしました。

<Second Result>

二回目のTestをやります。

歩いている時だけAnimationが表示されます。

先週のBlogを読むと

と書いてありました。

出来てますね。

<Fixing Character Rotation>

Freddyが上下には移動しないようにCodeを改良します。

前のTutorialからCodeをCopyして以下の部分に追加しました。

Errorの箇所を直します。

まず以下のModuleを追加します。

追加したCodeは以下のように改良しました。

FreddyProp.MoveTo()関数のParameterは以下のように変更しました。

ここでTestするのかと思ったら、

やっぱりこの部分の実装は以下のようにLoopの中に書く必要があったと、Codeを移動させています。

同様に移動させました。

このAngleの値がXとYから作成しているからPlayerのZ軸における変化は無視されるはずです。

後、PlayerPosの設定が間違っていたのでそこは直しました。

<Final Result>

はい。

それではテストします。

走っている時に上を見上げました。

うん。

出来ています。

8.2 CUSTOM Fortnite Character Pt 2 (Animations) - UEFN / Creative 2.0 Tutorial [5]を実装した感想

段々VerseとUEFNの関係が分かって来ました。

UEFNでAssetを指定して、Verse側でそのAssetの機能を追加します。

大体はEvent HandlerにCallbackを追加する形式でAssetに機能を追加します。

Callbackには関数が使用されます。

9. DirectX12の勉強

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

9.1.1 Creating a Window | D3D12 Beginners Tutorial [D3D12Ez] [6]の次の10分を勉強す

<Shutdown Method>

DXWindow ClassのInit()関数の最後にReturnを追加しました。

今度はShutdown()関数の実装を行います。

このUnregisterClassW()関数が全部やってくれるそうです。

<Creating the window>

Main.cpp fileに戻って作成したDXwindow ClassのInit()関数が動くか確認しています。

Window.hをIncludeしました。

DXWindowを初期化しました。

WhileにBreak Pointを追加してDXWindowが初期化しているのかを確認しました。

今度はWindow.cppに戻り、

Init()関数の最後に以下の実装を追加しました。

これで実際のWindowを作成しています。

<Creating the window handle>

先程のCreateWindowExW()関数はReturn ValueにWindow Handlerを返します。

それを受け取るVariableを作成します。

Window.h fileのPrivateに以下に示した様にHWND型の変数を宣言します。

名前はm_windowとします。

Window.cppのInit()関数に戻って

以下のように実装しました。

これでCreateWindow()関数のReturn Valueの値をm_windowが受け取るようになります。

更にinit()関数のReturnの値を以下のように変えました。

これでCreateWindow()関数がWindowを生成出来たかどうかをInit()関数のReturn Valueから確認出来るようになりました。

<Testing the window>

実行します。

以下のようなWindowが生成されました。

ただしこのWindow、何をしても反応しません。

例えばWindowを閉じようと右上のxを押しても、何の反応もしません。

これはWindowがFrame毎に同様に反応すべきかを指定してないからだそうです。

そのための関数をWindow.h fileに追加します。

更にWindow.cppにその関数の実装を追加します。

最後のDispatchMessageW()関数だけ意味がよく分からないです。

後は大体理解出来ました。

まずWindowのClose Buttonを押すなどすると、Eventが発生します。そのEventを受ける変数をまず作成します。

これがMSG型の変数であるmsgです。

これにPeekMessageW()関数を使用してWindowが発したEventをmsgにAssignします。

そのままでは理解出来ないのでTranslateMessage()関数でmsgの内容を翻訳します。

そしてDispatchMessageW()関数で何をするの?

どこかにこのMessageを送るのか。

うーん。

この先でEvent ListenerがあってそこでDispatchMessageW()関数から送られたMessageを受け取るのかな。

ここで22:25になったので、今週の勉強はここまでとします。

9.1.2 Creating a Window | D3D12 Beginners Tutorial [D3D12Ez] [6]の次の10分を勉強した感想

前に他のTutorialでWindowを作成した時は、この部分の説明はよく分からなかったですが、今聞くと単なるEventとその処理をどうするのかについての話だと理解出来ました。

勉強の成果が出ている証拠です。

たしかに一週間では一寸ずつしか成長していませんが、この成長は正しい方法で勉強しているから起きている事であり、けっして軽んじてはいけないと思います。

このまま勉強を続けたいと思います。

9.2 「DirectX 12の魔導書」の勉強

9.2.1「4.11 三角形ポリゴンを四角形にしてみる」の「4.11.1 Primitive Topologyを変更する」を実装する

今回は先週の勉強の内容を実装する事にします。

果たして、四角が表示されるようになるでしょうか?

まず今の実装のままで実行してみます。

以下に示した三角形が表示されました。

それではCodeを変更します。

まずVerticesの指定ですが以下のように最初から4つ指定しています。

ここは変更する必要ありません。

次です。

PrimitiveのTopologyの設定を以下のD3D_PRIMITIVE_TOPOLOGY_TRIANGLELISTから

D3D_PRIMITVE_TOPOLOGY_TRIANGLESTRIPに変更する必要があるそうです。

変更します。

更にDrawInstance()関数の最初のParameterの値も3から4に変更します。

はい。

これで四角を表示するための実装の変更は出来たはずです。

実行して試してみましょう。

おお、四角になりました。

出来ました。

9.2.1「4.11 三角形ポリゴンを四角形にしてみる」の「4.11.1 Primitive Topologyを変更する」を実装した感想

前に四角を表示しようとして失敗しましたが、結構惜しかった所までやっていたんですね。

PrimitiveのTopologyのやり方を指定したのは覚えていたんですが、どこでその指定をしたのかまでは覚えていませんでした。

来週からはIndexを使用してVertexの位置を指定する方法を勉強します。

実際はIndexで指定するらしいのでここはしっかり勉強する事にします。

10. まとめと感想

特になし

11. 参照(Reference)

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

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

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

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

[5] Pi Equals Three. (2023, June 12). CUSTOM Fortnite Character Pt 2 (Animations) - UEFN / Creative 2.0 tutorial [Video]. YouTube. https://www.youtube.com/watch?v=7VETvYBZNQc

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

[7] Daniel Batal. (2023, May 21). Camera SHAKE Effect - DaVinci Resolve [Video]. YouTube. https://www.youtube.com/watch?v=bqZiYVl6XQc

[8] Cart & Horse. (2023, June 27). Export an audio track in the movie render Queue (Unreal Engine) [Video]. YouTube. https://www.youtube.com/watch?v=8BowOk2mxdA

[9] Unreal Katya Fedak. (2024, April 10). Unreal Engine 5.4 Plant Growth Effect tutorial in under 5 mins [Video]. YouTube. https://www.youtube.com/watch?v=JJyJD_QDLy0

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

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

 

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

1. 今週の予定

先週のBlogを読み直して今週の予定を建てます。

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

以下の内容について検証します。

<UE内で3D Gaussian Splattingを用いたFilmの作成>

先週作成した3D Gaussian SplattingとSkeletal Meshの構成動画の精度を上げます。

具体的には、

  • 動作の改善
  • 影の修正
    • Sky LightやDirectional Lightの調整
    • 他の3D Gaussian Splattingを試す
  • Dragonが着地した時に土煙のEffectの追加。
  • Cameraの位置の修正(Dragon全体が写る様にする)

などをやる予定です。

<Luma AIを試す>

今度は直線の通路を撮影してみました。

撮影用に使用するだけなので、全方位か見て完璧になる必要はないです。しかし奥行が欲しい場合があります。

これが出来るかどうかを確認します。

<PwnisherのTutorialを勉強する>

勉強出来そうなTutorialを探します。

1.2 AIの勉強

Jeremy Howard氏の Practical Deep Learning for Coders: Lesson 1 [1]の続きを勉強します。

先週、なんだかんだ言いましたがやっぱりJeremy Howard氏のTutorialは素晴らしいです。

これで勉強する事にします。

1.3 Materialの勉強

Ben Cloward先生の Tutorialを勉強します。

その後で、Pwnisher氏のUnreal Engine Materials in 6 Levels of Complexity [2]の続きを勉強します。

Ben Cloward先生のTutorialはしばらくお休みしてUE5の映像生成の学習に集中するかもしれません。

1.4 Gaeaの勉強

GaeaのTutorialの続きを作成します。

今週は、SetMapノードの使用方法の最後の部分、Textureノードの代わりに使用出来るNodeについてのTutorialを作成します。

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

先週作成し直しているSoda Canの続きを作成します。

1.6 Houdiniの勉強

Parameterの追加の続きを行います。

1.7 UEFNの勉強

Pi Equals Three氏のTutorialの勉強をします。

1.8 DirectX12の勉強

Lötwig Fusel氏のDirectX12のTutorialではCreating a Window | D3D12 Beginners Tutorial [D3D12Ez][3]を勉強します。

DirectX 12の魔導書」は「4.11 三角形ポリゴンを四角形にしてみる」の最初の節を勉強します。

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

2.1 UE内で3D Gaussian Splattingを用いたFilmの作成

先週作成したDragonと自転車の映像をBrush upします。

< 動作の改善>

Dragonが自転車を超えて、後ろに下がってから着地しています。

これを直します。

出来ました。

Gifに変換すると画質が落ちるので、YouTubeに上げてそれをここに挿入します。

www.youtube.com

<他の3D Gaussian Splattingを試す>

影の修正ですが、Luma AIにはUE5様に4つのTypeがあります。

これらの違いを試してみます。

以下の3番目のTypeが一番きれいに表示されました。

正しDragonの影とは表示されませんでした。

2024-02-12のBlogにそれぞれのTypeの説明がありました。

これを見るとDynamicだけがUEの光の影響を受けるみたいですね。

三番目のDynamicを使用します。

結果です。

そんなに変化してないので画像だけ示します。

影の修正>

<<Sky Lightの修正>>

以下の部分だけ変更しました。

結果です。

Dragonの色が緑っぽくなりました。

<<Directional Lightの調整>>

取りあえずこれだけ変更しました。

結果です。

<Dragonが着地した時に土煙のEffectの追加>

以下のPackの中からSmokeのNiagaraを探します。

それを調整して使用します。

www.youtube.com

まずEffectは一回だけ再生してくれればいいのに何回も再生しています。

How to use Niagara VFX in Sequencer Unreal Engine 5.1 [4]のやり方でEffectをLevel Sequenceに追加したんですが、このやり方ではダメみたいです。

更にEffectの煙の発生する場所と色も変化させる必要があります。

UE4 - How to activate Niagara VFX while using Sequencer for Cinematics? [5]に以下の回答がありました。

これを試してみます。

結果です。

駄目でした。

EffectのLife Cycleの長さを無理やり引っ張って短くしてみました。

今度はEffectは一回だけ再生されるようになりました。

youtu.be

<Cameraの位置の修正(Dragon全体が写る様にする>

これとSmokeのEffectの修正は来週やります。

<追記>

2024-02-12のblogを見ると

Static Meshの影をGaussian Splattingの上に投影しています。

しかしDragonの影は全く投影されていません。

何故なんでしょう?

2.2 Luma AIを試す

3D Gaussian Splattingで作成した3Dを背景として使用出来ないのか一寸期待しています。

今回はそれを試してみます。

近所の細道を3回位往復して撮影しました。

結果です。

UE5に落とした結果です。

端っこが歪んでいます。

ここはかなりマシです。

左の建物が歪んでいます。

更に左側の植木がボケています。

ボケてない車はNumber Plateの文字まで読めるくらい鮮明に再現されています。

看板に貼ってある紙に書かれた文字がぼやけています。

うーん。

直ぐに使用するのは無理ですね。

やっぱり360度CameraとDroneで撮影しないとこういうのに使用するための3Dは出来ないのかもしれません。

しばらくは携帯で撮影した映像で試してみます。

以下にUE5内で撮影した映像を示します。

youtu.be

youtu.be

画面一杯にして1920x1080の画像で確認するとボケボケです。

2.3 PwnisherのTutorialを勉強する

今週はHow I get UNREAL ENGINE to look like a movie | FULL BREAKDOWN [6]のTutorialを軽く見る事にします。

軽くですが全部見ました。

まず2年前に作成されたTutorialですのでUE4を使用しています。

UIや機能が古いです。

後、ここで語られている事の半分は既に知っています。

しかし残り半分は勉強になりそうです。

うーん。

これをしっかり勉強するのは結構無駄が多い気がします。

同じようなTutorialでUE5で作成し直したのが無いか探します。

うーん。

最新のTutorialから見ていきます。

なんと下から三番目のTutorialが山全体をPhotogrammetryで撮影してそれをUnrealにImportした話でした。

これは最新のTutorialから見ていった方がいいですね。

3.AIの勉強

Jeremy Howard氏の Practical Deep Learning for Coders: Lesson 1 [1]の続きを勉強します。

<Other applications of computer vision. Segmentation>

以下の図を使用してSegmentationでは無くPredictionの説明をしていました。

Segmentationの話はどうなってしまったんでしょう。

というかこれがSegmentationなのかもしれません。

この図は左が正解の図で、右がAIが判断した図です。それぞれPixel毎に車、道路、壁、岩などを判断しています。右の色分けを見ると車の部分とか、結構間違えています。

このTrainingを繰り返す事で、AIの判断が正しいものに近づいていくそうです。

やっぱりそうでした。

Copilotにも質問してみましょう。

まずDeep LearningにおけるSegmentationの一般的な意味です。

なんとImageをObject毎に分割する手法をSegmentationと呼ぶそうです。

成程そういう解釈もあるのか。

要するに画像に写っているObjectを分割するのが目的って事です。

Segmentationには以下の2種類があるそうです。

はい。

Objectに分割するだけでなく、それぞれのInstance毎にも分割しているのがInstance Segmentationって事ですね。

分かりました。

次にDeep LearningとSegmentationの関係についても説明していました。

このSegmentationを達成するためにDeep LearningではU-Net, Mask R-CNN、そしてFCN(Fully Convolutional Networks)などがあるそうです。

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

うん。

納得です。

<Segmentation code explanation>

今度は以下に示したSegmentationDataLoaders()関数のParameterの解説をしています。

先にSegmentationDataLoaders()関数のAPIを見て、それぞれのParameterが何を担当しているのかを確認してしまいましょう。

公式SiteのVision data [7]に説明がありました。

こんなにParameterがあるの?

以下にそれぞれのParameterの説明も載せておきます。

ほとんど説明してないですね。

今回の例で使用しているのはPath、bs、fname、label_func、そしてCodeの5つです。

PathはLoaderがDataを読み込むために見るFileの場所でしょう。

BsはBatchのSizeだそうです。

Batchは先週勉強しました。

これです。

これのSizeが8ってどういう事?

Fnameは何の名前でしょう。ここには何の説明もありませんね。

Label_funcは何からの関数をパスすると思われますが、何のための関数なのかが不明です。もしかしたら先程Copilotが教えてくれたU-Net, Mask R-CNN、そしてFCN(Fully Convolutional Networks)などのSegmentationをするための色々な手法をここで指定するのかもしれません。

最後のCodeですが、これは何をやっているのか全くわかりません。

うーん。

全然分からない。

取りあえずTutorialの説明を聞きます。

Data Blockで勉強した事とほとんど同じ事をここでもしていると言っていました。

そうなの?

Data Blockの説明を読み直してみます。

見直して来ましたが全然似てないです。

Tutorialの説明を聞いたらfnamesがImage Fileを得ているから、そこがData Blockと似ていると言っていました。

Data Blockを見直して来たら確かに以下の要素がGet_image_files()関数を使用していました。

でもこれって似ているのか?

Label_funcは何かのPathを返してるそうです。

このLambda式が読めない。

これってPython特有の書き方なんでしょうか?

Copilotに聞いてみます。

はい。理解出来ました。

OがParameterでこの例の場合はStringになる訳です。

そしてこのParameterが例えばBirdだった場合は、path/’labels’/f’{bird.stem}_P{bird.suffix}になります。

F{}_P{}の意味が分からないですね。

これもCopilotに聞いてみます。

これはF-Stringsというモノのようです。

この説明を読むと、単純にOにStringをパスしてはいないみたいです。O.Stemと言うParameterを読み込んでいるみたいです。

のでここではOがBirdのようなStringではない可能性が高いです。

単純なStringを使用する場合は以下のようになるそうです。

もう分からないのでこのLambda式を直接copilotに打ちこんでこの式の説明してくれ。と書き込みました。

結果です。

最後のPの解釈の部分には一寸疑問が残りますが、大体はこんな感じなんでしょう。

これぐらいの理解で今は十分です。

先に進みます。

今度はCodeの説明です。

Codeの意味はここに指定したTextだと言っていました。

このTextにCodeの関係した内容が書かれるという事でしょうか?

何でこれらの情報が必要なのか不明ですが、また一回目の勉強なのでここは軽く流す事にします。

Data Blockと同じようにLearnをしてFine Tuneをしています。

Data Blockでは以下のようにしていました。

SegmentationではUnet_learner()関数を使用していますね。

<Tabular analysis with fastai>

今度は表を作成するTabular_learner()の話に突然変わってしまいました。

Tabular AnalysisのLoaderです。

これってTableのDataを読み込んでいるんでしょうか?

それぞれの要素はまあ、良いです。これは実際に使用する時に確認します。

Show.Batch()関数で以下の表を示しています。

うーん。

表になっていますね。

<show_batch method explanation>

Data Tableの時はFine_tuneを使用しないそうです。

これってAIじゃなくない?

と思ったらやっぱりTableを作成するこれはAIに学習させる必要はないそうです。

それゆえにFine_tuneもする必要が無い訳です。

<Collaborative filtering (recommendation system) example>

突然この話が始まっています。どういう意味でしょう?

Collaborative FilteringについてCopilotに質問してみました。

要するにUserに対して表示するDataの選別を行う手法です。

このUserの好みに合わせてって英語で書いてある場合、本当にUserの好みに合わせている場合は0です。

まさか研究機関でそんな事をしているとは思いませんがこのCollaborative Filteringの実際のAlgorithmがどうなっているのかとても興味があります。

Collaborative FilteringのLoaderです。

これは指定している要素は少ないですね。

Show Batch()関数で以下のようなDataを示しています。

うーん。

これはどう解釈したらいいのか?

Collaborative Filteringが、このShow_Batch()のCommandを打った人が見たいDataは、それぞれのUserのIDと好きな映画である。と判断したって事なの?

違う気がしますが、もう少し説明が欲しいですね。

次の例です。

こっちはFine_tuneを使用しています。

Collaborative FilteringはFine Tuneを使用する事も出来るそうです。

結果です。

Fine Tuneが増える度にValid Lossが減っています。

Show_results()関数を使用して結果を表示します。

このShow_results()関数はFastAIにあるどのModelに対しても使用出来るそうです。

<How to turn your notebooks into a presentation tool (RISE)>

今度はPCをそのままPresentation用のBoardに変化させる方法について解説しています。

以下のRiseを使用するそうです。

この辺はなんか広告って感じです。

この教授の書いた教科書が無料で読めるSiteの紹介があったのはここでした。

という事は前に一応、ここまでは見たって事ですね。

<What else can you make with notebooks?>

ここも前の続きでした。

<What can deep learning do presently?>

Deep Learningで何が出来るのかを示しています。

結論は、何にでも応用出来るって事です。

<The first neural network - Mark I Perceptron (1957)>

歴史の話です。

最初のNeural Networkについて解説していました。

何と1957の頃と理論はそんなに変わってないそうです。

では何が変わったかと言うと、以下の3つが変わったそうです。

  • GPUの発達
  • SSDの発達
  • Netの発達による大量の学習用Dataの獲得

だそうです。

うーん。

回りの環境が変わった事によってDeep Learningはこんな革命的な変化を起こしたのか。

これはびっくりです。

通常のProgrammingです。

InputがあってProgramが何かをして結果が出ます。

Machine Learningの場合です。

Input以外にWeightsがあります。

ありますが、ほぼ普通のProgrammingと同じ結果です。

<Machine learning models at a high level>

次のModelです。

結果からLossを計算してそれを元に次の計算のWeightsの値を調整しています。

うええ。

こうやってMachine自体が学習出来るようなProgrammingを組んでいたのか。

驚きです。

そうしてTrainingが終わったら以下のようにして使用する訳です。

はあ、成程。

これはProgrammingが要らなくなる訳だ。

<Homework>

以下の宿題をやる必要があるそうです。

  • Kaggleを使用してこのLectureでやったBirdとForestを分けるようなDeep LearningのCodeを書く事。
  • 教科書のChapter1を読む事

そして以下の場所でやった内容を発表するそうです。

これって誰からも見る事が出来るんでしょうか?

私は別にこの大学で授業を取っている訳では無いので宿題をやる必要はないですが、この大学の学生がどんな風に宿題をやったのかをみるのは楽しいです。

これは後でCheckしてみます。

と思ったら学生がやった内容が紹介されていました。

これはBirdとForestの違いよりはかなり難しそうです。

でも傾向は全く同じですね。

以下の例ではCucumberとZucchinisの違いについて検討していました。

こっちは実用性が高そうです。

Zucchiniはまずいです。前に間違えて買って後悔した記憶があります。

これは何を比較しているんでしょう?

Cultural Urban Characteristicsって書いてあるけど、都市の衛星写真を見てどの国の都市かを当てられるかを調べたみたいですね。

結構当たってるのか、

こっちはDroneで撮影した画像に写っている家が、建築済み、建築中、土台だけに色分けされるようにAIをTrainingしたみたいですね。

Segmentationの技術を使用したと書いてあります。

うーん。

Segmentationってこうやって使用するのか。

こんなのズルい。

他の分野の専門家がAIに参入するとイキナリこんな事が出来るのか。

でも凄いです。

こんな所から将来のNobel賞が生まれるのかもしれません。

他にも凄い例も紹介していました。

うーん。

凄い。

私は、政治家の選挙ポスターとその政治家が当選したか落選したかのDataを勉強させて、

今度の選挙で選挙ポスターからその政治家が当選するかどうかを予測する

Deep Learning占いみたいなYouTube受けしそうなIdeaを考えていました。

4.Materialの勉強

4.1 Ben Cloward先生の Tutorialを勉強する

Ben Cloward先生のTutorialはしばらくお休みしてUE5の映像生成の学習に集中する事にしました。

4.2 Pwnisher氏のUnreal Engine Materials in 6 Levels of Complexity [2]の続きを勉強する

先週の続きを勉強します。

今週からMaterialの勉強は一端中止して、Pwnisher氏のUE5のTutorialを勉強する事にします。

<Level 3 - Swap between Textures or 0-1 Sliders>

今度はLevel3です。

今まで作成したAlbedoの実装と単純なColorをSwitch Parameterノードで切り替える事が出来るようにします。

ホントに簡潔に整理されています。

しかしこれだけであの写真のような美麗なLevelを作成する事が出来るんでしょうか?

SpecularとRoughnessにも同様に追加します。

更にMetallicにもParameterを追加しました。

<Level 4 - UV Controls with Material Functions>

Level4です。

Material Functionを作成しています。

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

全てのTextureノードのUVに繋げました。

TestするとそれぞれのMaterialが回転していました。

またMaterial Functionに戻って以下の実装を追加しました。

MaterialのScaleを管理するParameterです。

今度はPositionつまりOffsetの指定です。

Master Materialに戻って以下のようにParameterを追加します。

全部のParameterをPSR Groupに追加します。

<Level 5 - Surface Imperfections>

Level 5です。

以下の場所にあるSurface Imperfectionを追加します。

これって無料なんでしょうか?

見てみましょう。

30ドル以上してました。

こういうのは自分で作成する事にします。

この中から一枚のTextureを使用してRoughnessに追加しました。

BrightnessとContrastを追加しました。

何とこの結果をLerpのAlphaに繋げてしまいました。

うーん。

これはBrightnessと同じ結果になる気がしますね。

無駄なんじゃないでしょうか?

Brightnessとは違う効果があると言っていました。

そうなのか?

これは後で実装する時に確認します。

今まで作成したRoughnessとこの実装をSwitch Parameterノードで合成します。

Lerpノードをもう一回使用してSwitch ParameterノードのTrueにSurface ImperfectionとRoughnessの混合の結果をPassします。

そしてSurface ImperfectionのUVに先程作成したMaterial Functionを繋ぎます。

ここでMaterial FunctionのInputを作成した意味が出て来るのか。

さっきまでこれだったらParameterでも変わらないじゃないかと思っていました。

<Level 6 - Dirt Texture Overlay>

まずは以下のようにしてDirtをBase Colorに追加していました。

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

Surface Imperfectionsと同じです。

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

最後にSwitch Parameterノードを追加しました。

更にMaterial Functionを追加してTextureのUV値の管理も行っています。

これで実装は終わりのようです。

<Migrate to Other Projects>

このやり方よりMigrateした方が良いと思いました。

それよりFolder名に

Lego Japanって書いてあります。

これってやっぱりPwnisher氏って日本に住んでいるって事?

<Using our Material (finally!)>

最後に実際に使用している例を示しています。

コンロの端の部分のMaterialの作成方法を示しています。

以下に示した様にInstance Materialをセットして値を調整しています。

この辺の具体的な値はこのMaterialが完成してから別に勉強する事にします。

<If you liked this video, then check these out!>

単なるOutroです。

4.3 Pwnisher氏のUnreal Engine Materials in 6 Levels of Complexity [2]を勉強した感想

まずPwnisher氏の整理力が凄いです。

教えている内容は基本的な内容です。

今の私は当然知ってなければならない内容ですが、こんなにきちんと整理する事は出来ません。

後、結果が凄い。

こんなにPhoto-Realisticな形状を作成出来るのは驚きです。

しばらくはPwnisher氏のTutorialで勉強する事にします。

5.Gaeaの勉強

GaeaのTutorialの続きを作成します。

5.1 TutorialのためのPowerPointを作成する

今週は、SetMapノードの使用方法の最後の部分、Textureノードの代わりに使用出来るNodeについてのTutorialを作成します。

作成したPowerPointです。

題です。

SetMapシリーズの結果です。

今回のLecture内容です。

今回で初級者としてNodeを組むのは最後になります。

ので初級者と中級者との違いとは何かを説明しています。

その上で、初級者から中級者になるためのヒントとして今回のTutorialを作成した旨を説明しています。

まずTextureノードは単に白黒の色合いを追加しているだけなので、他のData GroupのNodeでも代用できるんじゃね。

とまあ、基礎に足して少し軽んじている感じで上から目線で指摘をするのが中級者の最初の入り口です。

で試してみます。

すると出来る訳です。

しかしTextureノードでやった方が結果は綺麗に出る訳です。

ここでやっぱり基本は大切だ。と悟る訳です。

しかしですね。ここで終わってしまったらいつまでたっても初級者のままで中級者にはなれないんです。

一工夫するんです。

Textureノードに単体では勝てないですが、Textureノード+他のData GroupのNodeだったらどうか。

と工夫を追加するんです。

すると、Textureノード単体で使用するよりきれいな結果を得る事が出来ました。

これで基本を破って更によい結果を出す事に成功しました。中級者になれたわけです。

今回、色々なNodeを試すのにFxノードを追加する必要が出て来たので、FxノードとColor Fxノードの違いについても簡単に説明しました。

最後にまとめです。

5.2 PowerPointのSlide ShowをしながらNVidiaの録画をしたら画面がチラついた件

画面が一秒ぐらい真っ黒になって元に戻って、また黒くなる。を繰り返すようになりました。

以下の方法で直りました。

FileからOptionを開き詳細設定を選択します。

表示にある「スライドショー実行中はハードウェア グラフィック アクセラレータを無効にするにCheckを入れます。

これでSlide Showを実行しながらNvidiaで録画しても画面が黒くチラつく事が無くなりました。

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

今週もSoda Canの続きを作成していきます。

6.1 先週の復習

先週の内容を簡単にまとめ直します。

先々週、Unreal Engine 5.4: Create STUNNING Product Commercials with Motion Design [8]を実装しました。

実際に実装するに当たって以下の問題がありました。

これらの問題を解決するためにはもう一回Soda CanのMotion Designをやり直す必要がある。との結論により先週もUnreal Engine 5.4: Create STUNNING Product Commercials with Motion Design [8]の実装をやり直していたんでした。

3番目の「生成したImageを60fpsでVideoに変換する方法が分らない(Davinci Resolve)」は先週のBlogに詳しいやり方がまとめられていました。

既に解決しています。

2番目の問題である「MaterialからEmittしている色の光が強すぎて、Rectangle Lightの光がよく見えなくなった」に関しては以下に示した様に

<<Planeのみ>>

<<Rectangle Lightのみ>>

<<両方>>

Planeの位置と大きさを変化させる事で、Tutorialと同じような感じにする事は出来る事は確認しました。

この問題は何かを設定するのを忘れたからではなく、単にPlateのSizeと位置が違うと結果も違うという事だと思います。

それでこの問題も解決しました。

よって先週解決しなかった問題は最初の「Static MeshのSoda CanがNull ActorにAttach出来なくなってしまった」だけです。

6.2 Unreal Engine 5.4: Create STUNNING Product Commercials with Motion Design [8]の続きをやる

「Static MeshのSoda CanがNull ActorにAttach出来なくなってしまった」を試すためにTutorialの続きをやって行きます。

<Post Process Volume>

Post Process Volumeを追加して

Infinite Extent(Unbound)にCheckを入れました。

Exposureの設定をManualに変更します。更に値も10に変更します。

結果です。

うん。

まあ綺麗ですね。

<Positioning and Movement of Can>

Soda Canの向きを変更しました。

ここからです。

ここのやり方を前回は完全に真似する事が出来なかったんです。

2024-05-12のBlogに詳しくまとめていますが、

Null Actorを生成する前からSoda CanがSequenceに追加されていました。

これが「Static MeshのSoda CanがNull ActorにAttach出来なくなってしまった」原因なのではないかと思っています。

今回はSoda CanのStataic MeshはSequenceに追加されていません。

Tutorialの説明と同じやり方でやる事が出来ます。

まずSoda Canを選択します。

以下のIconを押します。

Null Actorが生成されました。

Null Actorの名前をCTRL_Canに変更します。

そしてSequencerに追加します。

2024-04-14のBlogにはどうやって追加したのかは記されていませんでした。

Tutorialを見て確認します。

CTRL_Canを選択した状態で以下のようにしてSequencerに追加していました。

同じ様にします。

しました。

同様にSoda CanのStatic Meshも追加します。

これでSoda CanのStatic Meshの設定は完成しました。

この後Editorを起動しなしたら「Static MeshのSoda CanがNull ActorにAttach出来なくなってしまった」問題がSoda CanのStatic MeshがSequenceに先に追加されてしまったからかどうかが判明します。

一回Editorを閉じて起動し直しました。

うん。前と同じですね。

この後、このTutorialではLevel Sequenceの設定方法を詳しく解説しています。

この部分は今の私に非常に足りない部分なのでここはもう一回勉強する事にします。

<<SequenceのFPSの値を変更する>>

はい。

もうどうやって変更するのかまったく覚えていません。

以下の箇所から変更していました。

60 fpsに変更しました。

これってUE5.3には無かった気がします。

まあそれは良いです。

次に行きます。

<<撮影終了時のFrameの指定>>

今度は撮影を終了するFrameの設定です。

撮影の終了は以下の赤いBarで指定していたはずです。

しかしここでは以下のIconを開き

以下のBoxのEndから指定していました。

Endに300を指定しました。

赤いBarの位置が以下のようになりました。

2024-04-14のBlogには以下のように書いてありましたが、

これは間違っていますね。

今以下の数字を確認すると0になっています。

Sequenceを見ると白いBarが0の位置にいます。

この数字はこの白いBarの位置を示しているはずです。

試しに150に変更しました。

結果です。

白いBarの位置が150に移動しました。

この状態で白いBarを右Clickして以下のBoxを表示させて

Set End Timeをセットすれば同じになります。

白いBarの位置を60にセットしました。

ここにCTRL_CanのTransformの値をセットしました。

今度は白いBarの位置を0にセットしました。

CTRL_Canの位置を下に移動します。

Soda CanではなくCTRL_Canの位置を移動させます。

Canが消えました。

この状態でKey Frameを追加しました。

Frameが0の位置にKey Frameが追加されています。

0の位置にあるKey Frameを選択すると

以下のBoxが表示されるので、

Exponentialを選択します。

そうだ。

「Static MeshのSoda CanがNull ActorにAttach出来なくなってしまった」が起きないようになったかどうかは、このようにLevel Sequenceに位置を指定した後でテストする必要がありました。

今、テストしてみましょう。

Editorを閉じて開いてみます。

Sequenceです。

何も変化していません。

Soda Canも同じ位置に配置されています。

全く問題ないです。

「Static MeshのSoda CanがNull ActorにAttach出来なくなってしまった」問題は、Soda CanのStatic MeshがNull Actorを生成する前に、Sequenceに追加されてしまったので起きた問題だと判明しました。

Tutorialの残りはLevel Sequencerの操作とは関係ないので、ここで終わりにします。

6.3 3つの問題を解決して

一応、先週の課題であった以下の3つの問題は全部解決しました。

しかし、まだまだ勉強しないといけない部分が沢山ある事も判明しました。

以下にUE5で映像を作成するためにこれから勉強しないといけない分野をまとめておきます。

  • Level Sequenceの使用方法
  • Cine Camera Actorの使用方法
  • 3D Gaussian SplattingをUE5内で使用する方法
  • Motion Designの勉強

こんな感じですか。

この節で勉強しないといけないのは「Level Sequenceの使用方法」と「Cine Camera Actorの使用方法」ですね。

以下にもう少し深く掘り下げます。

<Level Sequenceの使い方>

今回は白いBarとか赤いBarとか読んでいますが、これらのBarの正式名称とか、全然分かりません。

後、Frame Rateの設定と撮影の終わりを指定する方法は分かりましたがそれ以上はまだよく分からないです。

Level SequenceのEditorについては公式のSequencer Editor [9]に詳しい説明がついていました。

これを辞書的に使用して理解を深める事にします。

早速、赤いBarと白いBarの正式名称が分かりました。

以下のところで説明されていますが、赤いBarはEnd(Red) Marker、白いBarはPlayheadというみたいです。

PlayheadをClickしたら以下のPageに飛びました。

物凄く詳しく解説しています。

全然知らない機能がいっぱい説明されていました。

こういうのはやりながら覚えないと身につかないので今回は軽く見て終わりにします。

<Cine Camera Actorの設定>

このTutorialではPost Process VolumeでAuto Exposureの設定をしていましたが、Cine Camera Actorでするのとどう違うんでしょうか?

後以下の設定も何を指定しているのか不明です。

Cine Cameraの設定にしても同様に公式のCine Camera Actor [10]に詳しい解説が載っていました。

Cameraから設定するPost Process Volumeについての解説も載っていました。

Cameraから設定したらCameraから見た場合だけPost Processがかかるようですね。

最終的な結果は同じですが、PCの画面で確認する場合は大きく違いますね。

7.Houdiniの勉強

今週は先週作成調査したParameterをBrickwall_toolに追加していきます。

7.1 Parameterの追加方法を復習する

2024-05-19のBlogを見てBrickwall_toolにParameterを追加する方法を復習します。

大体分かりました。

以下にまとめ直します。

Type Propertiesを開きます。

開き方が分からないじゃん。と思ったら2024-05-12のBlogにやり方が書かれていました。

追加したいParameterをDrag and DropしてType PropertiesのRootにDropします。

ここ注意しないといけないのはRootにdropする事です。

はい。

以上です。

7.2 Parameterの追加

それでは先週調査したParameterを追加していきます。

Type Propertiesを開いたら以下のような画面になっています。

???となっていると

ParameterというTabがありました。

これを選択したら期待している画面が表示されました。

Existing Parameterを見ると以下のようになっていました。

ム。

これはRootではなくFolder Wall Parameterに追加すべきなのか。

そうでしょうね。

<Resample Brick Spacingノード>

Resample Brick Spacingノードの

Lengthを追加してみましょう。

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

そして以下に示したParameter Descriptionが表示されました。

あ。

これの正しい指定方法を復習するのを忘れていました。

確認します。

Parameter Tabでは名前とLabel名を変更していました。

ChannelではDefault値がParameterの値と同じになっているか確認していました。

名前は以下のように設定しました。

これで出来たはずです。

Applyを押してAcceptも押しました。

Brickwall_toolを開いて確認してみます。

Brickwall_Tool_buildを右ClickしてParameters and Channelsを選択してParametersを選択します。

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

そうだ。

これらのParameterが正常に作動するのかのTestを行う必要がありました。

うーん。

Testは全部のParameterを追加してからやる事にします。

いや。やっぱりやってみます。

先週のBlogによれば、このParameterをいじると

Brickの横幅が変化するそうです。

Defaultの0.97の場合です。

Resample Brick Spacing Lengthの値を3に変更してみました。

結構計算に時間がかかっています。

結果が出ました。

おお。Brickの横幅が3倍位の長さになりました。

出来てますね。

<Attribwr Angle Shuffle Bricksノード>

これですね。

これは以下のParameterを追加するそうです。

早速追加しました。

名前は以下のようにしました。

Default値が正しくセットされているのも確認しました。

Applyを押しました。

Errorになりました。

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

Segmentation Faultがあるって事はaccessしてはいけないMemoryにAccessしてるって事でしょう。

なんか直すのが大変そうなErrorです。

ああ、HoudiniがCrashして閉じてしまいました。

これは思っているより大変かもしれませんね。

もう一回開いたら普通にParameterとして残っていました。

LabelはMultiに変更しました。

Testして試そうかと思ったんですが、この値が何を変化させるのかが不明です。

後、変化させていい値のRangeも不明です。

うん。

さっきのResample Brick SpacingノードのLengthのテストで、許容範囲以上の値を入れてしまったのかもしれません。

それだってもしからしたらSegmentation Faultの原因になるかもしれません。

うーん。

Testは、

  • Parameterが何を変化させるのか。
  • そのParameterが取り得るRangleはどの範囲なのか

が判明してからやる事にします。

今週は取りあえず、全部のParameterをBrickwall_toolに追加する所までやる事にします。

<Line Brick Depthノード>

以下のNodeの

Lengthを追加します。

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

これは名前を見ればBrickの奥行の長さを決めるためのParameterです。

この名前が妥当でしょう。

Default値があっているのも確認しました。

ApplyとAcceptを押しました。

前のようなErrorは起きませんでした。

Brickwall Toolを開いてみます。

Brick Depth Lengthが追加されています。

あ。

Attribwr Angle Shuffle BricksノードのParameterの名前がMultiとしか表示されていません。

やっぱりここはしっかりしたLabel名を考える必要がありますね。

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

このParameterはどんな変化を示すのかはっきりしているのでTestする事にします。

半分の0.15にしてみました。

結果です。

Brickの奥行の長さが半分になりました。

<Attribwr angle Brick Jitterノード>

のMultiを調整します。

あ、そうかAttribwrangleノードのParameterは必ずMultiになるのか。

となるとBrick Jitter Multiとかの名称にすれば、MultiがついているからAttributewangleノードでBrickのJitterを調整するためのParameterであると推測出来るようになるのか。

ただJitterって普通は機械がRandomに震える事を指します。

ここでは以下に示した様にそれぞれのBrickがRandomに配列される事を指します。

この名称からそれを推測するのは難しいです。

以下のように追加しました。

名称です。

Default値の確認です。

Applyを押してAcceptを押しました。

特にErrorも起きませんでした。

Brickwall Toolを開いて確認します。

Brick Jitter Multiが追加されています。

このParameterは指定出来るRangleは不明ですが、どんな効果が起きるのかはわかっているのでTestする事にします。

Default値の時です。

値を0.2に上げました

あんまり変化しないな。と思って横から見たがBrickの位置が凸凹になっていました。

凄い効いていました。

<Carve Tweak Brick Widthノード>

を追加します。

名称は以下のようにしました。

Default値も確認しました。

Applyを押してAcceptを押したら、またsegmentation Errorになりました。

再起動させたら普通に動いたので続きをやります。

Brickwall Toolを開くとTweak Brick Widthが追加されていました。

Testします。

Defaultの時です。

Tweak Brick Widthの値を0.08にしました。

Brickの横の隙間が長くなりました。

出来てます。

<Attribwr angle Mask Noiseノード>

結構疲れて来ました。

なんとここではRampがParameterとしています。

これってそのまま追加して表示してくれるんでしょうか?

うーん。

試してみますか。

無理やり追加してみました。

名前を変更しました。

他のParameterはこんな結果になっていました。

RampのParameterは実際は以下のようになっています。

こんなの駄目じゃん。

でもよく分からん。

これはCancelしておきます。

後でもっとHoudiniの実力がついてからこれには取り組む事にします。

<Attribwr angle Crack Ratioノード>

を追加します。

名称です。

Default値も確認しました。

結果です。

Crack Probabilityの値をいじってみます。

0.5にしました。

ヒビが無くなった?

変化したのは分かりますが、どう変化したのかが今一分かりません。

1に戻しました。

あ。

Brickのひび割れが増えています。

そう言う事でした。

<Color Tint Brickノード>

です。

これの追加方法はまだわかりません。

今回はPassします。

<Delete Small Parts1ノード>

を追加します。

名前は以下のようにしました。

Default値の確認も行いました。

Acceptを押してその後、Testも行いました。

値を0.5に変更すると

こんな結果になりました。

0.5以下のBrockは表示されなくなっています。

<Peak1ノード>

を追加します。

何とこのParameterは、先週のBlogに

Rangeの範囲が指定されていました。

これは早速指定してみます。

名前は以下のようにしました。

このParameter、Brickの角を削る役割がある事は分かりましたが、それ以上の事が分かりません。

ので名称はそのままにしておく事にしました。

Rangeの指定を以下のようにしました。

Errorも起きずに追加する事が出来ました。

Testします。

Distance Peak1の値を0.01にしました。

Brickの角が残っています。

<Color Brick Chipノード>

を追加します。

このTypeのParmeterはまだ追加した事ないですね。

やってみましょう。

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

うん。

これは出来ているのか?

名称は以下のようにしました。

RangeはDefaultで0~1の間となっていました。

Default値の以下のようにRGBのそれぞれの色が指定出来るようになっていました。

Acceptを押してもErrorにはなりませんでした。

Brickwall Toolを開くと以下のようにColor Brick Chipが追加されていました。

赤くしてみました。

結果です。

Brickの削れた部分が赤くなっています。

出来てますね。

<Re-Mesh Grid Groutノード>

の2つを追加します。

まず最初のDivision Sizeを追加しました。

名称は以下のようにしました。

これは割っているので最大値は1のはずです。

最小値を0にしてしまうとErrorになってしまうと思われますが、どうなんでしょうか?

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

このParameterは元からRe-Mesh Grid Groutノードに備わっていたParameterですし、多分これであっているんでしょう。

このままにしておきます。

Applyを押したらErrorになりました。

もしかしてRangeが0からだったからか?

再起動します。

もう一方のParameterも追加しました。

名称です。

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

Default値の確認もしました。

Acceptを押してもErrorになりませんでした。

Brickwall Toolを開くとParameterが追加されていました。

もう時間が無くなって来ました。

Testはまたの機会にします。

<Color Tint Groutノード>

最後のParameterです。

を追加します。

これはColor TypeのParameterですね。

前にやったのと同じはずです。

名前は以下のようにしました。

Default値の確認も行いました。

Acceptを押してもErrorになりませんでした。

Brickwall Toolを開くと以下のようになっていました。

赤くしました。

結果です。

きちんと作動していますね。

7.3 Parameterを追加した感想

まずRangeの正しい範囲を調べるのを忘れていました。

後、ParameterのTypeがRampの場合はどうやって追加すれば良いのかが分かりません。

Colorはすぐに追加出来ました。

後、今の時点でこの部分にこだわるのも良くない気がして来ました。

ので来週はもう次のTutorialの勉強に移行します。

以上です。

8.UEFNの勉強

8.1 CUSTOM Fortnite Character Pt 2 (Animations) - UEFN / Creative 2.0 Tutorial [11]を勉強する

先週まであれだけ批判してまだPi Equals Three氏のTutorialを勉強するのか。と言われそうですが、まあ続ける事にしました。

<Intro>

今回は何をやるのかと思ったら、前のFreddyが追いかけて来るTutorialを作り直して、きちんと動くようにした新しいTutorialをここでやるみたいです。

やっぱりあの時のTutorialの評判は散々だったみたいですね。

<Creating Verse File / Editable Prop>

新しいVerseのDeviceを追加しています。

名前はCustom_model_deviceになっていました。

VerseをVisual Codeで開いてProp用のConstantを初期化します。

ここに先週作成したSkeletal MeshのFreddyを追加するんでしょうね。

<Creating Main Update Model Function>

次にFreddyがPlayerを追いかけるためのFunctionを作成します。

TutorialではMethodっていっていますが、C++系のProgrammingならFunctionって言うべきだと思います。

あ。

VerseはPython系だった。

じゃMethodっていうべきなのか。

まずMethod名です。

SpecifierとしてSuspendsを使用していますね。

Suspendsの意味を忘れてしまっています。Loopを使用する時に必要だったんでしたっけ?

調べます。

2023-10-09のBlogには以下のように書かれていました。

確かにこの通りなんですが、Loopについての説明が無いですね。

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

これです。

後、Suspendに関して重要な事が2024-03-24のblogで説明されていました。

Suspendを指定しているMethodを呼び出すMethodにはSuspendの指定が必要です。

しかし以下の方法で実装するとSuspendが無いMethodでもSuspendがあるMethodを呼び出す事が出来ます。

Spawn:が追加されています。

これでSuspendが無いMethodからでもSuspendがあるMethodを呼び出す事が出来ます。

Module、Charactersを追加しています。

そしてagentからFortniteのCharacterを受け取ります。

いつものやつですね。

受け取った後はLoopです。

これもSuspendを追加している事から予想出来ていました。

FreddyをPlayerの位置に移動させます。

これも散々使用したMethodです。

GetViewRotation()関数は初めて使用するかもしれませんね。でもその名前から何をしているのかは明白です。

更にLoopの前にPlayerがHide()になっているようにします。

うん。

なんで?

これはあんまり意味が分かりません。

実装する時にこの理由を確認します。

<Setting up Mutator Zone to Transform into Custom Character>

このMethodを発動させる方法ですが、今回はLevel上からItemを使用して発動させるそうです。

Level上に以下のItemを配置します。

名前をChangeToFreddyと変更します。

Verseに戻ってConstantのMutatorを作成します。

Level上に配置したMutatorにVerseからAccessするためのConstantですね。

MutatorのBox内に侵入した時に発動するEventをここで指定します。

HandleAgentTriggerというEventが発動します。

ただしHandleAgentTriggerと言う名前のMethodはまだ作成してないのでErrorになっています。

このEvent、何年も使用していますが、理屈を完璧に理解したのは最近です。

確認のためにその時のBlogをもう一回読む事にします。

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

これ読むと、EventはPlayerがMutatorのBoxに侵入した時に発生しますね。

HandleAgentTriggerに指定された内容を実行するのはEventでは無かったです。

そしてEvent Listenerは以下の関数になります。

最後のEvent ObjectがHandleAgentTriggerになります。

うーん。

また勘違いして解釈してしまっていた。

HandleAgentTrigger()関数を追加します。

この関数内では先程作成したUpdateModel()関数を呼び出しています。

Suspendのある関数をSuspendの無い関数から呼び出す場合は、Spawn:を追加する必要があります。

UEFNに戻ってVerseをBuildしたりDeviceをLevel上に追加したりしています。

後はDeviceのParameterに適切なAssetをセットとかもしています。

<First Result>

テストします。

Mutator Zoneがどこなのかわかりません。

適当に走っていると

以下に示した様に巨大なFreddyが追いかけて来ました。

<Fixing Character Position Offset>

まずFreddyが浮いているのを直します。

Propを開いてFreddyの位置を直します。

あれ?

前回のTutorialでPropまで作成していたのか。

これは来週実装する時にやる事にします。

<Creating Animation Sequence>

更にAnimationを追加します。

Level Sequenceを追加しました。

Freddy Animation Runningと名付けました。

Sequenceを開いてFreddyを追加します。

+を押して以下のBoxを表示させ、走っているAnimationを追加します。

Animationの最後にRed Markを合わせます。

今度は以下のBoxを選択して秒表示に切り替えます。

以下の部分の表示が秒表示に変りました。

Sequenceを表示するための以下のItemを配置します。

Cinematic Sequence Deviceですね。

そこに先程作成したLevel Sequenceをセットします。

Look PlaybackをEnableします。

<Cinematic Sequence in Verse / Setting up Animation Update Loop>

はい。

Verseに戻って来ました。

先程配置したCinematic Sequence DeviceをVerse側から管理するためのConstantを作成します。

UpdateModel()関数を改良します。

Brachを追加しました。

Branch内の実装は実行されますが、それと同時にBranchの次に書かれているCodeも実行されるそうです。

それがBranchの機能だそうです。

でBranchの後に以下の実装を追加しました。

<Using SprintedEvent to Change Animation States>

このAwait()関数はこの後のCodeの実行を一時的に止めるそうです。

そしてSprintedEvent()が発動したら、止めていたCodeの実行をするそうです。

SprintedEvent()関数の定義を見ると以下のようになっています。

ので以下のように書く事が出来ます。

ここの理屈はまだ100%理解した訳では無いです。

しかしこれでIsSprintingTupleがSprintedEventのEvent Object(ここではPayloadと書かれている)を受け取る事が出来る事は理解しました。

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

(1)はTopleの2番目の値を指定しているそうです。つまりLogicです。

?はどんな意味だったけ。

Optionで存在しないときもある事を示しているはず。

そしてCinematic Sequenceを実行しろというCodeを追加しました。

Playerが移動している時は、Freddyも移動するのでFreddyのAnimationを追加するのか。

それ以外の時はAnimationを停止しています。

これでVerseのCodeは終わりです。

UEFNに戻ってVerseのDeviceにCinematic Sequence Deviceをセットします。

勿論、VerseのBuildとかは先にやっています。

<Second Result>

Testしています。

Playerが移動するとそれに合わせてFreddyも歩くAnimationを使用しながら移動しています。

走るのを止めると以下のようになります。

うーん。

この結果を見ると、FreddyがPlayerを追いかけているじゃなくて、Playerの操作するCharacterがFreddyになってるみたいですね。

そう言う事だったの?

<Fixing Character Rotation>

Playerが上を向いて下を向くとFreddyが地面に潜りこんでしまいました。

このBugを直すようです。

前のTutorialからCodeをCopyして以下の部分に追加しました。

いや。

一寸待て。

なんで最初にIsCinematicPlayingの変数が追加されているの?

後はまあ、今までやった実装なので何をやっているのかわかります。

結果はどうだったんでしょうか?

と思ったらDebbyPosと書かれている箇所をFreddyPosに直していました。

あれ?

DebbyとFreddyって違うCharacterだったの?

更に以下のModuleを追加していました。

そしてDebbyPosと書かれた箇所をFreddyPosに直してました。

こんな感じです。

最後にNewRotationの値を以下の場所にPassしています。

成程。

これでPlayerの上下の変化には対応しなくなる訳か。

納得。

でも何でPlayerの姿は見えないの。

これがPlayerの姿を消しているだ。

成程。

ここでTestするのかと思ったら、

やっぱりこの部分の実装は以下のようにLoopの中に書く必要があったと、

Loop内に移動させていました。

<Final Result>

Testしています。

Playerが上下を向いてのFreddyが地面に埋まる事は無くなっています。

うん。

出来ていますね。

8.2 CUSTOM Fortnite Character Pt 2 (Animations) - UEFN / Creative 2.0 Tutorial [11]を勉強した感想

所々に分からない部分がありますが、まあ大体は理解出来ました。分からない部分は実装する時に調べる事にします。

今回のTutorialは思ったよりは勉強になりました。

のでPi Equals Three氏のTutorialの勉強はこのまま継続する事にします。

9.DirectX12の勉強

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

9.1.1先週勉強した内容を復習する

DirectX12を表示するためのWindowを作成していました。

独自のWindow Classを作成してそのClassをMain()関数内で呼び出す事でWindowを作成しています。

そのWindow Class内ではWin32のWindow Class(この場合はWNDCLASSEXW)を呼び出しています。

Win32のWindow Classは以下のMemberを指定する必要がありました。

この中で、lpfnWndProcではCallback Functionを指定する必要があります。

ので以下のようなFunctionを作成して

それを指定していました。

この時Callback FunctionとFunction Pointerについての勉強もしています。

この部分のCallback Functionの説明を聞いたら逆に混乱して来ました。

先程、UEFNで勉強していたEvent周りの用語は以下のようになっています。

ここに先週のCallback Functionの説明を追加すると

となり、Event Linster()関数に紐づけられた関数を指す事になります。

先程のUEFNの例で言うと

Handle Agent Trigger()関数がそれに当たります。

これってEvent Objectだと思っていました。

でもEventが起きる度に関数を発してはいないから、Event Objectでは無いですね。

あとPayloadとCallback Functionの関係も分かりません。

Copilot先生にきいてみますか。

まずCallback Functionの説明です。

これはまあ先週勉強した通りの内容でした。

次にPayloadの説明です。

成程。

PayloadはそれぞれのEventが起きた時にEvent Listenerに送られるDataを指していました。

となるとEvent Objectと同じって事?

次にEvent Objectについてです。

Event ObjectはEventが発生した事を知らせるのが目的みたいですね。

この説明から推測するとEvent ObjectにPayloadが含まれる(押されたButtonのIDとか)場合が多そうです。

後、この説明で驚いたのがEvent ListenerとEvent Handlerが同じと説明されていた事です。

そりゃそうだ。

Eventが起きた事を聞く関数と、起きたEventをHandle(処理)する関数は同じです。

私がEventがよく分からなかった理由は、そのProgrammingの仕組みじゃなくてその仕組みを表す用語の定義が曖昧だったからでした。

実際にはEventなんて何年も使用している訳ですが、理解してないはずは無かったです。

はい。

この問題は解決しました。

更に他のDirectX12のTutorialでは無かったWindow作成のためのExtraなMemoryの確保についての勉強もしました。

これは以下の2つのMemberで指定します。

あれだけ大げさにこの部分について解説していたのに、実際は

0を指定して終わっていました。

9.1.2 Creating a Window | D3D12 Beginners Tutorial [D3D12Ez] [3]の先週勉強した箇所を実装する

それでは実装をやっていきます。

<Intro>

特にやる事は無いです。

<Recap>

これも無いです。

<Framework>

Main()関数に以下に示したCodeの赤線で囲った部分のCommentを追加しただけでした。

<Creating a Window>

ここから本番です。

まずSupport Folder内にWindow Classを作成します。

最初にこのTutorialをやった時は以下のIconを押すとFolderの表示に変えられる事を知らないで

以下のIconからFolderに新しいFileを追加したので、

Fileの構成がTutorialと全然違った結果になり、最終的には全部やり直しました。

今回は同じ間違いは犯さないように気をつけてやります。

Support Folderを選択して

「新しいItemを追加する」を選択します。

以下のWindowが表示されるので

C++ Classを選択して名前をWindowにします。

追加はされましたが、Support Folder内に追加されませんでした。

なんで?

Drag and Dropで無理やりSupport Folder内に移動させました。

WinInclude.hの実装を丸CopyしてWindow.hに張り付けます。

あれ?

WinInclude.hの実装は以下のようになっています。

うーん。

これはWinInclude.hではなくDebugLayer.hの実装をCopyしていますね。

DebugLayer.hの実装をWindow.hに張り付けます。

Class名をDXWindowと変更します。

<Window Class>

全部、DXWindowに書き直します。

PrivateのComPointerの部分はどうやって直すんでしょうか?

Sample Codeの方にはこの部分の実装は無いですね。

一応、Tutorialを見て確認します。

消していました。

消しました。

今度はWindow.cppに移動してInit()関数の実装を追加していきます。

WNDCLASSEXW型のInstanceを作成します。

この作成方法については先週のBlogで散々勉強したのでここでは触れません。

それぞれのMemberを指定します。

その部分の実装をSample Codeから丸々Copyして来ました。

上から順番に確認していきます。

<Window Class Styles>

この2つに関してはTutorialでもこうやってSetするもんだ。で終わっていました。

まあ、WindowのSizeとStyleを指定している事は分かるのでそれで十分でしょう。

<Window Proc>

次のlpfnWndProcです。

Callback FunctionであるOnWindowMessage()関数はまだ作成して無いのでErrorになっています。

作成します。

Window.hで以下の関数を宣言しました。

Window.cppに戻ってOnWindowMessage()関数の実装を行います。

まずReturn Valueに以下の関数を追加しました。

これはお決まりだそうです。

そしてSwitchを追加しました。

Sample Codeを見るとこのSwitchの中に沢山のCodeが書かれていますが、Tutorialでは今回の実装はここで終わっていました。

先程のwcexのMemberの指定している場所の戻ると

lpfnWndProcのOnWindowMessageのErrorが消えています。

<Additional Memory>

ここはTutorialでは凄い大げさに説明されていましたが、0をセットして使用していませんでした。

残りのParameterに関しては説明しないで終わっていました。

これらのMemberは前に勉強した記憶はありますね。

まあ必要になったら復習する事にして今回はSkipして先に進みます。

最後にここで作成したWcexをRegisterします。

このRegisterした結果を保持するためのInstanceを作成します。

ATOM型のInstanceだ。

このInstanceを作成した事で以下の部分のErrorも消えました。

最後にRegisterが失敗した時の事を考慮して以下のCodeを追加します。

以上でした。

9.1.3 Creating a Window | D3D12 Beginners Tutorial [D3D12Ez] [3]の先週勉強した箇所を実装した感想

Window Classを指定したFolderに作成出来た後は、特に難しい部分は無かったです。

Eventに関してのそれぞれの名称もしっかり理解出来ました。

後、よく分からないのはATOMです。

これは追々勉強していくことにします。

最初にDirectX12を勉強した時は、このWindowの作成の部分も暗中模索の状態でやっていましたが、流石に4回目のWindows作成になるとそれなりに内容が理解出来るようになって来ました。

やっぱり最初から全部理解するのではなく、兎に角やってみるのが大事って事ですね。

9.2 「DirectX 12の魔導書」の勉強

9.2.1 「4.11 三角形ポリゴンを四角形にしてみる」の「4.11.1 Primitive Topologyを変更する」を勉強する

先週軽く「4.11 三角形ポリゴンを四角形にしてみる」を全部読んだので、今週は「4.11.1 Primitive Topologyを変更する」をしっかり細かい部分まで読み込む事にします。

今度は四角形を表示するための実装に変更します。

当然、Vertexは4つ必要になります。

しかしこれを変更しただけでは三角形しか表示されません。

はい。

これは前に試して確認しています。

その理由は、Primitive Topologyの設定が、D3D_PRIMITVE_TOPOLOGY_TRIANGLELISTだからだそうです。

この設定だと、三角形を描くのに、頂点が3つ必要なので、四角形を作成するには三角形が2つ、つまりVertexは6つ必要になります。

4つのVertexで四角形を作成するためにはPrimitive Topologyの設定をD3D_PRIMITVE_TOPOLOGY_TRIANGLESTRIPに変更して

更にDrawInstance()関数の最初のParameterの値も3から4に変更する必要があります。

以上でした。

先週勉強した内容と比較するとあまり新しい情報とか無かったですね。

先週のBlogでは以下のように書いていましたが、

そんなに調査すべき事にも思えません。

予定した部分の勉強が終わったので、一寸短いですが、今週の「DirectX 12の魔導書」の勉強はこれで終わりにします。

来週は今週勉強した内容を実装してみます。

10. まとめと感想

なし

11. 参照(Reference)

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

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

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

[4] MR3D-Dev. (2023, January 30). How to use Niagara VFX in Sequencer Unreal Engine 5.1 [Video]. YouTube. https://www.youtube.com/watch?v=xup3jZqthA4

[5] UE4 - How to activate Niagara VFX while using Sequencer for Cinematics? (2020, March 17). Epic Developer Community Forums. https://forums.unrealengine.com/t/ue4-how-to-activate-niagara-vfx-while-using-sequencer-for-cinematics/139933

[6] pwnisher. (2021, October 16). How I get UNREAL ENGINE to look like a movie | FULL BREAKDOWN [Video]. YouTube. https://www.youtube.com/watch?v=FdtTthV_sXI

[7] fastai - Vision data. (n.d.). Fastai. https://docs.fast.ai/vision.data.html

[8] Reality Forge. (2024, March 29). Unreal Engine 5.4: Create a Product Commercials with Motion Design [Video]. YouTube. https://www.youtube.com/watch?v=yWQIz5yzTrw

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

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

[11] Pi Equals Three. (2023, June 12). CUSTOM Fortnite Character Pt 2 (Animations) - UEFN / Creative 2.0 tutorial [Video]. YouTube. https://www.youtube.com/watch?v=7VETvYBZNQc

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

1.今週の予定

先週のBlogを読み直して今週の予定を建てます。

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

以下の内容について検証します。

<UE内で3D Gaussian Splattingを用いたFilmの作成>

先週は3D Gaussian Splattingで作成したUEの3D空間内にQuinnを展開しました。

QuinnをThird Person Characterとして操作したので画面に迫力が無くなってしまいました。

今週は、FilmのTemplateを使用してLevel Sequenceを用いてQuinnを動かしてみます。

<Hardware Ray TracingのFar Fieldの検証>

先週は使えそうなMapを見つけて

Hardware Ray TracingをEnableしようとしたら

出来なかったところで終わりました。

新しいProjectを作成してもう一回試してみます。

<Luma AIを試す>

先々週撮影した花は風になびいていたので、綺麗に3D化しませんでした。

ので今回は風で動かないモノを撮影します。

更にこの場所で撮影すると必ず地面がぼやけます。

今回は思いっきり遠距離から撮影して、それでも地面がぼやけるのか確認します。

<PwnisherのTutorialを調査する>

今までGediminas Kirdeikis氏のUnreal Engine 5 for Architecture - 2023 Full Beginner Course [1]を中心に勉強して来ましたが、このTutorialは長すぎる割に結果に即効性がありません。

他のTutorialも一寸だけ確認する事にします。

や他の映像系のUE5のTutorialの内容を確認します。

1.2 AIの勉強

Jeremy Howard氏の Practical Deep Learning for Coders: Lesson 1 [2]を勉強しました。

ここでどうもDeep Learningを勉強するにはPyTorchを使用する必要がある事が分かりました。

今週はこのPyTorchについて調べる事にします。

その後で、Jeremy Howard氏のTutorial の続きを勉強します。

1.3 Materialの勉強

Ben Cloward先生の Introduction To Vertex Shaders - Advanced Materials - Episode 32 [3]を実装します。

その後で、Pwnisher氏のUnreal Engine Materials in 6 Levels of Complexity [4]を勉強する事にします。

これMaterialの基礎を理解するのに必要な最低限の内容が簡潔にまとめられていてかなり凄いTutorialになっています。

1.4 Gaeaの勉強

今週は別な作業をやる事にします。

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

 Unreal Engine 5.4: Create STUNNING Product Commercials with Motion Design [5]の実装をするに当たって以下の問題がありました。

  • Static MeshのSoda CanがNull ActorにAttach出来なくなってしまった。
  • MaterialからEmittしている色の光が強すぎて、Rectangle Lightの光がよく見えなくなった。
  • 生成したImageを60fpsでVideoに変換する方法が分らない(Davinci Resolve)

これらについてどうやって解決していくのかを検証します。

1.6 Houdiniの勉強

先週、 Houdini 19 - Wall Tool 12 [6]の実装は終わったんですが、Tutorialでは全てのParameterをParameter Windowに追加する事はしませんでした。

更に追加したそれぞれのParameterのTestもしていません。

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

今週はそれをやります。

1.7 UEFNの勉強

 Custom Fortnite Character P. 1 : Import CUSTOM Model - UEFN / Creative 2.0 Tutorial [7]を実装します。

こんなの5分で終わってしまいますが、今週の予定が既に凄い量になっているので、ここは軽くしておきます。

1.8 DirectX12の勉強

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

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

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

2.1 UE内で3D Gaussian Splattingを用いたFilmの作成

Bicycleの3D Gaussian Splattingを配置したLevelを開きます。

取りあえずLevel Sequenceを配置して

Cameraを配置しました。

更にCameraをLevel Sequence内に追加して

Cameraの配置をKey Frameに追加しました。

以下のIconを押して

Renderingします。

以下のようなImageが生成されました。

Davinci Resolveを使用して、これらのImageをVideoに編集します。

やり方は先週のBlogで調べたやり方をそのまま繰り返しました。

Gifに変換した映像を以下に示します。

凄い。

実際のCameraでは出来ない速い動きを示しています。

これだけでも価値がありますね。

今度はCharacterを配置して自転車の周りで動かしてみます。

Level Sequenceの終わりがとんでもなく長くなってしまいました。

直し方が分かりません。

調べます。

Copilotに質問しました。

この通りにやったんですが上手く行きません。

しかしこれをやっていたら以下の赤いBarがPlayの最後を示している事が判明しました。

この赤いBarを弄ってPlayの最後を300 Frameに揃えました。

300までのFrameを作成して欲しいのに156までしかImageを作成してくれません。

CameraのCutを強引に300Frameまで伸ばしてみました。

今度は300枚のImageを生成しました。

結果をGifに変換しました。

容量が大きすぎるのでSizeを半分にして、圧縮しましたので画像は汚いです。

本来の映像は物凄い綺麗です。

以下にその一枚を示します。

Dragonの影がオカシイです。

後、土煙のEffectの追加も必要です。

まだまだやるべき事は沢山あります。

しかし今の時点ではこれで十分です。

今週はここまでとします。

2.2 Hardware Ray TracingのFar Fieldの検証

こっちを先にセットする必要がありました。

これをEnableした後なら、

こっちのSetも出来るようになります。

これで先週ImportしたMapの結果を見てみます。

以下の警告が表示されています。

これは取りあえず無視して画像の変化を見ます。

地面の反射は綺麗になっている気がします。

もう一回、Fra Fieldについて勉強します。

公式SiteのLumen Technical Details [9]を読み直します。

このMapでも200mはないですね。

これは今の時点では試しようが無いです。

こんな機能もある事は覚えておきます。

2.3 Luma AIを試す

今週は時間が無くて外で撮影出来ませんでした。

2.4 PwnisherのTutorialを調査する

UE5を使用した映像作品の作成方法を勉強していますがUnreal Engine 5 for Architecture - 2023 Full Beginner Course [1]は長すぎます。

他のTutorialで勉強した方が効率が良い気がして来ました。

Pwnisher氏のTutorial、Unreal Engine Materials in 6 Levels of Complexity [4]がYouTubeのお勧めに出て来ました。

軽く見ただけですが、簡潔にまとまっていてとても見やすかったです。

これ前も調べた気がします。

Blogを調査して確認します。

見つかりませんね。

もしかしたらpwnisher氏のSpellを間違えたのかもしれません。

2024-03-31のBlogにPwnisher氏についてまとめた記事がありました。

やっぱりSpellを間違えていました。

後、この人です。

この人のTutorialの勉強をやった方が良い気がしています。

こっちももう一回検証しましょう。

3.AIの勉強

3.1 PyTorchについての調査

PyTorchがPythonを使用するためのPlatformなのは分かりますが、もっと情報が欲しいです。

調べる事にします。

Copilotで質問しました。

Frameworkなのか

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

最後の部分を読むと、PyTorchをInstallするにはLocalな方法とNetにあるPlatformを使用する2つの方法があるそうです。

このTutorialで先週勉強したKaggleというのもその内の一つのようですね。

これもCopilotに質問してみましょう。

まずAnacondaが紹介されました。

Cloud Serviceを使用する場合は以下の3つが紹介されていました。

Kaggleは紹介されてないですね。

Kaggleはどれくらい良いのか聞いてみます。

おお。結構良い評価です。

Kaggle全体の評価です。

どっちかって言うとData Scientist用に開発されたPlatformのようですね。

うん。

でもAIの勉強にも使用できる訳ですね。

KaggleはFreeなの?

ここ重要です。これは後でもう一回確認します。

そうだ。

今のPCはRTX3070Tiを積んでるだ。

Localで勉強する事も考慮すべきです。

成程ね。

全部書いたCodeの内容は公開されてしまうのか。

勉強するには良いですが、独自の開発をするには向かないですね。

最後にKaggleはFreeなのか聞いてみます。

おお、全部Freeだそうです。

これは勉強するだけなら使っても良いかもしれません。

Kaggleの使い方を説明したTutorialを探してみます。

腐るほどありました。

電話番号を登録する必要が有る所が心配です。日本の携帯電話の登録方法は国番号+電話番号なんでしょうか?

この辺は実際に登録する時に調べる事にします。

後、勉強するのはAI関連だけで十分ですので、Data Science全般のTutorialは無視して進める事にします。

PyTorchのTutorialも検索してみましょう。

こっちも沢山のTutorialがありました。

KaggleのTutorialと違ってこっちはDeep Learning、Machine LearningをPyTorchを使用して勉強するとはっきり書かれています。

それぞれのTutorialでどんなEnvironmentで設定しているのかだけ確認します。

Patrick Loeber氏のPyTorch Tutorial 01 – Installation [10]です。

Condaを使用していました。

Condaを使用してPyTourchを動かすそうです。

これはLocalでPyToruchを動かすのに必要な何かなんでしょうか?

Copilotに質問してみます。

まずCondaはPackage ManagerかつEnvironment Management Systemだそうです。

この2つの意味はよく分かりません。

通常CondaはAnacondaを通して使用するみたいです。

のでInstallするのはAnacondaになるみたいですね。

ここでもAnacondaをInstallするみたいな事を言っています。

後、Sandboxで実験出来るそうです。

最後にCondaはPyTorchをLocalで走らせるのか、質問しました。

その通りと言っています。

Copilotの回答を見る限りでは、Condaはかなりお勧めのようです。

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

GoogleのColabを使用するそうです。

前にCopilotに質問した時に出て来たGCPというのがGoogle Colab Platformとかかもしれません。

これも質問してみましょう。

Installが必要ないのは良いですね。

後、GoogleのServiceなのでAccountを別に作成する必要が無いのも良いです。

TPUが使用できるのは興味深いです。

環境設定はこのCodeを一行書けば良いのか。

こっちの方が良いかもしれませんね。

でもGoogleとしてはTensorFlowをPyTorchより進めているのか。

うーん。

成程。

やっぱりTPUを無料で試せるのは強いですね。

最大で一回の使用時間が12時間の制限があるのか。

こんなのは問題になるんでしょうか?

企業のProjectの場合は問題がある場合もありそうですね。

AssemblyAI氏のPyTorch Crash Course - Getting Started with Deep Learning [12]です。

これはLocalのやり方とCloud Serverを使用するやり方の両方が解説されていました。

ただしLocalのやり方はPyTorchのHomepageに行ってここでDownloadしてね。で終わっていました。

Cloud Serverを使用するやり方はGoogleのColabを使用していました。これが最も簡単だと言っていました。

2つのTutorialでGoogleのColabを使用しています。Colabは良いServiceのようです。

freeCodeCamp.org のPyTorch for Deep Learning & Machine Learning – Full Course [13]です。

これ何が凄いって、一本の動画で25時間もあります。

Seriesにして40本ぐらいの動画にして載せるべきでしょう。

それはともかくとしてこのTutorialもGoogleのColabを使用していました。

sentdex 氏のIntroduction - Deep Learning and Neural Networks with Python and Pytorch p.1[14]です。

どれでも良いですが、以下のCloud ServerがSponsorだそうです。

のでこのCloud Serverを進めていました。

Aladdin Persson氏のPytorch Tutorial - Setting up a Deep Learning Environment (Anaconda & PyCharm) [15]です。

ここではAnacondaとPyCharmを使用したLocalなPyTorchの設定方法をかなり詳しく解説していました。

Localで設定するならこのTutorialはかなりお勧めかもしれません。

こんだけ調べたらまあ、大体の傾向は掴めましたね。

PyTorchを使用するにあたってLocalの場合は、Condaを使用してCloud Serverを使用する場合はGoogle Colabを使用するのが一般的のようです。

Kaggleは誰も使用してないですね。

Jeremy HowardのWikiのPageを見たら

Jermy Howard氏はKaggleのPresident兼Chief Scientistと書かれていました。

それでKaggleを押していたのか。

うーん。

成程ね。

大体情報が手に入りましたは。

3.2 PyTorchについての調査をした感想

一番簡単にPyTorchを使用してDeep Learningを勉強する方法はGoogle Colabを利用する事です。

正しLocalで使用したい場合はCondaを使用してやるのが一般的です。

どちらもKaggleは使用していません。

更に言うと、Kaggleで書いたCodeは全部公開されてしまいます。

自分の学習した内容は全部、他の人の学習用のDataとして使用されてしまう訳です。

これを大金を払って勉強しにくる学生に強制的に使用させるのはかなりあくどい気がしますね。

一寸、Jeremy Howard氏のImageが変わりました。

自分の成功より他人の成功を喜ぶ自己犠牲の精神に溢れる教育熱心な大学教授から、大金を掴んで楽に暮らしたいちょっと狡い学者のImageに。

そういう目で見ると、Jeremy Howard氏のTutorialはそのTutorialの中ではまるで一番優れた教材であるかのように語っていますが、他のYouTubeの教材と比較して格段に優れている訳でもないようにも見えます。

特にこの教材で勉強したから仕事が見つけやすいとかも無いです。

Lecture内でそういう雰囲気を存分に出していますが。

ただしFastaiに関してはJeremy Howard氏のTutorialでしか習えないです。

これがどれくらい凄いのかは分かりません。

ひょっとするとものすごく優秀かもしれません。

そうなるとJeremy Howard氏のImageももう一回回転して凄い良い教授になります。

まあ実際に使用して確認するしかないですね。

3.3  Practical Deep Learning for Coders: Lesson 1 [2]の続きを勉強する

まあなんだかんだ言ってもしばらくはこれを軸に勉強する事にします。

先週の続きから勉強します。

<Datablocks API parameters explanation>

DataBlockのそれぞれの要素について解説しています。

まずBlockです。

Blocksの中身はInputとOutputについての解説です。

ImageBlockはInputがImageである事を示しています。

これは理解出来ます。

次の説明です。

CategoryBlockはOutputがCategoryつまり沢山ある数の中の一つの数字である事を示しています。

これはよく分かりません。

まあでもCategoryを数学的に厳密に表現するとこうなるのかもしれません。ここはあまり深く考えずにこういうもんだと思って進んでいきます。

次はGet_Itemsの説明です。

ここはどんなDataから学習するのかを指定するそうです。

Get_image_filesはFunctionだそうです。

今回の場合はImage Fileを返すそうです。

ここで唐突にValidation Setと言うものがある事を説明しています。

このValidation Setがどういうものであるのかは不明ですが、Fast.aiではこのValidation Setを指定しないでModelの学習をする事は出来ないそうです。

ここでそのValidation Setの指定をするそうです。

どのようにどれくらいのDataをSet Aside(Saveするという意味か?)するのかを指定します。

ここではRandomに選んだ20%のDataをSet Asideするようにと指定しています。

うーん。

結構、分かり易いぞ。

Fast.aiもかなり良いLibraryな気がして来ました。

どうやってPhotoのLabelが正しいのかを知る事が出来るのか?を指定しているそうです。

これは鳥の写真か森の写真かをどうやってFast.aiが知る事が出来るのかと言う意味だそうです。

そういえば鳥の写真と森の写真を集めていたんだ。

最初の前提を既に忘れてしまっていましたわ。

Parent_labelも関数でその機能は、そのFileが入っているFolderのPathを返すそうです。

今回の実装の場合は、森か鳥が返ってくるそうです。

うーん。

ここは実際の実装を見ながら検証しないとよく分からないですね。Pathという事はFolderの名前も帰って来るって事でしょうか?

最後の要素ですが、AIにおいては、学習用のImageはほとんどの場合Sizeを揃えてから使用するそうです。

ここでSizeを揃えているそうです。

ここでは192x192 PixelでSquishと言う手法でSizeを揃えています。

最後に以下の部分です。

これらのData BlockからData Loaderを作成しています。

PyTorchはこのData Loaderを利用して実際のDataをIterateしていくそうです。

まずTutorialの説明からまとめます。

GPUを用いて何千ものDataを同時に処理していきます。

これをBatchと呼びます。

ここでShow Batchと書いていますが、これはその何千もの処理の中から6個のDataを見せてと言っているのだそうです。

Tutorialでは以下の結果が表示されていました。

ここではInputされたImageとそのImageのLabel(以下の関数で指定されたLabel)

が表示されます。

<Where to find fastai documentation>

以下に示したDocs.fast.aiでこれらの関数に関しての詳細な説明を見る事が出来るそうです。

早速見てみます。

あれ?

なんか見た目が全然違いますね。

どちらかと言うと退化している気がします。

URLは合っていますね。

日本語訳とかも無いですね。

Deep Learningを勉強する人達は英語が出来るのは当然なのかもしれませんね。

<Fastai’s learner (combines model & data)>

ここからFast.aiにおいて重要なConceptであるLearnerについての解説が始まります。

LearnerはModelとDataを繋げる働きをするそうです。

ここで言うModelは我々が実際の学習したNeural Network Functionを指しているそうです。

うん。

この説明はまったく分からない。

我々というのは教授の事を指しているんでしょうか?

そしてNeural Network Functionって何の事でしょう。

分からない事はCopilotに聞きます。

うーん。

なんかDeep Learningそのものを指している感じですね。

実際の人間の脳の構造を真似て設計されているからNeuralと言うんですね。

この知識を元に先程の意味をもう一回考えると、既にTrainingが終わっているModelに鳥と森のLabelの付いたDataを読ませるって事だと思います。

そして以下のCodeです。

まずdlsでDataを指定しています。

次にResnet18で使用するModelを指定しているそうです。

<Fastai’s available pretrained models>

以下のSiteにFast.aiで使用出来るImage Modelについての解説があるそうです。

見てみましょう。

お、こっちは全く同じSiteが表示されました。

以下の場所から色々なModelを見る事が出来るそうです。

試してみたら

こんな結果になりました。

なんじゃこれ。

<What’s a pretrained model?>

ここでResnet18などのImage Modelについて解説しています。

これらのModelは既にTrainされている事なんかが解説されています。

やっぱりそうだったのか。

生成AIが有名になって、AIの学習に2つある事は今では一般常識になっています。

この当時(2年前)は、AIを学習する人の間でもAIの学習に2つある事は、そんなには知られてなかったみたいです。

結構詳しく解説しています。

Fine_tuneについて解説しています。

Fine TuningはModelに今までTrainしたDataとこれから学習するDataがどれくらい違うのかを示すそうです。

3回テストして違いが0%である事を示しています。

<Testing your model with predict method>

今度はPredict Methodを使用します。

文字通り提供されたImageがBirdであるかどうかを判断します。

このReturn Valueの意味が分かりません。

まずIs_birdですが、TrueかFalseが返ってくると思われます。

次の_はどういう意味でしょうか?

Tutorialの説明だと鳥かどうかをIntegerで返すそうです。

最後は鳥である確率(Probability)を示すそうです。

ここで写真に鳥が写っているとかのImage RecognitionだけでなくSegmentationにも使用出来るとSegmentationについての解説が当然始まりました。

以下の実装を示しています。

そもそもSegmentationって何の事でしょう?

もうそろそろAIの勉強に使用出来る時間が無くなって来ました。

今週はここまでとします。

Tutorialの55:02まで勉強しました。

残りは来週勉強します。

<Other applications of computer vision. Segmentation>

<Segmentation code explanation>

<Tabular analysis with fastai>

<show_batch method explanation>

<Collaborative filtering (recommendation system) example>

<How to turn your notebooks into a presentation tool (RISE)>

<What else can you make with notebooks?>

<What can deep learning do presently?>

<The first neural network - Mark I Perceptron (1957)>

<Machine learning models at a high level>

<Homework>

4.Materialの勉強

4.1 Introduction To Vertex Shaders - Advanced Materials - Episode 32 [3]を実装する

今週は簡単なはずです。

とっととやってしまいます。

今回試すのは

これです。

と言うかこれだけです。

まずTutorialの使用方法を試してみました。

こんな結果になりました。

他も色々ためしてみます。

Normalです

通常の結果です。

Vertex Interpolatorノードを追加しました。

結果です。

これは先程のNormal用のTextureはPixelに対応して使用するのでVertexに対応して使用したらこのような変な結果になるのは当然です。

うーん。

あんまりやる事無いですね。

これで終わりです。

4.2 Pwnisher氏のUnreal Engine Materials in 6 Levels of Complexity [4]を勉強する

これちょっとだけ見て凄い良いTutorialなんで勉強する事にしたんですが何と44分もあります。

今週は最初の10分だけ勉強します。

もうかなり疲れています。

<You can do it!>

このTutorialの内容が説明されていますが、Master Materialを一個作成して、それで全てのMaterialに対応させるそうです。

このMaster Materialの設計思想が凄い良いんです。

しかも結果も凄い。

<50% off my Master Material>

広告でした。

<How Material work in Unreal Engine

BlenderのMaterialとUnrealのMaterialの違いについて解説しています。

元々、Pwnisher氏はBlenderを使いこなしている人向けのUnrealのTutorialを作成しています。

全然関係ないけど、Pwnisher氏の家、障子があります。

何で?

<How to Create a Material>

ここからLevel1が始まっています。

まずMaterialを生成してMM_Tutorialと名付けています。

更にここからMaterial Instanceも作成しました。

Materialを開きました。

この設定はどうやっているんでしょうか?

左の部分にMaterialを表示して右の部分にはMaterial InstanceのParameterが表示されています。

これってDefaultでこうなってたっけ?

<Level 1 - Basic Material Setup>

更にMegaScanか何かから入手したような適当なTextureをMaterial内に配置しています。

指定の通りに並べています。

それぞれのTexture SampleノードをParameterにConvertしました。

InstanceにそれぞれのParameterが表示されています。

更に全部のTextureノードを選択してTexturesと言う名前のGroupとして登録しました。

<Honkai: Star Rail 3D Art Reveal>

広告です。

<Level 2 - Color Correction & Intensity Sliders>

まずBase ColorのTextureにMultiplyノードをつないでいます。

この値を弄る事で白くなったり

黒くなる事を示しています。

TutorialではBrightnessと言っていますがShadeの事ですよね。これ

非常に分かり易いです。

今度はContrastをつけるためにPowerノードを追加しました。

これは既に何度も勉強しているのでここで敢えて復習する必要はないですね。

次に行きます。

Desaturationノードを使用してSaturationを追加します。

これは何やっているんでしょうか?

値を上げると赤い部分が出て来ました。

Mathew Wadstein Tutorials氏のWTF Is? Material - Desaturation in Unreal Engine 4 [16]に分かり易い説明がありました。

Desaturationの値を上げるとそのTextureは本来の色を失って灰色に収束していくそうです。要するにGrey Scaleになる訳です。

ここの実装ではその逆を指定しているのでGray Scaleからどんどん彩度の高い色が発生してくる訳です。

成程。

理解しました。

最後に色を追加しました。

うーん。

これってSaturationする前に追加すべきでは?

後、Parameterに変換した時にTintと名付けていますが、Tintは白を追加してShadeは黒を追加するって意味じゃないの?

色を追加する事をTintっていうの?

ほら、Copilot先生もそう説明しています。

ここは単に色の追加で良いと思います。

ここで作成した全てのParameterをGroup、Albedoに追加します。

更にParameterの並びの順番を調整する方法も説明していました。

同じ様に他の要素にも調整用のNodeを追加していきます。

Specularです。

SpecularはMultiplyノードとPowerノードだけ追加しました。

Roughnessです。

RoughnessはSpecularと同じ実装です。

Normalの計算です。

NormalはRangeが違うから今までの計算と同じには出来ないはず。

と間違えるのを期待して見たんですが、Flatten Normalノードを使用してしっかり正しい実装をしていました。

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

5.Gaeaの勉強

今週はGaeaの勉強は無しです。

GaeaのHomepageを読んでいたら以下のTextureをExport出来ると書いてありました。

これのやり方は分かりません。

これについて調査する事にします。

色々調べたら「Export出来るけど実用性がない。」って書かれていました。

Layer作ってそれぞれに色を塗る方が正しいやり方のようです。

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

 前回、Unreal Engine 5.4: Create STUNNING Product Commercials with Motion Design [5]の実装をするに当たって以下の問題がありました。

  • Static MeshのSoda CanがNull ActorにAttach出来なくなってしまった。
  • MaterialからEmittしている色の光が強すぎて、Rectangle Lightの光がよく見えなくなった。
  • 生成したImageを60fpsでVideoに変換する方法が分らない(Davinci Resolve)

これらについてどうやって解決していくのかを検証します。

6.1生成したImageを60fpsでVideoに変換する方法が分らない(Davinci Resolve)

まず調べたらすぐにやり方が判明しそうなこれから調べます。

Copilotに質問したら以下の方法で出来るとありました。

更にTimelineのFrame Rateを変更する方法も説明されていました。

試してみます。

ImportしたImage群から作成されたVideoを右Clickすると確かにClip Attributesがありました。

選択します。

以下のWindowが開きました

確かにFrame Rateがありました。

60に変更してみます。

普通に出来ました。

Exportして確認します。

最初に指定した速度で動いています。

6.2 Unreal Engine 5.4: Create STUNNING Product Commercials with Motion Design [5]の実装をもう一回やる

以下の問題を解決するにはもう一回作成する必要があります。

  • Static MeshのSoda CanがNull ActorにAttach出来なくなってしまった
  • 3 MaterialからEmittしている色の光が強すぎて、Rectangle Lightの光がよく見えなくなった

もう一回、Unreal Engine 5.4: Create STUNNING Product Commercials with Motion Design [5]を実装します。

<Creating a Level>

新しいLevelを作成しました。

<Enabling Motion Design Mode>

Motion Designを押してMotion Design Modeに入ります。

Create Defaultsを押して

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

<Importing our Supporting Files>

2024-04-14のBlogを見てたら

CanのImportをする時にCombine MeshesにCheckを入れろと書いてありました。

これ前回はやらなかったかもしれません。

Checkしました。

Importした結果です。

あ。Static Meshが一個しかありません。

Canを開くと蓋がくっついていました。

<Applying Textures>

TextureもImportしてMaterialに追加します。

Preview画面です。

<Materials>

ここは後ろの壁用のMaterialを作成しています。

今回も前にImportした壁をそのまま使用しますのでここはSkipします。

<Emissive Master>

Emissive Materialを作成しています。

ここです。

なんで前回作成した時はあんなに明るくなってしまったんでしょう?

今確認しましたが特にへんな所は無かったです。

前回作成したMaterialを使用してInstanceだけ生成する事にします。

<Making an Instance>

既に作成しました。

<Unlocking the Camera>

しました。

<Placing Props>

Infinity Wallを原点に配置します。

前回はこのWallのSizeが大き過ぎました。

今回はもっと小さくして配置します。

どれくらい小さくすると丁度いいのかまだ不明なので、取りあえずScale1で配置しています。

SkylightとPost Process Volumeを消します。

Soda Canを以下のように配置しました。

CanのScaleの値は取りあえずはそのままにしておきます。

<Emissive Lighting>

Planeを並べてMaterial Instanceを適用しました。

Cameraから見たViewです。

まだEmissive Colorの影響が出てますね。

Plateの位置を遠くに移動させました。

とりあえずこれでやってみます。

<Setting up the Camera>

Cameraの位置やSoda Canの位置はここで良いので、CameraのLensの設定だけやります。

Focus MethodをTrackingに変更して

Actor to TrackにSM_SodaCanをセットします。

更にLens Settingsの値を50mm Prime f/1.8に変更しました。

Cameraから見た風景が以下のようになりました。

Canの位置を調整し直します。

少しだけ正確に直そうとGridを使用しようと思ったんですが、

Gridを選択するためのIconが表示されていません。

何で?

Tutorialを見直したら、Cinematic Viewportを選択してからGridを表示していました。

今度は表示出来ました。

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

うーん。

Cinematic ViewportとDefaultの違いも勉強する必要がありますね。

<Using Light Actors>

Rectangular Lightも配置します。

しました。

結果です。

後ろの壁が味気なくなってしまいました。

壁の位置を調整します。

色々調整したんですが、良い感じになりません。

最終的にLens Settingsの値を以下のようにしました。

結果です。

かなり良い感じになったと思います。

更に調整しました。

これでOKとします。

明るさがTutorialと全然違う理由が判明しました。

Directional Lightです。

こいつの向きを調整します。

凄い明るくなりました。

Tutorialの様にRect LightをPlaneの後ろに配置してみました。

光が完全に遮断されています。

なんかPCの調子が悪いです。

一端再起動させます。

とりあえずこれでOKとします。

うーん。Post Processまで出来たらNull Actorの問題がどうなっているのか判明するんですが、今週はここまでとします。

なんかUE5.4を使用するとPCの調子が悪くなります。

7.Houdiniの勉強

 Houdini 19 - Wall Tool 12 [6]で実装しなかったParameterを実装して来ます。

7.1 追加するParameterの確認

まず黄色のNodeを抜き出します。

その後で、それぞれのNodeのどのParameterを追加すべきなのかを確認していきます。

最初のNodeです。

Resample Brick Spacingノードです。

Attribwrange Shuffle Bricksノードです。

Line_Brick Depthノードです。

Attribwr angle Brick Jitterノードです。

Carve Tweak Brick Widthノードです。

Attribwr angle Mask Noiseノードです。

Attribwr angle Crack Ratioノードです。

Color Tint Brickノードです。

Delete Small Parts1ノードです。

Peak1ノードです。

Color Brick Chipノードです。

Re-Mesh Grid Groutノードです。

Color Tint Groutノードです。

これらのNodeのParameterを追加していきます。

しかしこれらのNodeのどのParameterを追加すれば良いのかが分からないのでそれを調べます。

7.2 追加するParameterを調査する

<Resample Brick Spacingノード>

まずこのNodeの追加するParameterを調べます。

2024-01-07のBlogに以下のように書かれていました。

追加するParameterはLengthですね。

Lengthの値を変更すると

Brickの横幅が変化するそうです。

<Attribwr Angle Shuffle Bricksノード>

このノード内で使用するParameterの解説も2024-01-07のBlogに書かれていました。

Multiノードを使用するそうです。

<Line Brick Depthノード>

2024-01-07のBlogに説明されていました。

<Attribwr angle Brick Jitterノード>

これはもうParameterを見ただけで

この値を調整すると分かりました。

一応、Blogで確認すると2024-01-14のBlogに以下のように書かれていました。

<Carve Tweak Brick Widthノード>

これは以下のParameterを調整します。

この値が大きくなるとBrick同士の隙間が大きくなります。

これはBlogにも説明が無かったので自分でテストして確認しました。

Foreach_end1ノードの結果を以下に示します。

FirstUの値が0.003の時です。

Brick同士の隙間がほとんどありません。

今度はFirstUの値を0.08にします。

Brick同士の横の隙間が大きくなりました。

<Attribwr angle Mask Noiseノード>

これはBlogを見直しても、Parameterを確認してもどれを弄るとどうなるのかが全然分かりません。

Tutorialを見直します。

2024-01-29のBlogによると Houdini - Wall Tool 06 [17]でこのNodeを追加したそうです。

このTutorialを見てみます。

分かりました。

以下に示したRampです。

このParameterを弄る事によりMaskを掛けています。

Tutorialでは以下のようなMaskを生成する事で

BrickのTopとButtonだけに影響を及ぼすような設定にしていました。

<Attribwr angle Crack Ratioノード>

これはもう以下のCrack Probabilityしか該当しそうなParameterがありません。

BlogにはこのParameterについては何も説明していません。

この値を弄るとひび割れの数が変化します。

<Color Tint Brickノード>

これは以下のParameterでBrickの色を指定していました。

BarをClickするとColor Barが表示されて指定したい色が選択出来ます。

<Delete Small Parts1ノード>

これは最近しようしたNodeなので中身を覚えています。

以下のThresholdの値を弄ると

指定した値より小さなBrickを消してしまいます。

<Peak1ノード>

これはもうDistanceしかありません。

2024-03-31のBlogにこのPeakノードのDistanceをTweakした結果が載っているですが、これを読んだだけではどんな働きなのかイマイチ分かりません。

でもBooleanノードの結果を比較してPeakノードのDistanceの影響を見ている事は分かりました。

PeakノードのDistanceの値が0.002の時のBooleanノードの結果です。

これは弄って判明したんですが、一寸しか変化する事が出来ません。

以下に示したようにDistanceの値が0.025の場合で

Brickの凹みがほとんどなくなってしまいました。

逆にDistanceの値を0.001に下げると

以下の結果のようになり

これ以上はほとんど変化しなくなりました。

これらの結果から考えるとこのDistanceのRangeは0~0.03位で良いと思います。

<Color Brick Chipノード>

これは以下のParameterでBrickの欠けた部分の色を指定しています。

赤くしてみました。

<Re-Mesh Grid Groutノード>

2024-05-05のBlogで解説していました。

最近作ったばっかりです。

なんとここでは2つParameterが使用されていました。

この値によってGrout(セメントの部分)の厚みが変化します。

穴が大きくなったり小さくなったりします。

実際に試してみます。

Divisionの値が0.05の時です。

0.1に変更しました。

あ。

これはMeshの大きさが変わっていました。MeshのSizeを決定するParameterでした。

Dilate/Erodeの値も変更してみます。

Dilate/Erodeの値を上げました

Grout(セメント)の量が増えました。

こっちはGrout(セメント)の量の調整であってますね。

<Color Tint Groutノード>

これはGrout(セメント)の色を決定しているだけです。

以上でした。

Copilot Previewが使用出来ません。

BrowserからAccessしたらこっちは普通に使用出来ました。

なんでなんでしょう?

今週はここまでとします。

8.UEFNの勉強

8.1  Custom Fortnite Character P. 1 : Import CUSTOM Model - UEFN / Creative 2.0 Tutorial [7]を実装します

<Intro>

特になし

<Download Model from Sketchfab>

AnimationがついているModelをSketchfabからDownloadします。

まずはTutorialと同じModelで試してみます。

これですね。

FBXをDownloadします。

<Importing Model into UEFN>

展開しました。

Sourceを開くと以下のFileが確認出来ました。

UEFNを起動してImportしてみます。

最初からCheckがついていました。

Import出来たみたいです。

Login出来ないって出て来ました。

うーん。

では仕方ない。

今回はここまでにします。

<追記>

次の日になったら繋がるようになりました。

Animationを開いたら普通に動いていました。

Materialも作成しておきます。

出来ました。

9.DirectX12の勉強

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

9.1.1 Creating a Window | D3D12 Beginners Tutorial [D3D12Ez] [18]を勉強する

今週は最初の10分だけ勉強します。

<Intro>

特になし

<Recap>0:10

今までの内容の復習的な話で、特に重要な部分はなかったです。

<Framework>0:52

Mainの中の実装です。

緑のCommentがこれから追加していく内容になります。

<Creating a Window>2:31

今度はWindowを作成します。

DirectX12で生成した3DのObjectを表示するにはWindowが必要です。

それを作成します。

そう言えばこんな事もやりました。

これって結構大変だったんだ。

Support Foler内にWindow.hを作成します。

WinInclude.hの実装を丸CopyしてWindow.hに張り付けます。

まずClass名をDXWindowと変更しました。

<Window Class>4:24

全部、DXWindowに書き直しました。

ここでWindow Classで指定する内容について簡単な説明がありました。

勿論、通常のWindowの形状の指定をするのは当然ですが、それだけでは無くて、WindowのMemoryをどう扱うのか、例えばDesktopのMemoryを共同で使用するのか、それともWindow自身でMemoryを使用するのかの指定もすると言っていました。

こんな指定、前はした記憶無いです。

更にWindow CreationをどうやってHandleするのかとか、Window MessageをどうやってCycleするのかとかもここで指定すると言っています。

この辺は前にやった事を少しだけ覚えています。

Window.cppを作成し

Init()関数の実装を追加していきます。

以下のようにしてWindow Classを作成しました。

こんな方法で作成してましたっけ。

一寸Blogを調べてみます。

2022-11-06のBlogです。

これは前に勉強していたOlympusMonsTutorialsの内容でした。

2022-12-04のBlogでは「DirectX 12の魔導書」におけるWindow Classの宣言方法について解説してありました。

その次の年の2月頃までずっとWindow Classについて勉強していました。

Instanceの宣言方法がそれぞれ違っています。

Lötwig Fusel氏のD3D12 Beginners Tutorial [D3D12Ez]では

WNDCLASSEXW wcex{};

OlympusMonsTutorialsでは

WNDCLASSEX Wcex;

DirectX 12の魔導書」では

WNDCLASSEX  w = {};

どれも正解ですが、どう違うのかを忘れてしまいました。

Copilotに質問します。

WNDCLASSEX  w;

WNDCLASSEX  w{};

WNDCLASSEX  w = {};

Copilot PreviewにはAccess出来ないのでBrowserからCopilotにAccessしました。

いやこれは宣言はしているけどInitializationはしてないじゃん。と思ったら解説にそう書いてありました。

こっちは全てのStructureのMemberに0などの初期値が与えられるのか。

となると最後との違いが気になります。

同じって書いてありました。

単に読み易いのでこっちを使用する人が多いだけだと。

うーん。

成程。

更に以下のまとめが載っていました。

まあ、最初の方法で宣言するのは止めた方が良いって事ですね。

ホントにCopilotは凄い。

昔ならこれを調べるだけでも一仕事って感じでした。

Window ClassのMemberを追加しました。

<Window Class Styles>

以下のようにセットしただけです。

<Window Proc>7:05

まずWindow.h fileに戻って以下の関数を追加しました。

<Window Parameters>8:05

当然、Window.cppに以下の実装を追加します。

このCallbackと言う書き方も覚えていません。

これもCopilotに質問してみます。

うおお。

凄い沢山の回答が返って来ました。

以下にまとめます。

まずCallback全般についての解説です。

あるFunctionを別なFunctionのArgumentとして使用する事をCallbackと言う。と書かれていました。

あれ?

そうだったけ。

あるEventが実行されたらCallbackが起きる場合です。

今度はCallback Functionに関しての解説です。

ああ、成程。ボタンを押すというEventに対して、どんな機能を追加するのはを決定するのにCallback Functionを使用するのか。

Callback Functionの意味は理解してなかったけど、この機能は今までもずっと使用していましたわ。

要するにCallback FunctionにEventが起きたら何をするのかを具体的に書くわけだ。

相する事で全体のCodeを変更しないで、個別の機能を追加する事が出来るようになった訳です。

やっとCallbackについて心の底から理解出来た。

やっぱりCopilot凄い。

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

後、Function Pointerについても質問してみます。

まあ、これは想像していた通りです。

最後のDispatch Tablesの意味は分かりませんが、残りは想像していた通りです。

以下のように宣言するそうです。

うん。

そうなの?

こんな宣言した事ないですけど。

ReferenceとDereferenceのやり方です。

この場合はReferenceで指定したFunctionを呼び出しているはずです。

後で、この辺の内容は確認する事にします。

やっぱりそうでした。

最後にFunction PointerをParameterとして使用する方法が載っていました。

これだと、ここで指定したFunction Pointerと同じ型のFunctionなら何でもPass出来るという事ですね。

Function Pointerについても完全に理解しました。

Copilot凄い。

OnWindowMessage()関数の実装を追加しました。

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

<Additonal Memory>9:19

さあ、ここでWindow作成のためのMemoryについて勉強します。

前回Windowを作成した時は、まったくMemoryについて勉強した記憶がありません。

よく聞いて理解する事にします。

この2つがExtraのMemoryを指定するそうです。

うーん。

これがそうなのか。

Blogで確認したけど、このParameterは使用してないですね。

公式SiteのWNDCLASSEXA structure (winuser.h) [18]を見たんですが、

以下のSyntaxになっていて

普通にcbClsExtraとcbWndExtraはあるんですが。

もう一回確認します。

ありました。

2022-11-06のBlogにOlympusMonsTutorialsでは以下のように指定していました。

正し説明はなく、どんなWindowでもこれらの値はこういう風に設定する。と言ってるだけでした。

それだけでした。

他の教科書にはこのParameterの説明は載ってなかったみたいです。

念のために「DirectX12の魔術師」のSample Codeだけ確認しましたが

やっぱりcbClsExtraとcbWndExtraは指定してないです。

公式SiteのWNDCLASSEXA structure (winuser.h) [18]のcbClsExtraとcbWndExtraの説明です。

うーん。

一応、このParameterがExtraなMemoryを確保するんですよ。と聞いているので何となく言っている事が理解出来るって感じです。

この後、このMemoryの使用方法について解説するのかと思ったらなんと、

次のMemberの値をどんどん指定して行ってしまいました。

残りのParameterの指定方法に関しては他のTutorialで勉強した内容と大同小異なので、ここでは勉強しません。

最後にこのWindow Classを登録(Register)します。

このRegisterしたWindow Classの結果を受け取るための変数を作成します。

Window.hに戻って以下の変数を作成します。

ATOMってどんな変数だったけ。

Copilotに聞きます。

うん。

この後もATOMについて詳しく解説していますが、肝心のVariableとして使用した場合についての解説がありません。

と思ったら以下のところにありました。

多分ですが、ATOMを使用するとどんなWindow Classが返って来てもErrorにならないんでしょう。

そしてWindow.cppに戻ってATOMを使用して作成した変数、m_wndClassにRegister Classの値をAssignしました。

勿論、失敗する時もあるので以下のようにその確認のためのCodeも追加しておきます。

以上で最初の10分(正確には12:53)が経ったので、今週のD3D12 Beginners Tutorial [D3D12Ez]の勉強は終わりにします。

9.1.2 Pointer Functionを実装する

まずCopilotにある例をそのまま書いてみました。

実行してみます。

うーん。

凄い。

一寸だけCodeを変更してみます。

以下の関数を作成して

Funcに追加しました。

その結果です。

おお。出来てます。

今度はPoint FunctionをParameterとしてPassする方法を試してみます。

以下の関数を作成しました。

更にMainのCodeを以下のように変更しました。

結果です。

今度は

Add()関数に変更しました。

結果です。

おお、足し算に変っています。

出来てますね。

9.2 「DirectX 12の魔導書」の勉強

9.2.1 「4.11 三角形ポリゴンを四角形にしてみる」を勉強する

今週は軽く全体を読む事にします。

<「4.11.1 Primitive Topologyを変更する」を読む>

Vertexの数を4つにすると言っています。

いや私のProjectは既に4つになっているのに三角形しか表示しないです。

と思ったら、その理由が書かれていました。

以下のCodeの設定が

D3D_PRIMITIVE_TOPOLOGY_TRIANGLELISTになっているからだそうです。

これをD3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIPに変更して

更に、以下のDrawInstanced()関数の最初のParameterの値を4に変更すれば

四角形が表示されるようになるそうです。

先週、四角形を表示しようとして失敗しましたが、結構惜しい所までやっていました。

D3D_PRIMITIVE_TOPOLOGY_TRIANGLELISTなどのIASetPrimitiveTopology()関数内のParameterについては来週以降、しっかり教科書を勉強する時に調べる事にします。

<「4.11.2 Indexを利用する」を勉強する>

ここではIASetPrimitiveTopology()関数の値がD3D_PRIMITIVE_TOPOLOGY_TRIANGLELISTのままで、Indexを代わりに使用して四角形を表示する方法を示すそうです。

ここではIndexが何なのかと言う説明と、Indexを使用するとVertexを6個指定しなくても三角形を2つ生成して四角形が作成出来る事が説明されていました。

なんか、この辺の話は昔、OpenGLを勉強した時に一回勉強した気がします。

<<「Indexを使う理由」を読む>>

別な例を用いて、Indexを使用するとLoad時間やVertexの呼び出しの回数が少なくなる事を解説していました。

<<「Indexの実装」を読む>>

ここは実際のIndexの実装方法が書かれていました。

具体的な内容に関しては次回しっかり読む時にまとめます。

後以外に重要な事が書かれていました。

MMDに使用されるPMDモデルはIndexありきで制作されているのでIndexを読み込めないと表示出来ないそうです。

前にOpenGLを勉強していた時に、MMDのModelを表示させたりしていたのですが、その時にはそう言う事は気にした事はなかったはずです。

多分Indexは使用していたんでしょうね。

あんまりおぼえていませんが。

9.2.2 「4.11 三角形ポリゴンを四角形にしてみる」を勉強した感想

これで4章が終わりです。

結構感慨深いです。

4章と比較するとやっぱり3章がかなり難しい内容でした。

これから勉強する人達には、3章はもう少しかみ砕いて教える必要がありますね。

10. まとめと感想

なし

11. 参照(Reference)

[1] Gediminas Kirdeikis. (2023, April 30). Unreal Engine 5 for Architecture - Full Beginner course [Video]. YouTube. https://www.youtube.com/watch?v=bT8aSTkpkDY

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

[3] Ben Cloward. (2023, November 30). Introduction to Vertex Shaders - Advanced Materials - Episode 32 [Video]. YouTube. https://www.youtube.com/watch?v=CHrnErTJvHU

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

[5] Reality Forge. (2024, March 29). Unreal Engine 5.4: Create a Product Commercials with Motion Design [Video]. YouTube. https://www.youtube.com/watch?v=yWQIz5yzTrw

[6] Rick Banks. (2022, June 22). Houdini 19 - Wall Tool 12 [Video]. YouTube. https://www.youtube.com/watch?v=Bi-9UwB_B1Q

[7] Pi Equals Three. (2023, June 10). Custom Fortnite Character P. 1 : Import CUSTOM Model - UEFN / Creative 2.0 Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=9f9UyyWG94Y

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

[9] Lumen Technical details 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/lumen-technical-details-in-unreal-engine

[10] Patrick Loeber. (2019, December 13). PyTorch Tutorial 01 - Installation [Video]. YouTube. https://www.youtube.com/watch?v=EMXfZB8FVUA

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

[12] AssemblyAI. (2022, July 9). PyTorch Crash Course - Getting Started with Deep Learning [Video]. YouTube. https://www.youtube.com/watch?v=OIenNRt2bjg

[13] freeCodeCamp.org. (2022, October 6). PyTorch for Deep Learning & Machine Learning – full course [Video]. YouTube. https://www.youtube.com/watch?v=V_xro1bcAuA

[14] sentdex. (2019, September 23). Introduction - Deep Learning and Neural Networks with Python and Pytorch p.1 [Video]. YouTube. https://www.youtube.com/watch?v=BzcBsTou0C0

[15] Aladdin Persson. (2020, June 24). PyTorch Tutorial - Setting up a deep learning environment (Anaconda & PyCharm) [Video]. YouTube. https://www.youtube.com/watch?v=2S1dgHpqCdk

[16] Mathew Wadstein Tutorials. (2016, January 30). WTF is? Material - Desaturation in Unreal Engine 4 [Video]. YouTube. https://www.youtube.com/watch?v=0pPyCZvZ05A

[17] Rick Banks. (2022, June 20). Houdini - Wall Tool 06 [Video]. YouTube. https://www.youtube.com/watch?v=o6Jfgv_FXWs

[18] Jwmsft. (2022, July 27). WNDCLASSEXA (winuser.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-wndclassexa

 

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

1. 今週の予定

先週のBlogを読み直して今週の予定を建てます。

<映像作品としてのLandscapeの作成>

3D Gaussian Splattingの元になる動画の撮影では、中心のObjectが風で揺らいていると3D Gaussian Splattingにした時にピンボケする事が判明しました。

今回は中心のObjectは固体を使用して撮影してみます。

Asphaltの地面が綺麗に再現出来ない理由はまだ不明です。今回はObjectを遠くから撮影してみます。

Unreal Engine 5 for Architecture - 2023 Full Beginner Course [1]の勉強の続きをやります。

先週このTutorialの勉強の一環として、公式SiteのLumen Technical Details [2]を勉強しました。

その中で、凄い興味を引いたのがHardware Ray TracingのFar Fieldの機能です。

これの設定方法についてもっと調べる事にします。

もしその後も時間があったら2024-04-28 のBlogで勉強したProject Settingの続きを実装します。

<AIの勉強>

今週からNiagaraの勉強の代わりにAIの勉強を始めます。

Jeremy Howard氏のPractical Deep Learning for Coders [3]を勉強する予定です。

他にも3Blue1Brown氏のNural Networks [4]とか

東京大学 松尾・岩澤研究室の松尾研 LLM コミュニティ Beginning LLM [5]とかも見ていこうと思います。

このTutorialが良いという噂を聞いたんですが、一個しか動画が上がっていません。

これじゃないかもしれません。

こっちはLLMの勉強みたいですね。

AIは全く分からないのでDeep LearningとLLMの関係も分からないです。

まあ、慌てずにゆっくり勉強する事にします。

<Materialの勉強>

Ben Cloward先生のTutorialを勉強します。

<Gaeaの勉強>

GaeaのTutorialを作成します。

先週、何もしなかったので今週は頑張ってTutorialを作成します。

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

先週、以下の順番で勉強する事にしました。

今週も Unreal Engine 5.4: Create STUNNING Product Commercials with Motion Design [6]の実装の続きをやります。

<Houdiniの勉強>

Castle Wall Tool [7]の勉強をやります。

今週は先週勉強したHoudini 19 - Wall Tool 12 [8]の実装を行います。

<UEFNの勉強>

先週は突然、UEFNの勉強は無駄かもしれない。と思い、止めるか続けるのかをもう一回考え直す事にしました。

更に言うと、元々Mapを公開してお金を稼ぐのが目的だったのに、全くその目標に到達出来そうにないので、少なくともPi Equal Thee氏のTutorialで勉強するのは止めた方が良いのでは。と思っていました。

Blogを書いた後に、Map上に神社を作って賽銭を貰ったらどうか。というIdeaを最初に考えていた事を思い出しました。

3D Gaussian SplattingやPCGそしてGaeaで作成したPhoto-Realisticな神山とその中に神社をUEFNで公開するんです。

今かんがえても「このIdeaは絶対にいける。」と思っています。

やっぱりUEFNの勉強は続ける事にしました。

<DirectX12の勉強>

Lötwig Fusel氏のDirectX12のTutorialではFence & Command List | D3D12 Beginners Tutorial [D3D12Ez] [9]の最後の10分を実装します。

DirectX 12の魔導書」は「4.10.3 描画命令」を実装します。

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

2.1 3D Gaussian SplattingをUE5で試す

今日は大雨なので外での撮影は中止します。

代わりに3D Gaussian SplattingをUE5で落としてそれを撮影してみます。

この自転車の3D Gaussian Splattingは前にUE5の落としたものです。

この中をUE5のMannequinを走らせる映像を取ります。

このProjectが元々Third Person Characterが出てこないTemplateを使用していました。

うん。

新しいProjectを作りますか。

Third Person CharacterのTemplateを使用したProjectを新しく作成しました。名前はThird Person 3DGSとしました。

新しいLevelを作成しました。

3D Gaussian SplattingのImportの仕方を忘れてしまいました。

調べます。

2024-04-07のBlogにLuma AIのGaussian SplattingのDataをUE5にImportする方法がまとめられていました。

Luma AI PluginをEnableします。

自転車のPly FileをImportしました。

Level上に3D Gaussian Splattingを展開してみました。

うん。出来てますね。

板を敷いてその周りをQuinnで歩いてみます。

床に敷いたCubeを調整しました。

色々な角度から見てみます。

これなんか結構良い感じです。

こっちは後ろの建物が歪んでいるのが確認出来ます。

自転車から離れると風景もぐちゃぐちゃになります。

もう一回、自転車の周りを回ってみます。

左の遊戯施設がボケています。

これはほぼOKです。

こっちも遊戯施設の一部がボケています。

自転車は綺麗に写っています。

これは写真を奥に置いた感じがしますね。

3D Gaussian Splattingの角度を少し調整しました。

後ろの建物が真っすぐになりました。

この角度から見る限りはギリギリですが、本物に見えなくもないですね。

2.2 3D Gaussian SplattingをUE5で試した感想

まず簡単には行かない事が分かりました。

その上で以下の改良すべき部分が分かりました。

一つ目は、Third Person Characterを歩かせるためには、CubeかPlaneを床に引く必要があります。

このStatic Meshが部分部分で表面に飛び出します。

適切なMaterialを張り付けて目立たなくする必要があります。

二つ目は、Third Person Characterに付属のCameraで撮影するとかならずぼやけた部分る事です。

Third Person CharacterであるQuinnをLevel上で動かす場合はLevel Sequenceを使用してCameraは別に配置した状態で撮影した方がよさそうです。

更に言うと、ここでAndroidを使用した撮影方法を組み合わせるのが良いかもしれません。

最後の点は、影の影響がどうなるかですね。

今回は影が出ないタイプの3D Gaussian Splattingで試してたので影の影響については全く分かりません。

これは来週、試す事にします。

2.3 Hardware Ray TracingのFar Fieldについての調査

これです。

まずこれを試す事できるMapを探します。

色々探したけどあんまりいいMapが無いです。

やっと見つけたのが以下のMapです。

Hardware Ray Tracingをセットします。

Use Hardware Ray Tracing when availableがEnable出来ません。

うーん。何で?

もしかして最初にProjectを作成する時に以下のCheckを入れないと駄目なのか?

2024-05-05のBlogでは

となっています。

もしかしてGame用のTemplateだとUse Hardware Ray Tracing when availableはEnable出来ないのかも。

ここで時間が無くなってしまいました。

今週はMapを探すのに時間を捉られて進みませんでした。

3.AIの勉強

3.1 Jeremy Howard氏のPractical Deep Learning for Coders [3]を勉強する

3.1.1 Practical Deep Learning for Coders: Lesson 1 [10]を勉強する

<Introduction>

特になし

<What has changed since 2015>

特になし

<Is it a bird>

写真を見て鳥かどうかを判断するCodeをPythonを使用して書いています

<Images are made of numbers>

特になし

<Downloading images>

以下のPythonのCodeでImageをDownloadしているんですが、

このCodeは自分で書けないと駄目なんでしょうか?

Python弄った事ないんですが。

一応、自分勝手に読んでみます。

まず最初の行にあるsearchesですが、Constantでしょうか。Typeの指定は無いですね。

ForestとBirdを指定しているのでStringのArrayになっているようです。

次の行のPathですがこれは何を指定しているのか分かりません。

Path(’bird_or_not’)

となっています。

次のIf not節は分かり易いです。もしPathが存在しなかったら実行を停止しろって事です。

次の行はFor Loopでしょう。

でもo in Searchの意味が分かりませんね。

そのまま解釈するとSearchの中のoを探せ。と言う意味に思えてしまいます。

Mkdir()関数はそのままDirectoryを作成しているはずです。

Resultsはddgの中にあるImageでoの条件であるものを保持しているはずです。

その結果の最初の200枚をDownloadしているようですね。その次の行で。

最後の行でImageのSizeを変更していますね。

うーん。

分からん。

一寸調べますか。

Python Variables, Constants and Literals [11]によると

=でVariableの初期化も出来るみたいですね。

何とPythonではConstantの名称はUppercaseで書く必要があるそうです。

更に別のFileで作成してそれを読み込むそうです。

Constとして読み込むようにと指定していますね。

これがConstantのAssignの方法のようです。

となるとこの例で宣言しているのはConstantではなくVariableですね。

これは実際にPythonでCodeを書いて確認しないと分からんですね。

このLectureで使用しているPythonは何て名前だったのかな。

なんかNetを利用して行うやつだったはずです。

これは後で調べてInstallします。

次のPathですが、調べてもPathlib.Path()しか出て来ません。

Copilotに質問したら以下の回答が返って来ました。

PathlibはどうやらModuleのようです。

そしてPathlib Moduleは以下の機能があるそうす。

FileへのPathを示しているって書いていました。

そうか。

じゃ、

は同じFolder内にあるBird_or_Not file(もしくはFolder)へのPathを示しているって事か。

次はPath Classの機能についての解説が載っていました。

使用したいFolderやFileへのPathを作成してくれることは分かりましたが、具体的なPathの書き方はどうなっているんでしょうか?

例も載っていました。

いや、例文のCodeでもbird_or_notを使用しているじゃないですか。

これでは分からん。

次はFor Loopの書き方です。

W^3 SchoolのWebpageにあったPython For Loops [12]です。

以下のように書くと

こんな結果になるそうです。

これXの代わりにOを使用しても同じ結果になるんでしょうか?

こういうのは自分で確認しないと分からないですね。

と思ったら自分でCodeを書いて試せる箇所がありました。

以下のCodeを実行してみます。

結果です。

成程。

となると

はSearchesにあるStringを一個ずつ取り出しているだけのようですね。

これは何をしているんでしょう。

以下の質問をCopilotにしてみました。

Copilotの回答です。

まずCodeを書き直しています。

そして以下の説明をしていました。

成程。

こういう意味だったのか。

要は、Distに新しいPathであるBird_or_not/birdをAssignしたって事でした。

そうなるともう残りの意味は分かりました。

Distの場所に新しいFolderを生成します。

DdgからBird のPhotoを探して来ます。

そのImageから最初の200枚をDistにDownloadします。

ImageのSizeを400に変更します。

今度は間違ったImageをUnlinkしています。

何でVerify_images()関数で間違ったImageを取り除く事が出来るんでしょうか。

そもそもVerify_Image()関数は何をやっているんでしょうか?

またCopilotに聞きました。

そんな関数はない。って帰って来ました。

これは教授のJokeだったみたいです。

<Creating a DataBlock and Learner>

で今度はDataBlockを作成しています。

このData Blockと言うのはC++でいう所のStructみたいなもんでしょう。

Data Blockの作成方法を確認します。

またCopilotに質問します。

これは実際に作成する方法を教えているのか。

これはPythonをInstallしてから勉強する事にします。

Lectureに戻ります。

以下の6つのImageを表示していました。

<Training the model and making a prediction>

今度は以下のCodeを流しています。

こんな関数があるんでしょうか?

これもCopilotに質問してみました。

あるみたいですね。

回答の残りも以下に示しておきます。

これ読むとcnn_learner()関数の大体のImageがつかめますね。

以下のような結果が出て学習が終わりました。

今度はこの学習したAIを使用してテストするみたいです。

これでテストになるのか。

まずlearn.predict()関数がなんなのかを調べる必要があります。

更にこのReturn Valueをis_bird, _ . probsで受け取っています。

Pythonって2つのReturn Valueを受け取る事が出来るの?

これもCopilotに質問してみましょう。

凄い。

何でも答えてくれます

ただこれって効率は凄い高くなりますが、その分疲れますね。

以下のような感じで使うそうです。

うーん。

じゃこのCodeだけ覚えてしまえば一応、Machine Learningが作成出来てしまうって事。

これは簡単だ。

LectureのCodeはつまりこのTrainしたModelにBird.jpgと言う名前のImageを見せて鳥かどうかを聞いている訳です。

その返事です。

うーん。

ここからがLectureの重要な内容でした。

今回のLectureは別にこの部分のPythonのCodeを勉強するのが目的ではなかったです。

ここでLectureの最初の部分の話と繋がって来ます。

ところが私はこのLectureの最初の部分は大切だと思ってなかったのでSkipしてしまいました。

以下に最初の部分の話を簡単にまとめます。

6:33

2015年頃は、AIに写真を見せて鳥が写っているかどうかを判断させるのは不可能でした。

それを示す当時の一コマ漫画です。

ところが現代(動画が作成されたのは2022年頃)ではこんな簡単なCodeでAIがImageを見て鳥かどうかをはっきり示す事が出来ます。

こんな短期間にどうしてAIはこんな大進化をする事が出来たのでしょうか。

<What can deep learning do now>

速くその解答を教えてほしいし、話の流れ的にそれがDeep Learningなのは想像出来ますが、中々その話が出て来ません。

その代りにMid JourneyとかDaliで生成されたImageを見せています。

2022年当時は衝撃的だったかもしれませんが、今となっては別にって感じです。

これでこの節は終わってしまいました。

あれ?

これはオカシイ。

前の節の最後をもう一回聞き返したら、

既にそれがDeep Learningだって言っていました。

<Pathways Language Model (PaLM)>

ここでそのDeep LearningのModelがどうなっているのかを習えるのかと思ったら、今度はGoogleのPathways Language Model(PaLM)についての話です。

別なClassで勉強するAIと倫理の話もしていました。

こういうのってアメリカだと当然のように勉強させられますが、日本ではこういうのはほとんど勉強する人はいませんよね。

こういう所で躓いてしまう日本人って多そうな気がします。

一応、気になっていたので記録に残す事にしました。

この後はClassの進め方についての解説をしていました。

Classの何%が理解出来なかったら内容をどうするのかとかの話をしていました。

これは私には関係ない話です。

私は理解するまで前に進まないので、勝手に自分のペースで勉強しますので。

ここでLectureの10分が経過したんですが、ほとんど何も勉強していません。

なので疲れもしません。

YouTubeのTutorialは10分も勉強するとくたくたになりますが、大学の時は一時間半とかの長い時間を良く勉強出来たな。と少し焦っていたんですが、何の事はない。内容が薄かったんです。

そりゃそうだ。教室には下手したら100人ぐらいの生徒がいる訳ですから、その生徒が全員理解出来るペースで教える必要があるから遅くなったり内容が薄くなったりするのは当然です。

これはYouTubeで勉強するのはかなりお得だったのかもしれませんね。

もう少し勉強する事にします。

<How the course will be taught. Top down learning>

このCourseの学習方法が少し特殊な理由を説明していました。

簡単にまとめると初心者でも理解出来る方法で教えるので、博士号とか持っている人が最初からぎっちり理詰めで勉強したい人には不満がある学習方法になっているとの事です。

後、以下の教科書に沿って勉強しますが、

この教科書が無料でDownload出来る事も説明していました。

これは前にDownloadした記憶があります。

Blogにも記録を残したはずなんですが見つかりません。

DownloadしたFileは見つかりました。

この前後のBlogも調べましたがAIについての話は載ってなかったです。

<Jeremy Howard’s qualifications>

これだけ勉強してこのTestを理解出来たら、まあこのCourseを履修した事を認めてやる。みたいな話かと思ったら、逆でした。

Jermey Howard氏がこのLectureを教える資格がある事を説明していました。

<Comparison between modern deep learning and 2012 machine learning practices>

何とやっとここで何で今のAIは簡単に鳥を見分ける事が出来るのかを説明するそうです。

どうもMachine LearningはDeep Learningより前にあってMachine Learningはあんまり上手くいってなかったみたいです。

でLayerを直接見る事にしたみたいな説明をしていました。

<Visualizing layers of a trained neural network>

なんかLayerをどんどん増やしています。

<Image classification applied to audio>

LayerをImageで表していますが、これは元のDataがImageだからではなく、どんなDataでもImageで表すそうです。

その例として音の学習のImageを示していました。

<Image classification applied to time series and fraud>

他の画像ではないDataでImageのLayerを作成した例を示しています。

後、Deep Learningの学習で以下のように述べていました。

<Pytorch vs Tensorflow>

このCourseではPyTorchを使用するそうです。

これをInstallする必要があるのか。

良し。

ここでLectureの時間で30分たったんですが、まだ余裕があります。

もう少し勉強します。

<Example of how Fastai builds off Pytorch (AdamW optimizer)>

PytorchだけでCodeを書くのは大変なので、Jermey Howard教授が作成したFastaiというLibraryを使用して学習するそうです。

Jupyter Notebookとかいうのを使用してSlideを作成しているそうです。

これ使う必要があるの?

調べます。

一応、無料と書かれてはいますね。

なんと、このSoftをCloud Serverで走らせて使用するそうです。

どうも大学の学生はこのCloud Serverを無料で使用出来るみたいですね。

これは別に真似しなくてもいいや。せっかくRTX-3700Tiがあるんだし、自分のPCで計算しますわ。

<Using cloud servers to run your notebooks (Kaggle)>

一応、この説明は聞いておきます。

以下にしめしたKaggleというCloud Serverを使用しています。

これか。

どうせ無料ではないでしょう。

こんなのもある位で理解しておきます。

いきなり以下の画面から始まっています。

Editを押します。

以下に示した様にEdit Modeに入りました。

ここでPythonが自由に使用出来るそうです。

この辺は勉強したくなったらKaggleのTutorialを個別に探して勉強した方が効率良いでしょう。

Tip的な話を何個かしています。

!があるのはPythonではなくBash Shell Commandだとかです。

この辺はKaggleを勉強しないといけなくなったら勉強する事にします。

<Bird or not bird? & explaining some Kaggle features>

実際にKaggleを使用して先程の鳥の画像を識別するAIを作成するためのCodeを書くみたいです。

まず、FastaiをInstallしていました。

Kaggle内でLibraryをInstallする時は電話番号を聞かれるそうです。

うん。

なんか既視感があります。

この動画は前に軽く見たはずですが、一回勉強したかもしれません。

<How to import libraries like Fastai in Python

<Best practice - viewing your data between steps>

この辺は前に示したCodeの解説をしています。

私は既にここで紹介されているCodeは勉強してしまったので繰り返しになる部分はSkipsします。

<Datablocks API overarching explanation>

あれ、Verify_images()関数を使用しています。

うーん。

ここは実装する時に確認します。

Data Blockの説明です。

BlocksはどんなDataなのかを解説しているそうです。

最初のParameterはInputのImageについての説明です。この例でImageのBlockだと説明しています。

次のParameterはOutputのImageについての説明です。この例ではCategoryのBlockだと説明しています。

うーん。

分かり易い。

ここで丁度、Lectureの半分が終わりました。

今週のAIの勉強はここまでとします。

残りは来週勉強します。

4.Materialの勉強

4.1 Introduction To Vertex Shaders - Advanced Materials - Episode 32 [13]を勉強する

Brickの作成が終わって、次のTutorial Seriesです。

今度はVertex Shaderについて勉強するそうです。

UnityのMaterialではVertex ShaderとPixel Shaderが分かれていますが、UE5のMaterialでは一緒です。どうやって勉強するんでしょうか?

以下の内容を勉強すると言っていました。

成程。Materialから直接Vertex Shaderを扱う方法を勉強するのではなく、Vertex Shaderで扱っている機能についてUEやUnityを使用した場合の適用方法を勉強するみたいですね。

Offsetの説明をしています。

成程。

今回のTutorialはこんな内容を勉強するのか。

次に以下のVertex Interpolatorノードを使用していました。

このNodeの左側に来たものは全部Vertex Shader、右側に来たものはPixel Shaderに繋がるそうです。

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

これは面白いNodeを知りました。

何と今週の勉強はこれだけでした。

まあ丁度いいかもしれません。

実装は来週します。そしてこのVertex Interpolatorの機能を色々試してみます。

5.Gaeaの勉強

5.1 Tutorialを作成する

以下のPowerPointを作成しました。

先週のSlideをそのまま流用しました。

今回勉強するNodeのPropertiesはTextureノードとSatMapノードの2つです。

SatMapノードのPropertiesを示しています。

Satellite MapのLibraryの種類を解説しています。

ひし形のButtonの機能について解説しています。

HeartマークのIconの機能です。

Rangeの機能です。

TextureノードのPropertiesです。

5.2 Tutorialを録画する

今回はMicrophoneを机に置いて録音しました。

録音する音が小さいのでPCの設定を変更しました。

Control Panelを開き

Soundを選択しました。

マイクを開き

LevelのTabからマイクのLevelを最大値まで上げました。

更に詳細のTabを開き

ApplicationによりこのDeviceを排他的に制御できるようにするもOffにしました。

一応これで録音した音が少しは大きくなりました。

ただしGaeaを操作している時の録音した音声はあんまり綺麗ではないのは一緒です。

ここは後から録音しなおします。

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

6.1 Unreal Engine 5.4: Create STUNNING Product Commercials with Motion Design [6]の実装の続きをやる

先週の最後にやった内容を確認します。

となると今週は2024-04-21のBlogの内容を実装する事になりますね。

<Adding Background Text>

ここからやって行きます。

Projectを立ち上げたらSoda Canがまたどっかにいってしまいました。

こんなところにありました。

更にMotion Designの項目を見ると

Soda CanとCTRL_Canが別々の存在になっています。

うーん。

なんで?

無理やり、Soda CanをDragしてCTRL_Canに追加してみました。

するとSoda CanのLocationが0を指さなくなりました。

Soda CanのLocationを0に直しました。

Soda Canの位置が元の場所に戻りました。

あー。

びっくりした。

以下のWindowの表示方法が分りません。

Place Actor Windowを開いてそこからText Actorを追加します。

以下のように配置しました。

TextにIt‘s Unrealと打ち込みました。

更にEnforce Upper CaseにCheckを入れました。

Fontの指定ですが、Tutorialでは以下のFontを使用していましたが、

このFontはDefaultではないのでDefaultのままにしておきます。

結果です。

字が大きすぎてはみ出してしまっていますね。

調整します。

文字のFontも変更しました。

次の工程ですが、2024-04-21のBlogには

CameraをTime Sequenceに追加すると書いておきながら。実際はText Actorを追加しています。

Text ActorをLevel Sequenceに追加しました。

Text Actorの+を押してActor Hidden in Gameを選択します。

Visibilityが追加されました。

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

以下に示した白いBarの位置が120の位置に移動しました。

ひし形のIconを押してKey Frameを追加しました。

今度は以下の場所に119を代入しました。

そしてVisibilityのCheckを外しました。

<Animating Background Text>

今度はFrameが240の場所に白いBarを移動させました。

Kerningの値をSequenceに追加しました。

更にFrameが120の位置に白いBarを移動させ

Kerningの値を-5.0にしてその値を記録しました。

Animationを見て確認しましたが、文字が大きくなるAnimationが追加されています。

次の工程です。

とりあえずBarを掴んでひっぱってみます。

出来ました。

白い縦のBarでは無く、Text Actorの横線のBarをひっぱったら出来ました。

更にSequence Curveの調整も行います。

右上のPointを選択して

Tangent Lineを表示させ、

Tangent Lineの左端のPointを引っ張って

このようなCurveに変更しました。

Animationを見て確認しましたが、あんまり変化は感じませんでした。

<Rendering>

とうとうRenderingまで来ました。

CameraをTime Sequenceに追加しました。

以下のIconをClickし

以下のWindowが開きました。

Unsaved Configを選択します。

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

ここは見ただけでした。

Acceptを押して前のWindowに戻り、右下にある以下のButtonを押します。

あ。

どこにOutputされたのか確認するのを忘れていました。

出来ました。

生成されたFileはProjectのSaved内のFolderに保存されていました。

おお。と思ったら生成されたImageを見ると

Textの文字がボケているし、Soft Canが表示されません。

???

です。

一回UEを再起動してみました。

おお、Imageと同じ結果になっています。

Soda Canがまた外れていました。

Soda CanをCTRL_Canにつなげると元に戻りました。

Soda Canの方にもKey Frameを入れてみました。

もう一回Renderingしてみます。

うーん。

駄目でした。

これはSoda CanだけでLocationを指定し直す事にします。

色々やってとうとう出来来ました。

最終的にはSoda Canは新しいSatic Meshで作り直しました。

うーん。で

この300枚のImageからどうやってVideoに変換するんでしょうか?

Davinci Resolveに突っ込んだらVideoに変換してくれました。

それをMP4 FileでRenderingしました。

更にそれをGifに変換したのを以下に示します。

(Sizeが大きすぎるのでImageに変えました)

なんでこんなに遅いんでしょうか?

見直すとDavinci Resolveで生成したVideoそのものが遅くなっていました。

Frame rateが60FPSなのに24FPSでVideoを生成したからこうなったんです。

色々調べたんですがどうやって60FPSでVideoに編集するのか分かりません。

今回は250倍の速度でVideoを作り直しました。

それをGifにしたモノを以下に示します。

まあ、最初の映像作品なので、これでも良いでしょう。

一応完成とします。

7.Houdiniの勉強

7.1 Houdini 19 - Wall Tool 12 [8]を実装する

Clean UpとDigital Assetの作成を行います。

<Clean Up>

Color_TintGroutノードのClassの値をPrimitivesに変更します。

しました。

以下の位置にGroupノードを追加します。

Group Nameの値をGroutに変更します。

Merge3ノードを選択し

更にiを選択します。

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

以下のAttributeが生成されていました。

Tutorialで生成されていたAttributeです。

全く同じですね。

要らないAttributeを消します。

Attribute Delete1ノードを追加します。

以下のAttributeを消します。

ここはTutorialに書かれているままにやりました。

どのAttributeをどこで使用したのかについては全く覚えていません。

後、ここでDeleteされるAttributeが自分で書いたCodeから生成されたものなのか、それとも勝手に生成されたものなのかも分かりません。

この辺はおいおい勉強していくことになると思います。

同様の事をGroupにも行います。

Group Deleteノードを追加します。

要らないGroupを消します。

何とGroup Nameに何も登録されていません。

Merge3ノードを見ると以下のように沢山のGroupが存在しています。

以下のようにMerge3ノードから直接Group Deleteノードを繋いだ場合は

以下のように

存在するGroup Nameが全部表示されます。

これはAttribute Deleteノードの設定をどこか間違えている可能性があります。

Tutorialを見直して確認します。

TutorialのGroup DeleteノードはしっかりGroup名が表示されていました。

更にTutorialではAttribute Deleteノードのiを表示させると

以下のように残っているGroupを表示しますが、

私のAttribute Deleteノードは

あれ?

表示している。

前に見た時は表示してなかったんですが?

何とGroup DeleteノードのGroup NamesもGroup名を表示するようになっていました。

???です。

もしかしたら全体の計算をして情報を更新するのに少しだけ時間がかかるのかもしれません。

以下のように値をセットしました。

Outputノードを追加します。

名前をOutput_BrickWallOutputとします。

ここからDigital Assetを作成します。

全部のNodeを選択します。

以下のIconを押します。

しばらくなんの変化も起こらないので、焦りましたが

以下に示した様に一個のNodeになりました。

このNodeにBrick Wall Toolと名付けました。

右ClickしてDigital Assetを選択します。

<Create A Digital Asset>

これの事でしょうか?

先週のBlogで取ったScreenshotではDigital Assetと言う項目がありますね。

Tutorialを見て確認します。

Create Digital Assetの方を選択していました。

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

TutorialのBoxとは全然違いますね。

一寸、読む事にします。

まず最初のAsset Labelです。

これはTutorialのOperator Labelと同じでしょう。

名前をBrick Wall Tool (Build)としました。

以下の部分は名前や分類するための設定です。

そのままで良いでしょう。

次に行きます。

最後のSaveする場所ですが、

C:\Users\kazuh\OneDrive\Documents\houdini20.0\otls\sop_kazuh.Brick_Wall_Tool_Build.1.0.hdanc

C DriveになっているのでDに変更します。

D:\2024\Houdini\houdini20.0\otls\sop_kazuh.Brick_Wall_Tool_Build.1.0.hdanc

ここにAddressを記録しておくので駄目だった場合は元のAddressに直してまた試せるでしょう。

Createを押します。

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

実際は5秒ぐらい何の反応もなくて結構焦りました。

Maximum Inputsの値を2に変更します。

Parameterの設定をします。

高Polygonの結果と低Polygonの結果の表示を選択出来るParameterを作成します。

ParameterのTabを選択しました。

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

この画面はTutorialとほとんど同じですね。

Create ParametersのBy TypeにToggleもありました。

これをDrag and Dropして

Exiting ParameterのRootに追加します。

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

名前をBuildModeToggleに変更します。

Labelの値をBuild Modeに変更します。

この状態で右下のApplyを押します。

更にAcceptを押します。

開いていたWindowが閉じて通常の画面に戻って来ました。

BrickWall_tool_Buildを見ると以下のように

開いたLockのIconが表示されています。

このIconはTutorialの方には表示されていませんね。

更にParameterの表示ですが、

私の方は以下に示した様に

名前とBuild Modeしかありませんが、Tutorialの方は

Asset Name And Pathがあります。

うーん。

まあVersionが変わったのでUIも少しだけ変化しただけでしょう。

今度はBrick Wall Tool Buildノードの中を開いて中身を変更していきます。

先週、勉強した時にこれどうやって開くんだよ。と思ったんですがDouble Clickしたら普通に開けました。

Nullノードを追加します。

Switchノードを追加します。

Nullノードの結果を繋ぎます。

うーん。

Nullノードはなんの結果も受け取ってないんですが、繋いじゃって良いんでしょうか?

Tutorialで確認します。

思いっきりDelete Small Parts1ノードの結果をNullノードに繋いでいました。

繋ぎました。

更にNullノードの結果をSwitchノードに繋ぎました。

以下に示したBrickwall_tool_buildを右Clickして

以下のBoxを開き

Type Propertiesを開きます。

ここからが難しいです。

まずParameter DescriptionのChannel Tabを選択します。

以下に示したSwitchノードのSelect InputをDrag and Dropして

以下の場所にDropします。

結果です。

Defaultsの1のLinked Channelの値が追加されました。

この後の先週のBlogのまとめは細かい点が抜けているのでTutorialで確認しながら進めます。

Applyを押します。

その後で、SwitchノードのSelect Inputを押すと

以下に示した様に値が変化します。

そしてAcceptを押してWindowを閉じています。

先週のBlogではこの後に、

とだけ書いていて、どんなテストをしたのかがまとめられていません。

流石にこの辺に来たら疲れてしまったのかもしれません。

以下に示したBrickwall_tool_buildを右Clickして

Windowを表示させ以下に示したParameterを選択します。

以下のWindowが開きますので、

このBuild ModeをOn、Offします。

何にも変わらない!

と焦りましたが、Outputノードの可視化をセットしてなかったです。

Outputノードを可視化してもう一回テストすると

以下のようにOn Offで結果が変わる様になりました。

あ、先週のBlogはこの後にこのテストの内容の詳しいまとめをしていました。

テストしています。じゃなくてテストします。と書いてあれば気が付いたんですが。

まあ仕方ないです。

User Interface Layouts>

Type Propertiesを開きます。

ここにParameterを追加します。

<Line Width>

まずLine_WidthノードのParameterを追加します。

Line WidthノードのLengthをDrag and DropしてType Propertiesの以下のRootにDropします。

うーん。

これParameterのTypeを先に指定しなくて良いでしょうか?

一応Tutorialで確認しておきます。

しなくて良いみたいです。

正しDropするのは以下に示したRootの方です。

ParameterのNameとLabelの値を変更しました。

ChannelのDefault値が3になっている事も確認しました。

<Line Height>

今度はLine Heightノードです。

以下のLengthを

Type ParametersのExisting Parameterに追加します。

他のParameterの値もLine_Widthノードの場合と同じように変更します。

Tutorialで確認したんですが、このParameterはDefault値の確認はやってませんでした。

<Brick Rose>

今度はBrick Rowノードです。

ここはSegmentの値をType ParametersのExisting Parameterに追加します。

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

名前も変更します。

こっちはDefault値が6になっているのも確認しています。

最後にParameterのRangeの値を調整します。

Wall HeightのRangeです。

しっかり鍵も掛けました。

Wall LengthのRangeも変更します。

最後にFolderを追加します。

以下の方法でFolderを追加するそうです。

出来ました。

Folderの名前を変更します。

ここで今回のTutorialは終わっています。

Type ParametersのApplyを押さないと

今までの設定、全部消えてしまうと思うんですがそこは書いてません。

Tutorialで確認します。

うん。

RowのRangeですが以下のように設定していました。

直します。

Defaultでこの値になっていました。

TutorialはType ParametersのWindowを閉じないで終わっていました。

Applyを押してAcceptを押してType ParametersのWindowを閉じました。

今週のHoudiniの勉強はここまでとします。

今週作成したParameterのテストと残りのParameterの追加は来週やります。

8.UEFNの勉強

8.1 先週のBlogを読み直す

先週のBlogは大急ぎで思いついたIdeaをまとめたので綺麗にはまとまっていません。

それで読み直して、ここに綺麗にまとめ直します。

読み直しました。

うーん。

思っていたより100倍しっかりまとまっていました。

特に生成AIがもたらす新しい情報の価値を具体的な例で表現していたのは俊逸でした。

やっぱり私、文才があります。

このBlogを読み直す前、Nvidiaの創設者であるJensen Huang氏が「AIは次の産業革命を起こす。」と言っていた動画を見ていたんです。

そのAIが起こす革命によって人類はどう変わるのか?を考える必要があると思ったら、何と私が先週書いたBlogに既にその答えが書かれていました。

まあ、「AIが起こす革命によって人類がどう変わるのか?」と言うお題はかなり壮大なので、先週私がまとめた内容だけが起きると言う訳ではないでしょう。

この疑問についてはまた別の機会に考える事にします。

8.2 UEFNの勉強について

UEFN内でPhoto-Realisticな神社を建設するというIdeaは絶対にいけるので、このまま勉強は続ける事にします。

でもまあ焦らないでやる事にします。

UEFNだけ理解が進んでもGaeaやUEのPCGの勉強が追い付かなかったら意味ないですので。

で、まあPi Equals Three氏のTutorialをこれからも続ける事にします。

ただし前に勉強したHOW TO ANIMATE YOUR CUSTOM PET - Fortnite UEFN / Creative 2.0 Tutorial [14]のBugの直しはやりません。

そんなに真剣に直しても今の時点では意味がないからです。

どんどん色んな事を試す方を優先させます。

ので今週はその次のTutorialを勉強します。

8.3 Custom Fortnite Character P. 1 : Import CUSTOM Model - UEFN / Creative 2.0 Tutorial [15]を勉強する

いやいや。

Custom ModelのImportの仕方は別なTutorialで既に勉強したよ。

と言うかこの前のTutorialをやるのにCustom ModelをImportする必要があったじゃないか。と思いましたが、今回は黙ってやる事にします。

ただやっぱりPi Equals Three氏のTutorialで勉強を続けるのはかなり危険な気もしています。

後で、他のUEFNのTutorialの探す事にします。

<Intro>

SketchfabからSkeletal MeshのImport方法を説明するそうです。

まあ題の通りですね。

<Download Model from Sketchfab>

これをImportするそうです。

なんと以下の部分を見ると付属のAnimationの存在も分かるそうです。

知らんかった。

一寸確認します。

全部の3D ModelにAnimationを選択するButtonがついているのではなかったです。

ただしRigがある3D Modelには以下に示した様にAnimationを表示するButtonがありました。

ついているAnimationはピンキリで

単にPoseを変えているだけのものから

複雑なAnimationをやるものまで色々でした。

でもAnimationはMixamoから入手すれば良いのでここでそんなに一生懸命する必要は無いと思います。

Downloadを押してWindowを開きFBXを選択します。

<Importing Model into UEFN>

DownloadするとSourceとTextureのFolderが出て来ます。

開くと3D ModelとそのModelに使用するTextureがあります。

ModelをImportすると以下のWindowが表示されます。

以下のImport AnimationにCheckがついている事を確認して下さい。と言っています。

これがOffになっているとAnimationがImportされないそうです。

え。

知らんかった。

前に3D ModelをImportした時にAnimationがImportされなかったのはこのせいだったのか。

以下にUEFNにImportされたDataを示しています。

確かに2つのAnimationが生成されています。

<Applying Materials To Model>

今度はMaterialの作成方法を説明しています。

なんか一気に出来る方法があるのかと思ったら、地道に一個ずつ作成していました。

<Converting Skeletal Mesh to Blueprint Prop>

もうこれで完成かと思ったらここからBPを作成するそうです。

PropからBPを作成して、そのBPを開いてSkeletal Meshを追加してそのSkeletal Meshに今の3D Modelを追加しただけでした。

以上でした。

8.4 Custom Fortnite Character P. 1 : Import CUSTOM Model - UEFN / Creative 2.0 Tutorial [15]を勉強した感想

まさか、3D ModelをImportする時にImport AnimationのCheckがOffになっているとAnimationがImportされないとは。

いやこのImport Animationという項目がある事に気が付いていたら、多分自分でその事を発見出来たと思うんですが、まあ、気が付きませんでした。

それだけ勉強出来ただけでもこのTutorialを勉強した甲斐はあります。

なんかPi Equals Three氏のTutorialってそういうのが多い気がします。

8.5 UEFNの他のTutorialを探す

他のTutorialを探す事にします。

UEFN Tutorialで検索したら以下のTutorial Seriesが出て来ました。

一番上にPi Equals Three氏のTutorial Seriesが出て来てますね。

やっぱり彼のTutorialの評価が一番高いんでしょうか?

後JSFILMZ氏のTutorial Seriesがありました。

こっち勉強するのもありかもしれません。

最後のGreme Bull氏のTutorial Seriesですが72本の動画が上がっています。

その割に再生数は7千回と非常に少ないですね。

何でなんでしょう?

最新のTutorialの最初だけ見たんですが、千回位再生されているし、別に変な感じもしません。

このTutorialで勉強するのもありかもしれません。

YouTube全体でこれだけしかないのが一寸驚きです。

もうGame産業自体が斜陽になっている証拠でしょうね。

9.DirectX12の勉強

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

9.1.1 Fence & Command List | D3D12 Beginners Tutorial [D3D12Ez] [6]の最後の10分を実装する

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

先週のBlogを見ると以下の実装から始まって

最後の方でDispatchCommantList()関数の名前をExecuteCommandList()関数に変更していましたが、

私のProjectを見ると既に

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

これはDispatchCommandList()関数(ExecuteCommandList()関数)の先週の最終的な実装と全く同じです。

更にSample Codeで確認しましたが、

以下に示した通り

Tutorialの最後の実装や私の今の実装と同じになっています。

今度はMain.cppの実装を行います。

Whileを追加します。

Whileの中を実装していきます。

まずCommand Listを初期化しました。

次にExecuteCommandList()関数を実行しました。

Close()関数をExecuteCommandList()関数に追加します。

Tutorialでは以下のように追加していました。

私のProjectでは以下に示した様に既に追加されていたのでそのままにしておきます。

これはSample Codeをそのままコピペしたからです。

試しに実行したら以下の真っ黒の画面が表示されました。

Memoryは82MBを使用していました。

Tutorialでは以下に示した様に72MBの消費でした。

まあ大体同じでしょう。

9.2 「DirectX 12の魔導書」の勉強

9.2.1 「4.10.3 描画命令」を実装する

先週勉強した内容を実装していきます。

以下の内容を実装します。

<「1.Pipeline StateのSet」について>

以下のように実装しました。

<「2. Root SignatureのSet」について>

とりあえず以下の場所にCodeを追加しました。

<「3. ViewportとScissor RectangleのSet」について>

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

<「4. Primitive TopologyのSet」について>

これはRoot Signatureの後に追加しました。

<「6. Drawを命令する」について>

最後のDrawを命令するための実装です。

これで完成のはずです。

実行して試してみます。

白い三角形が表示されました。

とりあえずは成功したと考えていいですね。

<「いろいろ試してみよう」を実行する>

ここは教科書に載っている以下の実装を試してみます。

まずDrawInstanced()関数の最初のArgumentの値を4から3へ変更します。

この部分の値はInputするVertexの数を表しているはずです。

今回はVertexの数は3つになっているので3に変更しました。

次にPixel Shaderの変更を行います。

Input.posを使用していますが、

Sample CodeにはStruct、Inputが実装されています。

更にPixel ShaderのBasicPS()のArugmentにInput inputを追加しました。

テストします。

Errorになりました。

以下の関数がExceptionをはいています。

うーん。

これはCodeを変更したからなったのか?

もう一回元のCodeに戻してTestし直します。

普通に三角形が表示されました。

一寸だけ変更してどこでErrorが発生するのか試してみます。

Pixel Shaderの色を変更してみます。

これはOKでした。

次にVertexの値を変更しました。

何でこれで三角形が描けるのか今一分かりませんが、Xの値だけ0.7から0.1に変更しました。

うーん。

出来てますね。

今度はPixel ShaderのBaiscPS()関数にParameterを追加しました。

ここでErrorが発生しました。

これは何かDirectX12のCodeを変更する必要がありそうです。

これから教科書で勉強する内容が必要な気がします。

Errorの原因の追究はここまでにして、来週は教科書の勉強を進める事にします。

10.まとめと感想

なし

11.参照(Reference)

[1] Gediminas Kirdeikis. (2023, April 30). Unreal Engine 5 for Architecture - Full Beginner course [Video]. YouTube. https://www.youtube.com/watch?v=bT8aSTkpkDY

[2] Lumen Technical details 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/lumen-technical-details-in-unreal-engine

[3] Howard, J. (n.d.). Practical deep learning for coders. YouTube. https://www.youtube.com/playlist?list=PLfYUBJiXbdtSvpQjSnJJ_PmDQB_VyT5iU

[4] 3Blue1Brown. (n.d.). Neural networks. YouTube. https://www.youtube.com/playlist?list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi

[5] 東京大学 松尾・岩澤研究室. (n.d.). 松尾研 LLM コミュニティ Beginning LLM. YouTube. https://www.youtube.com/playlist?list=PLT07SIG9QbZy12TWM9sBvtF0USv6m5Y9V

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

[7] Rick Banks. (n.d.). Castle Wall Tool. YouTube. https://www.youtube.com/playlist?list=PLNbgmFvU__fiPhyUWHHzZ2Nv5ieM_bOdB

[8] Rick Banks. (2022, June 22). Houdini 19 - Wall Tool 12 [Video]. YouTube. https://www.youtube.com/watch?v=Bi-9UwB_B1Q

[9] Lötwig Fusel. (2023, May 22). Fence & Command List | D3D12 Beginners Tutorial [D3D12EZ] [Video]. YouTube. https://www.youtube.com/watch?v=KsCZDeJDXDQ

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

[11] What are Python Variables, Python Constants and Literals? | Definition. (2021, June 29). Toppr-guides. https://www.toppr.com/guides/python/python-introduction/variables-constants-literals/python-variables-constants-and-literals/#:~:text=In%20the%20Python%20programming%20language,initialized%20on%20different%20modules%2Ffiles.

[12] Python for loops. (n.d.). https://www.w3schools.com/python/python_for_loops.asp

[13] Ben Cloward. (2023, November 30). Introduction to Vertex Shaders - Advanced Materials - Episode 32 [Video]. YouTube. https://www.youtube.com/watch?v=CHrnErTJvHU

[14] Pi Equals Three. (2023, May 30). HOW TO ANIMATE YOUR CUSTOM PET - Fortnite UEFN / Creative 2.0 Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=VTHH4S9VjAA

[15] Pi Equals Three. (2023, June 10). Custom Fortnite Character P. 1 : Import CUSTOM Model - UEFN / Creative 2.0 Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=9f9UyyWG94Y

 

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

1. 今週の予定

今週から先週のBlogを読み直してから今週の予定を建てる事にします。

<映像作品としてのLandscapeの作成>

撮影した映像をLuma AIに上げて3D Gaussian Splattingを作成します。

更に Unreal Engine 5 for Architecture - 2023 Full Beginner Course [1]の勉強の続きをやります

Niagara の勉強>

Unreal Engine 5で学ぶビジュアルエフェクト実装 基本機能からNiagara、シミュレーションまで」の最後の実装が、先週Errorになってしまいました。

この原因を追究します。

<Materialの勉強>

Ben Cloward先生のTutorialを勉強します。

今週は先週勉強した Procedural Brick Distortion - Advanced Materials - Episode 31 [2]の実装をします。

<Gaeaの勉強>

GaeaのTutorialを作成します。

今週は特に何もしないかもしれません。

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

先週、以下の順番で勉強する事にしました。

今週は Unreal Engine 5.4: Create STUNNING Product Commercials with Motion Design [3]の実装の続きをやります。

<Houdiniの勉強>

Castle Wall Tool [4]の勉強をやります。

今週はHoudini 19 - Wall Tool 12 [5]を勉強します。

<UEFNの勉強>

本来はMapを公開して少しでもお金を稼ぐのが目的だったはずですが、目的から凄いズレてしまっています。

今週は計画の見直しを考えます。

<DirectX12の勉強>

先週は勉強出来ませんでした。

先々週の勉強を見直すと今週何をすべきなのか大体判明しました。

Lötwig Fusel氏のDirectX12のTutorialではFence & Command List | D3D12 Beginners Tutorial [D3D12Ez] [6]の最後の10分を勉強します。

DirectX 12の魔導書」は「4.10.3 描画命令」を勉強します。

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

2.1 Luma AIを試す

先週作成した3D Gaussian Splattingは地面がぼけてしまっていました。

今週は、同じ被写体を撮影して地面のボケを無くす方法を検討します。

まず、今回は少し下がって撮影しました。

結果です。

地面の周りはやっぱりボケていました。

先週作成した3D Gaussian Splattingです。

先週の方がボケている地面が多いです。

しかし今週の結果もボケている部分は多いです。

花は綺麗に写っています。

こっちの草はボケています。

どの角度から見てもボケていました。

2.2 別のDataを試す

別のVideoから作成した3D Gaussian Splattingです。

こっちは花を集中的に撮影して花にピントを合わせる事を最重要としました。

ブレブレです。

うーん。

元の動画を見て理由が判明しました。

花が風で揺らいていました。

これがピンボケを誘発していました。

うーん。

一つ勉強になった。

2.3  Unreal Engine 5 for Architecture - 2023 Full Beginner Course [2]の勉強の続きをやる

今週は公式SiteのLumen Technical Details [7]を勉強します。

序文から以下のような解説がされていました。

先週あった色々な疑問がこの説明だけでかなり解決しました。

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

この疑問も一瞬で解決です。

LumenはGlobal IlluminationとReflectionを行うためにRay Tracingを行っているそうです。しかも色々なRay Tracingを何回も行っているそうです。

更にSoftware Ray TracingとHardware Ray Tracingについても解説していました。

先々週のBlogではSoftware Ray TracingとHardware Ray Tracingを以下のように設定していました。

Support Hardware Ray TracingをEnableした上にSoftware Ray Tracingの設定もTweakしていました。

両方使用する事も可能のようですね。

Surface Cache>

ここはDefaultではSurfaceのために12個のCardsが利用出来るようになっている事。

もっと複雑な形状のMeshを正確に再現したい場合はCardsの数の設定を

以下のMax Lumen Mesh Cardsから変更する事だけ覚えておきます。

このCardが実際は何をやっているのか今一理解出来ません。

おそらくCardがより正確になるとSurface Cacheもより正確になるんでしょう。

以下の設定でSurface Cacheの可視化が出来るみたいです。

以下のように可視化されるそうです。

Pinkの部分はSurface Cacheが無い部分だそうです。

他にも沢山解説が載っていましたが、現状理解出来たのはこれだけでした。

<Screen Tracing>

最初のRay Tracingの方法であるScreen Tracingです。

先週のBlogと先々週のBlogを読み直したんですが、この設定をいじっている箇所が見つかりません。

以下の方法でScreen Tracingの無い状態を見る事も出来るそうです。

<Lumen Ray Tracing>

ここでSoftware Ray TracingとHardware Ray Tracingについて解説しています。

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

更にそれぞれの解説がありました。

<Software Ray Tracing>

Software Ray TracingではSigned Distance Fieldsに対してのみRay Tracingが行われるそうです。

このRay TracingはShader Model 5 (SM5)がSupportされているHardならどのHardでも使用出来るそうです。

先週のBlogで確認すると、このProjectではSM6を使用していました。

後、このRay Tracingを使用するためにはProject SettingsのGenerate Mesh Distance FieldsをEnableする必要があるそうです。

Software Ray Tracing Modeのそれぞれの設定の解説もありました。

先週のBlogではこの部分の設定には以下の解説がありました。

うーん。

この説明だと何でSoftware Ray Tracingでこの機能が選択できるのかよく分からないです。

このSiteの解説です。

これなら納得出来ます。

そしてDetail Tracingの方が計算Costがかかりますがその分正確な計算をする事も理解出来ました。

この後、Distance Field Resolution Scalesの値を変更する事で以下のように

distance field representationのMeshの形状をより正確に表す方法を説明していました。

これは今の私では活用できないLevelの精度の話です。

ただこの辺までしっかりやったとしてどれぐらい評価されるのかは不明です。

誰もこんな細かい部分なんて気にしないんじゃないでしょうか?と言う気もします。

<Hardware Ray Tracing>

簡単にまとめるとHardware Ray Tracingの方が性能が良いです。

そしてHardware Ray Tracingを使用するためには

以下の設定をする必要があります。

うーん。

この設定を読むと先週のBlogで以下のようにまとめられていましたが

Tutorialの設定ではHardware Ray Tracingを使用出来ない設定になっているみたいですね。

あれ。

このTutorialを作成した人は本当にこの部分を理解しているんでしょうか?

以下の条件の時にHardware Ray Tracingを使用するそうです。

これ見ると普通にHardware Ray Tracingを使用しているみたいです。

<Large Worlds>

これは後で勉強します。

<Far Field>

この機能を使用すると以下のような遠くのSceneを含む場合でもきれいなLumenを再現出来るそうです。

うーん。

凄い。

ただしこれはHardware Ray Tracingだけについているそうです。

<General Limitations of Lumen Features>

ここは特に重要な情報はないみたいです。

<Lumen Platform Support>

Lumenを使用するためのHardwareの性能が書かれていました。

私のPCは余裕で要求をClearしていましたが、Androidの方はどうなんでしょう?

Vulkanを使用したら制限ありだけど少しはSupportしているみたいです。

<Lumen Visualization Options>

これです。

これが知りたかった。

以下のように説明されていました。

先週、Lumen Sceneにした時は以下のようになりました。

Lumen Sceneは以下のように解説されていますが、

Lumenを起動したらこんな変な画面になってしまうって事でしょうか?

<Troubleshooting Topics>

何の情報もないです。

<Problem-Causing Meshes>

具体的な例とその解決法が載っていました。

以上です。

2.4 Lumen Technical Details [7]を勉強した感想

かなりLumenについて理解が深まりました。

その結果ですが、Unreal Engine 5 for Architecture - 2023 Full Beginner Course [2]の設定って間違っている気がします。

まず以下の部分ですが

Hardware Ray Tracingが使用出来ない設定になっています。

そのくせ、

はEnableしています。

うーん。

どうしよう。

他のTutorialでここまで解説しているのは無いかもしれないし。

取りあえずは最後まで勉強しますか。

3Niagaraの勉強

先週完成したと思ったFluid Simulationの実装はErrorになってしまいました。

あんまり深く考えなくても教科書とSample Codeの実装に沿って作っていけば完成するだろうと高をくくっていたらこんな結果になってしまいました。

今週はこのErrorを直します。

3.1 Errorの原因を追究する

取りあえずSample Codeと比較して結果が違う箇所の原因を探ります。

まずSample CodeのCameraからみた画像です。

水に色がついています。

私のProjectのCameraから見た画像です。

水が透明になっているんです。

ここがまず違います。

水に色を追加する部分の実装のどこかを間違えていると思われます。

この部分の原因から探っていきます。

うーん。

今度はRT_WaterThicknessの画像に問題がある事が分かりました。

以下に示した様にSample CodeではLevel上のFluid SimulationとRT_WaterThicknessの画像が同じになっていますが、

私のProjectではLevel上のFluid SimulationとRT_WaterThicknessの画像は以下のようになっていて

全く違う画像になっています。

更にRT_WaterDiffuseAndSpecularの画像もSample Codeでは以下に示した様に

透明な部分は無いですが、

私のProjectの方のRT_WaterDiffuseAndSpecularの画像は以下のようになっていて

脇が透明になっている感じがします。

後、単純に撮影しているCameraの位置が遠すぎでSimulationがよく見えません。

もうこれはCameraの位置の設定から直したいですね。

うーん。最初からやり直すか。

教科書を読み直したら、最初はNiagaraのEmitterの設定をチクチクやっています。

流石にその部分に間違いがあるとは思えません。

SceneCapture2D_Thicknessの設定の部分を読んでいたら

Cine Camera ActorにAttachした後は、Transformの値をDefaultに戻せ。と書かれていました。

なってなかったです。

直しました。

RT_WaterThicknessの画像です。

Levelと同じ位置を写すようになりました。

うーん。

一個Errorが直りました。

このCameraの位置では見にくいのでCameraの位置を変更します。

BackgroundのImageは後で撮影します。

RT_WaterDiffuseAndSpecular とRT_WaterThicknessの画像も以下のように変化しました。

うーん。

RT_WaterDiffuseAndSpecularの画像がオカシイです。

しかしこれが実装が間違っているからか、元々のParticleの大きさや数が違っているのが原因だからなのかが分かりません。

PP_DiffuseAndSpecularの実装を確認します。

一個間違いを発見しました。

以下の部分のCamera Direction Vectorノードの結果に-1を掛けるのを忘れていました。

直しました。

RT_WaterDiffuseAndSpecularの画像です。

おお。

前よりは格段に良くなりました。

ただよく見ると

以下のように粒粒が生成されているのは元のままです。

これは生成するParticleのSizeと数の問題な気がします。

Emitterの設定を確認します。

ParticleのSizeと数は以下の部分で設定されていました。

Sample Codeと同じ値に変更しました。

RT_WaterDiffuseAndSpecularの画像です。

ううん。

前よりはかなり液体っぽくなっています。

これで一端結果を確認します。

RT_WaterThicknessの結果です。

PP_Compositeの以下の部分の実装が間違っていましたので直しました。

Cine Camera Actorから見た結果です。

Background Imageを直すのを忘れていました。

ああ。空のAssetを既に消してしまっています。

もう背景の撮影は出来ません。

ここは諦めます。

結果です。

うん。

十分でしょう。

FluidのSimulationになっています。

これで完成とします。

3.2 Fluid Simulationを勉強した感想

やっとFluid Simulationが完成しました。

このようなFluid Simulationは昔から作成したかったんですが、どう計算しているのか分からなくていつも挫折していました。

挫折する箇所はいつも同じで、

  • Particleの計算方法がよく分からない箇所がある
  • Particleから液体を生成する方法が分らない

で詰まってしまっていました。

UEの勉強を始めてすっかりその事を忘れていたんですが、今回たまたま「Unreal Engine 5で学ぶビジュアルエフェクト実装 基本機能からNiagara、シミュレーションまで」を勉強していてこの流体のSimulationに出会い、それこそ数年越しにFluid Simulationの作成方法を理解しさらに自分で実装する事が出来ました。

うーん。

感慨深いです。

こんな方法で実装していたのかとかなり感動しています。

今度はDirectX12から直接、流体のSimulationを実装してみたいですね。

3.3「Unreal Engine 5で学ぶビジュアルエフェクト実装 基本機能からNiagara、シミュレーションまで」を勉強した感想

この教科書で勉強するのも今回が最後です。

ので勉強終わった上での感想をまとめておきます。

まず後半の内容はかなり勉強し甲斐がありました。

特にSimulationの理論の説明は簡易でありながら、その本質を捕らえた説明であって非常に分かり易かったです。

後、数式の解説も分かり易かったです。

3.4 Niagaraの勉強について

今週でNiagaraの勉強も一端お休みになります。来週からはAIの勉強を代わりにします。

AIの勉強としてまずはJeremy Howard氏のPractical Deep Learning for Coders [8]を勉強します。

Niagaraはかなり勉強しましたし、その内容はかなり理解しましたが、Businessに繋がるような結果にはならなかったですね。

CGHOW氏もYouTubeでTutorialの公開を止めてしまってMembershipだけの公開に変更してしまいました。

Niagaraだけ勉強してもそんな結果しか得られないという事も判明しました。

まあ、どこかで役に立つ知識である事は間違いないしょう。

4.Materialの勉強

今週は先週勉強した Procedural Brick Distortion - Advanced Materials - Episode 31 [2]の実装をします。

Noiseノードを追加します。

Functionの設定をFast Gradient – 3D Textureに変更しました。

Texture Coordinateノードの結果に0をAppendした値をNoiseのPositionにPassしました。

Noiseの計算結果をPreviewで見ました。

うん。

Tutorialの結果と同じですね。

Levelの値を1に変更しました。

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

更にMinとMaxの値も以下のように変更しました。

結果です。

これもTutorialの結果と同じです。

TurbulenceをOffにしました。

今度はScaleの値を3に変更しました。

結果です。

まぶしくてどこが変わったのがよく分かりませんね。

でもこの辺のParameterはただ歪みを追加するためのParameterなのでそんなに真剣に同じにする必要はないと思っています。

のでそんなに気にしないで先に進みます。

MinとMaxの値を以下のように変更しました。

この結果をBrickの結果に足します。

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

更にこの結果をHash23ノードに繋がるFloorノードにもつなげていました。

結果です。

うーん。

あんまり変わってない。

近づいてみます。

お、少しだけ歪んでいました。

うん。

出来ましたね。

Noiseの値を一寸だけいじってみます。

Scaleの値を1にしました。

結果です。

歪みが無くなりました。

今度はScaleの値を5にしました。

結果です。

歪みがはっきりしていますね。

でも歪み方が一律になっていますね。

他のParameterも色々弄りましたが結果はそんなには変化しませんでした。

以上です。

5.Gaeaの勉強

今週はGaeaの勉強はお休みします。

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

6.1 Unreal Engine 5.4: Create STUNNING Product Commercials with Motion Design [3]の実装の続きをやる

<Setting up the Camera>

Cameraからの映像が以下のようになるようにCameraの位置を移動しました。

そしてCinematic Viewportに切り替えます。

Gridを選択します。

以下のようにGridが表示されました。

Canの位置を中央に揃えました。

Cameraの位置が決定したらBookmarkも追加しました。

そしてLens Settingsの値を以下のようにしました。

Cameraから見た画像です。

うーん。

Tutorialではこの時点で

こんな感じになっています。

これは後で確認します。

Focus MethodをTrackingに変更します。

Cameraからの映像が以下のようになりました。

ボケて何も見えません。

Actor to TrackにこのCanをセットします。

ピントが合いました。

Tutorialの方での確認もしました。

PlaneからのEmitterの色がものすごく弱かったです。

それで白く見えているみたいです。

私のProjectの方も以下のように調整しました。

良い感じです。

<Using Light Actors>

なんとここでRectangular Lightを配置していました。

このRectangular Lightで光の色を追加していたみたいです。

試しに以下のように左側のPlaneにそって一個だけ追加してみました。

光の色を水色に変更したりRectangular Lightの形状を変更したりしました。

Cameraから見た画像です。

Intensityの値を1.0にまで下げました。

結果です。

全く変化しません。

RectLightを消してみました。

全く変化しません。

全部のLightを消して確認したところ以下のようにCanに光が届くようにするには

Intensityの値を15cdにする必要がありました。

この状態だと全部のLightを切ってもいかのような光がつきます

Lightの色を調整したら以下のように青くなりました。

Rectangular Lightの形状と位置を以下のように移動させました。

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

うーん。

私の場合はPlaneからの光だけで青とオレンジの色合いを生成出来ていたのでここで敢えてRectangular Lightで青とオレンジの色合いを出す必要は無い気もしています。

しかしEmissive Lightの色だけで光を生成した場合、Global Illuminationかなんかで問題が発生した記憶があります。

ここはRectangular Lightで青とオレンジの色合いを出すようにLevelの配置を直します。

Rectangular Lightが無い状態です。

Rectangular Lightの左側を追加した状態です。

Rectangular Lightで色合いの変化を出す事に成功しています。

右側にOrangeのRectangular Lightを追加しました。

すっごい綺麗です。

上に白のRectangular Lightを追加しました。

すっごい綺麗です。

<Post Process Volume>

Post Process Volumeを追加しました。

Infinite Extent(Unbound)をEnableしました。

Exposureの設定を以下のように変更しました。

Cameraから見た結果です。

良い感じですね。

<Positioning and Movement of Can>

回転を掛けました。

ここからCanにNull Actorを追加します。

SM_Soda Canを選択します。

その状態で以下のIconを押します。

あれ、私のSoda CanはSequenceになっています。

どういう事?

うーん。

今回はこのままやってみます。

どこかで躓いたらそこでやり直す事にします。

Null Actorの名前をCTRL_Canと名付けました。

そしてSequencerに追加しました。

いや私のSequencerには既にCanが存在しています。

どこかで間違えたみたいですね。

一回消して以下のように追加したら

Canが消えてしまいました。

理由が分かりました。

CanのLocationを0に戻す必要がありました。

CTRL_CanにTransformを追加しました。

SequenceのFPSの値を60に変更します。

Endの値を300にしました。

Sequenceの最後を示す赤いLineが300の位置に止まっています。

以下の部分の値を60に変更しました。

白いBarが60の位置に移動しました。

この位置でCTRL_CanのLocationのKey Frameを追加しました。

今度はFrameの位置を0にします。

CanをCameraから見えない位置に移動して

あれ、なんか四角いのが写っています。

何これ?

消えてる?

うーん。

取りあえずはこのままやります。

Key Frameに追加しました。

以下の丸をClickして

以下のBoxを開きました。

Exponentialに変更しました。

再生して確認するとCanが下から飛び出してきました。

60にあったFrame Keyを90に移動させました。

2024-04-14のBlogでは

と書いていましたが、単に選択して引っ張ったら動きました。

今度はRotationのFrameを追加します。

0の位置でRotationのFrame Keyを追加しました。

Frameの位置を300に移動しました。

ここにもFrame Keyも追加しました。

Rotationを開きます。

XYZではなくRoll、Pitch、Yawとなっています。

TutorialではXYの値を消す。とありましたが、XYはないのでRollとPitchを消しました。

Frameが0のKey FrameにYawの値、360を追加します。

結果です。

以下のように回転しています。

以下のように回転してほしいはずです。

Tutorialで確認します。

最初の回転であっていました。

今度は回転の速度を調整します。

最初は速くて後はゆっくりにします。

以下のKey Frameを選択した状態で

以下のKey Frameを押します。

すると以下のBoxが開きます。

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

2024-04-14のBlogはここで終わっているので今週はここまでにしておきます。

残りは来週やります。

7.Houdiniの勉強

7.1 Houdini 19 - Wall Tool 12 [5]を勉強する

Clean UpとDigital Assetの作成を行うそうです。

<Clean UP>

Color_TintGroutノードのClassの値をPrimitivesに変更しました。

更に以下の位置にGroupノードを追加します。

そしてGroup Nameの値をGroutに変更しました。

Merge3ノードを選択し

更にiを選択します。

すると以下のようなBoxが表示されます。

以下の部分を見ると

沢山のAttributeが存在している事が分かります。

これらのAttributeのほとんどは必要ありません。

ので消します。

以下に示したAttribute Delete1ノードを追加します。

以下に示した方法で必要ないAttributeを消します。

同様の事をGroupにも行います。

Group Deleteノードを追加します。

以下のように設定します。

Outputノードを追加します。

名前をOutput_BrickWallOutputとします。

ここからDigital Assetを作成するそうです。

全部を選択します。

以下のIconを押します。

なんと一個のNodeになってしまいました。

更にこのNodeにBrick Wall Toolと名付けました。

右ClickしてDigital Assetを選択します。

<Create A Digital Asset>

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

これは単なるSaveするための設定のようです。

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

Acceptを押すと以下のWindowが表示されます。

Maximum Inputsの値を2に変更しました。

次はParameterの設定です。

最初は高Polygonの結果と低Polygonの結果の表示を選択出来るParameterを作成するそうです。

以下のCreate ParameterからToggleをDrag and Dropして

Existing Parametersに追加します。

追加したら名前がLebelに変化しました。

何ででしょう?

名前をBuildModeToggleに変更しました。

更にLabelの値をBuild Modeに変更しました。

右下のApplyを押しました。

更にAcceptを押しました。

Windowが閉じて元の画面に戻って来ました。

Brick Wall Tool Buildノードを選択すると

以下のように

先程追加したBuild Modeが表示されています。

今度はBrick Wall Tool Buildノードの中を開いて以下の場所にNullノードを追加しました。

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

このSwitchノードは以下のように繋ぎます。

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

以下の箇所をClickして以下のBoxを開き、Type Propertiesを選択します。

さっきのWindowが開きました。

一番右端にある以下の部分に

SwitchノードのSelect InputをDragして?

以下の場所にDropします。

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

これでToggleの機能が追加されたそうです。

そうなのか?

テストしています。

今度は以下のParameterを選択しました。

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

Build ModeがOffの状態です。

Onの状態です。

うーん。

何でこうなるのか不明です。

User Interface Layouts>

またType Propertiesを開きました。

ここにParameterを追加していくみたいです。

以下の黄色くしたNodeが持っているParameterの事です。

ただし全部はやらないそうです。

最初の数個だけやり方を見せるので、後は自分でやるようにと言っていました。

<Line Width>

Line WidthノードのLengthをDrag and Dropして

Type Propertiesの以下のRootにDropします。

以下の場所の値も変えていました。

Nameの方のSpellは間違っていますね。Wall Lengthが正しい名前です。

Channelの以下の部分の値が3になっているか確認しています。

<Line Height>

今度はLine Heightノードです。

Line Widthノードの時と同じようにLengthをDragして

Type Propertiesの以下の部分のRootにDropしました。

名前も同様に変更していました。

<Brick Rose>

今度はBrick Rowノードです。

Resample Brick RowノードのParameterであるSegmentをDrag and DropしてType Propertiesの以下の場所のRootにDropしていました。

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

以下の場所からDefaultの値が6になっているのも確認していました。

最後にParameterのRangeの値を調整していました。

以下に示したのはWall HeightのRangeです。

0.1から10に変更して更に鍵をかけていました。

Wall Lengthでは以下の値になっていました。

もうこれで完成かと思ったら今度は以下に示した様に

Type Propertiesの以下の場所から

Wall Length、Wall Height、そしてRowsを選択して右ClickしてBoxを表示させPut Parameters in New Folderを選択します。

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

確かにFolder内に移動しています。

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

更にFolder TypeをSimpleに変更しました。

残りのParameterは自分でやらないといけないそうです。

以上でした。

8.UEFNの勉強

もともとUEFNの勉強を始めたのは、Epic Games社がFortniteで稼いだ金の何割かを還元すると言ったのでそれで勉強を始めたんでした。

調べたら2023-03-27のblogにその話がまとめられていました。

しかし今のところMapを作成して公開する所まで全く出来ていません。

しかも公開したとしても、これだけ沢山のMapが既に公開されている状態で、誰かが私のMapにPlayしに来るとは思えません。

で、このまま勉強を続けても意味がないかもしれない。と思い始めています。

その辺、今までどう考えていたのかとか、これからどうすべきなのかとかをまとめ直すべきだと思い今週はその辺をここにまとめる予定でした。

ところが、その辺を考えていたら売れるSoftwareとは何なのかという事が稲妻のように脳裏をよぎりました。

これは凄いIdeaなんですが、このままだと忘れてしまうので、それをここにまとめます。

その上で、何故生成AIがこれから売れていくのか。とかもそのIdeaを発展させて考察します。

その後で時間があったらそれらの考察を踏まえて売れるUEFNのMapの生成が出来るのかどうかをもう一度考察します。

8.1 売れるSoftwareとはどんなSoftwareなのか?

Softwareの本質的な価値とは、何かという事をここにまとめます。

それは「ある情報をその情報が必要な人に提供する。」という事です。

例えば「来週の日曜日は、○○湾に午前7:00頃にアジの群れが回遊してくる。」という情報があったとします。

その情報を、来週の日曜日に○○湾に釣りに行く人に提供する事が出来るSoftwareがあったらそのSoftwareには価値が生まれる訳です。

そしてそれがお金を生むんです。

結局、Softwareって情報しか伝達していません。

情報をその情報が必要な人に届けられるかどうかだけがそのSoftwareに価値を追加します。

例えばGoogle検索です。

検索者は欲しい情報があります。

その情報に関するKeywordを入力するとGoogleはそれに関連する情報が書かれたSiteの一覧を紹介してくれます。

そしてこの観点から考えると、本当のSoftwareの定義はいわゆる一般的なSoftwareの定義とはかなり違うものである事も見えてきます。

いわゆる一般的なSoftwareの定義はPCやMacでProgramming言語を用いて作成された特定の媒体上で動くAppの事です。

しかし世の中にはそういうAppでは無くても情報をその情報が必要な人に届ける媒体は沢山あります。

例えばDrive Recorderです。

Drive Recorderは事故があった時にどんな風に事故にあったのかを客観的な情報として記録しています。

そしてその情報を保険会社やもしくは裁判所か警察に提出する事で、事故の正しい情報をその情報が欲しい人達に伝えています。

これは完全にはSoftwareとは言えませんが、ある情報をその情報が必要な人に伝達するという意味では今のSoftwareの定義そのものの機能を持っています。

8.2 生成AIがこれからのSoftware Businessに革命をもたらす理由

この情報の伝達と言う観点からSoftwareを見るとData Miningから始まったBig Dataの管理とそこから必要な情報を抜く出してくるためのDatabaseの技術が非常に重要になって来ます。

会社は顧客のDataを死ぬほど持っています。

しかしそのDataを有効活用する事はあまりできていません。

その有効活用するための技術として発達したのが昔のData MiningやBig Dataの管理方法、そしてそのためのSpecialistとしてのData Scientistの存在です。

しかし高額なお金を払ってData Scientistを雇ったのに、折れ線Graphの表一枚しか出てこんかった。みたいな話ばかりになってその費用対効果にかなり疑いの目が向けられ、大量解雇される事態になりました。

それに対して生成AIは入力したDataに対して、単に質問するだけで適切な情報を拾いあげ、更に簡潔にまとめて説明してくれます。

従業員の業務日誌を例にして説明します。

全従業員の業務日誌をData化してPCで管理したとします。

今までは、例えば3月15日に○○さんは何をしたのか。という直接的な情報しか抽出出来ませんでした。

ところが生成AIだと、もっと間接的、抽象的な質問から具体的な解答を引き出す事が出来るようになりました。

例えば

「3月14日に金庫から現金が3万円程消えたんだけと、犯人である可能性のある従業員の名前とその理由を述べて」

みたいな質問でもAIは的確な解答を返してくれます。

勿論、AIですのでHallucinationを起こしている可能性は常に考慮する必要がありますので、AIが答えた結果が正しいのかを確認する作業は常にやる事は必要になりますが。

9.DirectX12の勉強

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

9.1.1 Fence & Command List | D3D12 Beginners Tutorial [D3D12Ez] [6]の最後の10分を勉強する

今週やるのはこれだけです。

DispatchCommandList()関数にListsを追加しました。

この辺はExecuteCommandList()関数を数週間も追いかけていたので、もう自明の構造になりました。

更にSignal and Wait()関数を追加しました。

今度はMain.cppに戻って来ました。

Whileを追加しました。

Whileの中を実装していきます。

InitCommandList()関数を使用します。

ここに来てDispatchCommandList()関数の名前を

ExecuteCommandList()関数にかえてしまいました。

うーん。

混乱する。

そしてMain.cpp内の以下の箇所にExecuteCommandList()関数を追加します。

ここでテストするために実行したら以下のような大量のErrorが表示されていました。

Close()関数をExecuteCommandList()関数に追加しました。

Tutorialではこれが無かったからErrorになったと言っています。

最終的には以下のような実装になりました。

今度は実行してもErrorにはなりませんでした。

しかし以下に示した様な大量のMemoryを消費してしまっています。

これはDirectX12のLibraryが巨大なためだからだそうです。

Release Modeで実行してみましたが、それでも62MBも消費しています。

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

一寸短いですが、今週のD3D12 Beginners Tutorial [D3D12Ez]の勉強はここまでとします。

9.2 「DirectX 12の魔導書」の勉強

9.2.1 「4.10.3 描画命令」を勉強する

この節は4.10の中でもっとも複雑だったはずです。

気合を入れて勉強していきます。

以下の命令をCommandListに追加するそうです。

  1. Pipeline StateのSet
  2. Root SignatureのSet
  3. ViewportとScissor RectangleのSet
  4. Primitive TopologyのSet
  5. Vertex InformationのSet
  6. Drawを命令する

なんか凄い事をするのかと思ったら今まで作成したものを全部セットしているだけみたいです。

全部セットしたらDrawの命令を出す事が出来る訳ですね。

<「1.Pipeline StateのSet」について>

む、Setの方法以前にPipeline Stateが何をするのかを忘れてしまいました。

これは前に調べたはずです。Blogを見直します。

2024-04-28のBlogに以下の説明がありました。

以下の部分がPipeline Stateを説明していました。

日本語訳も次いでにつけておきます。

以下の方法でPipeline Stateはセットしていました。

<「2. Root SignatureのSet」について>

以下に示したSetGraphicRootSingature()関数を使用していました。

教科書ではこの関数について特に何も説明していませんでした。

<「3. ViewportとScissor RectangleのSet」について>

教科書にはこの部分の供述はありません。

Sample Codeを見ると

先程追加したSetGraphicRootSingature()関数の手前でRSSetViewports()関数とRSSetScissorRects()関数を使用してViewportとScissor Rectangleをセットしていました。

<「4. Primitive TopologyのSet」について>

Primitive TopologyはVertexをどう組み合わせてPolygonを生成するのかを指定します。

以下に示した様にIASetPrimitiveTopology()関数を使用してセットしていました。

D3D_PRIMITIVE_TOPOLOGY_TRIANGLELISTは公式SiteのD3D_PRIMITIVE_TOPOLOGY enumeration (d3dcommon.h)[9]によると

という意味だそうです。

<「5. Vertex InformationのSet」について>

Vertexの情報は以下に示したIASetVertexBuffers()関数を使用してSetするそうです。

今回は一個のVertexしかないからArrayは使用しないで&で値をPassしているそうです。

教科書の説明によると、最初のParameterはSlotの番号、二番目のParameterはVertex Buffer Viewの数、そして三番目のParameterにはVertexのDataをセットするそうです。

Slotの番号って具体的に何を指しているんでしょうか。

公式SiteのID3D12GraphicsCommandList::IASetVertexBuffers method (d3d12.h)[10]には

と説明されていました。

0をセットしておけば良いみたいです。

教科書には書かれていませんでしたが、この後に以下に示したIASetIndexBuffer()関数が使用されていました。

<「6. Drawを命令する」について>

そして最後にDrawInstanced()関数が使用されていました。

教科書によると

最初のParameterはVertexの数、2番目のParameterはInstanceの数、3番目のParameterはVertexのOffset、そして4番目のParameterはInstanceのOffsetを表しているそうです。

Instanceの数って何?と思ったら教科書に説明が書かれていました。

同じPolygonを何個表示するのかを指定するそうです。

成程、だからInstanceなのか。

これって一個以上必要になる事あるんでしょうか?

これで完成だそうです。

教科書ではこの時点で実行して三角形の図形が表示されています。

<「いろいろ試してみよう」を読む>

Vertexの値を変更したりしていました。

Sample CodeのVertexの値は以下のようになっていました。

これだと四角形になりそうですが。

左上と右上の値が同じなのか。

こういう書き方をしないとPolygonが閉じないのかもしれません。

更にPixel ShaderのReturn値を以下のように変更していました。

以上でした。

実装は来週します。

10. まとめと感想

特にないです。

11. 参照(Reference)

[1] Gediminas Kirdeikis. (2023, April 30). Unreal Engine 5 for Architecture - Full Beginner course [Video]. YouTube. https://www.youtube.com/watch?v=bT8aSTkpkDY

[2] Ben Cloward. (2023, November 23). Procedural Brick Distortion - Advanced Materials - Episode 31 [Video]. YouTube. https://www.youtube.com/watch?v=TBheGAKQeu4

[3] Reality Forge. (2024, March 29). Unreal Engine 5.4: Create a Product Commercials with Motion Design [Video]. YouTube. https://www.youtube.com/watch?v=yWQIz5yzTrw

[4] Castle Wall Tool. (n.d.). https://www.youtube.com/playlist?list=PLNbgmFvU__fiPhyUWHHzZ2Nv5ieM_bOdB

[5] Rick Banks. (2022, June 22). Houdini 19 - Wall Tool 12 [Video]. YouTube. https://www.youtube.com/watch?v=Bi-9UwB_B1Q

[6] Lötwig Fusel. (2023, May 22). Fence & Command List | D3D12 Beginners Tutorial [D3D12EZ] [Video]. YouTube. https://www.youtube.com/watch?v=KsCZDeJDXDQ

[7] Lumen Technical details 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/lumen-technical-details-in-unreal-engine

[8] Howard, J. (n.d.). Practical deep learning for coders. YouTube. https://www.youtube.com/playlist?list=PLfYUBJiXbdtSvpQjSnJJ_PmDQB_VyT5iU

[9] Stevewhims. (2023, February 14). D3D_PRIMITIVE_TOPOLOGY (d3dcommon.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3dcommon/ne-d3dcommon-d3d_primitive_topology

[10] Stevewhims. (2024, February 22). ID3D12GraphicsCommandList::IASetVertexBuffers (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-id3d12graphicscommandlist-iasetvertexbuffers

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

1. 今週の予定

<映像作品としてのLandscapeの作成>

撮影した映像をLuma AIに上げて3D Gaussian Splattingを作成します。

Niagara の勉強>

Unreal Engine 5で学ぶビジュアルエフェクト実装 基本機能からNiagara、シミュレーションまで」の実装の続きをやります。

<Materialの勉強>

Ben Cloward先生のTutorialを勉強します。

<Gaeaの勉強>

GaeaのTutorialを作成します。

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

UE5.4の新しい機能を解説した動画がそれなりに出て来ました。

重要そうなやつを何個かまとめる事にします。

<Houdiniの勉強>

Castle Wall Tool [1]の勉強をやります。

<UEFNの勉強>

Pi Equals Three氏のTutorialをやります。

<DirectX12の勉強>

DirectX 12の魔導書」の勉強をやります。

更にLötwig Fusel氏のDirectX12のTutorialをやります。

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

2.1 Luma AIを試す

室外で撮影した2つのVideoを試してみます。

今度は5周ぐらい回って撮影しました。

回れば回るほど正確なImageが生成されるのかを知りたいです。

地面がぼけています。

対象物である花に近づきすぎて撮影してしまったのかもしれません。

しかし花は花で一寸ピンボケしています。

以下の方向から見た場合はかなり綺麗に生成されています。

この原因は撮影対象に近づきすぎたのかもしれません。

前回、自転車を撮影した時は、2~3m位離れて撮影していました。

別のDataです。

こっちはiPhoneで撮影しました。

花はバッチリ写っていますが、周りの風景がまったく写っていません。

中々難しいです。

こんな感じでしばらく毎週何かを撮影してそれをLuma AIにUploadして行こうと思います。

2.2 Unreal Engine 5 for Architecture - 2023 Full Beginner Course [2]の勉強の続きをやる

先週勉強したSettingの内容の勉強を実装します。

EngineのRenderingの設定から変更していきます。

これって一個のProjectの設定を変更したら全部のProjectの設定も変わってしまうんでしょうか?

これ確認しておきます。

まずGlobal IlluminationのDynamic Global Illumination Methodの値をLumenに変更します。

既にLumenになっていました。

うーん。

Reflections Reflection Methodの値もLumenに変更します。

これも既になっていました。

その次のReflection Capture Resolutionの値ですが、

現在2048になっていますが、256に変更しています。

これで、ここの設定を変更した場合、他のProjectでも2048の値が256に変更されるのか確認してみます。

まずReflection Capture Resolutionの値を変更しないでこのProject(My Architecture)のProjectを閉じます。

別なUE5.3のProject(Text_3)を開きます。

Reflection Capture Resolutionの値を調べます。

128になっていました。

この時点で違う値になっています。

という事はEngineの設定と言えども、それぞれのProjectで独自の値を設定しているという事になります。

はい。

確認出来ました。

考えてみればEngineの設定はそれぞれのProjectのDefaultEngine.iniで管理している訳ですからそれぞれのProjectで独立していて当然でした。

では次にReflection Capture Resolutionの値を変更した場合の反射像の精度について検証します。

現在Reflection Capture Resolutionの値は2048になっています。

256に下げました。

凄い、UEが計算を初めました。

結構時間がかかっています。

結果です。

確かにそんなに変わってないです。

ただし先週のBlogには以下のようにまとめられていました。

うーん。

そうなのか。

この結果を比較した感じでは全く同じに見えますね。

Ray Lighting Modeの設定です。

そもそもこれが何を設定しているのかが分かりません。

Cursorを乗せると以下の説明が出て来ました。

要するにLumenのRayの計算方法は2種類あって、Defaultでは計算Costが低いけどQualityも低いSurface Cacheが使用されているが、計算Costが高い代わりにQualityも高いHit Lightingもあります。

という事です。

何だ。

先週のBlogでも同じ説明が書かれていました。

変更したら結果が少し変化しました。

主に2つ変化しました。

まず以下の窓から光が入っている箇所です。

これはRay Lighting ModeがSurface Cacheになっています。

Hit Lighting for Reflectionに変更します。

外からの光が入ってきている場所が曖昧になっています。

うーん。

こういうのって科学的な計算としては正しいのかもしれませんが、芸術的な観点から見るとどうなんでしょう。

こんなぼやけた画像が欲しい場合は、こんな面倒な計算しなくてもBlurを掛ければ良いだけです。

むしろ、最初のSurface Cacheで計算した結果のような光の境目がはっきりした画像の方が美しく見えます。

3D Graphicsの研究者はこういう所に気が回らないから、生成AIに人気を奪われてしまったんですよ。

もう一つの違いは以下のReflectionの部分です。

Surface Cacheの場合です。

外からの光が床やBedに写っているのが見えます。

Hit Lighting For Reflectionの場合です。

外からの光がぼやけて見えなくなった代わりに、Bedの脇にあるLightの光が写っています。

色々な場所で確認しましたがこの設定は結構結果が変わります。

要確認が必要な値という事が分かりました。

なんと先週のBlogには以下のように書かれていました。

こういうのはやっぱり一個ずつ自分で確認する必要がありますね。

Tutorialの主張と私の感想は真逆になっています。

Software Ray Tracing Modeの設定です。

TutorialではDetail Tracingを選択していました。

この機能の解説です。

この文章から推測するとLumenのTracingにはHardで計算する場合とSoftで計算する方法があるみたいです。

こっちはSoftwareで計算した時の設定を指定しているようです。

Detail TracingとGlobal Tracingの2種類がありました。

どちらを選択しても結果は全く変化しませんでした。

おそらく私のProjectはHardwareでこのTraceを計算しているのだと思われます。

Tutorialでは以下のような説明がされていました。

うーん。

参考になります。

ShadowsのShadow Map Methodです。

値にはVirtual Shadow MapsとShadow Mapsの2つがありました。

TutorialではVirtual Shadow Maps(Beta)を選択していました。

機能については以下のような説明がありました。

Shadow Mappingの方法についての指定のようですね。

Virtual Shadow MappingはForward Shadingが選択されている時は使用出来ないんでしょうか?

色々な場所で試してみましたが、違いは確認出来ませんでした。

Hardware Ray TracingのSupport Hardware TracingをEnableします。

これは元からEnableされていました。

機能の説明です。

Support Compute SkincacheをEnableする必要あるそうです。

どこでその設定はするんでしょうか?

これについての解説はTutorialも何もしてなかったですね。

今度はPlatformsのWindowsの設定です。

D3D12 Target Shader Formatsの設定です。

SM6を選択していました。

CopliotでSM5とSM6について質問したら以下の回答が表示されました。

SM6ではSM5にはないRay Tracing、Mesh Shader、そしてAmplification Shaderがあるそうです。

ふーん。

Ray Tracingを使用するためにはSM6を使用する必要があるのか。

Mesh ShaderとAmplification Shadarはどんな機能か知りません。

調べます。

Mesh Shader [3]に以下の解説がありました。

かなり最新の機能みたいですね。

これは知らなくても良いです。

Targeted RHIsのDefaultRHIです。

これは最初からDirectX 12になっていました。

先週のBlogにRHIについて以下の説明がありました。

UE5の公式のForumにRender Hardware Interface (RHI) [4]がありました。

うーん。

DirectにRender Hardware Interfaceが何なのかを説明はしていませんでした。

と思ったらその下に説明がありました。

要するにDirectX12、VulkanそしてMetal2.0で生成された3Dを統合するLayerの事ね。

理解しました。

今度はPost Processingの設定です。

Global IlluminationのMethodをEnableしてLumenを選択しました。

これはDefaultではOffになっていました。

以下の場所で違いを検討しましたが、

全く違いが分かりませんでした。

Tutorialにはこの設定による変化を確認する方法が紹介されていました。

View Mode(普段Litと表示されているIcon)をLumen Overviewにセットします。

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

これは何を表示しているんでしょうか。

それぞれの画面について軽く調べる事にします。

Lumen Sceneです。

公式SiteのLumen Technical Details [5]に詳しい解説が載っていました。

いましたが、もう今日はこれを読む気力が湧きません。

今週のLandscapeの勉強はここまでとします。

血何にTutorialではこの後にLumen Global IlluminationのLuman Scene Lighting Quality?とLuman Scene Detailの値を1~4に増やしていました。

来週はこの辺から勉強します。

3. Niagara の勉強

先週勉強した「16.8.5 水の厚み(Thickness)をRenderingする」「16.8.6 Compositeする」を実装します。

今回で「Unreal Engine 5で学ぶビジュアルエフェクト実装 基本機能からNiagara、シミュレーションまで」の勉強は終わりです。

2024-01-07のBlogで宣言している通り、今週でNiagaraの勉強は一端終わりです。

来週からはJeremy Howard氏のPractical Deep Learning for Coders [5]を勉強します。

最後の章の最後の部分です。

3.1 「16.8.5 水の厚み(Thickness)をRenderingする」を実装する

Niagaraで調整します。

Particle Spawn StageのColor Moduleを使用するそうです。

む。

私のNiagaraにはParticle Spawn Stage 内にはColor Moduleは無いです。

教科書を読み直したらColor Moduleを追加しろ。と書かれていました。

しました。

Colorの値を以下のように設定しました。

これでこの部分の設定は終わりです。

3.2「16.8.6 Compositeする」を実装する

Composite用のMaterialを作成します。

Material Instanceを生成しました。

これを以下のCine Camera Actor(Instance)のCamera Component (Camera Component)の

Post Process Materialsにセットします。

Materialを開いて実装します。

Texture Sampleを2つ追加しました。

それぞれのTexture Sampleノードには以下のRender Targetをセットしました。

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

水の厚みに色付けしています。

この結果と最初のTexture Sampleノードの結果を足しています。

AddノードのPreviewを見ると

以下のImageが生成されていました。

なんか結果がSample Codeと違うような気がします。

まあ最後までやってみましょう。

では次の背景を追加するための実装をやっていきます。

以下のように組みました。

Lerpノードの結果をResultノードのEmissive Colorに繋ぎました。

当然、ResultノードのMaterial DomainはPost Processに変更しました。

Previewを見ると以下のような結果になっています。

あれ?

出来てない。

うーん。

ああ。

UE5がCrashしてしまった。

もう一回立ち上げました。

背景を消すと以下のようになっていました。

これはこの時点で間違っているのか。

うーん。

来週考えます。

今週で「Unreal Engine 5で学ぶビジュアルエフェクト実装 基本機能からNiagara、シミュレーションまで」の勉強は終わりかと思ったんですが、来週もやる事になりました。

4. Materialの勉強

4.1 Procedural Brick Distortion - Advanced Materials - Episode 31 [6]を勉強する

今週は以下のようなDistortionを追加するそうです。

今回もUnreal Engineは後半で実装方法だけ説明されていました。

まあ良いです。

その部分だけ勉強します。

Noiseノードを追加しました。

Functionの設定をFast Gradient – 3D Textureに変更しました。

Texture Coordinateノードの結果に0をAppendした値をNoiseのPositionにPassしました。

結果です。

Levelの値を1に変更しました。

このLevelの別名がOctaneだそうです。

Octaneか。

この言葉にも散々振り回されました。

結果です。

更にMinとMaxの値も以下のように変更しました。

結果です。

TurbulenceをOffにしました。

今度はScaleの値を3に変更しました。

結果です。

更にMinとMaxの値を以下のように変更しました。

結果です。

この結果をBrickの結果に足すそうです。

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

更にこの結果をHash23ノードに繋がるFloorノードにもつなげていました。

結果です。

歪んでいますが、歪みが均一です。

この後、NoiseノードのParameterをTweakしてBrickの形を調整していました。

それなりに良くなりましたが、均一感は消えないです。

以上でした。

5. Gaeaの勉強

5.1 Tutorialの作成

以下のようにPowerPointを作成しました。

題です。シンプルにしました。

今回はSatMapノードの正しい組み方を頭ごなしに教えると書いています。

これを説明しておけば、何でそんな組み方をするのかと考える必要が無くなります。

とは言え最初にSatMapノードが色を追加するためのNodeである事だけは説明しておいた方が良い事に気が付きました。

のでこのSlideだけ追加しました。番号が0になっています。

SatMapノードの正しい組み方を説明しています。

隣に同じ様に色を追加するNodeであるConstantノードの正しい組み方を比較のために表示しています。

ここで先程出て来たTextureノードについての簡単な解説をしています。

その解説の続きです。

TextureノードがTerrainに灰色で濃淡をつける事を説明しています。

SatMapノードがTextureノードがつけた灰色の濃淡に対して、上記のColor Barに沿った色を配置する事を説明しています。

後、Slideには書いていませんが、このColor BarをUEにはExport出来ないので、SatMapノードで生成したImageをUEで同じ様に再現する事は出来ない事もここで説明します。

ここでSatMapノードをConstantノードの代わりに使用した場合のMaskの組み方を解説します。

Textureノードが余分に追加されています。

連続でMaskingを使用する場合はTextureノードの結果もPortする必要があります。

この場合、Fxノードを使用できるのか、覚えていません。

これは後で調べます。

まとめです。

今回はTextureノードがTerrainに白黒の濃淡を追加する事、SatMapノードがその濃淡に応じて色をUnLinerに配置する事の説明だけで終わらしています。

Terrainに白黒の濃淡をつけるだけなら別にTextureノードだけでなく、Data GroupにあるNodeの全てが出来ます。

のでこの部分の実装は別にTextureノードじゃなくても良いんですが、今週はそれについてはあえて述べない事にしました。

5.2 色を付けた後のFxノード

調べました。

Klaus氏のTutorialはどこでこの話を述べているのかは不明でした。

しかし自分で実験して何が正しいのかは判明する事が出来ました。

まずFxノードの代わりに使用すべきノードは以下のColor Groupに存在しているColor Fxノードです。

このNodeとFxノードの違いを以下の実験で比較しました。

Textureノードの後にFxノードとColorFxノードを繋げてその結果を比較しています。

まずTextureノードの結果です。

これと同じ結果をFxは保持する必要があります。

Fxノードの結果です。

全く同じ結果になっています。

Color Fxノードの結果です。

これも同じ結果です。

つまりどちらのNodeを使用しても同じ結果を得ることが出来ます。

それに対して以下の実装です。

色付けが終わった後にFxノードとColor Fxノードを追加しています。

このCombineノードの結果です。

そしてFxノードの結果です。

色が消えています。

これがFxノードを色付けした後では使用出来ないという理由だったんです。

ちなみに、Color Fxノードの結果は、

普通の色がついていました。

5.3 録音について

録音方法ですが、音を聞きながら録音して後で編集する事を考えています。

今回はそれを試してみます。

<追記>

結局、先週と同じ方法に落ち着きました。

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

6.1 内容の整理をします

今回も試したい新しい機能が目白押しです。

ここにやりたい内容をまとめ直します。

まず先週から実装を始めたUnreal Engine 5.4: Create STUNNING Product Commercials with Motion Design [7]の続きです。

ただしこれを作成しているProjectが開けなくなってしまっています。やり直すにしても最初からになってしまいました。

次にTexture Graphに関してです。

これを試すと次からProjectが開けなくなりました。今までにUE5.4のProjectを2つ作成したんですが、両方開けません。

のでしばらくTexture Graphには近づかない事にします。

後はMotion Design関連で以下のTutorialを見つけました。

この中で特に以下のようにAnimationで草を生やす方法について解説しているTutorialがあります。

これは勉強する必要があります。

更に先週、 Official Android Support for Unreal Engine Virtual Camera [8]も勉強しました。

これの実装をする必要があります。

うーん。

更にまだ調査していませんが、Biome GeneratorについてのTutorialを勉強する必要もあります。

以下のようにやる事にします。

  1. Unreal Engine 5.4: Create STUNNING Product Commercials with Motion Design[7]を実装します。
  2. Official Android Support for Unreal Engine Virtual Camera [8]を実装します。
  3. Motion DesignでAnimationで草を生やす方法について勉強します。
  4. Biome Generatorについて勉強します。

と言う訳で今週はUnreal Engine 5.4: Create STUNNING Product Commercials with Motion Design [7]の実装をやる事にします。

6.2 Unreal Engine 5.4: Create STUNNING Product Commercials with Motion Design [7]の実装をやる

先週作成した部分があるProjectはもう開けません。

新しいProjectを作成します。

UE5.4のUpdateが来ていました。

これを先にやります。

UE5.4.1になりました。

と言うかこれって先週UE5.4になりました。と発表された時にUE5.4.1になったと思ったんですが。何故か私のはPreviewから0にはUpdateされたんですが1にはなりませんでした。

よく分かりません。

ひょっとすると今の状態なら開けなくなったProjectが開けるかもしれません。

まずこれを試してみます。

まずはこのProjectです。

開けませんでした。

開けない原因にTexture Graph Engineと書かれています

もう一方のProjectでも試してみます。

こっちも同じ結果になりました。

うーん。

駄目だったか。

新しいProjectを作成します。

最初のTemplateにどれを選択すれば良いのか分かりません。

Film/Video & Live Eventsを選択しBlankを選択します。

Project名はMy Motion Design 0502としました。

以下のProjectが生成されました。

相変わらず、Content Browerが開いた状態から始まります。

Motion DesignのPluginをEnableします。

こっちはどうしましょう。

前回はこっちもEnableしたんですが。

うーん。

今回はこっちはなし。

これでUE5.4を再起動します。

Motion Designが使用出来るようになりました。

<Creating a Level>

まずこのProject用のLevelを作成します。

当然Empty Levelを選択します。

Empty Levelが生成されたら、以下のMotion Designを押します。

今度はTool BarにあるCreate Defaultsを押します。

以下のWindowが表示されたので

Spawnを押します。

以下のAssetが追加されました。

CameraをUnlockして自由に動くようにします。

Cameraの位置をPilotで操作しましたがよく分かりません。

これは後で調整します。

<Importing our Supporting Files>

CanをImportします。

やり方は先週のBlogでまとめた方法と全く同じです。

Materialは以下のように作成しました。

Previewの結果です。

ふたの方にもMaterialが適用されました。

後ろの壁紙です。

先週のBlogを見たらこれをどこから持ってきたのかを書いていませんでした。

まさかProjectが開けなくなるなんて思ってもいなかったので、記録していませんでした。

同じStatic Meshを見つけて来ました。

<Materials>

これはやる必要ないです。

ここまでが先週やった範囲でした。

やっと復元出来ました。

<Emissive Master>

新しいMaterial、M_Emissive

を作成しました。

<Making an Instance>

このMaterialのInstanceを作成します。

それぞれの色の具体的な値は無かったので適当に作成しました。

<Unlocking the Camera>

CamaraのLockを解除しました。

<Placing Props>

壁を原点に配置します。

SkylightとPost Process Volumeを消します。

UnLitに変更します。

Cameraから見て以下の位置にCanを配置しました。

この辺は完全に同じには出来ないので適当にやっていきます。

<Emissive Lighting>

Planeを両端に並べてそれぞれに先程作成したMIをセットします。

Planeを追加しようとしたらUEがCrashしました。

原因が分かりました。

以下のPlace Actor Windowを開いてここからPlaneを追加する必要があります。

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

おお、この時点でかなり良い感じです。

遠くから見るとこんな感じです。

天井の光も追加しました。

Cameraから見た映像です。

もう少し天井を近づけました。

ここからTutorialはなんか複雑な操作を始めています。

今週はここまでにしてその複雑な操作は来週勉強する事にします。

7. Houdiniの勉強

今週は先週勉強したHoudini 19 - Wall Tool 11 [9]を実装します。

7.1 Houdini 19 - Wall Tool 11 [9]を実装する

<The Grout Pattern>

今週はGrout Patternを直します。

GroutとはBrickの間に使用されているセメントの事です。

Delete Small Parts1ノードを選択します。

これですね。

見つけるのに凄い時間がかかりました。

Nodeを名前で検索する機能とかHoudiniには無いんでしょうか?

先週のBlogでは

になっています。

同様の値をセットすると

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

これは影響が強すぎます。

まで下げました。

Foreach_End3ノードを選択し可視化します。

以下のように

それぞれのBrickでTextureのSizeが違っています。

これを先に直します。

<Texel Density Node>

Texel Densityノードを以下の位置に追加します。

Asset PropertiesのAsset Resolutionの値を1024x1024に変更します。

Scale UVs to Match Texel DensityにCheckを入れます。

UV LayoutのCheckを外します。

この状態でTexel Density1ノードの結果をForeach_end3ノードの左のInput端子に繋ぎます。

Foreach_End3ノードの結果です。

それぞれのBrickのTextureのSizeが同じになりました。

先週のBlogを見ると以下のように書かれています。

確認してみましょう。

同じ大きさになっていました。

Re-mesh Gridノードを追加します。

Foreach_end3ノードの結果を繋ぎます。

結果です。

Tutorialと同じような結果になっています。

Colorノードを追加します。

結果です。

Re-Mesh GridノードのDivision Sizeの値を0.05に下げました。

結果です。

Dilate/Erodeの機能も試してみます。

Dilate/ErodeのDefault値は0です。

0.05に上げてみました。

結果です。

先週のBlogでは

と書いてありました。

確かに穴も塞がっています。

全体的にVolumeが増しているというのがより正確な解説のようです。

Foreach_EndノードとRe-Mesh Gridノードの結果をMergeノードを使用してMergeします。

結果です。

おお、凄い。

Re-Mesh Gridノードの名前をRe-Mesh Grid_Groutノードに変更します。

更に黄色くします。

更にColor1ノードの名前もColor_TintGroutに変更します。

黄色にもします。

Tintってどういう意味でしたっけ。

前に調べた記憶があります。確認します。

2024-03-17のBlogに書いてありました。

これです。

これが知りたかった。

このGroutのMeshにもUV Coordinateが必要です。

UV Unwrapノードを追加します。

UV Unwrap2ノードを可視化します。

うーん。

なんかTextureが大きすぎる気がします。

Spacingの値を2から1に下げてみました。

結果です。

うーん。

まだ大きい気がします。

0.1にしました。

おお、今度はイイ感じになりました。

<Texel Density>

Tutorialの言う通りTexel_DensityノードをDuplicateしたんですが、

線が繋がったままDuplicateされました。

この線の切り方が分かりません。

前に一回勉強したんですが、Blogのどこにまとめたのか覚えていません。

Copilotに聞いてみます。

これです。

これが知りたかった。

切れました。

Copilot凄い。

以下のようにDuplicateしたTexel_Densityノードを追加しました。

うーん。

これってGroutのTextureのSizeがここで調整されるって事?

Texel_density2ノードの結果です。

やっぱりTextureのSizeが変わっています。

Merge3ノードの結果を可視化しました。

UV Coordinateの表示は消しています。

うーん。

凄い。

<UV Coordinates>

Color_TintGroutノードの色を灰色にします。

結果です。

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

Delete_Small_Parts1ノードとRemeshgrid_Groutノードの値を少しだけTweakしました。

結果です。

おお。

かなり良い感じになりました。

この結果をSaveしておきます。

7.2 Houdini 19 - Wall Tool 11 [9]の勉強を続けて

流石にここまで続けるとHoudiniの仕組みと言うか何かが見えてきました。

まだまだよく分からない部分は沢山ありますが、今週のこの結果は

なんか不思議な自信を自分にもたらしてくれました。

Proceduralな実装の意味も何となく理解して来ました。

要はUEのBPの事を言っているだけです。

今週はゴールデンウィークで突然の用事が入ってしまったので残りは中止します。

8. UEFNの勉強

9. DirectX12の勉強

10. まとめと感想

11. 参照(Reference)

[1] Castle Wall Tool. (n.d.). https://www.youtube.com/playlist?list=PLNbgmFvU__fiPhyUWHHzZ2Nv5ieM_bOdB

[2] Gediminas Kirdeikis. (2023, April 30). Unreal Engine 5 for Architecture - 2023 Full Beginner Course [Video]. YouTube. https://www.youtube.com/watch?v=bT8aSTkpkDY

[3] Microsoft.(n.d.). Mesh Shader. DirectX Specifications. https://microsoft.github.io/DirectX-Specs/d3d/MeshShader.html

[4] Render Hardware Interface (RHI) | Community tutorial. (n.d.). Epic Developer Community. https://dev.epicgames.com/community/learning/tutorials/aqV9/render-hardware-interface-rhi

[5] Howard, J. (n.d.). Practical deep learning for coders. YouTube. https://www.youtube.com/playlist?list=PLfYUBJiXbdtSvpQjSnJJ_PmDQB_VyT5iU

[6] Ben Cloward. (2023, November 23). Procedural Brick Distortion - Advanced Materials - Episode 31 [Video]. YouTube. https://www.youtube.com/watch?v=TBheGAKQeu4

[7] Reality Forge. (2024, March 29). Unreal Engine 5.4: Create a Product Commercials with Motion Design [Video]. YouTube. https://www.youtube.com/watch?v=yWQIz5yzTrw

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

[9] Rick Banks. (2022, June 22). Houdini 19 - Wall Tool 11 [Video]. YouTube. https://www.youtube.com/watch?v=h1oZD8X7gkA