UE4の勉強記録

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

「Unreal Engine 4.xを使用してRPGを作成する」の足りない部分を作成する。アニメレンダリングについて9

<前文>

<バイデン大統領による学生ローンの免除のNewsの続き>

バイデン大統領による学生ローンの免除は学生ローンを借りたすべての人が$10,000~$20,000の免除を受けられるみたいです。

これが本当に困っている人達への本当の助けになるのかどうかは、私には分かりません。

しかし今まで共和党の熱心な支持者だった若者が、泣いて「民主党支持に変える。」って言っているのを見ると、ある層のアメリカ人にとっては本当に助けになるみたいです。

これは本当にGood Jobで、私はバイデン大統領が就任した時に、今最も大統領がしなければならない事は学生ローンの免除であるが、彼はそれをしないだろう。そしてその結果、支持率は急落して次の大統領選挙では彼は負ける。と予測しました。しかし私の予測は外れ、バイデン大統領は、未だかつてない規模の学生ローンの免除を決定しました。

それでアメリカの文化では、男が人前で泣く事は最も恥すべき事であるにも関わらず、泣いて感謝する若者が続出した結果に成ったわけです。

それ見て思ったんです。もう共和党は滅亡するんじゃないのかと。

私は、アメリカに10年も住んでいたのでアメリカの事は本当に深く知っています。

それでアメリカと中国が戦争になったら、アメリカが負ける可能性は十分ある。って予測しています。

しかし、この予測は少しだけ外れていて、アメリカそのものが滅ぶんじゃなくて、アメリカの共和党とそのFollowerだけが滅ぶのかもしれません。

と言うか、アメリカの共和党とそのFollowerはもう滅びかけている気がします。

まず、共和党は3つの大問題に直面しています。

一つ目が、トランプ元大統領によるスパイ疑惑です。

これはアメリカの核兵器関連の秘密を中国かロシアのスパイに教えた疑惑です。

これもし本当だったらアメリカ史始まって以来のTraitorでしょう。

勿論、今は疑惑ですがFBIの捜査は着々と進んでいています。遅かれ早かれ、本当の事が判明するでしょう。

それで、私の純粋な予測ですが、彼はアメリカの核兵器の配置場所を中国かロシアのスパイに教えたと思っています。

その理由は、私がアメリカにいる時に中国人から聞いた話です。

中国共産党ハッカーは既にアメリカのホテル会社のComputerのハッキングに成功していて、アメリカの議員がどのホテルに泊まっているのかを全部知っている。しかしアメリカは中国に対して同じ事が出来ていない。何故か中国のSecurityを破る事が出来ない。って話を聞いた事があるからです。

私、この話を聞いたとき、それは誰がホテルに泊まっているって情報に何の価値もないから、アメリカは本気になってないからでしょう。と思ったんですが、後で議員を暗殺するとしたらこれほど便利な情報はないと、鳥肌立ったのを覚えています。

今、思うともっと便利な利用方法があります。

中国共産党は、そのホテルで議員と愛人が密会しているのも分かるんです。イヤ愛人位だったら暴露されてもギリ大丈夫でしょう。でも買春していたら?しかも未成年者を。

これアメリカ文化を一寸でも知っていたら分かりますが「未成年者を買春していた事実を暴露する。」と中国から脅迫された。そして「アメリカの核兵器の配置場所を教えたら暴露しない。」と言われたが、それを教えたらアメリカの安全が終わりになる。だから脅迫が有った事を告発します。

って通らないです。

いや通る。かもしれませんが、議員を止めるのは当然として、まあギリ刑務所は免れるかもしれませんが、それ以外の全ては失うでしょう。

これで脅されて、中国にアメリカの核兵器の配置場所を教えちゃった可能性は0ではない。と個人的には思っています。

しかもこの件に加えてこの前の議会における暴動に対する捜査も続きます。

この前の議会における暴動って、どう控えめに見てもアメリカに対する反逆罪でしょう。

2つ目が中絶禁止法です。

これ「最高裁が中絶を禁止するかどうかはそれぞれの州政府が決める事だ。連邦政府が決める事じゃない。と決定しただけだ。」と聞いて「えっ!そうなの。」と私も最初は納得したんですが、この議論って昔「奴隷制を決めるのは連邦政府が決める事じゃない。それぞれの州政府が決める事だ。」って言ってたのと全く理屈だったんです。

まあ、アメリカに住んでいる女性は奴隷と同じだって意味にも取れるわけです。

これアメリカのほぼ全部の女性を敵に回してしまいました。

共和党は、アメリ有権者の半分の票を敵に回してしまったんです。バカとしか言いようがないです。

3つ目が、今Newsになっているバイデン大統領による学生ローンの免除です。

完全に若者が民主党の味方になりました。

このNewsが発表されてわずか3日で、バイデン大統領の支持率は3~7%も上がったそうです。

これ、公平に言わないといけませんが、アメリカには一部の国民を直接助けると言う発想は今まで無かったです。だから共和党だけじゃなくて、民主党も学生ローンの免除のような事をやろうとした事は無かったです。

しかしバイデン大統領は学生ローンの免除を決定しました。

ここで、アメリカの若者は気が付いたんです。誰が本当の味方で誰が嘘つきなのかを。

これは日本にいると本当に分からないですが、アメリカの若者たちは本当に日本のアニメが大好きです。特にNARUTOが大好きで、アメリカ人の好きな忍者の話に加えて、主人公が金髪碧眼で、アメリカ人が感情移入しやすいんです。

そのNarutoの話に、火影と言って大統領みたいな立場の人が、本当の国の宝は子供たちだ。と言って自分を犠牲にして子供たちを守る話があるんです。

これを見て、ほとんどのアメリカの若者は衝撃を受けるんです。アメリカの老人たちは自分の財産を守るために、自分ら若者を戦場に送って犠牲にしているのと正反対だと。

で、俺らのLeaderってホントは敵国の独裁者とそんなに変わらないんじゃないのかと。

ところが、バイデン大統領は違ったわけです。

自分達が大好きな日本のアニメに出て来る、本当に格好いい老人と同じだったです。

これは民主党には追い風ですが、共和党には致命傷かもしれません。これから20~30年間、アメリカの主流になる人達の支持も失ってしまったからです。

バイデン大統領による学生ローンの免除は、アメリカの政治形態に建国以来の改革をもたらす一撃になるかもしれません。

それでは今週の勉強を始めます。

<本文>

1.今週の勉強について

今週も以下の内容についてやって行きます。

  • Niagara: CGHOW氏のTutorialをやる
  • Materialの勉強
  • RPGEventの作成
  • Open Worldの検証
  • Gaeaの勉強
  • 雪山のMapの作成
  • UI Designの勉強
  • Anime Renderingの勉強

2.Niagara: CGHOW氏のTutorialをやる

今週もScratch Padの勉強をやります。

UE5 Niagara #ScratchPad Module #5 | Static Mesh Location with Offset , Rotation and Scale [1]を勉強します。

その後で先週勉強したFlip Fluid in UE5 Niagara Tutorial | Download Files [2]の実装をやります。

2.1 UE5 Niagara #ScratchPad Module #5 | Static Mesh Location with Offset , Rotation and Scale [1]を軽く見る

まず軽く全部見ます。

題から大体何をやるのかは想像出来ますが、一応確認します。

<Static Mesh Location Module

まずScratch Pad ModuleにStatic Mesh Location Moduleと同じ機能を実装しました。

<Rotation

次にこのBox上にあるParticleを回転させる実装を先程のScratch Padに追加します。

<Offset

次にOffsetを作成するための実装を追加します。

Characterの形状のStatic Mesh に使用した場合、

が以下の様になります。

<Scale

今度はScaleを変化させる実装です。

以上の実装方法について解説していました。

2.2 UE5 Niagara #ScratchPad Module #5 | Static Mesh Location with Offset , Rotation and Scale [1]の実装方法を勉強する

それぞれの実装方法を勉強します。

<Static Mesh Location Module

まずMap GetノードにInput New Static Meshを追加します。

