UE4の勉強記録

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

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

1. 今週の予定

1.1 今週の予定

今週は以下の内容を勉強します。

<Landscapeの作成>

建築用のLevelの作成の勉強の続きをやります。

Niagara & Materialの勉強>

Unreal Engine 5で学ぶビジュアルエフェクト実装 基本機能からNiagara、シミュレーションまで」を読みます。

実装もします。

<Gaeaの勉強>

Earth and Space Sciences XのTutorialを勉強します。

更にGaeaのTutorialを作成します。

<Houdiniの勉強>

Free Time Coder氏のUnreal PCG Tutorial [1]の続きを勉強します。

<UEFNの勉強>

Pi Equals Three氏のTutorialをやります。

<DirectX12の勉強>

DirectX 12の魔導書」と「Direct3D 12 ゲームグラフィック実践ガイド」の勉強をやります。

2. Landscapeの作成

2.1 Unreal Engine 5 for Architecture - 2023 Full Beginner Course [2]の続きをやる

先週は以下のところまで作成しました。

続きをやって行きます。

<Material Library: Quixel>

Level上にSphereを配置して黒と白のMaterialの違いについて解説しています。

これを試してみます。

黒のBase Colorの設定です。

白のBase Colorの設定です。

灰色の設定です。

MetallicとRoughnessの値に関してはTutorialで確認しました。

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

黒が真っ白です。

この後どうやってLightingを調整するのかがBlogを読んでも不明です。

Tutorialを見直します。

うん。

Reflectionを作成するのを忘れていました。

Reflectionを作成します。

以下のParameterをセットしました。

結果です。

ここでLightの設定を変更するのかと思ったら、こっちは一端中止して窓ガラスのMaterialの作成に入っています。

まずPost Process Volumeを追加してTranslucencyに関する全てのParameterをEnableしています。

試してみます。

結果です。

窓ガラスが反射しています。

二階の窓です。

反射が写っていないと思われましたが近づくと空が写っていました。

正しあまり綺麗では無いです。

後、窓なので全部反射するのではなく少し黒っぽい方が本物っぽい気がします。

Post Process Volumeの設定方法はこれからじっくり勉強する事にします。

今回はTranslucencyの設定を軽く触った感じです。

ここからTutorialは窓のMaterialを作成しています。

同じ様に作成してこの建物に付属の窓のMaterialと比較してみます。

Blend ModeをTranslucentに変更しました。

Lighting ModeはSurface Forward Shadingに変更しました。

このParameterをいじるのは初めてです。

どんなParameterなのか調べます。

公式SiteのMaterial Properties [3]に以下の解説がありました。

うーん。

Material側がLighting Modeを管理出来るようにする機能みたいです。

GlassやWaterのような表面を形成するみたいですね。

それ以上の事は分かりません。

以下のSiteに詳しい説明があるとありました。

公式のLit Translucency [3]です。

これを読んで勉強しますか。

もう速攻でこの文の意味が不明です。

Cascaded Volume TextureってどんなTextureなんでしょうか?

それがView Frustumの周りに並んでいるそうです。

全くImage出来ません。

Netで調べましたがほとんど資料がありません。

Volume Textureに何かをするとCascaded Volume Textureになる事だけは分かりました。

そのVolume TextureがView Frustumの周りにOriented Around the View Frustumとなっています。

Oriented Around the View Frustumって以下のようなImageです。

Volume Textureに向きがあるのかどうか不明です。更にView Frustumの周りにOrientする意味も不明です。

この結果、LightingはVolume内をSingle Forward Passするそうです。

Forward ShadingはTranslucentな表面にSpecular Lightを追加します。と書かれていました。

これは理解出来ます。

Parallax-corrected Reflection Capturesが何なのかは不明です。

Reflection Captureの設定にParallax-Correctedがあるんでしょうか?

GlassのMaterialの実装です。

Tutorialの値と同じにしています。

奥が今作成したMaterialで手前が建物のガラスに使用されているMaterialです。

奥のMaterialの方はDefault値では全く見えないのでOpacityの値を0.7まで上げました。

うーん。

成程。

Specular Lightは全く観察されませんね。

建物の窓に使用されているMaterialの設定を見てみます。

まずLighting ModeですがSurface Translucency Volumeが採用されていました。

Surface Forward Shadingでは無いですね。

Material Properties [3]には以下の説明がありました。

こっちの方がSurface Forward Shadingよりも質は悪いみたいですね。

後はよく分からないです。

これでTutorialの勉強している所まで追いついたみたいです。

案外短かったです。

2023-09-11のBlogを見たらもう一週分ありました。

こっちもやっていきます。

<Foliage Assets: Quixel/Marketplace>

木を追加します。

もうこれで完成でも良い感じです。

<Camera Setup>

Lens Flaresの値を0.05に変更しました。

Lens Flaresの値が1の時です。

0.05の時です。

Flareってこの光っている四角の事を指しているんでしょうか?

公式SiteのPost Process Effects [4]を見ると以下に示した解説がありました。

やっぱりあっていますね。

更に

と書かれていました。

更にBloomのMethodをConvolutionに変更しました。

そして次にIntensityの値を0.1にします。

結果です。

あんまり変わってないですね。

次はCameraを追加します。

TutorialではFolderを作成してその中にCameraを追加しています。

これは新たなCameraを追加する必要が出来たらその時に作成します。

Cameraの位置を調整します。