これはData InterfaceのStatic Meshでないとダメだそうです。

Data InterfaceにあるStatic Meshだけが以下に示したStatic Meshの関数が存在していて

ObjectにあるStatic Meshには存在していないそうです。

Get Triangle WSノードを追加します。

このNodeは昔使用した事があります。

Input Triangleの番号でStatic Mesh内にあるどのTriangleを使用するのか決めるはずです。

Random Triangleノードを繋げました。

BaryCoordが何をやっているのか不明です。

これは実装する時、調べます。

そしてGet Triangle WSノードのPositionの値をMap Setノードに繋げてOutputします。

最後にGet Triangle WSノードのRandom Infoの値を決定するParameterをMap Getノードに追加します。

以上です。

<Rotation

次は回転です。

まずEuler to Quaternionノードを追加します。

次にこのNodeのInputであるYaw、Pitch、RollをMap Getノードに追加します。

更にMultiply Vector with Quaternionノードを追加します。

以下に示した様にGet Triangle WSノードのPositionをこのMultiply Vector with QuaternionノードのVectorに繋げます。

更にEuler to Quaternionノードの計算結果をMultiply Vector with QuaternionノードのQuaternionに繋げます。

最後にMultiply Vector with Quaternionノードの計算結果をMap SetノードのParticle Positionにセットしました。

以上でした。

<Offset

TutorialではParticleをStatic MeshのNormal方向に移動させる実装と言う表現もしていました。

こっちの表現の方が実態を表している気がします。

実装方法ですが、まずGet Triangle WSノードのNormalをMultiplyします。

その結果をMultiply Vector with Quaternionノードの計算結果に追加します。

その結果をMap SetノードのPositionに返します。

先程のMultiplyノードのBのタイプをVectorに変換します。

Map Getノードに繋げてinput Offsetを作成します。

以上です。

特に疑問に感じる箇所もないですね。

<Scale

最後のScaleですが、これはもう自分でやり方分かりました。

まずAddの結果をMultiplyノードに繋げます。

そのMultiplyノードの結果をMap SetノードのParticle Positionに繋げます。

MultiplyノードのBのTypeをVectorに変換して

Map Getノードに接続して新しいInput Scaleを追加します。

以上です。

2.3 UE5 Niagara #ScratchPad Module #5 | Static Mesh Location with Offset , Rotation and Scale [1]を実装する

ここまで細かくこのTutorialを勉強する必要は無かった気がしますが、まあやってしまったのを消すのもあれ何でこのまま最後までやります。

まずいつもの下準備をします。

Fountainを追加したNSを作成します。

要らないModuleを消します。

Particle Spawn SectionにScratch Padを追加します。

<Static Mesh Location Module

もうここからはTutorial通りにやって行くだけです。

まずMap GetノードにData InterfaceのNew Static Meshを追加します。

Get Triangle WSノードを追加します。

Random Triangleノードも追加します。

Random Triangleノードの計算結果をGet Triangle WSノードに繋げます。

このBaryCoordが何の値をパスしているのか気になります。

調べたらどうやらBarycentric Coordinatesの省略した言葉みたいです。

Barycentric Coordinates自体は沢山の解説がNetに有ったのでそれを一々ここで解説する事はしません。

ここではそれぞれの三角形上に存在する単なる点の座標と解釈しておきます。

以下の様に繋ぎます。

Map SetノードにParameterのParticle:Positionを追加します。

これ、前節で勉強した時は新しいParameterを作成したと勘違いしていました。

そこにGet Triangle WSノードのPositionの結果をSetします。

Applyを押します。

警告されたので以下の様に直しました。

Map GetノードにInt32を追加し、Random TriangleノードのRandomInfoに繋げます。

名前をRandom Infoに変更します。

System Overviewに戻ってRandom Infoの値を以下の様にセットします。

結果です。

<Rotation

今の実装でNSをLevel上に配置します。

そしてNSをLevel上で動かすと以下に示した様にParticleは生成された場所から動きません。

これでは回転させた時に、新しく生成されるParticleのみが回転する事になってしまいます。

直します。

これの直し方は簡単で、

Particle Spawn SectionにあったScratch PadをParticle Update Sectionに移すだけです。

次ですが、Particleを回転させるためには、一辺に沢山のParticleを生成して それを消さないで保持させる方が効率的です。

その設定を行います。

Emitter Update SectionのSpawn Rate Moduleを消してSpawn Burst Instantaneous Moduleをセットします。

設定は以下の様にしました。

これはある程度のParticleがSpawnされたら良いので適当です。

Particle Update SectionにあるParticle State Section Moduleの

Kill Particles When…のCheckを外します。

そしてEmitter Update SectionにあるEmitter State Moduleの

Loop Behaviorの設定をOnceに変更します。

これはCGHOW氏がParticleを一回だけ生成してそれをずっと保持していたい時に必ずやる設定です。

料理で言えば下ごしらえみたいなものですが、今まできちんと文章にした事が無かったので今回まとめました。

それではScratch Padの実装をやっていきます。

まずEuler to Quaternionノードを追加します。

Euler to QuaternionノードのInputであるYaw, Pitch, RollをMap Getの+に繋ぎ、Map Getに[Input] Yaw、[Input] Pitch、[Input] Rollを追加します。

ParameterのName Spaceと名前をどうやって分けて表記するのか悩んでいたんですがBrackets で囲む事にします。

後、Mat Get ノードに追加するParameterが元から存在しているParameterと、以下に示した様なSystem OverviewのScratch Pad Moduleから値をInputするその場で作成したParameter typeがあります。

[input]とか [Particle] と書くとこの二つの違いも分かり易く表示出来る様になります。

そしてEuler to Quaternionノードの結果をMultiply Vector with QuaternionノードのQuaternionに繋げます。

更にGet Triangle WSノードのPositionをMultiply Vector with QuaternionノードのVectorに繋げます。

Multiply Vector with Quaternionノードの計算結果をMap Setの[Particle] Positionに繋げます。

Applyボタンを押して、System Overview画面に戻ります。そしてScratch PadのPitchの値を以下の様に変化させてみました。

結果です。

グルグル回転しました。

Pitchの値を以下の様に設定すると時間によってグルグル回るEffectになります。

はい。

これTutorialではLevel上で回転さえているんですが、回転の中心をWorld Positionの原点にしていますよね。

のでLevel上でPreviewと同じように回転するためにはNSを原点に配置しないといけない気がします。そしてもし原点以外に配置した場合は、原点を中心にして回転するはずです。

一寸試してみます。

原点にNSを配置した場合です。

NSを原点から外れた箇所に配置するとやはり原点を中心に回転します。

<Offset

Get Triangle WSノードのNormalに

Multiply ノードを繋げます。

MultiplyノードのBのタイプはVectorに変換しました。

この結果をAddノードに接続して今までの結果と足します。そしてその足した結果をMap Setに接続しました。

最後にMultiplyノードのBの値を

Map Getノードの+に繋ぎ、[input] Bを作成しました。

[Input] Bだと何を指しているのか不明なので名前をOffsetに変更します。

以上です。

Offsetの値を以下の様にセットしました。

結果です。

この後、TutorialではCharacterを使用してOffsetの効果を試しています。

適当なモデルがないので、以下のStatic Meshを代わりに使用します。

普段の状態です。

Offsetを

にセットします。

結果です。

確かにCubeである最初の例とは違い全体的に大きくなっています。

でもこれはサイズが大きくなる場合とは一寸違いますね。最初の例のCubeのような面が平らな場合はサイズが大きくなるのではなくそれぞれの面が分離して移動していますから。

<Scale

これは最後にMultiplyノードを追加するだけです。

BはMap Getノードの+に繋げて[input] Scaleを作成します。

Scaleを5倍にしてみました。

結果です。

Cubeのサイズは5倍になっていますが、Offsetと違い面が離れたりはしません。

2.4 UE5 Niagara #ScratchPad Module #5 | Static Mesh Location with Offset , Rotation and Scale [1]を勉強した感想など

別にこのTutorialをここまで細かく勉強する必要は無かったんですが、勉強するためのFormatの実験としては上手く出来たと思っています。

  1. Tutorial全体を軽く見て構成を把握する
  2. 実装を整理してその理論を理解する。
  3. 実際に実装してみて、NodeModuleの使い方を確認する。

をやりました。

まあ、このTutorialに関して言えば、特に理論的に理解出来ない箇所や使用した事のないModuleやNodeが沢山ある訳でもなかったので、2と3は一緒にやっても良かったです。

でもこのやり方でやればCGHOW氏のTutorialはほとんど全て完全に理解出来るようになります。

まあ、そういう意味では記録に残しておくのも役に立つでしょう。

2.5 Flip Fluid in UE5 Niagara Tutorial | Download Files [2]の実装

まず使用するCharacterが無いので以下のCharacterを追加します。

次にPluginを開いてNiagara FluidsをCheckします。

Projectを再起動させます。

Niagaraを作成します。

から

を選択します。

Templateから選んだ場合は以下の様にFinishが表示されるんですね。

意外な所で驚きです。

出来ました。

中身を見てみます。

まずPreviewですが以下の様になっていました。

Systemです。

こっちはまあ置いておいてEmitterを見てみましょう。

Emitter Summaryを見てみましょう。

Open Boundary Backとか先週勉強したやつがありますね。

2つ目のEmitterです。

Foam やBubbleを形成するそうです。

まあ想像していたそうです。

昔、Two Minute PapersでFluid Simulationの動画を見てた時に、波にFormやBubbleを追加したら凄くRealになるのにそれを発表したPaperが全然注目されてなかった話を思い出しました。

でもこのEmitterは今回は使用しないのでCheckを外します。

まずBoundaryを表示します。

SystemのUser Parameterを選択して

Show BoundsにCheckを入れます。

結果です。

Boundaryが表示されました。

EmitterのEmitter Summaryから

Open Boundary RightをCheckします。

すると以下に示した様に右の壁が無くなり、液体が右から流れ落ちていくようになりました。

全部の壁を消しました。

結果です。

液体はどこにも溜まらなくなりました。

後、意外に今のPCでもそれなりに動いています。

次は液体が真下に落ちる様にします。

Particle Spawn SectionのSet: [Particle] Velocityを選択します。

結果です。

液体はまっすぐ落ちる様になりました。

次はSphere Locationの代わりにCharacterをセットします。

まずSphere Locationを消します。

Static Mesh Location Moduleを追加しました。

Errorが表示されるのでFixを押します。するとSample Static Mesh Moduleが追加されました。

Sample Static Mesh Moduleの以下のPreview MeshとDefault Meshに

先程のCharacterをセットしようとしたら

このCharacterはSkeletal Meshでした。

調べたらSkeletal Meshを開くと以下に示した様にMake Static Mesh Buttonがあるのでそれを押すとこのSkeletal MeshのStatic Meshが作成出来るそうです。

しました。

出来ました。

Sample Static Mesh ModuleのPreview MeshとDefault Meshにセットしました。

結果です。

私のCharacterのSizeはTutorialと違って丁度いい大きさですね。

SystemのUser Parametersの

World Grid Extendsの値を弄る必要はないみたいです。

とは言え一寸は触ってみたいので、Zの値だけ400に変更してみます。

何と、PCがほとんど動かなくなってしまいました。

しかもSample Static Mesh Moduleに以下のErrorが表示されています。

取りあえずFixを押してみます。

PCは動くようになりましたが、液体のSimulationはカクカクのままです。

えい。ダメ元でこのNSをLevel上に配置してみます。

出来ているっぽいです。

普通に動いています。

やれるところまでやる事にしました。

次は液体の色を変えます。

Tutorial通りにMesh Render Moduleを選び

使用しているMaterialを見つけます。

そのMaterialのCopyを作成しました。

それをセットし直しました。

Base Colorを赤くしました。

Opacityは1にしました。

Metallicは0.2にしました。

結果です。

Boundaryはもう要らないので消します。

うわわ。

Boundaryを消すのに30秒位かかっています。

でもBoundaryは消えました。

この後、Parameterの解説がずっと続きます。

それぞれのParameterを実際に試してみたかったんですがもうPCが限界みたいなので止めます。

Collideをやります。

Level上に配置したNSを選択して

Static Mesh CollisionsのTagを開きます。

既にcolliderと書かれていました。

今度はCharacterである

を選択します。

そのTagにcolliderをセットしようとしたら2つもTagがあります。

Tutorialで確認したらActorの方でした。

以下に示した様になりました。

これでCollideしているはずですが良く分かりません。

背中の方を見るとCollideしてるようにも見えます。

これで終わりです。

2.6 Flip Fluid in UE5 Niagara Tutorial | Download Files [2]を勉強した感想

やっぱり私のPCではSimulationはきつかった。でも何とか最後まで出来ました。

Taskを見るとCPUよりMemoryが限界に来ているみたいでした。

今度買うPCのMemoryは32GBを予定しているんですが、UE5のデモを動かすには64GB必要みたいです。やっぱり拡張して64 GBにした方が良いんでしょうか?

3.Materialの勉強

3.1 先週の復習

先週、Rain On The Lens Post-Process Effect - Shader Graph Basics - Episode 53 [3] の定常状態の粒の実装で理屈が分からない部分をきっちり解決しようとしたんですが、Powerノードの理解に致命的な勘違いがあって途中で断念しました。

その勘違いとは、以下に示した様にPowerノードはBaseの値がNegativeだった時はClampされ0になる事です。

これ知らなかったです。

のでずっとNegativeな値をBaseに代入した場合、以下に示した様に、

Expの値が奇数ならばNegativeの値、Expの値が偶数ならばPositiveの値になると思っていました。

この考えが正しいと思って実装の計算を頭の中で推測して追っていました。

ので最初から間違って推測していました。

更に、先週のMaterialのまとめで以下の様に

Less than 0って書いてあるところを、0以下とか訳しています。

この辺だけ見ても先週は頭脳がきちんと回転していなかったのかなと思いました。

ので今週はもう一回、Rain On The Lens Post-Process Effect - Shader Graph Basics - Episode 53 [3] の定常状態の粒の実装を勉強します。

3.2 Rain On The Lens Post-Process Effect - Shader Graph Basics - Episode 53 [3] の定常状態の粒の実装をもう一回、勉強する

まず先週のBlogの部分を以下にまとめます。

先週の勉強は、元々先々週の疑問でその定常状態の粒の実装の中に以下の様な部分があり、

この結果が、Power(x, 10)とFloorを使用した場合は

同じになるはずだ。と予測しテストすると

Power(x, 10)の場合は、

となり、Floorの場合は

こんな結果になります。

Power(x, 10)の場合の方が、Floorより全然白いんです。

この理由が分からない。と言っています。

それを先週は検証した訳です。

今度は、その検証を読み直しながら、その理論が正しいのか検証の検証をします。

まず以下に示した様に0未満の値をSaturateで消しています。

と言う事は、この時はPowerノードが0 未満の値はClampして0にしてしまう事は知らなかったんですが、結果的に0未満の値は0として計算しています。

と言う事はこの部分の検証はあっているはずです。

一応、確認します。

Power(x, 10)の結果です。

Saturateノードを挟んだ結果です。

全く同じです。

先週の仮説です。

これは当然なんですが、以下のImageにPowerやFloorを掛けるです。

これ黒 = 0、灰色 = 0.5 、白 = 1の3つの色しかないんです。

灰色はPower(x, 10)でもFloorでも黒 = 0にしかならないですよね。

そこで先週は以下の事に

という仮説を立てました。

そしてPower(x, 10)の結果と

Floorの結果を

比較しました。

その結果ですが、Floorの結果はPower( x, 10 )と比較してギザギザなんです。

例え、先週はPowerノードの機能を勘違いしていたとしても、これらの事実を考慮すると、先週考えたこの仮説はあっていますね。

一応、この結果を今、確認すると

Power(x, 10)の結果です。

Floorの結果です。

やっぱりFloorの結果はギザギザです。

これはやっぱり先週の仮説は正しかったんですね。