Pilot ‘Cinecamera Actor’を使用します。

凄い操作がしやすいです。

Bookmark1と大体同じ位置にCameraを移動しました。

CameraのPilotを止めるためには

を選択すれば良いだけでした。

ここからCameraの設定を変更していきます。

まずFilm backです。

映画用のAspectに揃えました。

結果です。

全然雰囲気が違います。

こういうのは実際に試してみないと分からないですね。

何週もかけて建物を準備した甲斐が有りました。

Current Focal Lengthの値を35から90に変更します。

結果です。

なんかおもちゃの建物を撮影してるみたいになっています。

CameraをZoom Outしました。

なんとCameraはこんな遠くに位置していました。

あってんのかな?

これ

取りあえず邪魔な木を2つだけ消しました。

Current Aperureの値を2.4から1.2に変更しました。

2.4の時です。

1.2の時です。

変わってないですね。

今度はFocus Settingsの値を調整します。

Manual Focus Distanceの値をDropperで指定します。

建物を選択しました。

結果です。

一気にピントが合いました。

これ建物が大きいので建物の奥の風景がほとんど見えないんです。

これが単調なImageにしてしまっています。

ピントの合ってない木が僅かに映っていますが、この木は建物より奥に位置しているはずです。

Draw Debug Focus PlaneにCheckを入れます。

結果です。

うーん。

何ともいえない。

建物の途中でFocus Planeが掛かっていますがこれが良いのか悪いのかわかりません。

手間の木だけ残してみました。

Custom Near Clipping Planeの値を調整します。

これはそのままの値にしておきます。

Camera Aspect Ratioについて解説しています。

これがCheckされているとCameraが指定したAspectになるそうです。

試しにCheckを外してみました。

次はPost Processの設定です。

Exposureの値を変更します。

Metering ModeをEnableしてManualを選択します。

画面が真っ黒になりました。

Exposure Compensationの値を上げます。

Tutorialでは

まで上げていましたが、私の場合はこれ以上上げると建物が白くなりすぎます。

結果です。

おお、かなりマシになって来ました。

ここで先程作成したMaterialを投入します。

この球の色を見てExposure Compensationの値を調節します。

Tutorialを見直すと以下のように調節していました。

黒の球の影の部分が黒くて白の球のHigh Lightの部分が白いのが基準のようです。

球の影がよく見えるようにするためにDirectional Lightの方向を調整しました。

その上で

の値を調整しました。

結果です。

かなり本物らしくなって来ました。

最後にVignette Intensityの値を変更しました。

結果です。

ここで2023-09-11のBlogは終わっていました。

今週はここまでとします。

流石にここまでPhot-realisticになって来ると地面のMaterialも直す必要を感じます。

LandscapeのMaterialは来週直す事にします。

3. Niagara & Materialの勉強

3.1 「Unreal Engine 5で学ぶビジュアルエフェクト実装 基本機能からNiagara、シミュレーションまで」を勉強する

今週も「Unreal Engine 5で学ぶビジュアルエフェクト実装 基本機能からNiagara、シミュレーションまで」を勉強します。

実際に実装しないと本当の理解は出来ませんが、まず全部読む事にします。

今週はそれぞれの章の感想をここにまとめる事にします。

<Blueprint>

ノードは関数もしくはクラスのInstanceです。

BlueprintはProgrammingであるとはっきり宣言してるのは好感持てます。

何故か、Epic Games社はBlueprintを使用するのでUEはProgrammingを知らなくても使用出来ると言いがちです。

これ全くの嘘で、BlueprintはVisual ScriptingというれっきとしたProgramming言語の一種です。

Nodeを一個一個教えるやり方はかなり悪手だと思います。

これ電車とかで単語帳で勉強している人を見るといつも思うんですが、絶対やめた方が良い勉強方法です。

何故かと言うとこのやり方で勉強すると必ず忘れるからです。

じゃあどういう教え方が良いのかと言うと、Storyに沿って教えるんです。

人間は物語があると絶対に忘れません。

更に物語にすると論理的にオカシイ部分もすぐに発見出来ます。

Niagaraの全体像>

Niagaraを理解するためにはMaterialを理解しておく必要があります。

更にParticle Systemを使用したVFXの30%はMaterialが担当しています。

Materialの勉強をしないでNiagaraをいきなり紹介しても初心者は混乱して終わるだけです。

ここまで書いて気が付いたんですが、三章で一応Materialの勉強はしていましたね。

Parameter(変数)という表示がありました。

これは卓見です。

このNiagaraの場合はParameterとして表示されている一群は変数(variable)なんです。

後、これはこの本の批評ではないんですが、Emitter内のSectionの日本語訳って「パーティクルのスポーン」とか「レンダリング」になってたんですね。

これって意味あるんですかね。

概要とか更新と訳するなら意味があると思います。

しかし単に英単語の発音をカタカナ表記しただけじゃないですか。

しかも間違った発音に基づいているし。

もう素直に「ParticleのSpawn」とか「Rendering」とか書いた方が良いと思います。

このように直接英単語で記述すると以下のMeritがあります。

  • カタカナ発音と言う間違った発音を覚えてしまう危険がない
  • 英語のSpellを覚えられる。
  • 英語のSpellですら覚えられない怠け者を切り捨てる事が出来る
  • 変な日本語の意味が追加されたり、間違った解釈のまま単語が理解されたり事が無くなる