先週、最後になって間違っているって分かっている事を載せるのもアレだし、全部消してしまおうか、とも思ったんですが消さなくて良かったです。

更に、先週では以下の実験をする事で、白の値が1だけでなく0.997とかが存在している事を証明しようとしています。

Roundノードの機能は、

となっています。

0.5は1になるみたいですね。

ところが、結果は灰色の部分は黒くなりました。

これは偶然ですが灰色の部分は0.499みたいな値だったと結論づけています。

確かにその可能性は高いですが、一寸以下の方法で確認してみたいと思います。

以下の様にPower(x,10)の手前の結果をUnlitで表示させ

それをCopyして切り抜き、Medibangに貼りつけました。

これで黒、白そして灰色の部分の色のRGBの値を調べます。

まず黒い部分ですが0でした。

次に灰色の部分ですが、117と118の箇所がありました。

最後に白の部分ですが、この中で最も白い部分で254でした。他の白い部分は240~230でした。他の部分でもっと大きな白い塊の中心では255の値を示す所もありました。

灰色の部分は0.46、白は0.9~1、黒はほとんど0になります。

はい。

もう十二分に検証しました。

先週のPowerノードに対しての解釈が間違っている箇所はありましたが、最初の仮説は合っていました。

次の問題を検証する事にします。

先週のBlogでは、この後で3つの謎があったと言っています。

そう。この謎そのものは正しかったんです。

これらの答えが分からないから先々週は混乱したんです。

だからこの疑問の設定自体は正しかったんですが、この解答が間違っていました。

いやこの解答の一部が間違っていたと言うのが正解でしょう。

三番目の謎ですが、以下の様に解答しています。

これは先程確認した通り100 %あっています。

次に2番目の謎ですが、ここからPowerノードを理解出来るかどうかが関係してきます。

まずPowerノードを使用した場合、-1~0の間の値は自動的に0にClampしてくれます。ので同様の結果を出せる、Saturateノード+ Roundノードよりもひと手間少なく実装できます。

次に、-1, 0, 1の3つの値が存在しているだけではありません。0.98のような値も存在しています。

いや、この-1, 0, 1という区切りが一寸オカシイですね。

これをもう一回検討しましょう。

まず最初のTextureのAlphaの値を調べます。

以下の様にTextureを切り抜いてMedi Bangに貼りつけてRGBを測定しました。

黒 = 0、白 = 255, そして灰色 = 105でした。

正規化すると黒 = 0、白 = 1, そして灰色 = 0.41です。

これに以下の計算をしています。

まず2を先程のそれぞれの値に掛けると

黒 = 0、白 = 2, そして灰色 = 0.82になります。

そこから1を引くと

黒 = -1、白 = 1, そして灰色 = -0.18になります。

この結果は以下のMask(B)のPreview

以下の様になっている事からも正しいと思われます。

灰色の部分が-0.18だから黒くなっています。

この結果に-1を掛けます。

すると、黒 = -1、白 = 1, そして灰色 = -0.18が、黒 = 1、白 = -1, そして灰色 = 0.18になります。つまり黒 ―>白、白->黒, そして灰色 = 灰色です。

しかしこの計算も結果と合いませんね。

灰色=0.18だと45.9しかありません。

前にこの部分の灰色の部分を測った時は117と118(大体0.46)でした。計算結果は半分以下の値です。

うーん。このやり方だと灰色の値は正確には測れないのかもしれませんね。

もしかしてsRGBが効いていると仮定して計算されているのかもしれませんね。

この辺は良く分かりません。

しかし-1, 0, 1という区切りは間違っていて、-1, 0.46, 1の値が存在している所にPower (x, 10)を掛ける意味があるのか?が2番目の謎の正しい定義になりますね。

しかしその解答は、先程の解答でほとんどあっていますね。

もう一度書きますが、

まずPowerノードを使用した場合、-1~0の間の値は自動的に0にClampしてくれます。ので同様の結果を出せる、Saturateノード+ Roundノードよりもひと手間少なく実装できます。

更に1の部分が本当は0.98~1の間に値が分布しています。Floorを使用するとこの0.98などの値は0になりPower (x, 10)を掛けた場合とは違う結果になります。

そして最後に最初の謎である

の解答ですが、Powerノードが勝手に0未満の値をClampして0にしてくれるから、0~1をPowerしているのと変わらないんです。

3.3 先週の検証の検証をしたまとめ

まず、先週の復習をするのが大変でした。

Powerノードの機能を間違って理解していた。って言っても、それ以外は完璧なのかと言う訳ではなく、結局は暗闇を手探りしながら正解らしくモノを探している状態なので、Consistencyを保ちつつ、何か意味ある結論に到達しようとするのはかなり大変でした。

Powerノードの機能を間違って理解していた事は全体的に見た場合、そんなに問題じゃなかったです。

それで今週の復習で完璧に理論通りに解決したのかと言うとそうではなく、新たに灰色の部分を0.46とかで計算していると全然理論値と違う結果になると言う、さらなる混乱が発生しています。

これ以上は今の自分の力で検証しても無理な気がします。

のでここで一端諦めます。

まあ、Materialはもう全部理解した気になっていました。が、まだ分からない部分がある事が分かっただけでも成果があったと思いました。

3.4 Rain Drips On The Lens Post-Process Effect - Shader Graph Basics - Episode 54 [4]を軽く見る

流石にこれしか勉強しないと勉強した気がしないので、Rain Drips On The Lens Post-Process Effect - Shader Graph Basics - Episode 54 [4]を勉強する事にします。

まず軽く全部見ます。

見ました。

名前の通りDripを作成していました。

大体の実装は前のDropと同じです。それで何でDripが作成出来るのかと言うと、違うTextureを使用しているからです。

後の細かい点の違いは見ただけではあんまり良く分かりませんでした。

3.5 Rain Drips On The Lens Post-Process Effect - Shader Graph Basics - Episode 54 [4]を実装します

それでは実装をします。

まずDownloadしたImageをUE5にImportします。

SRGBのCheckを外しました。

残りの設定は良く分からないのでこのままで行きます。

今週は以下のMaterial Functionの実装を作成します。

Texture Sampleノードを追加しました。

このTexture Sampleの設定を見ると

Linear Colorになっています。

と言う事は先週のsRGBの設定はあっていたと言う事ですね。

良く見たらTutorialに一瞬だけこのSample Textureの設定が写っていました。

こっちが私の今の設定です。

これ見るとまあ、同じですね。

Tutorialではもう一個Texture Sampleノードを追加しています。

うーん。何これ?と思ったら

もう一つ別なTextureを使用していました。

DownloadしてUE5に追加しました。

こっちのTextureを保持したTexture Sampleノードの設定を見るとLinear Colorになっています。

のでこっちもsRGBのCheckを外しました。

はい。追加しました。

次にTextureの縦横比を画面に揃えるために以下の実装をします。

MultiplyノードのBの値ですが、Tutorialでは0.07と言っていますが、実際に代入した値は0.7でした。ので0.7を代入しました。

この後、TutorialではこのTextureの解説を簡単にしています。

簡単にした理由はUnityの実装の解説でこのTextureの内容をしっかりしたからだそうです。

それでは、ここでこのTextureを確認しておく事にします。

RのImageです。

TutorialではこのImageはUのNormalを表しているそうです。

GのImageです。

ImageはVのNormalを表しているそうです。

BのImageです。

DripのMaskだそうです。

AlphaのImageです。

それぞれのGray ValueをOffsetに使用するそうです。

うん。大体理解出来ました。

次に行きます。

以下のコードを追加しました。

TutorialではContrastを上げる為に追加した。と言っていましたが、これ範囲が0~1から-3~3に変わっているんですよね。この違いを後でどう処理するのかにも注目したいと思います。

今度はこのDripにAnimationを追加します。

以下の実装をしたんですが、これが何をしているのか一寸不明です。

これは後で検証します。

最後に以下の様にOutputに繋ぎます。

最後にMaterialに戻って今作成したMaterial Functionを繋ぎます。

結果です。

Dripしていますね。

TutorialがやっているようにDripだけを表示してみました。

うーん。どうみても雨粒がカメラのレンズを垂れているようにしか見えません。

凄いです。

今週のMaterialの勉強はここまでにしておきます。

このDripの実装の内容は来週検証します。

4.RPGEventの作成

先週以下の様に述べたのでそれを

4.1 Eventを完了した時に表示されるWidgetの作成

当然、これを元に作成します。

以下の様に作成しました。

まず、先程のW_EventStartScreenをDuplicateしました。

それを以下の様に改良しました。

取りあえずEventは1個しかないのでこれで良いです。

これが完成したら残りのEventの整理の方法も考えます。

で、武器を手に入れた時にこのWidgetを表示する様にします。

ここでこのWidgetを表示するTimingを決めるのは簡単です。武器を手に入れる時とは、

Game Instanceにある変数のWeaponsに武器が追加される時だからです。

現在、武器がこのArrayに追加される場合は2か所だけです。

一つ目が武器屋で武器を買った時です。

Widget Weapon内の

Buy from weapon shopにあります。

2つ目が武器を拾った時です。

Pickup Item Widget

Weaponsです。

ここにGame InstanceのEvent Number変数が

1だったら、Event End Screenを表示させれば良いんです。

ただそのためには今開いているWidgetをどうにかする必要があります。

それを一寸考えます。

4.2 今開いているWidgetをどうするのか?

一番、やりたいのはEvent End Screenが表示されている時は、その時に開いているWidgetは透明になって機能も一時停止する事です。

それが出来ない場合、自転の策として、一端それまで開いていたWidgetは閉じて、Event End Screenが閉じた時にまたWidgetを開く事です。これはそれぞれの場合で、別々の実装をする必要が出て来るので面倒です。出来れば一括で全部管理出来る様にしたいです。

最後の案ですが、Event End Screenのデザインを変えて不透明にします。これなら今開いているWidgetの上から開くので、Event End Screenが閉じたら前のWidgetが普通に機能するはずです。

これらが実際に実装出来るのか実装したらどうなのかを試してみようと思います。

と思ったら時間がなくなってしまったので残りは来週やります。

5.Open Worldの検証

今週はNaniteの実装の復習をやります。

Ryan Laley氏の Unreal Engine 5 Tutorial - Create Nanite Meshes [5] をもう一回やります。その後で、JSFILMZ氏のunreal engine 5 how to enable nanite [6]も勉強します。

5.1 Unreal Engine 5 Tutorial - Create Nanite Meshes [5] をもう一回勉強する

2022-01-31のBlogに前回、Unreal Engine 5 Tutorial - Create Nanite Meshes [5] を勉強した内容がまとめられています。同じ事を2回繰り返すのは勿体ないので一応、このBlogを読み直して前回何を勉強したのかを復習します。

大体以下の事を勉強していました。

  • QuixelからStatic Mesh Importする方法
  • Import したStatic MeshNaniteに変更する方法
  • Naniteを可視化する方法
  • Position Precisionについて

でした。

更に以下の疑問が述べられていました。

  • BridgeからImportした時、Textureのサイズの指定する方法が不明
  • BridgeからImportしたMaterialMain Nodeなどの要素が普段と違う。
  • MeshTriangleは違うのか?

これらの疑問は、今なら直ぐに解決出来そうです。

ではこれを踏まえてもう一回、 Unreal Engine 5 Tutorial - Create Nanite Meshes [5] を勉強しましょう。

あんまりNaniteには関係ないですが、UE5のDemoを動かすのに必要なPCのSpecが紹介されていました。

うーん。結構知らない事が書いてありますね。

VRAMが8GB以上なのか。3070tiってVRAMが8GBだったような結構ギリギリですね。

このRTX 2080以上ってのが、どのくらいのスペックなのか分からん。3070だったら2080より上なんでしょうか?

12 Coreって言っているけど、どうなんでしょう。最新のIntelでCore数が10個しかない場合と、古いVersionで12 Coreある場合だったら最新の方が良いと言う場合もあるんでしょうか?

そして64 GBのRAMです。

34 GBじゃ駄目なんでしょうか?

うーん。と思ってパソコン工房のPCを見直していたら、UE5用のPCが既に組まれていました。

ここから選べばいいのか!

うーん。でもここのお勧めのPC、6 Coreしかないのとかありますね。後Memoryが32GBってのも不安があります。

Video CardだけEpic Game社の規準よりかなり良いのが入っていますね。

これってGameを作るのか映像作品を作成するのかにもよるんだと思います。

映像作品だったら製作者のPCの性能は滅茶苦茶良くて、映像を見るUserのPCはその辺のノートPCで動けば良いだけです。

Gameだと凄い性能のPCで作成して一般の人のPCじゃ動かない。となったら、うーん。ってなります。となるとGameを作る場合はそこそこのPCで作成した方が良い気がします。

そこでMemoryが32GBか64GBがどっちを選ぶべきかですが、

映像作品だったら文句なしに64GBを選ぶべきでしょうが、GameだったらほとんどのUserのPCが32GBで動かしているのに64GBじゃないとSmoothに動かないGame作ってもどうなんでしょう?      

はい。脱線は終わりです。

Naniteの勉強に戻ります。

まずMesh をQuixel BridgeからImportします。

凄い。もうこんなにUIが変わっています。

私のは以下の様にしてQuixel Bridgeを開きますが、

Tutorialのは以下の様になっていました。

あれ、間違えてた。

JSFILMZ氏のunreal engine 5 how to enable nanite [6]のTutorialを見てた。

こっちは後で勉強します。

Ryan Laley氏の Unreal Engine 5 Tutorial - Create Nanite Meshes [5] を勉強します。

あれ、別にQuixel BridgeからStatic MeshをImportしたりはしてないですね。

と言うか解説では、Bridgeを使えばNaniteのMeshを直接Download出来ます。って解説しています。

うーん。

じゃ。仕方ないです。

もとからStarter Packにあった以下のStatic MeshをNaniteにしてみます。

Tutorialでは以下の事をNaniteに変換するStatic Meshに対してしています。

私の方のStatic Meshは以下の様になっています。

まあ大体は一緒です。Enable Nanite SupportにCheckを入れ、Apply Changesを押します。

これでNaniteになったの?

Tutorialではそれを確認するためにNaniteをLevel上に配置してNanite VisualizationからTriangleを選択して確認しています。

同じ事をしたら

何も起きません。

あれ?

調べたら公式のForumsの[UE5] Nanite Bugged in new version of UE5? [6]に以下の解答がありました。

私のPCじゃ無理って事でした。

はい。

マジか。

これは本当にPCを買わないとダメになって来ましたね。

この1カ月くらいはNaniteで遊ぼうと思っていたので一寸残念ですね。

しかたないです。

作戦を変更します。

5.2 以下の別な予定を実行する

この中で建物の作成方法だけ全く勉強した記憶がないんです。

唯一、勉強したのが2022-07-25のBlogでUnreal Engine 5 Beginner Tutorial - UE5 Starter Course 2022 [7]の勉強中に城を作成した時です。

でもこの城中身がないんです。

廊下とか部屋を作成する場合、どうやって作成するのが一番最適なのか全く知らないです。

今週はこれを調べる事にします。

5.3 今までにやった中身のある建物の作成の復習

今作成しているRPGで、作成した村は以下のPackageに有った家を適当に配置しただけです。

これらの家は中に入る事が出来ません。

なので付属のMaterialを使用して

以下に示した様な中身がある店を作成しました。

所が、この作成した家、Buildするたびに以下のErrorが表示されます。

まず分からないのが、最初の警告です。Level Designする時Static Meshを重ねたらそれぞれのMeshのUVがOverlapするのは当たり前じゃないのかなと思います。

次の警告は今から調べたら問題解決する事は出来そうです。

この村を作成したのが既に数年前の事なので、今見たら問題解決出来そうな部分もあります。

あれ?今確認したらErrorを表示している建物は私が作成した建物とは別の建物でした。

あれ?

うーん。じゃこの問題は解決ですね。