後、Simulationについての記載がありました。

これが私が習いたかった事で、この本はこの部分に関してはかなり詳しく解説していそうです。

ただ心配なのが、最近公開された大量解雇した後のUnreal Engine Public Roadmap [5]のSimulationのSection中に今まであったNiagara Fuild Dynamic が無くなっている事です。

5.3のRoadmapです。

Forward Simulationです。

Niagara Fluid SimulationのProject自体が無くなってしまったんでしょうか?

そうだった場合は勉強するとかなり無駄になってしまいますね。

Niagaraで基本的なEffectを作成する>

流石にここで説明されている内容は全部知っています。

ので初心者目線で、この説明じゃ初心者には理解出来ないんじゃないのか?と言う部分についてコメントする事にします。

Render SectionのSprite Moduleです。

これ板に絵を貼ってるだけなんです。この本でもそう説明されていますが、この概念初心者にはよく分かりません。

板が常にCameraに向いている状態でかつ板に書かれたモノが写真そっくりだった場合、本当にそのモノがそこに存在しているように見える。という事を知らないからです。

こういうのは分かってしまった人にはあまりも明白で説明するのも面倒ですが、こういう所をしっかり教えておかないといつまでたってもSpriteを理解出来ない事態になってしまいます。

Niagaraをゲームと連携させる>

生成されたNiagara SystemのMemoryは自分で解放する必要が有る事は知りませんでした。

この部分の説明はかなり勉強になりました。

EmitterのLife Cycle Modeの意味がよく分かりました。

Life Cycle Modeは何を指定しているのか今一理解出来なかったんですが、NiagaraのMemoryの解放方法の指定をしていたんですね。

サンプルコードは後で実装してみます。

<発展的な機能で表現を広げる>

NiagaraのEvent機能についての説明です。

Event機能に関してはCGHOW氏がYouTube上で公開しているTutorialの質が凄いのでそれを見た方が良いです。

ここで紹介されている花火の例は凄く綺麗です。

私も昔、Niagaraで花火を作成してみようかと思ったんですが面倒になって止めてしまいました。

この本の作者はどう見ても理系ですが、芸術のセンスも持ち合わせているみたいです。

羨ましいです。

<外部ツールを用いて更に表現を広げる>

Houdiniを使用した人体モデルの爆発は非常に興味深いです。

Houdiniはまだ一寸しか勉強していませんが、それでもMeshを破壊する方法は勉強しました。

調べたら2023-03-13のBlogで勉強していました。

爆発のEffectをこれを組み合わせたら凄い映像が作成出来ます。

ただこういうHoudiniとUEを組み合わせたEffectの作成方法を解説したTutorialは調べたら結構ありそうです。

その辺の調査をした後でこれを勉強するかどうかを判断する事にします。

今週はここで時間切れです。

残りの章は来週読む事にします。

4. Gaeaの勉強

4.1 Tutorialの作成

今週はTutorial作成に全力を尽くします。

RVCのModelはDefaultで付いていたのを使用します。

このModelは著作権的に問題が起きにくいのと声の質がかなり良いで、新しい声が完成するまでこの声で録音する事にします。

TUNEは最初は6で試しました。

流石に6は音が低すぎました。

次は

で試しました。

今度は思いっきり高くしてみました。

こっちの方が良い感じです。

うーん。

取りあえず前に作成したパワポをこの声で朗読してみます。

それを録画します。

やらないといけない事が多すぎて混乱します。

Microphoneの管理やRVCの管理そして録画の3つを一度に管理する必要があります。

録画した音声を確認します。

途中から声が割れてしまっています。

元々声がガラガラなので、気を抜いて喋ると声が割れてしまうみたいです。

色々試しましたが、録画の長さを短くすると声が割れなくなる事が判明しました。

パワポの内容を修正します。

なるだけ内容を詰めて全部で10分以内にしました。

これで試してみます。

良い感じですが、声が疲れてしまっています。

流石にしゃべり過ぎました。

すこし休んでから録画する事にします。

4.2 利用規約の確認

このModelの利用規約の確認を行います。

利用規約が途中で切れているので全部コピーして来ました。

まずVCClient以外でこのModelの使用は禁止されているわけです。

これは問題ありません。

問題ないですがこの規約そのものは少し変な気がします。

私が調べた限りでは、無料のAIを使用したVoice ChangerはこのRVCしかなかったです。

有料のAIを使用したVoice Changerは専用のModelが用意されている訳で別にFreeのModelを使用する必要はないです。

うーん。

調査が甘かったかも。

他にも無料で使用出来るAIを使用したVoice Changerがありそうです。

残りの規約も常識の範囲内のものでこれも問題ないです。

しかしこれだけではよく分からない事があります。

まず使用に関して何を記載する必要が有るのかについてです。

更にこの声を別なキャラに当てる事が可能なのかについても不明です。

これは他のRVCを利用している動画制作者の記載を見て確認する事にします。

何個か確認しましたが、何も記載していません。

というかRVCの使用方法を説明した動画しか出て来ません。

これは実際の動画に使用するには結構怖いですね。

他のRVCを使用した無料のSoftを探してみます。

直ぐに見つかりました。

https://voice.ai/

です。

一寸調べてみます。

Do NOT Use This 'Free' AI Voice Changer [6]にこのAppの詳しい解説がありました。

うえ。

まず実際はFreeじゃないそうです。

一回15秒だけFreeだそうです。