代わりに別な建物を配置したらErrorが消えました。

あ。

この建物、Sub Level 3_7に配置しなければならなかったです。Persistent Levelに配置してしまいました。

LevelsからLevel 3_7を選択します。

Persistent Levelにあるこの建物を切り取ります。

Pasteします。

はい。

このBuildingがSub Level3_7に移動しました。

Play画面から確認します。

こんな感じです。

新しく配置した建物、凄い浮いています。

後、建物が真っ黒です。

この理由、今なら簡単に分かります。この建物に使用しているMaterialのEmissive Colorが何かをしているんです。

確認します。

これが暗くしているんです。

でもEmissive IntensityというParameterがありますね。

試してみたけど駄目でした。

はい。

でも建物の作成に関しての問題が大体判明しました。

5.4 建物の作成についての整理

まず建物の作成方法について解説しているTutorialは見つかりませんでした。

多分、みんな適当にやっているんでしょう。

建物の中身が無い件ですが、これは使用するAsset次第だと思います。Assetが部屋を作成するつもりで作成しているなら中身もしっかり作ってあるでしょうし、そうでない場合は自分で足りない部分を作成する必要があるでしょうね。

AssetのMaterialはガンガン改良して使用すべきですね。

今週はもう時間が無くなってしまいましたのでここで止めますが、来週は建物を作成するための色々なAssetを見る事にします。

6.Gaeaの勉強

今週もHow To Create An Open World Snow Landscape | Unreal Engine 5 Tutorial [7]の続きを勉強していきます。

今週は先週、勉強した部分を実装してみます。

6.1 Textureを実装する

もう先週、何をやったのか忘れてしまいました。先週のBlogとTutorialを見ながらやって行きます。

Lakeノードの後にFxノードを追加しました。

FTに名前を変更しました。

更に以下のNodeにFTノードを追加しました。

それぞれのFTノードの名前は、SnowfallノードがFO_BeforeRiverで、Riversノードの後がFO_Riverです。

次にPortを繋げます。

次にLakesノードとRiversノードのCombineを作成します。

そしてCombineノードのMethodをMaxに変更します。

更にRationを100%にします。

あ、そうだ。

先週このMaxの意味を調べたいって思っていたんです。

調べました。公式のDocumentであるGaea DocumentationのCombine [8]によると

となっていました。

更にRationは

と書かれていました。

はあ、つまりRiverとLakeの高度が高い方が選ばれるって事ですね。

結果です。

Tutorialとは違いはじめから高い部分が表示されていますね。

ひょっとして私の作成した湖の標高って凄い高い可能性がありますね。

ここでLakeノードのLakeとRiverノードのDepthのFxノードを追加しています。

Tutorialを見るとこれらのFxノードの名前はそのままですね。

次にSnowfallノードのSnowとRiverノードのDepthのFxノードをCombineします。

結果です。

雪で被っている部分の川が消えました。

このCombineノードの結果をLakesノードのLakeからのFxとCombineします。

このCombineノードは名前をCombine_Waterに変更しました。

更にこのCombineノードの設定は以下の様になっています。

更にPortを追加します。

結果です。

何故か私のLakeはデコボコしています。

SnowfallノードのSnowにもPortを追加します。

ErosionのFlowにFxを追加します。

このFxノードを加える場合とPortを加える場合の違いが分かりませんね。

これでOutputが完成したはずです。

今度はTextureを作成して色を付けていきます。

まず新しいTexture用のGraphを作成します。

Fxノードを追加してFT Portを繋げ、Pin As UnderlayをCheckします。

このPin As Underlayの機能を忘れてしまったので調べます。

公式のDocumentであるGaea DocumentationのPinning Nodes [9] に

と書かれていました。

つまりこれから色塗りをする訳ですが、色塗りをする土台が必要になる訳です。それをこのPin As Underlayで決めるそうです。

TextureにOutputを追加します。

SatMapsノードを追加しました。

色は適当に選びました。

結果をCombineしてそのCombineノードのMaskにSlopeノードを追加しました。

結果です。

今度はWaterを追加します。

まずCombineノードを追加してそのMaskにCombine_Water Portを繋げます。

結果です。

確かにWaterの部分がCoverされています。

CombineノードのInput2にWaterの色を指定します。

このCLUTerノードにFXを繋げる意味が分かりません。

多分、一番上の色を塗る場所を指定しているんでしょう。

CLUTerノードの以下の色を指定する矢印の追加の仕方が分からなくて非常に手間取りました。

左Clickでした。

結果です。

これ水源の回りに緑がないというとても変な結果になっています。

しかしもう直す気力はありません。

うーん。今週のGaeaはここまでにして残りは来週に回しますか。

無理してやって大事な部分の勉強がおろそかになるよりはマシですので。

7.雪山のMapの作成

Volumetric Cloudの勉強の続きをやっていきます。

7.1 これからVolumetric Cloudに関して何を勉強するのか?

先週のVolumetric Cloudの勉強の最後でまとめましたが以下の事をやって行きます。

  1. Volumetric Cloud Materials - Building Worlds In Unreal - Episode 33[10] の実装部を理解する
  2. Unreal Engine 5 Beginner Tutorial | Sky And Clouds[11]をもう一回勉強する
  3. Pluginで提供されている他のVolumetric Cloud用のMaterialの実装について勉強する
  4. Volumetric Clouds - Building Worlds In Unreal - Episode 32 [12]を勉強する
  5. Volumetric Cloudを自作する(Donut状、ピンク色の雲など)

今週はVolumetric Cloud Materials - Building Worlds In Unreal - Episode 33 [10] の実装部を勉強します。

7.2 Volumetric Cloud Materials - Building Worlds In Unreal - Episode 33 [10] の実装部の勉強

Tutorialを全部見直しました。

それで気が付いたんですが、Defaultで実装されているVolumetric CloudのMaterialの実装そのものの解析は置いておいて、このTutorialにおける解説もまとめておく必要があります。

それを今週はやります。

2022-07-25のBlogで少しだけVolumetric Cloud Materials - Building Worlds In Unreal - Episode 33 [10]については勉強しました。しかしこの時はVolumetric Cloud用のMaterialに関しての理解と知識がほとんどない状態だったので、改めて最初からやり直します。

まずDefaultで実装されているVolumetric CloudのMaterialの実装を整理して以下の様にまとめました。

これは全く同じ整理を自分でもやって見ましたが、Tutorialで紹介されている実装とまったく同じものが出来ました。

まずこの3つのBlockですがLeapノードで繋がっています。

Alphaの値が0の時はA、1の時はBです。

Alphaの実装ですが、雲の下側が0、上側が1になる様になっています。

下半分の雲を生成しているAに繋がっている実装は、Softな雲を生成します。

上半分の雲を生成しているBに繋がっている実装は、Noiseが沢山ある雲を生成します。

Tutorialだと実際のVolumetric Cloudを見ても分かるよね。と言っていますが、以下に示した様に結構分かりにくいです。

雲の一番下がSoftで、一番上がNoiseな雲になっているのは分かりますが、境目が何処なのか分かりません。上図のBの線なのかAの線が境目なのか、あるいはLerpノードなのでその間はAとBの値をBlendしているのかもしれませんし。

この辺は来週、実際の実装を弄るときに検証して確認します。

次にExtinctionの実装についてです。

これは雲のDensityを管理していると解説していました。

確か、0の値をPassすると雲が消えるはずです。のでDensityと言った方が正確ですね。

0の値をPassすると雲が消える事は来週一応、確認します。

次にBase Shapeの一番最初のNodeであるAddが何を計算しているのかの解説をしています。

この部分は整理されているTutorialの実装でも見にくいので更に整理した実装を以下に示します。

AddノードのAの部分では、雲のTextureのUVの値を計算してるはずです。

ただし今回、ここで使用しているTextureは3D TextureなのでUVWの3つの値が必要になります。更に雲の単位はKm でUEの単位はcmなので単位の変換をするために1x10^5で割る必要もあります。

それをやっているだけです。

Bの部分は雲のAnimationの追加です。

次のMultiplyノードは、

以下に示した様に通常のTextureのUVのサイズを調節するためにTexCoord[0]にMultiplyノードを掛けて

Texture のサイズを変化させるのと全く同じ事です。

そしてTexture Sampleノードです。

ここで使用されている3D Textureについては2022-07-25のBlogでかなりしっかり勉強したのでここでは繰り返しません。

次にTutorialでは以下の2つのParameterが雲に与える影響について解説します。

Noize Scale は既にMultiplyノードの処で解説したようにTextureのサイズをControlするParameterです。

Tutorialで非常に面白い例を示していました。

以下の雲はNoize Scaleの値を大きくした場合の結果です。

雲の細部まで表現されている反面、TextureのTilingが確認出来ます。

何と、Volumetric CloudはTilingが発生するんです。

Landscapeの勉強で地道にTilingを防ぐためのMaterialの実装をやりました。この勉強が雲の実装でも役に立つ日が来そうですね。

Base Noise Expは、以下に示した様な実装です。

これはPowerノードですので、いつもの計算を以下に示します。

つまり黒くなるんです。

TutorialではContrastが強くなると言っています。私もそう言っていたんですが、この計算結果だといつでもContrastが強くなっているとは言えないですよね。全体的に白い絵の場合のみContrastが強くなります。

雲の場合はContrastが強くなるって言っても良いのかもしれません。

実際の結果ですが、この値を大きくすると雲が消えます。

これはMain NodeのBlend ModeがAdditiveにセットされているため。

黒い部分は、雲が存在しない部分と認識されるからだそうです。

うーん。やっぱりBen先生のTutorialは勉強になります。

最初のBlockの実装の最後の部分です。

Volumetric Advanced Inputノードについてです。

この値は以下のVolumetric Advanced Outputノードから来ています。

Conservative Densityの値が来ています。

こんな実装が繋がっていました。

この実装は簡単に言えば雲の形状を計算しています。

ここは来週じっくり検証します。

今週はTutorialの解説をまとめるに留めておきます。

Conservative Densityの値だけで雲を作成すると以下の様になります。

雲の形状だけ表現されていますね。

この角度から見ていると雲全体の形状は分かりにくいです。雲を上から見下ろしてほしいですね。

と思ったら、流石Ben先生、以下に示した様に雲全体の形状が分かる俯瞰図を示してくれました。

結構複雑な形状をしていますね。

以下の部分と

以下の部分は

全く形状が違います。

それではConservative Densityの実装を見てみます。

今度のTextureは普通のTextureなのでUV値のみ必要です。

ただ最初に5x10^5を対している意味は良く分かりません。その後のMultiplyノードの意味も不明です。これはUV値のサイズをここで変更しているんでしょうが何故こんな計算をしているんでしょう。

Tutorialでもこの部分はTextureのサイズをControlしているとだけ言っています。

そしてTextureを見ています。

TextureのRです。

先程の雲の下層部分の形状にそっくりです。

このTextureを元に雲の下層部分が形成されたようです。

GのImageです。

TutorialによるとこのImageが雲の上層部分を作成しているそうです。

その後の実装ですが以下の様になっています。

で使用されているCloud Sample AttributesノードのNormAtlititudeInLayerですが、

高度を返しているそうです。

解説を表示させてみました。

これ見ると雲の底が0で雲のてっぺんが1になるみたいですね。

この辺も来週、検証します。

そして以下の実装に繋がります。

つまりCould Sample AttributesノードのNormAtlititudeInLayerのInverseの値がTexture SampleノードのUV値のVの値になります。

しかしこれどういう意味なんでしょうか?

Texture SampleノードについているTextureです。

結論としては以下の形状の雲になります。

この部分の計算は良く分からないです。来週検証します。

これで最初のBlockであるSoftな雲を生成する実装を全部見ました。

次は次のBlockであるNoisyな雲を生成する実装を見ます。

このBlockの仕組み自体は前のSoftな雲を生成する実装と全く同じでした。

唯一違うのは以下のHLSLを使用したNodeを使用している点ですが、

TutorialではHLSLに関しては一切の説明がありませんでした。

Ben先生はMaterialのTutorialとは別にHLSLのTutorialも作成しているので

何か深い考えがあって敢えて無視したんだと思います。

最後のBlockです。

LerpノードのAlphaの値を決定します。

ここでもCloud Sample Attributeノードを使用しています。

この計算を見ると一番下が0で一番上が1、その間は0と1の間の値になりますね。

以上でした。

結構、勉強になりました。やっぱり前回このTutorialを見た時はまだ、全体を理解出来るほどのVolumetric Cloudの知識が無かったです。今回はかなり理解出来ました。

8.UI Designの勉強

この節をやる時間が無くなってしまったので今週はお休みします。

9.Anime Renderingの勉強

9.1 今回の予定

今回、初めてのAnime Renderingの勉強として、10回程度ここで勉強する予定です。以下に勉強する予定の内容を書いておきます。

9.2 PPLineDrawingを参考にしてOriginalの輪郭線Materialを作成する

PPLineDrawingはUnreal Engineでイケてるイラストを描くためのノウハウ大放出! | UE4 Manga Anime Illustration Dive Online [15] で紹介されています。

先週でPPLineDrawingの実装は全部見終わりました。

来週からはPPLineDrawingを参考にして自作用の輪郭線の構想を練ります。

<差分の元になるG Buffer

当然Scene Depth とWorld Normalは使用するとして、 Custom DepthとBasic Colorも考えています。

<3D Modelの準備>

差分を出すためのModelが必要です。アニメ風の3d Modelが必要です。

以下の候補を考えています。

<<Vroid>>

Vroidの標準モデルです。

<<MMD>>

結構、権利関係が面倒だった気がします。個人的に利用する分には問題ないんでしょうか?

<<Epic Games>>

こういうPhotorealなキャラにも輪郭線のPost Processを試してみたいです。

<<Ice-cream Hair>>

Blenderで3d Modelを作成する人達が良く作成しているソフトクリームみたいな髪の毛のModel達です。

探したんですがどこにあるのか分かりません。

<<z brushの作品>>

どこを探したらよいのか分かりませんが、z brushの作品に対してPost Processを使用したらどうなるのか試したいです。

9.3  公式のDocumentStylized Rendering[13]の勉強

今週は、先週やり残した以下のMaterialの

以下の実装部分を勉強します。

これはケツから見て行きます。

Rotate About Axisノードです。

このNode、公式のDocumentに解説が無いんですが?

Mathew Wadstein 氏のWTF Is? Material - Rotate About Axis in Unreal Engine 4 [16]に解説がありました。

久しぶりにMathew Wadstein 氏のTutorialを見ました。

もう一年以上何の動画も上げていないみたいです。

何か時代の流れを感じて寂しいです。

このTutorialでRotate About Axisノードを勉強します。

まずParameterにあるPeriodです。

これは一回転するのにかかる秒だそうです。Default値の1だと1秒で一回転するそうです。

次はInputです。

Normalized Rotation Axisです。

回転する軸を指定するそうです。

Tutorialでは以下のParameterが使用されていました。

この例ではVector4ですが実際はVector3が取られえるそうです。

次はRotation Angleです。

これ、Periodが1の時は0.5にすると半分だけRotationします。と解説されていました。

Periodが2の時に0.5にしたら4分の1だけRotationするんでしょうか?

実装して試してみます。

以下の様なMaterialを作成して

このCylinderに貼りつけました。

Rotation Angleの値を変化させます。

???

なんの変化もありません。

あ、Cylinderを原点に配置していました。

CylinderをY方向に100ずらしました。

0.25です。

0.5です。

0.75です。

1です。

1で一周しました。

今度はPeriodを2にセットして試してみます。

0.25です。

あ、前の半分しか動いていません。

一応確認のため1を試してみます。

あれ?

半分よりは動いている気がします。

2です。

一周回ったのかな?

試しに0を代入したら同じ位置でした。

はい。

Periodが2の時に0.5にしたら4分の1だけRotationするんであってますね。

次のInputはPivot Pointです。

これって回転する中心を指定しているんですよね。