この時点でかなりの詐欺ですが、更にInstallするとCrypt miningに使用されているらしいVirusを内緒でInstallしていると告発されていました。

うえ。

このVideoでは先程のRVCが進められていました。Open Sourceで完全Freeであるからです。

うーん。

成程ね。

完璧ではないけど他のSoftと比較すると断トツで良い訳ね。

やっぱりVCClientを使用する事にします。

まずAIの著作権に関しては先週調査した範囲で問題ないはずです。

しかしこれは法律に関して問題ないだけです。

アメリカでは奴隷制が合法だったように法律的に問題なければ何をしても良いかと言う訳ではありません。

勿論、法律を破れば国家権力によって罰せられます。

その反対に法律を守っていれば例え奴隷制のように今から見るととんでもない人権違反な行為をしても過去に遡って罰せられる事は無い訳です。

ので法律を守るのは絶対必要です。

しかしAIのように最近になって発明されたものは、使用した結果、誰が不利益を被るのか全然分かってない訳です。

更に作成した人の意図もよく分かっていません。

そういう目的で作成した訳では無い。

となる可能性は常にあります。

ここで大切なのは誰かが不利益にならないように気を付ける必要があります。

Win-Winの関係にならなければなりません。

しかし後で、

誰かが圧倒的な不利益を被る事が判明した場合はどうするんでしょうか?

規約に追加するのかな。

遡及禁止の原則を考えるなら、規約に追加しても過去に遡って契約内容を変更する事は出来ない気もします。

これってそういえばUnityの料金体系の変更でも問題になっていましたね。

「Downloadした時のUnityのVersionの規約が守る必要がある規約で、新しい料金体系はこれからDownloadする人だけが影響受けるはずだ。」

と昔の規約が書かれているPageに確認しに行ったらそのPageがまるまる削除されていて炎上していました。

Unity側の弁護士もそれは百も承知だったので昔の規約を見えなくした訳です。

因みにUnityのCEOであるJohn Riccitiello氏はこの騒動の後でCEOを辞職しましたが実質首です。

ただしUnity CEO John Riccitiello Resigns After Install Fee Causes Mass Revolt From Devs [7]によると

この人も結局はScapegoatで、本当にUnityを食い物にしようとしている連中はまだUnityの取締役に収まったままだそうです。

で、その連中を裏から操っているのがE〇〇n Musk氏だそうです。

彼のPayPal時代の仲間やTwitter社で彼のためにSpyをしていたTwitter社の幹部がそのままUnityの幹部に収まっているそうです。

これにMalwareを広告に仕込んでいたIron Source社のCEOが加わっている訳です。

私の推測では彼らが何かをするのはこれからです。

Unityを使用して何か恐ろしい事をこれからやるはずです。

E〇〇n Musk氏は下のUkraineとRussiaの戦争でもUkraine によるStarlinkの使用を突然中止にしてUkraine軍に多大な被害を発生させたりしていてやりたい放題です。

これが本当に彼と彼の会社だけでStarlinkの技術が開発されたならアメリカ人も我慢するかもしれません。

しかしNASAの技術とアメリカ人の税金を丸々もらって開発した技術でRussiaの味方をしているんですから、アメリカ人も超激怒です。

Traitor(裏切者)呼ばわりされています。

話が逸れました。

RVCのModelの使用に関してModelを作成している人があらゆる状況に応じた規約を作成していない以上、彼らがどう利用して欲しいのかを推測する必要があります。

と思ったらつくよみちゃん公式RVCモデルの利用規約 [8] ありました。

https://tyc.rei-yumesaki.net/work/software/rvc/terms/#toc14

に以下のように説明されています。

しかも他のCharacterにこの声を当てても良いと書かれています。

共通事項を読みます。

特に気になる点はありませんね。

RVCのつくよみちゃんの利用規約に書かれていた内容とほとんど同じです。

後は以下のところです。

要するにRVCモデルの音声元を示す事が絶対に必要って事だそうです。

この理由が音源元の著作権を守るためと言う考え方は間違っていますが、別にどうでも良いです。

私はこのModelを使用したいだけです。

のでクレジット表記をすれば良い事が判明したのでそれでいいです。

どうせならつくよみちゃんのイラストも使用したいです。

イラスト素材 [10]にイラストがありました。

先に利用規約から読みます。

今までの規約に追加してこれが追加されています。

うーん。

長い。

クレジット表記について[11]の動画として使用する場合に以下の説明がありました。

合成ソフトの名称の書き方については先程調べた結果で良いはずです。

個々の素材のクレジットの記載が必要なんです。

これです。

これが必要だそうです。

これを追加すれば良いみたいですね。

イラスト素材:夢前黎様 配布URL https://tyc.rei-yumesaki.net/material/illust/

と記載すれば良いみたいです。

②のつくよみちゃんと言う名前は何を記載すれば良いんでしょうか?

これでしょうか?

フリー素材キャラクターつくよみちゃん⇒ https://tyc.rei-yumesaki.net/

も記載に追加する事にします。

うーん。

となると以下の記載をする必要がある訳です。

結構面倒ですね。

イラストは無しにしますか。

後、アバターとして使用する場合は、動画内でもつくよみちゃん公式RVCモデルを使用している事を宣言しておく必要があるそうです。

これは来週追加します。

5. Houdiniの勉強

今週もHoudiniの勉強はお休みしてUE5のPCGの勉強をします。

先週までFree Time Coder氏のUnreal 5.2 Preview PCG Tutorial - Part 8 - Jungle Breakdown [11]を勉強していましたが、このTutorial全部の実装を説明しているか不明ですし、説明していたとしても特別に新しく何かを勉強する内容もなさそうです。

それよりももっと興味深いTutorialを見つけました。

Nodes of Nature氏のPCG Building in Unreal Engine [12]です。

Nodes of Nature氏はHoudiniのTutorialをYouTube上でUploadしていて

PCGについてはかなり詳しそうです。

Tutorialを見てみましょう。

まず以下のPluginをEnableします。

PCG Graphを作成して開きます。

速いです。

HoudiniのTutorialを作成する人ってみんなこうなんでしょうか?

前に勉強したHoudiniのTutorialも速かったです。

Static Mesh Spawnerノードを追加しました。

これも唐突です。

Static Mesh Spawnerノードがどんな機能なのかとか全く説明しないです。

Static Mesh SpawnerノードのStatic Meshに以下のStatic Meshをセットしました。

何でも良いとは言っていますが電光石火で画面が変わっています。

UEのTutorialではありえないです。

Attribute Operationノードを追加しました。

このNodeは初めて見ます。

このNodeを選択したままAを押すと

以下の部分にDataの内容が表示されるそうです。

Dも押していました。

これはDebugのDですので今まで勉強したやつです。

別のPCG Graphを開きました。

その中は以下のようにNodeを並べてありました。

青いNodeはDouble Clickすると中身を開く事が出来るそうです。

以下のNodeをDouble Clickして開きました。

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

え、これだけと思ったらFunctionが以下のようになっていて

Iteration Loop Bodyの実装は以下のようになっていました。

元のGraphに戻りました。

前のGraphは一体何を説明したかったんでしょうか?

Create Points Gridノードを追加します。

DebugをEnableしたのにLevel上にPointが表示されなくて焦っています。

なんか急に仕事が出来ない人に見えてきました。

Level上で地面に近づいたらちっちゃな点がある事に気が付きます。

DebugのPoint Scaleの値を0.5に変更して(Screenshotは5だが実際の値は0.5)

Grid Extentsの値を1500に変更します。

結果です。

これはそんなに難しい内容じゃないです。

Static Mesh Spawnerノードを追加して

そのStatic Meshに

SM_Column_Aを追加しました。

結果です。

この仕組みは別に勉強する程の内容では無いですね。

普通に何をやっているか分かります。

今度はCreate Point GridノードのCell Sizeの値を200に変更します。

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

今度は生成したMeshを掴んで移動させます。

Pointsは移動しません。

これを直します。

まずGet Actor Dataノードを追加します。

そしてTrack Actors Only Within BoundsにGet Single Pointをセットします。

Copy Pointsノードを追加して以下のように繋ぎます。

Copy Pointsノードは前に使用しました。

TargetのPointの周りにSourceのPointを生成するはずです、

これだとStatic Meshの位置を移動した時にPointsも同じように移動するんでしょうか?

結果です。

Static Meshが全然違う位置に移動しています。

プゲー。

こいつ本当に大丈夫なの?

Create Point GridノードのParameterの設定を以下のように変更しました。

今度はStatic Meshが戻って来ました。

更にStatic Mesh SpawnノードをDebugすると

PointがStatic Meshの下に移動しました。

うーん。

なんかこれおかしくない?

Copyノードを使用しなくてもStatic Mesh SpawnerノードにDebug設定したらPointの位置は移動するんじゃないでしょうか?

Pointを移動させるのが目的なら、ここでやっている事全部が必要ない気がします。

これを作成するのがGoalだそうです。

このTutorial、全体で47分もあります。

10分毎に分割して勉強する事にします。

今週は最初の10分だけ勉強しました。

6. UEFNの勉強

今週もPi Equals Three氏のTutorialをやっていきます。

6.1 Easily Make Anything Follow Your Player! UEFN/Creative 2.0 [6]を実装する

今週は先週勉強したEasily Make Anything Follow Your Player! UEFN/Creative 2.0 [6]の実装を行います。

UEFNを開くのも2週間ぶりです。

<Creating Your Prop>

Propを管理するためのBPは一番最初のTutorialで作成していました。

こんなの覚えてなかったです。

Blueprintクラスの作成からBuilding Propを選択しました。

名前をFollowers Playerに変更します。

Static Meshを追加しました。

次にFab Alpha Marketplaceに言って以下のAssetをDownloadします。

これは初めて試します。

これなんでしょうか?

凄い。

一寸見てみましょう。

無料じゃなかったです。

UnrealのQuixel Bridgeのように全部無料と思っていたら違いました。

でも無料でもこんな凄そうなのもあります。

VFXの項目がありました。

NiagaraのAssetも売っているみたいです。

見てみましょう。

うん。

これしかなかった。

やっぱりこれはUEFNのVFXのEffectを作成して売るのが一番おいしい気がします。

特にNiagaraに詳しい私は。

このCabbageを使用する事にしました。

Cabbageが追いかけて来るなんて面白そうです。

を押しました。

多分、これでUEFNに追加されたはずです。

確認します。

ありました。

ありましたがRead Only Fileなので中身を開いて見る事は出来ません。

先程作成したBP、Followers PlayerのStatic MeshにCabbageを追加してみます。

こんな感じでした。