World Positionにおける原点を中心に回転しろって事でしょうか?

色々試しましたが、多分あっています。ただ次のPositionとの兼ね合いが良く分かりません。

分かりました。

このMaterialを使用しているObjectの位置をこれで指定しているんです。

はい。

これでRotate About Axisノードの機能が分かりました。

それでは元に戻ってFace camera on 1 axisの実装を見て行きます。

公式DocumentのCoordinates Material Expressions [17]に以下の解説がありました。

これは0,0,1を返していると言う事でしょう。

次、Rotation Angleです。

このAngleを調整して常にCameraに向かって正対する様に実装しているはずです。

これは複雑ですので最後に見る事にします。

Pivot Pointです。

これはMaterialの位置を指定しているんでしょうか?

以下の実装がされていました。

TexCoord[0]ではなくTexCoord[2]とTexCoord[3]を使用しています。

これはTexCoordノードのCoordinate Indexの値を0から変更するとなるみたいです。

これも公式DocumentのCoordinates Material Expressions [17]に載っていました。

うーん。

これどこかのStatic MeshのUV Channelの事なんでしょうか?

このMaterialを使用しているStatic Meshである

ですが、UV Channel は0しかありません。

これが何を返すのか検討つきませんね。

うーん。

以下の様なMaterialを作成して

先程のCylinderにSetしました。

原点にあるときです。

X=200、Y=200の時です。

X=200、Y=‐200の時です。

X=‐200、Y=‐200の時です。

X=-200、Y=200の時です。

あ。分かりました。それぞれのPixelの位置を色で表現しているんです。

Debug Float 3 Valuesノードを追加しました。

X=-200、Y=200の時です。

結果です。

でもこれってWorld Positionと一緒じゃ?

試してみます。

以下の実装を組みました。

結果です。

先程の結果よりばらつき具合が大きいです。

この違いが必要なんでしょうか?

それとも別に敢えてこれを使用する必要は無くて、例えばObject Positionノードを代用しても問題なく出来たりするんでしょうか?

更に、TexCoord[2]とTexCoord[3]でないといけない理由もあるんでしょうか?

うーん。

分かりませんね。今週のStylized Renderingの勉強はここまでにして、これらの疑問は来週考えます。

9.4 夏森轄(なつもりかつ)先生の【Blender セルルック講座 ~ノード、輪郭線、法線転写、RGB分離~[14]

今週は、RGB分離で先週発生した問題の検証を行います。

まず、この部分、Tutorialと一寸違う実装をしているのでそれをTutorialとまったく同じにしてみます。

直しました。

結果です。

緑色が表示されていません。

しかしRGB分離は出来ていますね。

と言う事は、

の機能を理解してないと言う事になります。

これを勉強し直します。

理由が分かりました。

Mix Nodeは関係無かったです。

以下の実装を見て下さい。

Separate RGBノードのRの値をそのまま出力しています。

結果です。

なんと。Rの情報しか持っていないはずのSeparate RGBノードのRの値から作成されたImageには緑や青の情報が入っていました。

試しにSeparate RGBノードの代わりにSeparate XYZノードを使用してみました。

結果です。

これはしっかりと赤色の部分だけが白くなり残りは黒くなっています。

今度は緑色だけ出力してみます。

結果です。

はい。緑で塗った個所だけ白くなっています。

これこそがSeparate RGBノードに期待していた役割です。

Separate XYZノードを使用して先週作成したのとまったく同じ実装を組みました。

結果です。

Textureで指定した通りの色分けが出来ました。

この結果を影に繋げました。

結果です。

影の部分の色が赤、緑、青と指定した通りになっています。

出来ました。

これで夏森轄(なつもりかつ)先生の【Blender】 セルルック講座 ~ノード、輪郭線、法線転写、RGB分離~[14]の勉強が終わりました。

法線転写だけは全く知らない技術でした。

これはUEでも出来るんでしょうか?

MaterialのNormal に接続したらNormal Vectorって全く変える事が出来るんでしょうか?

10.まとめと感想

VroidとUEの関係の勉強は面白そうです。今度はその辺にも注目して勉強して行きたいと思います。

11.参照(Reference

[1] CGHOW. (2022a, June 10). UE5 Niagara #ScratchPad Module #5 | Static Mesh Location with Offset , Rotation and Scale [Video]. YouTube. https://www.youtube.com/watch?v=ucPQXa-O4yU

[2] CGHOW. (2022b, August 2). Flip Fluid in UE5 Niagara Tutorial | Download Files [Video]. YouTube. https://www.youtube.com/watch?v=THVoI62WU8o

[3] Cloward, B. [Ben Cloward]. (2022, July 14). Rain On The Lens Post-Process Effect - Shader Graph Basics - Episode 53 [Video]. YouTube. https://www.youtube.com/watch?v=Ftpf87brKWg

[4] Cloward, B. [Ben Cloward]. (2022, July 21). Rain Drips On The Lens Post-Process Effect - Shader Graph Basics - Episode 54 [Video]. YouTube. https://www.youtube.com/watch?v=jfXJYPTdyAg

[5] JSFILMZ. (2021, May 26). unreal engine 5 how to enable nanite [Video]. YouTube. https://www.youtube.com/watch?v=wHp8e84je7U

[6] Epic Games. (2022, April 5). [UE5] Nanite bugged in new version of UE5? Unreal Engine Forums. Retrieved September 4, 2022, from https://forums.unrealengine.com/t/ue5-nanite-bugged-in-new-version-of-ue5/513473

[7] Klaus. (2022, July 6). How To Create An Open World Snow Landscape | Unreal Engine 5 Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=ej2b-zWoYiM

[8] quadspinner. (n.d.-a). Combine - Gaea Documentation - QuadSpinner. Gaea Documentation. Retrieved September 4, 2022, from https://docs.quadspinner.com/Reference/Adjustments/Combine.html

[9] quadspinner. (n.d.-b). Pinning Nodes - Gaea Documentation - QuadSpinner. Gaea Documentation. Retrieved September 4, 2022, from https://docs.quadspinner.com/Guide/Using-Gaea/Pinning.html#:%7E:text=To%20pin%20a%20node%20as,shown%20as%20a%20purple%20link.

[10] Cloward, B. [Ben Cloward]. (2021b, June 3). Volumetric Cloud Materials - Building Worlds In Unreal - Episode 33 [Video]. YouTube. https://www.youtube.com/watch?v=rEYojMx26T0

[11] pinkpocketTV. (2022, January 14). Unreal Engine 5 Beginner Tutorial | Sky And Clouds [Video]. YouTube. https://www.youtube.com/watch?v=lYZoR3ZLD-o

[12] Cloward, B. [Ben Cloward]. (2021a, May 27). Volumetric Clouds - Building Worlds In Unreal - Episode 32 [Video]. YouTube. https://www.youtube.com/watch?v=dolfk2z4LDo

[13] Epic Games. (n.d.-a) Stylized Rendering. Unreal Engine Documentation. Retrieved June 19, 2022, from https://docs.unrealengine.com/4.27/en-US/Resources/Showcases/Stylized/

[14] 夏森轄(なつもり かつ). (2022, May 21). 【Blender】セルルック講座 ~ノード、輪郭線、法線転写、RGB分離~ [Video]. YouTube. https://www.youtube.com/watch?v=e1tFq5OoSY0

[15] Epic Games Japan. (2022, February 21). Unreal Engineでイケてるイラストを描くためのノウハウ大放出! | UE4 Manga Anime Illustration Dive Online [Video]. YouTube. https://www.youtube.com/watch?v=QuYIkSozV6w

[16] Wadstein, M. [Mathew Wadstein]. (2016, February 14). WTF Is? Material - Rotate About Axis in Unreal Engine 4 [Video]. YouTube. https://www.youtube.com/watch?v=ljWoJ7Pp9Ww

[17] Epic Games. (n.d.). Coordinates Material Expressions. Unreal Engine. Retrieved September 4, 2022, from https://docs.unrealengine.com/5.0/en-US/coordinates-material-expressions-in-unreal-engine/