比較する対象が無いので何とも言えませんが小さい気がします。

一応、Sizeを2倍にしました。

<Creating Verse Device>

Verse Deviceを開きます。

Verse Explorerを開きます。

Project名を右Clickして以下のBoxを開き

Add New Verse File to Projectを選択します。

名前をFollow_Player_Deviceに変更してCreateを押します。

Verse Explorerに戻ります。

ContentにFollow_Player_Device.verseを追加します。

Double ClickしてVisual Studio Codeを開きます。

<Get Editable Reference to Prop>

先程作成したBlueprintのPropを指定するためのObjectを作成します。

うーん。

これくらいならTutorialを見ないでも作成出来るはず。

まずObjectを作成する場所ですがFollow_Player_Deviceの後でOnBegin()関数の前である必要があります。

Object名はFollow_Playerにしますか。

クラス名は

うーん。

分からん。

答えを見ます。

Creative_propでした。

後、Object名もFollowerPropになっています。

直しました。

これ一番最初のTutorialでBPを使用した時もCreative_propを使用して作成したんでしょうか?

気になります。

確認しましょう。

確認しました。

2023-08-14のBlogに書いていますがVerseはまだ使用していませんでした。

今回がcreative_prop Classを使用するのは初めてでした。

今まで使用したDevice用のClassは後で復習します。

後、@editableを追加するのも忘れていました。

SaveをしてUEFNに戻りBuildをします。

Follow_PlayerをLevel上に追加します。

PropertyにFollowPropが追加されています。

先程作成したBP、FollowsPlayerもLevel上に追加します。

小さい。

Level上に表示したCabbageは豆粒のような小ささです。

サイズを変更しました。

これならOKです。

このキャベツを先程作成したFollowerPropにセットします。

<Create Follow Player Function>

今度はVerseを使用してPlayerを追いかける関数を作成します。

そろそろ関数も見ないで書けるようにならないといけません。

試しに見ないで書いてみます。

関数内の実装にLoopを使用するのでSpecifierでSuspendを追加したのを覚えています。

後は

関数名(Parameter):Return Value

なので

と書きました。

どうでしょうか?

SuspendじゃなくてSuspendsでした。

後は大体あっていました。

直しました。

先週のBlogにはこう書いてありましたが無限Loopになったら怖いので敢えて試すのは止めます。

<Get Reference to Players / All Players>

まずLevel上に存在している全てのPlayerのReferenceを集めます。

Errorになっていますね。

Ifで囲ったらErrorが消えました。

この方法でObjectをInitializationするのは初めてだと思いますので、ここで一寸調査します。

まずここで帰って来るのがどんなClassなのかです。

あれ?

GetPlayers()にCursorを合わせても何も表示されません。

公式SiteのGetPlayers function[14]を見つけました。

理由は分かりませんがGoogle検索ではこのPageに辿り着く事は出来ませんでした。

Verse API ReferenceのPageにModule Listがあったので

そこのPlayspaceを選択して

Playspace Moduleに移動します。

しかしそこにはInterfacesしかありません。

Fort_playspaceを選択します。

Fort_playspaceに移動すると

Functionsの表の中にGetPlayers()関数がありました。

これをClickしたらたどり着けました。

Google検索に表示されないのは何故なんでしょう。

GetPlayers function[14]ですがここにReturn Valueの説明が無いです。

ただし以下のDeclarationがありました。

これ見るとReturn Valueplayerですね。

playerと言うクラスがあるはずです。

調べます。

こっちはGoogle検索で見つかりました。

player class [15]です。

Verse.orgのSimulation ModuleにあるClassのようです。

Simulation module [16]を見たら

以下に示した様にClassの説明のところにありました。

はい。

かなり時間がかかってしまいましたがGetPlayers()関数が返すのはPlayer ClassのObjectだと分かりました。

次はObjectの生成方法についてですが、

2023-09-11のBlogにはClassの作成方法が以下のように書かれています。

要はこの右辺の部分にGetPlayspace().GetPlayers()が入った訳です。

納得です。

他にもいろいろ調べたい箇所はありますが、それをしているとこのTutorialが終わらなくなるので続きをやる事にします。

Character Moduleを追加します。

PlayerはSimulation Moduleですし、Getplayers()関数はPlayspaces Moduleです。

何でCharacter Moduleを追加しているのか不明です。

Errorが凄いです。

Players()ではなくてCharacterでした。

後、If節の最後には:が必要でした。

更にErrorを消すためには

の追加、正確に言うとCharacter ModuleではなくCharacters Moduleの追加が必要でした。

複数形だったのか。

この辺は間違えながら覚えていきます。

If節内の残りの実装を追加しました。

何故かErrorになっています。

あ。

Loopを追加するのを忘れていました。

追加しました。

先週のBlogを読んでいたらIf節内のAndとOrの指定方法で何も書かないとAndになるのでは?

と書いていました。

これも確認する必要がありますね。

今回の実装を見てみるとIf節の2つのConditionはCommaで切れています。

これがAndと同じ効果を発しているのかもしれません。

これは来週確認する事にします。

<Get Player Position Move To() Function>

まず以下のModuleを追加します。

次のCodeを追加します。

GetTransform()をgetTransform()と打っていてErrorがずっと表示されていました。

直すのに20分位考えました。

次の実装です。

もうかなり時間を費やしてしまいましたがFollowerPropのクラスであるCreative_propのAPIは調べておきますか。

なんと突然Visual Studio Codeが正常に作動し始めてDefinitionを表示する事が出来るようになりました。

うーん。

でもDefinitionにはそのClassがどんなFunctionを持っているのかは書いてなかったです。

公式Siteのcreative_prop class [17]を見ます。

FunctionのMove to()には以下の説明がありました。

これでこのFunctionは完成したみたいです。

最後にこの関数をOnBegin()に追加します。

<Final Result>

UEFNに戻ってBuildをしました。

テストしてみます。

追いかけて来ません。

DoFollowPlayer関数に()が付いてなかったです。

これError表示してくれ。と思いました。

この後20分位直らなくて色々弄ったんですが、

VerseやUEFNを変更した時は以下のPush Changesを押す必要がある事を思い出しました。

Push Changesを押したらUpdateが始まりました。

しばらくしたら自然にGameが始まって以下のようになりました。

なんだこれは?

一回Gameを終了してもう一回Gameを始めてみます。

今度はCabbageが追いかけて来ました。

Cabbageが以外に速くて逃げている間にScreenshotを取る事が出来ません。

そしてCabbageに捕まると、上記のような画面になりました。

ああ、これはCabbageを内側から見た状態なのね。

一応これで完成したので今週はここまでとします。

7. DirectX12の勉強

7.1「DirectX 12の魔導書」の勉強

7.1.1 先週の復習

先週何を勉強したのか覚えていません。

先週のBlogを読んで復習します。

「3.4 Error対応」の「トラブル原因の究明」を勉強して実装までしています。

思い出してきました。

先週はDebug Layerを実装しようとしたら既に実装していたんでした。

7.1.2 「DXGIのError Messageを取得できるようにする」を勉強する

「トラブル原因の究明」は更に小さな節に分かれていて先週実装したのはその中の「Debug Layerを有効化する」だけでした。

その次の節である「DXGIのError Messageを取得できるようにする」を勉強します。

まずDXGIが何なのかが分かりません。

調べます。

公式SiteにDXGI overview [18]がありました。

これを読みます。

まずDXGIはMicrosoft DirectX Graphics InfrastructureのAcronymでした。

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

あれ?

この図、前にどこかで見た事あります。

Blogで確認したんですが勉強した形跡はありませんでした。

うーん。

おかしいな?

まあでもこのDXGI周りの情報を得る事が出来るようになるのは理解出来ました。

7.1.3「DXGIのError Messageを取得できるようにする」を実装する

それでは実際に実装をします。

私のProject内からCreate DXGI Factory()関数を探します。

あれ?

教科書の実装方法とは違いますが、しっかりCreate DXGI Factory 2()関数を使用しています。

2023-03-06のBlogあたりにCreate DXGI Factory()関数の実装に関して実際にどうしたのかが書かれていました。

DirectX 12の魔導書」の「3.2.2 DirectX D12の初期化」でCreate DXGI Factory()関数を実装したそうです。

しかしSample Codeを見たら教科書と違いCreate DXGI Factory1()関数ではなくCreate DXGI Factory2()関数が使用されていて、結局Sample Codeのやり方を採用したと書いていました。

うーん。

成程。

せっかくなんで教科書の「3.2.2 DirectX D12の初期化」も読み直す事にします。

あ。

ここにDXGIの説明が載っていました。

うーん。

ここで勉強したのか。

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

でも教科書の図、公式SiteにDXGI overview [18]の図と全く同じなんですが、これって引用先を記さなくても良いんでしょうか?

Applicationの四角の隅が丸くなっていてD3D10やDriverとHardwareの四角の隅が尖っている所までクリソツです。

Create DXGI Factory()関数が出て来るのはその次の節にある「Graphic Boardが複数使用されている場合」でした。

その節を読むとGraphic Boardが複数使用されている場合、使用したいGraphic Boardの情報を得るためにCreate DXGI Factory()関数を使用しています。

うーん。

そういえばこんなのも勉強しました。

7.1.4 「3.4.2 Fence」を勉強する

本来なら今度は「Direct3D 12 ゲームグラフィック実践ガイド」の勉強を始めるんですが、先週の勉強で

と述べていました。

こっちは覚えていました。

ので今週は「Direct3D 12 ゲームグラフィック実践ガイド」を勉強しないで「DirectX 12の魔導書」の「3.4.2 Fence」を勉強します。

まず軽く読みます。

前に一回読んだはずです。

そんなに難しくないはずです。

おお。

FenceVal値をIncrementしていました。

しかもSignal()関数内でです。

これだ。

これが知りたかったんです。

しっかりこの部分を読む事にします。

まずFence()関数の役割ですが、GPU側の処理が終わったかどうかを確認するそうです。

GPU側の処理が終わっていないのにCPU側でBufferの内容をResetしてしまっているから今のErrorが発生している訳です。

このErrorを直すためにはGPU側の処理が終わっている事を確認する必要があります。

それを行うのがこのFence()関数だったわけです。

公式SiteのID3D12Device::CreateFence method (d3d12.h) [19]を見ると

Parameterに以下のUNIT64型であるInitial Valueが必要になります。

このVariableがIncrementします。

この教科書ではFenceValと名付けられていました。

最初のDefault値は0です。

Execute Command List()関数を使用した後に以下に示したCodeを実行します。

ここでSingal()関数が使用されます。

この時にはFencValの値はIncrementされているので1になってるはずです。

公式SiteのID3D12Fence::GetCompletedValue method (d3d12.h) [20]を見ると

としか書かれていませんが、

教科書の説明によるとこの値はGPU側の処理が終わるとIncrementされるそうです。

最初の値は

でfenceValの初期値がセットされていますので、0になるはずです。

それがGPU側の処理が終わった時点で1にIncrementします。

のでGetCompleteValue()関数のReturn ValueとIncrementしたFenceValの値が同じになるまではGPU側の処理は終わっていないという事になります。

その間はその先の実装を実行しないように何らかの方法でCodeの実行をPendingさせる必要があります。

教科書では最初はBusy Loopで実行をPendingさせていました。

その後でSample Codeと同じ方法に改良しました。

Sample Codeでは以下の実装でCodeの実行をPendingしていました。

これはEvent()関数を使用しているじゃないですか。

先週のEvent()関数の勉強の復習も兼ねてじっくり読んでいく事にしましょう。

まずここで確認する必要があるのはWait For Single Object()関数です。

この関数の機能を調べます。

公式SiteのWaitForSingleObject function (synchapi.h)[21]を見ます。

はい。

大体理解出来ました。

まずEventを作成します。

このEventをSet Event On Completion()関数を使用してFenceがGPU側の処理が終わった時にSignalを発するようにします。

このSignalが発するまでWait For Single Object()関数はこのThreadの作業をPendingさせます。

GPU側の処理が終わりこのEventがSingalを発生するとこのWait For Single Object()関数はこのThreadを停止するのを止めて次のCodeを実行させます。

Set Event On Completion()関数の機能も一応確認します。

公式SiteのID3D12Fence::SetEventOnCompletion method (d3d12.h)[21]です。

と書かれていました。

予測した通りでした。

予定した時間をOverしてしまったのでここで今週のDirectX12の勉強は終わりにします。

実装は来週やる事にします。

8. まとめと感想

なし

9. 参照(Reference)

[1] FreetimeCoder [FreetimeCoder]. (n.d.). Unreal PCG Tutorial. YouTube. https://www.youtube.com/playlist?list=PLA03OHAaHgYpo0enf8p-2oEpja3grLOKZ

[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] Lit translucency. (n.d.). https://docs.unrealengine.com/5.3/en-US/lit-translucency-in-unreal-engine/

[4] Post process effects. (n.d.). https://docs.unrealengine.com/5.0/en-US/post-process-effects-in-unreal-engine/

[5] Unreal Engine Public Roadmap Forward Looking. (n.d.). Unreal Engine Public Roadmap. https://portal.productboard.com/epicgames/1-unreal-engine-public-roadmap/tabs/94-forward-looking

[6] AI Tools Search. (2023, September 30). Do NOT use this “Free” AI voice changer [Video]. YouTube. https://www.youtube.com/watch?v=lZvMHoj23kk

[7] YongYea. (2023, October 10). Unity CEO John Riccitiello resigns after install fee causes mass revolt from devs [Video]. YouTube. https://www.youtube.com/watch?v=9-zXIBy3u9U

[8] Yumesaki R. (2023). つくよみちゃん公式RVCモデル/つくよみちゃんUTAURVC. つくよみちゃん公式サイト. https://tyc.rei-yumesaki.net/work/software/rvc/#toc5

[9] Yumesaki R. (2023). イラスト素材. つくよみちゃん公式サイト. https://tyc.rei-yumesaki.net/material/illust/

[10] Yumesaki R. (2023). クレジット表記について. つくよみちゃん公式サイト. https://tyc.rei-yumesaki.net/about/terms/credit/#video

[11] FreetimeCoder. (2023, March 29). Unreal 5.2 Preview PCG Tutorial - Part 8 - Jungle Breakdown [Video]. YouTube. https://www.youtube.com/watch?v=SCDZ8kobv1M

[12] Nodes of Nature. (2023, August 9). PCG building in Unreal Engine [Video]. YouTube. https://www.youtube.com/watch?v=m1DJ7qXBgug

[13] Pi Equals Three. (2023, March 31). Easily make anything follow your player! UEFN/Creative 2.0 [Video]. YouTube. https://www.youtube.com/watch?v=J7f2zHJbcUg

[14] GetPlayers function. (n.d.). Epic Developer Community. https://dev.epicgames.com/documentation/en-us/uefn/verse-api/fortnitedotcom/playspaces/fort_playspace/getplayers

[15] player class. (n.d.). Epic Developer Community. https://dev.epicgames.com/documentation/en-us/uefn/verse-api/versedotorg/simulation/player

[16] Simulation module. (n.d.). Epic Developer Community. https://dev.epicgames.com/documentation/en-us/uefn/verse-api/versedotorg/simulation

[17] creative_prop class. (n.d.). Epic Developer Community. https://dev.epicgames.com/documentation/en-us/uefn/verse-api/fortnitedotcom/devices/creative_prop

[18] Stevewhims. (2021, August 20). DXGI overview - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/direct3ddxgi/d3d10-graphics-programming-guide-dxgi

[19] Stevewhims. (2022, July 27). ID3D12Device::CreateFence (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-id3d12device-createfence

[20] Stevewhims. (2022, July 27). ID3D12Fence::GetCompletedValue (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-id3d12fence-getcompletedvalue

[21] Stevewhims. (2022, July 27). ID3D12Fence::SetEventOnCompletion (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-id3d12fence-seteventoncompletion