UE4の勉強記録

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

「Unreal Engine 4.xを使用してRPGを作成する」の足りない部分を作成する。アニメレンダリングの勉強2(休止)

<前文>

<元首 (Head of State) という意味>

最近、日本のNewsを見ていて元首と首相を敢えて間違えて使用して視聴者を混乱させようとしている人がいたので、それについて今週は書く事にします。

元首の英語はHead of Stateで首相はPrime Ministerです。そしてPrime Minister はHead of Governmentと同義なんです。

しかし大統領はPresidentでHead of StateでありかつHead of Governmentなんです。

つまり大統領は元首でもあるんですが、首相は元首ではないんです。

これは世界中の国で同じで日本だけが特別にそうなっている訳ではありません。どの国でも首相が元首になる事は出来ません。極めて普通の事です。

では、首相(Prime Minister)がいる国の元首は誰かというとその国の王様になります。これはKingやQueenである国もありますし、日本の様にEmperorである場合もあります。

つまり元首と言った場合、日本やイギリスのような君主制(monarchy)の国ではその国の王様を指し、アメリカや韓国のような共和制(Republics)の国では大統領を指すんです。

だからエリザベス女王の葬式には各国の元首とその伴侶のみを招待すると言った場合、日本の首相は自動的にはじかれるんです。

また、大統領が日本に来日した場合、大統領と同格なのは首相ではなく天皇になります。

しかし昨今では、君主制(monarchy)の国でも実質は王様が政治に直接関係する事は稀で、単なる象徴になり、実際の政治は首相が担当します。だから首相 (Prime Minister) がHead of Governmentと同義になるわけです。

<Stateの日本語訳は州なのか?>

この文章を書いていて、ある事をふと思い出しました。それはStateの日本語訳です。

Stateって通常、州って訳されています。

州ってどういう意味なのか本当のところは私も良く分からないですが、私は単純にアメリカの県に当たる言葉と思っています。そしてこれは多くの日本人もそうだと思います。

それでアメリカに住んでいた時、新聞読んでいたらどうしても意味が分からない文章に出くわしたんです。でその場にいた友達に聞いたら全員、その文章、理解しているんです。アメリカ人が理解出来るのは分かるんですが、他の国から来ている人達も全員、理解していました。

その中には明らかに私より英語力がない人(ただし日本人ではない。)もいましたが、その文章に関してはその人も完璧に理解していました。

で、問題のその文章ですが、Stateと言う単語が使用されていたんです。

私はStateを州と頭の中で訳していたので、どうしてもその文章の意味が理解出来なかったんですが、Stateって本当は国って意味だったんです。

上記の元首の英語訳であるHead of Stateも直訳すると国の頭と言う意味で、Stateが国と言う意味だと理解していればすぐに理解出来ます。しかしこのStateの意味を州だと思っていると州の頭、となって県知事の事?と全く間違った意味に捉えてしまいます。

Stateって国って意味なんです。

じゃ何でアメリカでは州の事をStateっていうのか?ってなると思いますが、これアメリカ人は州って概念で言っていません。国って概念で使用しています。つまりアメリカって50個の国が所属している連邦なんです。だから州ごとに法律が違うんです。でもそれだと不便な事があるじゃないですか。例えば殺人犯が隣の州に逃げた時とか。そういう時のために連邦政府の法律って言うのもあり、これは全ての州が守らないといけない訳です。

じゃ連邦政府がなんでも州に介入していいのかというと駄目なんです。こういう点から言ってもやっぱりアメリカの州は国なんです。

もしStateの日本語訳を国って習っていたら、新聞の文章が理解出来ないなんて事は起こらなかったんです。いやむしろこれだったらStateの日本語訳を習わない方が文脈から推測出来ました。Stateが州であるという強固な思い込みのせいで日本人以外なら簡単に理解出来る英文が理解出来なかったんです。

<日本人のこれから>

先程の元首と首相の違いを故意に無視して視聴者を混乱に落とす人や、Stateを州と訳してアメリカ人が生で使用している英文の意味を異常に理解しにくくなっている事。

これらは本当に氷山の一角で、日本での常識や間違った教育のせいで、これからの日本人が英語をしゃべれるようになったり工学やProgrammingをマスターしたり、その先に海外で生活したりするためのハードルは他国の若者に比べて異常に高くなってしまっています。

この前、日本にいるインドネシア人の若者が普通に英語をしゃべっているのを聞いた日本人の若者がどうやって英語覚えたの?って食い入るようにそのインドネシア人に聞いているを見たんですが、そのインドネシア人、インドネシアでは中学校と高校で英語を習うの。って答えていました。

そうなんです。

他の国の人達は学校で勉強するだけで英語がしゃべれるようになるんです。

日本で学校で勉強しただけで英語がしゃべれるようになった人どれくらいいますか?

0です。

それは、間違った事を教えているからなんです。

つまり、これからの日本人は他の国の人の2倍も3倍も頑張ってやっと他国の人と同じLevelに成れるんです。間違った教育や常識のせいで、超マイナスからのStartになります。

その上で超高齢化社会や、台湾と中国の軍事的な問題やアメリカの衰退などの外交問題、そして超円安が襲い掛かって来ます。

七難八苦の時代がやって来ます。

<貴方はどうすべきなのか?>

でもこれって良く考えてみて下さい。日本人の責任じゃないですよね。日本って国の責任です。貴方がブラック企業で働いていて、黒も白って言えといつも強制されていたとします。そしてその会社の社長が、検察に逮捕され、もう会社は終わりかもしれない。ってなったら貴方はどうしますか?

止めて別の会社に移るだけでしょう。

だから日本って国にはとてつもない七難八苦が襲い掛かる事になると思いますが、個々の日本人としては別に関係なく生きて行けばいいんです。

その中で特に私がお勧めなのがProgrammingの勉強を趣味にして生きていく事です。

ほとんどの工学、理学の勉強はいつかは国の助けが凄く必要になります。電気の勉強にしたって自分で発電所を建てるわけにはいきません。そして日本って国からの助けはまあ、期待するだけ無駄でしょう。

ところが、Programmingって本当にPC一台とNetに繋がる環境さえあれば、それこそMITやCalTechの最新の研究者のような年間何億円も貰っている研究者とほとんど同じ事が出来るんです。

勉強し甲斐があるでしょう。

しかも日本って国の国際的な立ち位置上、中国のようにいきなりアメリカのSoftの使用を禁止される事は起きないはずです。

やり損になりにくい分野でもあります。

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

<本文>

1.今週の勉強について

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

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

2.Niagara: CGHOW氏のTutorialをやる

先週は Collision Query | UE5 Niagara #ScratchPad Module #9 [1] の途中で急用が出来てしまい中止しました。

今週はその続きからやって行きます。

2.1 Collision Query | UE5 Niagara #ScratchPad Module #9 [1] の勉強の続き

先週は途中までこのTutorialを勉強しました。今週はその続きをまずやります。

Kill Particle ModuleがあるとParticleが生成しなくなる原因ですが、Particle はSpawn Burst Instantaneous Moduleで生成しているので一回しかParticleを生成しないからだそうです。

言われてみれば、最初にCubeと衝突していない箇所のParticleは全部Killしてしまったらその後で、新しく衝突した箇所のParticleは既に無くなってます。

次にParticle Update SectionにCurl Noise Force Moduleを追加しました。

渦状の動きをParticleに追加したい時は必ずCurl Noise Force Moduleを追加しますが、このModuleの使い方今一、分かっていません。

Tutorialでは以下の設定で使用していました。

こんな感じでParticleが移動しています。

しかしこのままだとParticleがどっかに行ってしまうので、Particle Update SectionにSpring Force Moduleを追加します。

このSpring Force ModuleのParticle Equilibrium Positionの設定を以下の様に変更します。

Particle はしばらくするとこのPointに戻って来るそうです。

今度はこのEmitterをDuplicateして設定を変更して以下のParticleを作成しました。

このEmitterの作成方法は最初のEmitterの値を変更しただけなので記録はSkipします。

更にEmitterをDuplicateして以下のEffectを追加しました。

これはRender SectionにMesh Renderer Moduleを追加して

そのMesh Renderer ModuleのMeshにSM_Debri01を追加しています。

このMeshがあるかどうかまず分かりません。実装する時に調べますが、無かったら似たようなMeshで代用します。

Particle Update SectionのScale Sprite Size Moduleを消してScale Mesh Size Moduleを追加します。

Scale Mesh Size Moduleの設定は消したScale Sprite Size Moduleと同じです。

結果です。

次にこのMeshを回転させます。

Particle Update SectionにUpdate Mesh Orientation Moduleを追加します。

なんと、イスが突然壊れてしまいました。

びっくりしました。

もう少しで大ケガする所でした。

代わりのイスがないので立ってやろうとしたんですが腰が痛くなってとても無理です。

これは一寸休めと言う天からの警告だと感じました。

ので、今週は休憩にします。更に来週は3カ月に一回の休みの週なので来週も休む事にします。

今週はUEの勉強は中止して、新しいPCを買いに行ったり、イスを買ったり、新しいPCを置く場所を掃除して確保したりします。

3.購買するPCについての下調べ

一応、他のUE5の勉強している方が、PCを新しく購入する際に参考になるかも知れないので、どうやって購入するPCを決定したのかを記録しておきます。

3.1 購買するPCについて

BTOパソコンShopの中でパソコン工房が一番評判が良さそうなので今回はパソコン工房さんから購入する事にしました。

しかも調べたらUE5用のBTOパソコンがありました。

引用元 https://www.pc-koubou.jp/pc/unrealengine5.php?pre=cmm_lcr

しかも以下の様に書かれていました。

引用元 https://www.pc-koubou.jp/pc/unrealengine5.php?pre=cmm_lcr

他のBTOパソコンの店も一応調べましたがここまでやっているのはパソコン工房さんだけでした。

そこで紹介されている商品の中で以下のモノを購入する事にします。

一番、値段が安いやつですが、流石にこれ以上の値段のやつを購入するほどの予算はないです。

3.2 それ以外に調べた事について

公式のDocumentであるHardware and Software Specifications [2]によると最低限の条件では以下の様になっていますが、

後でUE5でGame開発するには以下の条件が望ましいともう少し厳しい要求が書かれていました。

流石にこれそっくりの条件のPCを購入するとなると自作するしかなさそうです。

パソコンを自作するほどの知識はないので今回は大体この条件になるだけ合わせるように上記のPCをカスタマイズする事にします。

<Memory

Hardware and Software Specifications [2]では64GBを進めています。私が購入予定のPCのMemoryは32GBです。

Memoryは高いので取りあえずは32GBでやってみます。32GBではパワー不足と感じた場合は、後でMemoryを追加する事にします。

<Storage

Hardware and Software Specifications [2]ではOS用に256GB、Data用に2TBになっています。購入予定のPCは1TBなので、Data用にHDDを4TB追加する事にしました。SSDの方が良いのは当然ですがData用なんで遅くてもそんなに問題ないと思っています。

GPU

2080 Superは大体3060 と同程度か少し下の能力みたいです。ので3070Tiなら十分でしょう。

ただVRAMが3060は12GBで3070Tiは8GBです。

2080 Superと同程度で良いのなら3060の12GBと言う選択もありかもしれません。

今回はパソコン工房さんのUE5にお勧めのPCの中で3060が無かったので3060は選択しませんでしたが、もし3060の12GBが選択肢に含まれていたらそっちを買ったかもしれません。

<CPU

Xeon E5‐2643というCPUの存在が見つかりません。どんなCPUなのか不明です。

コア数が6で3.4GHzという事だけは分かります。

購入予定のRyzen5 5600Xの性能を調べたらコア数が6で3.7GHzと出て来たので、まあ性能的には近いんじゃないのかなと勝手に思っています。

例えRyzen5 5600Xの性能がXeon E5‐2643より低かったとしても、まあそれ以上のグレードのPCを買える予算はないのでここは諦めるしかないです。

<Xoreax Incredibuild (Dev Tools Package)

これが一番の不安要素なんですが、Hardware and Software Specifications [2]には、これが入っていない場合は、Compileするのに12~16コアが必要と書かれています。

これCPUの事だと思うんですが、購入する予定のPCのCPUのコア数は6です。

DownloadするUE5にはDefaultでこれが入っている事を期待するしかありません。

しかしもしこのSoftが入っていなくても、今の私のPCのCPUのコア数なんか4ですがそれでもUE5がそれなりにですが動いています。全く動かないと言う事はないと思っています。

3.3 今回のパソコン購入のために色々調査をして知った事について

以下にまとめます。

<PCゲーマーが常に最新のPCやVideo Cardを購入している訳ではない>

GTX 1000番台でゲームしている層が一番多い。って書かれていました。

これ初耳で、PCゲーマーって何時でも最新のPCでゲームしていると思っていました。

もし1000番台のVideo Cardでしかゲームしないのならそんなに高性能のVideo Cardでしか動かないGame作っても仕方ない気がします。

これからのGameってPCが主流というよりも任天堂のスイッチが主流になる気がします。

<PCの自作が趣味の人達に対しての質問の仕方>

PCの自作が趣味の人達はPCのパーツには凄い詳しいですが、UE5専用のPCだとどの組み合わせが最適なのかについては結局分からないんです。

例えばUE5には、VRAMがどれくらい必要なのかとか、CPUのコア数がどれくらいあった方が良いのかとか、そう言う事はあんまり知らない訳です。

そう言うPCの自作が趣味の人達には、CPUのコア数が最低で12、VRAMは10GB以上、Memoryは64GBでPCを組みたいですが、パーツを選んでほしい。と頼むとかなり精度の高い回答をしてくれる事も分かりました。

適切な質問が大切って事を学びました。

Nvidiaの最新鋭のVideo Cardについて>

RTX4000番台の発表を見たんですが、まあ値段的にもう通常のPCゲーマーが買えるものじゃないですね。

でも、CGの映像作品を作成している商業のCGデザイナーとかだったらかなり安い買い物になるとは思いました。

よくTutorialで勉強させてもらっているJSFILMZ氏は、一人で自動車会社のコマーシャルを作成してそのコマーシャル作成のための予算をほぼほぼ一人で貰った話をしていました。かなりの大金を貰ったみたいです。

こういう人達はこんな高いVideo Cardでもとてもお得な買い物でしょう。

それ以外の人達にはどうなんでしょう。とても高くて買えないって感じじゃないでしょうか。

それで思ったんですが、UE5の勉強している人って私を含めてGameを作成しようとしてばかりいるじゃないですか。

これって経済効率という面から考えるとあんまり良くないのかもしれません。

UE5を使用して映像を作成する事を勉強した方が、勉強した技術をお金に換算出来そうです。

更に私のようにGameがあんまり好きじゃないけど映画やアニメを見るのは好きというタイプもいます。

最新のVideo CardとUE5で映像を作成するのもアリだと思いました。

3.参照(Reference

[1] CGHOW. (2022, June 13). Collision Query | UE5 Niagara #ScratchPad Module #9 [Video]. YouTube. https://www.youtube.com/watch?v=kxFgm8B7Tm4&list=PLwMiBtF6WzsqfBv2rYkHe93Whx5AY1u6o&index=9

[2] Hardware and Software Specifications. (n.d.). https://docs.unrealengine.com/5.0/en-US/hardware-and-software-specifications-for-unreal-engine/

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

<前文>

エリザベス女王Queen Elizabeth II)の死去に関する感想>

英語圏のニュースが凄いつまんないんです。

なんでかなと思ったら、イギリス王室の功の話しかないんです。

まあ確かにエリザベス女王自体にFocusしたらお亡くなりになられたので功の部分に注目するのは分かります。しかしイギリスの王室とは帝国主義と植民地の歴史、そのもので、インド人なんかいろんな思いがあるはずなんです。

このインド人の想いや考えを英語圏のサイトは全部Blockしているんです。MemeですらBlockしています。

これやると英語のサイトを見ても本当につまらない。

民主主義を自称するのは簡単ですが、こういう細かい点を見るとイギリスの民主主義の脆弱さを見た気になります。残念です。

イギリス人がそういう報道やサイトの規則に抗議するのかと思ったら、逆にアメリカ人に今、エリザベス女王やイギリス王室のMemeを作ったら、911のMeme作りまくってやるから覚悟しろよ。と脅す始末です。

なんか、がっかりです。

世界中のほとんどの国がイギリスの支配下にあった屈辱の歴史を持っている訳で、イギリス王室に対しては非常に複雑な屈折した感情を抱かざる得ない訳です。その片鱗が一寸しか見れなかったのは、まあ残念な気持ちにならざるえなかったです。

しかし、これ逆に日本の凄さを再認識することになりました。

世界中のほとんどの国の人が英語がしゃべれるのって実はイギリスの植民地だったからなんです。

世界中を植民地にした最強のイギリスが同盟国に選んだほとんど唯一の国ですから。

しかもその理由が、日本人は約束を守るから。と言う、まあ日本人からしたらかなり誇り高い理由です。

うーん。

やっぱり日本って近代の歴史において非常に特異な位置に存在してたんですね。

<中国と台湾の冷たい戦争>

英語圏の情報ですのでどれくらい正しいのか分かりませんが、今の中国は熱い戦争、直接台湾に侵略する事よりも冷たい戦争、と言うか技術戦争、具体的に言うと半導体の製造で台湾に勝負を挑む方向にシフトしているみたいです。

これかなり情報が錯そうしているんですが、中国側は最後まで脅しを掛ければNancy Pelosiは訪台しないと言う中国情報局?の発言を信じて行動したら、結果が全くの逆になってしまったのがこの前の真相みたいです。

それでここからの推測も人によって違うんですが、この中国情報局?の分析の間違いが示すように、中国はアメリカと戦争しても本当は勝てないが、勘違いしているので台湾に侵攻してくると言う新しい推測が出て来ているみたいです。

ので中国が台湾への侵攻をあきらめたと言う訳では全く無いです。

しかしそれとは別に、今回、台湾側が「アメリカは絶対台湾を見捨てる事は出来ない。それは台湾企業しか世界で最新の半導体を製造する事が出来ないから。」と発言した事で、アメリカが全てにおいて世界最高であると信じているある種のアメリカ人をかなり刺激したんです。

アメリカ何やってんの。と

そしたら何故か中国が張り切りだして、急に半導体の製造に力を入れ始めました。

で、しばらくは中国は台湾を直接侵略するのではなく、半導体の製造で台湾を潰す方向で頑張るみたいです。

中国は7nmの半導体を自作出来るとこまで来たそうです。でそれに対して台湾の半導体産業がボロクソに叩いています。5~6前の技術、経済的に黒字になるLevelで製造出来るのか不明とか。です。

戦争の代わりに、こういう技術の競争で中国と台湾が競ってくれたら日本人として非常にうれしいです。

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

<本文>

1.今週の勉強について

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

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

2.Niagara: CGHOW氏のTutorialをやる

今週はScratch PadのTutorialを2個ぐらいと、先週、見たShort動画の内興味深いEffectのTutorialを1個位やろうと思います。

2.1 UE5 Niagara #ScratchPad Module #8 | Voxel FX [1] を勉強する

このTutorialでは以下のEffectをScratch Padを使用して作成するそうです。

いつもの通り、Fountainを使用したEmitterを追加しそれを改造します。

今回はRender SectionにMesh Rendererを使用します。

当然Mesh にはCubeを使用します。

次に要らないModuleを全部消します。

ここでCGHOW氏、先程追加したMesh Renderer Moduleを消してしまいました。

これ多分、間違いでしょう。

先を見て確認します。

はい。間違いでした。後で追加し直しています。

Emitter Update SectionにSpawn Burst Instantaneous Moduleを追加します。

Emitter State Moduleの

Loop BehaviorをOnceに変更します。

Particle Spawn SectionのParticle State Moduleの

Kill Particles When Lifetime Has Ended のCheckを外します。

これは一端作成したMeshを消さないようにする設定です。

次にParticle Spawn SectionにStatic Mesh Location Moduleを追加します。

Static Mesh Location Moduleを追加するとSample Static Mesh Moduleも追加されています。

Sample Static Mesh ModuleのSource Modeに以下のMeshをセットします。

うーん。

これってSkeletal Meshなんでしょうか?

良く分からないですね。

まあ、最後までこのTutorialを見れば判明すると思うのでそのまま進みます。

以下の様になりました。

しかしこれだと、Box同士の隙間が無いです。

それをScratch Padを使用して実装します。

[Particle] PositionをMap Get ノードに追加します。

今度は、Box同士のGapを指定するために[Input] Int32を追加しGapと名付けました。

Positionの値をGapで割ります。

その結果を四捨五入します。

この結果とGapの値を掛けます。

その結果をMap Setノードの[Particle] Positionにセットします。

以上です。

うーん。なんでこの実装でCubeの隙間が生まれるのか分かりません。

先に結果を見ます。

Gapの値が小さいときは

Boxが重なっています。

Gapの値を大きくすると

Boxの重なりが無くなりました。

2.2 UE5 Niagara #ScratchPad Module #8 | Voxel FX [1] を実装する

この実装は簡単なのでScratch Padの理屈を考える前に実装してしまいます。

まずFountain Emitterを改造して以下の様にしました。

そしてParticle Spawn SectionにStatic Mesh Location Moduleを追加します。

Static Mesh Location ModuleのFixボタンを押してSample Static Mesh Moduleを追加します。

Sample Static Mesh ModuleのMeshにはSevarogを追加しました。

以下の様になりました。

Cubeのサイズを10分の1にして生成する量を10倍にしました。

こんなんでいいでしょう。

Scratch Padの実装をやって行きます。

まずParticle Spawn SectionにScratch Padを追加して名前をVoxelにします。

Mat Get ノードに[Particle] Positionを追加します。

[input] Int32を追加し、名前をGapに変更します。

Tutorial通りの計算を実装します。

結果です。

Gapが15の時です。

色々微調整して最もいい出来だったのが以下のです。

モデルを変えてみました。

うーん。

こんなもんかもしれませんね。

<Scratch Padの実装の計算について>

Positionが1,2,3,4,5,6,7,8,9,10のCubeがあるとします。

これをGapの3で割ります。その後Roundするので 0、1、1、1、2、2、2、3、3、3になります。

これにGapを掛けると、0、3、3、3、6、6、6、9、9、9になります。

ああ、分かりました。

この計算をするとCubeがGapの倍数の位置に配置されるようになるんです。

だからGapの値が小さい時は、Cubeが重なっていました。

以上です。

2.3 Collision Query | UE5 Niagara #ScratchPad Module #9 [2] を勉強する

なんとこのTutorial、25分もあります。

これ勉強して今週のNiagaraの勉強は終わりにします。

以下のImageが表示されていました。

Tutorialの題がCollision Queryとなっていますので、この球とStatic MeshのCollisionを感知するためのScratch Padの実装を作成するための勉強をやるみたいです。

全体を把握するために一回全部見ました。

ほとんどScratch Padとは関係なく、まあ普通のNiagaraのTutorialとして見た方が良いですね。

特に気になったのがMaterialとNiagaraのDataのやり取りの方法でした。

最近はScratch Padの勉強に集中しているのでMaterialとNiagaraの関係という結構大事な内容について疎かになっている部分がありました。

簡単に全体の流れを以下にまとめます。

まず、このTutorial用に新しいLevelを作成しています。

Exponential Hight Fogを追加しただけのEmptyなLevelです。

正直、このLevelが必要なのかどうかというと必要じゃない気がします。

CGHOW氏のEffectは全部光っているのでこういう空間だと映えるんです。

でも普通の明るい場所に配置した場合は、それなりになってしまいます。

それではNiagaraに使用するMaterialを作成します。

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

Main Nodeの設定です。

今度はNiagaraの準備です。

まずRender SectionにMesh Rendererを追加します。

Mesh RendererのMeshesにSphereをセットして

先程作成したMaterialでOverrideします。

要らないModuleを消します。

いつものヤツです。

CGHOW氏ここで先週と同じミスをしています。Mesh Renderer Moduleを消してしまっています。

この後、Emitterの細かい設定をしていますが、いつもと同じなので記録は省略します。

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

このEmitterをLevel上に配置してCubeと交差させています。

当然ですが、何も起きません。

ではどうするのかと言うと、Material内で以下に示したDepth Fadeノードを使用します。

Depth Fadeノードを以下の様に実装に追加しました。

結果です。

CubeとNSが交差する部分のEffectが消えています。

しかし本当は交差した部分のEffectを消すのではなく強調したいんです。

それでMaterialの実装を以下の様に変更します。

Depth Fade ノードの結果をOne MinusしてAddします。

更にDepth FadeノードのFade Distance Defaultの設定を10に変更しました。

結果です。

今度はNSとCubeの交差している部分が強調されて色付けされています。

要するにこの部分と言うか、NSとCubeの交差を判定するためにはこのDepth Fadeノードの存在を知らないとそもそも作成出来ないんです。

このDepth Fadeノードについては後で検証します。

この交差している部分にNiagaraからAccessします。

まずFountain Emitterを追加します。

設定を弄って

以下の様なParticleが発生するようにします。

まず分かり易いようにColorで作成します。

Particle Update SectionにColor Moduleを追加します。

Color ModuleのColorの設定にLerp Linear Colorsを使用して以下の様にセットします。

これで交差している箇所を赤、それ以外を緑に表示する実装を作成します。

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

名前をCollision Queryに変更します。

このScratch Padの名前の変更って、いつも記録しておくかどうか迷います。今回は一応記録する事にしました。

Map Get ノードに[Input] Collision Queryを追加します。

うーん。

このCollision Queryって先程のDepth Fadeノードと何の関係もないような気がしますが。

これ単体でMeshと交差している位置などの情報を拾ってきそうです。

これも後で調べます。

この後、Query Mesh Distance Field GPUノードを追加します。

こんなNode知らないです。

Tutorialに一瞬だけ機能の説明が写りました。

これ見るとCollision QueryとField Sample Pos Worldに指定した位置の距離を返してくれるみたいです。

因みにこの機能を使用するためにはProject SettingでGenerate Mesh Distance FieldsにCheckを入れる必要があるそうです。

Mat Getノードに[Particle] Positionを追加しその値を、Query Mesh Distance Field GPUノードのField Sample Pos Worldに繋げます。

その結果をSubtractします。SubtractノードのBの値は

Map Getノードに新しく追加した[input] Distanceからパスします。

もしFadeしたいなら更にDivideノードを追加します。

更にClampしてMap Setノードに新しく追加した[Particle] DepthOutputに繋げます。

うーん。

段々、分かって来ました。

この[Particle] DepthOutputを使用すれば交差した位置とParticleの距離が0なら赤、1以上なら緑に設定出来るわけです。

Particle Update SectionのColor Moduleの

Lerp Factorに先程の[Particle] Depth Outputをセットします。

Scratch Pad ModuleのDistanceとFadeの値を以下のように変化させると

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

うーん。

やっぱりMaterialのDepth Fadeノードは関係無かったですね。

NSだけで完結しています。

しかしそれはそれで[Input] Collision Queryという変数やQuery Mesh Distance Field GPUノードについて知っている必要があります。

Scratch Padの勉強だけならここで一端中止して、実装したり検証したりするんですが、どうしましょう。

今週は、最後まで勉強して実装は来週、そして検証は再来週やる事にしますか。

今度はParticleのサイズを変更します。

まずParticle Update SectionにScale Sprite Sizeノードを追加します。

そして以下の様な設定にします。

Alphaに[Particle] Depth Outputをセットします。

以下の様にCollisionの付近だけParticleが現れます。

Particleのサイズは0ですが、一応見えない箇所にも生成されています。

それらを消しておきます。

Particle Update SectionにKill Particle Moduleを追加します。

以下の設定をします。

結果です。

見た目の変化はないですが、計算Costとかはどうなんでしょうか?

この後、Kill Particle Moduleが有ると2度とParticleを生成出来なくなるので消してしまいました。

なんかグダグダしています。

ここで急用が入ってしまったので一端中止にします。

3. Materialの勉強

3.1 Radial Blur Post Processing - Shader Graph Basics - Episode 55 [3] を勉強する

今週は以下のPost Processを作成するそうです。

Radial Blurの意味が分かりました。

真ん中から放射線状にBlurが掛かるPost Processの事です。

今週は原理の解説がありました。

この解説、非常に分かり易いのでここにまとめ直しておきます。

以下に示したPixelのBlur値を求めたいとします。

まず原点からこのPixelに線を引きます。

この線上におけるPixelの値を前から5個、後ろから5個集めます。

以下の黄色のPixelの値です。

それぞれの黄色の部分のPixelにGaussian Curveで重みを付けます。

図のCurveはGaussian風のCurveです。手書きなので。

実装も一緒にやってしまいます。

以下の方法で原点とPixelを結ぶ線を作成します。

この計算を見ただけで私は理解出来ましたが、一応、簡単な説明を以下に示しておきます。

原点を黄色、測定しているPixelを黒にします。

これがTexCoord[0]ノードと言うかTextureのややこしいとこですが、座標が以下の様になっています。

原点が0,0には無く0.5,0.5にあります。

ので原点、測定するPixelの位置をVectorで表すと以下の様になります。

原点のVectorは0.5、0.5です。測定しているPixelのVectorはその時で違いますが、それぞれの値はTexCoord[0]が返してくれます。

原点のVectorから測定しているPixelのVectorを引くと以下の青いVectorになります。

この青いVectorは原点から測定するPixelに線を引いた場合と同じです。

ので、以下の様な一見簡単に見える実装で測定しているPixelと原点を結ぶ線が計算出来る訳です。

これはこの部分の実装をいくらCopyしても理解出来るもんではなく、数学力が必要です。しかし数学力だけあってもTextureの座標がどうなっているのかを理解していないと解けないので、UEの設定を知っている必要もあります。

Materialの実装そのものは、今まで作成されたMaterialの実装をCopy Pasteすればそれなりのモノは出来るかもしれません。

しかし、それではそのMaterialの実装を真に理解したとは言えないと思っています。上記のような説明が出来て、初めてMaterialの実装を理解したと個人的には思っています。

次にMultiplyノードを繋げています。

Tutorialによると、これはBlurの強弱を調整するための実装だそうです。

もう一度、Multiplyノードを繋げています。

今度は測定するPixelの線上のPixelを選択するための実装だそうです。

‐0.05を掛けています。

その結果をTexCoord[0]の結果に足してScene TextureノードのPost Process Input 0に繋げます。

この結果にGaussian Curveの計算に基づいて重みを付けます。

TutorialはGaussian Curveの計算結果は以下のサイトで計算していました。

Tutorialはこの計算結果をそのまま使用していましたが、私はRoundした値を使用します。

これを11回繰り返す必要があります。

TutorialではMaterialにはFor Loopの働きをするNodeが無いので同じ実装を11個Copy & Pasteで作成します。

これMaterial Functionにして11回繰り返す方が良い気がしますが、間違えた時に直すのが面倒になるので今回はTutorial通りにやります。

出来ました。

今度は採取するPixelの位置を指定するConstantノードの値を変更します。

-0.05, -0.04, -0.03, -0.02, -0.01, 0,0.01, 0.02, 0.03, 0.04, 0.05の値をそれぞれに代入しました。

うーん。

この値だと本当の隣のPixelの値は取れないでしょうね。

Scene Texel Sizeノードを使用したら本当の隣のPixelの値が取れたはずです。

今週は時間が無いのでこの点についてはこれ以上は検討しませんが、‐0.01が隣のPixelの位置を示す様にはならないはずです。

とは言え大筋の計算結果が変わる訳ではないので、Tutorialのやり方で続きをやっていきます。

WeightもそれぞれのPixelによって変更します。

そしてそれぞれの計算結果を全部足します。

結果です。

今週は急用が入ったため時間が無くなってしまったのでLerpの部分は省略しました。

でもTutorialの内容は理解出来ていますので問題ないでしょう。

4. RPGEventの作成

時間が無くなってしまったので今週のRPGのEventの作成はお休みします。

5. Open Worldの検証

先週、検証したAssetについて簡単にまとめます。

5.1 検証したAssetのまとめ

壁などのStatic Meshの裏面が無い物が多かったです。これが普通なのかどうか分かりませんが、建物の裏側があった方が中身のある建物は作成し易いと思います。

壁の内面があったAssetは

  • City of Brass: Environments
  • Fantasy and Medieval Architecture
  • Fantasy Cave Environment
  • Medieval Castle Modular
  • Modular Fantasy House

でした。

ただし壁の内側がないInfinity BladeのCastleでも以下に示した様な立派な建物の内部を作成していました。

やり方によっては作成出来るのかもしれません。

これ以上は実際に建物を作成してみないと分かりません。

5.2 Modular Fantasy Houseを使用して建物を作って見る

これです。これで家を作成してみます。

取りあえず以下の様に床と壁を作りました。

床と壁が揃っていません。

直したら今度はStatic Meshが重なった部分がチカチカし始めました。Z Fightingと言うやつですね。

確か「Unreal Engine 4で極めるゲーム開発」にこれの解決方法が載っていたはずです。

読み直してみます。

うーん。結構複雑ですね。私が理解した範囲でまとめると、壁のサイズを小さくして柱を追加するそうです。

要するに重なっている部分を無くすんです。

これを全部のやるのは大変なので建物を小さくして試してみます。

確かにチカチカは無くなりましたが、何か変です。

柱を突き出して見ました。

うーん。

土台と柱の関係が分かりませんね。

土台より柱って突き出るモノなのでしょうか?

柱にも土台と追加してみました。

これならそんなに違和感ないです。

以下の様になりました。

正直、これだけ作成するのにも結構な時間が掛かり、それなりに疲れました。

屋根を作成します。

この屋根、以下の角度から見ると消えてしまいます。

柱を追加してその部分を隠しました。

別な屋根のPartsをみたらそれは上記のような問題はありませんでした。

それで屋根を作成しました。

一応、これで完成です。

これでは小屋ですね。

ドアを開く実装はまだ作成していないのでドアを外して中を見てみます。

思ったより明るいです。

今週の建物の作成はここまでにします。

5.3 建物を作成した感想

兎に角、疲れました。

柱や壁の位置が一ミリでもずれるとその場所ではあまり影響無くても、別な場所で問題が生じます。

最後の方は壁の位置を一ミリずつ動かして調節したりしました。

柱のように土台と組み合わせる事で見た目の違和感が改善される箇所がある事も分かりました。

土台を作成して、柱を配置、壁を作成して床を配置、最後に屋根を作成、のような作成する順番がある気がします。

実装やTutorialとは違い頭はあんまり使わないです。

YouTubeを聞きながらの作業でもそんなに問題ない気がします。

来週は、この小屋の中身を作成します。そして時間が有ったらドアの開閉も実装します。

6. Gaeaの勉強

 今週はHow To Create An Open World Snow Landscape | Unreal Engine 5 Tutorial [4]の残りを勉強します。

先週、勉強した箇所で既にGaeaの部分は終わって残りはUEの実装に移っています。更にUEでは前のTutorialで作成したLandscape用のMaterialを使用しています。のでどこまで実装すべきか分かりません。

ので今週はBuildしてHeight MapとMaskを出力しUEにImportする所までは実際にやって残りは、Tutorialを見ながら実際にやるのかどうかを決定する事にします。

6.1 細部の塗装を追加する

Color GraphにSat Maps ノードを追加しPort, Textureを追加します。

先週のBlogで以下の様に書いていますが

ここで作成していました。

Texture NodeはSat Maps ノードを使用するためには絶対必要なので、その辺から推測したら直ぐにこのPortの意味が分かったはずです。

今度、Port Textureを見たら直ぐにこの事を思い出すと信じて先に進みます。

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

Combineノードを追加します。

Combineノードの設定です。

このCombine ノードのMask様にFlowノードを追加します。

FlowノードにはPort FTを追加します。

結果です。

白い筋が入りましたね。

ここでTutorialではFlowノードの人を選択してShaperの値を下げています。

同じ事をやってみました。

白い線が少なくなりました。

最終の結果です。

先程追加した白い線は消えてしまいました。

後でMaskに使用するんでしょうか?

6.2 Exportを指定してBuildを行う

まずImageをExportするNodeにExportのMarkを付けていきます。

先週のBlogで以下の様に書きましたが、

右ClickしてもMark出来ないです。

F3は出来ました。

SlopノードにもMarkを付けました。

Base Shape Graphに戻ってCombine Water ノードをCheckしました。

TutorialではFTノードにもMarkが付いていたので付けました。

RiversノードのDepthのFXノードも名前をRiverと変更してExportのMarkを付けました。

更にSnowfallノードとRiversノードのOutputのFxノードにもExportのMarkを付けました。

SnowfallノードのShowの結果にもFxノードを追加してExport markを付けました。

ここでTutorialがExportのMarkの付け方を解説していましたが。右Clickをすると以下のBoxが表示されるので

その中からMark For Exportを選択しろと言っていました。

右Clickしたら選択出来るとは言っていませんでした。

TutorialではErosionノードのFlowに繋がっているFXノードにもExportのMarkが付いていました。

付けました。

Lake ノードのLakesのFXノードにもMarkを付けました。

これで全部のようです。

Buildを見ると10個あります。

Tutorialと同じです。

ExportするFormatをPng.8にしました。

以下の3つはHeight MapなのでPngにしました。

Resolutionを1009にしました。

RangeをNormalizedにしました。

TutorialではBaked CacheがStrictになっているので同じ様にしました。

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

ここでStep 3が終了していますね。

6.4 UEにImportする

Importすると書きましたが、実際はLandscape用のMaterialの作成だけしています。

それをやります。

Mega ScanからGrassのMaterialをImportして以下の実装を作成しました。

作成した後で、気が付いたんですがこれだとLayerの確認が出来ないです。

もうGaeaの勉強時間が無くなってしまったので、今週はここまでにして残りは来週やります。

7. 雪山のMapの作成

Volumetric Cloudの勉強をします。

2022-09-05のBlogでこれからのVolumetric Cloudの勉強の予定を以下の様にまとめました。

今週はUnreal Engine 5 Beginner Tutorial | Sky And Clouds [5]を勉強します。

7.1 前に勉強した時の復習をする

Unreal Engine 5 Beginner Tutorial | Sky And Clouds [5]はpinkpocketTV氏が作成したTutorialでVolumetric Cloudの勉強を始めてした時に、勉強したTutorialの一つです。

これの存在をすっかり忘れていたんですが、このTutorial、後から見直したら非常に良い出来で、Volumetric CloudのMaterialの仕組みの基礎を理解した今だからこそ、もう一回勉強すべき内容なんです。

と言う事で、やります。

しかし、前回勉強した内容を繰り返して勉強してしまうのは勿体ないので、最初に2022-09-05のBlogを見直して何を勉強したのかを確認します。

見直しました。

このTutorialはVolumetric Cloudに使用されているMaterialについてのTutorialではなく、それ以前のVolumetric Cloudの使用方法や設定方法についてのTutorialでした。Volumetric Cloud用のMaterialの作成方法についてはほとんど解説していません。

その代り、UE5におけるEmpty Levelから空を作成する方法が詳しく解説されています。

このTutorialにおける空の作成方法はEnv.LightMixerを使用しないやり方で、

Sky LightやSky AtmosphereとDirectional Lightを関連づける設定を手動でしている点です。

これ理解しないで、Env.Light Mixerでチョンチョンと空を作っていると、後で細かい調整をした時、なんでそうなるの?みたいな変な空になる可能性があると思っています。

現状のUE5では以下に示した様に、空が既に作成されているLevelを選択する事が出来ますが、

Gaeaなどの3D PartyのSoftwareを使用して作成したHeight Mapを使用してLandscapeを作成する場合はEmpty Open Worldを使用するのもっとも簡単で、その場合は空を自作する必要があります。

ので空の作成方法について理解しておく事は結構大切です。

UE5における空の作成方法については、ここで復習しておきましょう。

それ以外では、Volumetric CloudのMaterialにPlugin にある

にある

を使用して、

このMaterialのParameterであるLayer Bottom Attribute…とLayer Heightの調節方法を解説して

最後にDirectional Lightにある設定の以下の二つに

Checkを入れてLight Shaft (God Ray) を追加しています。

そう、後一個、重大な事がありました。

UE5の空の作成では、UE4と違いSky Sphereを使用しないんです。

Env.LightMixerを使用して簡便に空を作成する場合でも、以下のActorを追加するだけです。

この中にSky Sphereは入っていません。

このTutorialを勉強した2022-09-05のBlogでも

と述べていてUE5ではSky Sphereは使用しないみたいと書いています。

しかしDefaultで空が作成されているLevelを開くとSky Sphereは使用されています。

この辺についての調査を少ししたいです。

7.2 Unreal Engine 5 Beginner Tutorial | Sky And Clouds [5]を実装す

取りあえずUnreal Engine 5 Beginner Tutorial | Sky And Clouds [5]の方法で実装します。それから色々考える事にします。

せっかく2022-09-05のBlogUnreal Engine 5 Beginner Tutorial | Sky And Clouds [5]の空の作成方法をまとめたので、それに基づいてやってみます。

その後で、Tutorialを見直して検討や考察をします。

考察すべき内容は、

  • 空の作成方法について
  • Pluginから使用したVolumetric Cloud用のMaterialについて
  • Sky Sphereについて

の3つです。

この辺に注意を払いつつ実装をやって行きます。

<空の作成>

まずEmpty のLevelを作成しました。

Directional Lightを追加します。

Directional Lightを追加しただけでは真っ黒なんですね。

次にSky Lightを追加します。

Sky LightのReal Time CaptureにCheckを入れます。

2022-09-05のBlogで書かれている通りに以下の警告が現れました。

Sky LightのReal Time Capture を使用するためにはSky atmosphereが一個以上必要です。と言っています。

Sky Atmosphereを追加しました。

2022-09-05のBlog

と書かれていますが、このParameter見つかりません。

調べたらDirectional LightのParameterでした。

既にCheckが入っていました。

これで、Directional LightとSky LightとSky Atmosphereが繋がって空が青くなるそうです。

いや、なってないじゃん。と思って上を見上げたら空がありました。

この後、Ctrl+Lを使って太陽の位置を動かす方法を勉強しています。

これは今となっては常識Levelの内容なので今回はSkipします。

Exponential Height Fogを追加して地面が真っ黒であるのを直します。

結果です。

2022-09-05のBlogには、Blown outしているので以下の方法で直すと、Tutorialに書かれていたが、Defaultで直っていたと有ります。

まずTutorialにかかれていたとされるBlown Outの直し方ですが、以下の方法です。

2022-09-05のBlogによるとVolumetric FogにCheckを入れる以外はDefault値で直っていたそうです。

見てみましょう。

Fog Inscattering Colorです。

黒くなっていますね。

Directional Inscattering Colorです。

こっちも黒くなっています。

Volumetric Fogです。

これにはCheckが入っていません。

入れました。

画面が微妙に白くなった気がしますが、正直あんまり分かりません。

今度は、空と地面の境目のボケを直すそうです。

2022-09-05のBlogには以下の様に書かれていました。

Project Settingを開いてSupport Sky Atmosphere Affecting Height Fogを検索すると

既にCheckが入っていました。

ここまでが空の作成です。

<Volumetric Cloudの追加>

ここからVolumetric Cloudの追加になります。

Volumetric Cloudを追加しました。

この後、2022-09-05のBlogでは、このVolumetric CloudのMaterialに別のVolumetric Cloud用のMaterialを追加するためにPluginsであるVolumetricを追加する方法が延々と説明されています。

これは本筋とは関係ないのでここでは省きます。

で、そこにあった、M_VolumetricCloud_02_Profiles_PaintCloudsをVolumetric Cloud用のMaterialに使用します。

ではこのMaterialの実装を一寸だけ見てみますか。

一応Copyを作成してそっちを見て行きます。

M_VolumetricCloud_02_Profiles_PaintCloudsの実装です。

おお。かなり複雑ですね。

分かる所だけ見て行きます。

まずMain Nodeです。

何でこんなデブになっているのと、最初驚いたんですが、これはMain Nodeの設定のせいではなく単にこのMaterialの名前が長いからでした。

Main Nodeの設定はVolumetric Cloud用のMaterialの設定でした。

Volumetric Advanced Outputです。

Conservative Densityは使用していませんね。

AlbedoとExtinctionの実装は複雑過ぎるので今回は読むのは止めておきます。

使用しているVolume Textureだけ調べます。

VT_CurlNoiseが使用されていました。

これです。

あれ、3Dで表示する方法があったはずですが、

ありました。

2022-07-25のBlogにやり方がまとめられていました。

2022-07-25のBlogのやり方はUE4のやり方でUE5ではTrace Into Volumeの場所が一寸だけ違っていました。

一応、その場所を以下に示しておきます。

結果です。

Opacityの設定はTool Barにありました。

Opacityを下げてみます。

結果です。

うーん。Curl Noiseの値を3Dで指定しているんでしょうか?

あんまり良く分かりません。

M_VolumetricCloud_02_Profiles_PaintCloudsの実装については来週以降じっくり時間をとってやって行くので、今週はここまでとし、Tutorialの勉強に戻ります。

M_VolumetricCloud_02_Profiles_PaintCloudsをVolumetric CloudのMaterialにセットします。

結果です。

新しいLevelなので、まだBookmarkを設置していないのでこの位置からしか確認出来ませんが、確かにDefaultの雲と比較して格段に雲らしい雲です。

一応、Volumetric Cloudの設定も確認します。

Layer Bottom Altitudeです。

2022-09-05のBlog

AltitudeをAttributeって書いていました。

最後にDirectional Lightの設定を変更しています。一応これもやっておきます。

Light Shaft OcclusionとLight Shaft Bloomです。

結果です。

2022-09-05のBlogに書かれている通りでLight Shaft Bloomの違いは分かるんですがLight Shaft Occlusionの違いは良く分かりません。

以上です。

今週のVolumetric Cloudの勉強はここまでにします。

8. UI Designの勉強

8.1 UI Designの完成

先週までで全部のUIを直しました。

一回、GameをPlayしてみます。

Stage 4で負けてしまいました。

しかしこのGameやってみて面白いです。

通常のGameでは最後に生き残った方が勝ちになります。しかしこのGameではどちらか一方のMonsterが一体死ぬと負けになります。

今までにない発想のGameで、それ故にどんな戦術を選択すべきなのかがこのGame独自の持ち味になっています。

予定では、この後に報酬の画面を追加する予定でしたが、報酬については良く考えていなかったので、このGameの持ち味を生かしながら、Gameの設計から新しく考えて最初から全部作り直したいです。

それでこれからは、このGameに報酬システムを追加した新しいGameを考えます。

8.2 報酬について今まで考えた事

今週はどんな報酬を与えるのかについて今までBlog内で検討した内容をまとめます。

前に作成したScoreboard Widgetです。

取りあえず適当に報酬になりそうなものを並べています。

うーん。

もうどんなIdeaがあってこれを作成したのか覚えていません。

過去のBlogを見直してみます。

2022-06-12Blog

今のGameの設定では報酬をもらう意味がないので以下の様に今のGameの設定を敢えて変えて報酬を出す事にしています。

結局、この今のGameの設定を一寸だけ変更すると言う案が駄目なんです。

Gameの設定を一寸だけ変えるのって、最初から作り直す方が楽なくらい全部を変更する必要が出て来ます。

量を変更するのなら、後からでも一寸ずつ変更する事って出来るんです。でも質を変更するのって一寸だけやるってのは無理だったんです。

今回の報酬を追加する。というIdeaはこの質の変化を私の作成したGameにもたらしました。

ので全部最初から作り直します。

しかし凄いIdeaがここに書かれていました。

これはぜひ実装したいIdeaです。

後、報酬でMonsterをもらえる事について、強いMonsterがもらえるならかなりうれしい。と書いています。

これは今のGameのシステムでも新しいMonsterが貰える事は十分な報酬になる事を言っています。

しかしMonsterのTypeがグー、チョキ、パーしかないのでどんなMonsterを報酬にするのかが難しくなります。

今、思い付いたのはグー、チョキ、パーに色を付けて、黒はジャンケンに買った時は、攻撃力が3倍になるけど、負けた時のDamageも3倍になる。みたいなのも追加したら良いかもしれません。

2022-07-25Blog

ここでは2022-06-12のBlogのIdeaを更に深堀しています。

結論としては、報酬はMonsterと経験値の2つだけにすべきとありました。

新しいMonsterが貰えると次の戦闘に使用出来るのでうれしいです。さらに経験値が増えると、魔術師は新しい魔法を覚えます。これも次の戦闘を有利に進める事が出来るのでうれしいです。

ここでは結論として、他の報酬を出すためにはこのGameの構成を根本から作り直す必要があり、現状では報酬はMonsterと経験値に絞るべきだと述べていました。

これはその通りで、このRootで直すもの有ですね。

以上でした。

8.3 報酬について

来週からこの点について考えてみます。

UI Designの勉強は今週で終わりにします。来週から報酬システムを組み込んだGame の構築にします。

9. Anime Renderingの勉強

9.1 今週からの予定

  • Vroidで作成したModelをUEにImportする
  • 公式のDocumentのStylized Rendering[7]の勉強
  • 法線転写をUEで実装する方法を検証

をやって行きます。

今週から10回程度をメドにします。

9.2 Vroidで作成したModelUEImportする

今週は先週ImportしたVroidのMaterialを見て行きます。

Vroidに使用されているMaterialですが以下に示した様に12個もあります。

こんなにMaterialがあるんですか。

Materialの生成においてTextureの読み込み部分が一番、計算Costが掛かる箇所です。同じ一工程でもTextureのDataを引っ張って来るのはMemoryを跨いでいるだけ非常に時間が掛かる訳です。だからMaterialを作成する人は使用するTextureの数をなるだけ減らす方向で頑張る訳です。一見するとこのように沢山のMaterialを使用するのはそれぞれのMaterialで別々なTextureを読み込む訳で計算Costを非常に高くしているように見えます。

その辺はどうなんでしょうか?

こんな疑問を持ちつつ次に進みます。

どのMaterialがこのModelのどの部分を担当しているのか調べます。

Static Meshを開きます。

ありました。

<Element 0

これは口の中のMaterialを担当しているようです。

このMaterialの実装を見てみます。

これはMaterial Instanceでした。

この親Materialを開きます。

これもMaterial Instanceでした。この親Materialを開きます。

これもMaterial Instanceでした。この親Materialを開きます。

これはMaterialでした。

これの実装を見てみます。

うん。

沢山、Materialはありますが一個一個はそんなに複雑じゃないのかもしれません。読んでみます。

Main Nodeです。

Material Attributesを使用していますね。

その一個手前のNodeです。

Customized UV 0の値を追加しています。

まずCustomized UV 0を使った事がありません。

これって何をするんでしょう?

以下に普通のMain Nodeを示します。

Customized UV0はありません。

次にNum Customized UVsに1を代入します。

Customized UV0が現れました。

どんな機能を担当しているのか調べます。

公式のDocumentにCustomized UVs [6]がありました。

うーん。これだけ。

その下の解説に詳しく説明されていました。

Texture SampleのUV値ですが、通常の方法で設定するとPixel毎に計算されます。

これをCustomized UV0で計算するとVertex毎の計算になるそうです。

通常の計算でTexture SampleのUV値を指定している例です。

結果です。

1 Pixel毎に計算されているため、Smoothな線で描かれています。

以下の実装はTexture SampleのUV値をCustomized UV0を使用して指定しています。

結果です。

Vertex毎にしか計算しないのでギザギザです。

これだけ理解出来れば十分でしょう。M_VrmMToonBaseOpaqueの実装に戻ります。

Customized UV0の値を追います。

うん。

あ、成程、Customized UV0は敢えて指定しないとMaterial Attributeの中で消えてしまうんでしょうね。

と言うとこの先のNodeでCustomized UV0の値を計算しているはずです。

Material Functionですね。

この実装を開いてみましょう。

ふああああああああっ。

なんじゃこれ。

Output ノードを見つけました。

その手前のNodeです。

ここでCustomized UV0が指定されています。

これはLuckyかもしれません。

これを追ってみます。

UV Scrollと言う名前のBlockに到着しました。

今週はこれの実装を読む事にします。

<UV Scroll

まずBUseUvAnimノードです。

これはSwitch Parameterノードです。ので簡単なFalseの方を追います。

TexCoord[0]ノードでした。

なーんだ。

これは簡単。

それではBUseUvAnimノードのTrueを追っていきます。

Quality Switchノードです。

始めて見るノードです。

公式のDocumentであるUtility Expressions [7]では

と解説されていました。

要するに低品質のPCの場合はLowの値を、それ以外の場合はDefaultの値を流す訳です。

当然、実装が簡単になるLowの場合から見て行きます。

はい。

Quality SwitchノードのDefaultの場合も見てみます。

Feature Level Switchノードです。

ES2って携帯の基準でしたっけ。

これの公式のDocumentを見てみます。

Utility ExpressionsのFeatureLevelSwitch [8] の解説です。

はい。この解説を読むとESがOpenGL、SMがDirect XのVersionに対応しているんですね。

OpenGLのES2とES3_1はTexCoord[0]に繋がっていました。

DefaultとSM4_REMOVEDはCustom Rotatorに繋がっていました。

???

Feature Level SwitchノードやQuality Switchノードって繋いでいないInputはDefaultの値がそのまま使用されると思っていたんですが違うんでしょうか?

これ見るとDefault とSM4_REMOVEDだけがCustom Rotatorノードの計算した値を使用するように見えます。

この解説を読むとInputが接続されていない場合は、Default値を使用する。と言っているように思えます。

SM4_REMOVEDは繋げなくても同じ結果になる気がしますが、まあ結果は同じなので先へ進みます。

Custom Rotatorノードですが、Textureを回転させる気なんでしょうか?

Rotation Angle(0-1)(s)をずっと遡ったらTimeノードがありました。

これは完全にTextureをくるくる回すための実装ですね。

Rotation Centerは当然ですが0.5、0.5がセットされています。

Rotation Angleの実装です。

TimeはFracで小数点の繰り返しにしています。それにMtoon_Tex_UvAnimMaskTextureノードのTextureのRの値を掛けています。これはMtoon_Tex_UvAnimMaskTextureノードのTextureを実際に見ないと分かりませんが、目とかがグルグルまったりする部分なのかもしれません。

その後のMultiplyノードのBには以下のMtoon_UvAnimRotationが繋がっていました。

これDefault値が0なので通常は回転しません。と言う事になります。

UV値の値ですが、以下の様になっていました。

当然ですが、TexCoord[0]ノードです。

それに何かを足しています。

これはTexCoord[0]の値をXとY方向にずらすための実装ですね。

うーん。何のために使うのか今一分からない。

これでUV値をずらした場合、TextureのCenterはどうなるんでしょうか?

この実装の目的が分からないと何とも言えませんが、要らない気がします。

MultiplyノードのBの先の実装も見てみます。

ええ。これに繋がっているのか。

と言う事はUV値も回転しているの?

いや、これはAddしているのでX方向とY方向にPanしているのか。

うーん。

どこでこれを使用するのか分からないとなんでこんな事をする必要があるのか分かりませんね。

しかしUV Scrollの実装内容については大体理解しました。

このUV Scroll内に以下のUVScrollと言う使用していないNodeがあります。

このNodeはCustom Nodeで以下の様に設定されていました。

これ見ると、Custom Rotatorノードの存在が分からなかった時に、同様の機能をここで実装させていたみたいです。

UVの中心を0.5ずつずらしていないですね。

と思ったら、Custom Node内でずらしていました。

となると、UV値の計算でTimeノードを掛けた値を足しているのは何らかの目的があってやってるのは間違いないですね。

うーん。Ben先生のTutorialでPanのやり方を解説してるのがあったはずです。

来週はそれの復習からやりますか。

今週のVroidの勉強はここまでにします。

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

<Foliageに使用されている他のStatic MeshのMaterialについて>

以下のStatic MeshがFoliageに使用されていましたが、そのどれもが同じMaterialを使用していました。

のでFoliageに使用されているStatic Meshに使用されているMaterialについては全部見た事になります。

<城に使用されているMaterialを見る>

今度はどのMaterialを読もうか考えたんですが、以下に示した城のMaterialを見る事にしました。

まずは無難に以下の城の柱の部分のStatic Meshに使用されているMaterialを見ます。

以下の2つが使用されています。

最初のMaterial Instanceの元のMaterialは以下のM_StoneWall_Masterでした。

今週はこれの実装を読む事にします。

うーん。

まずはMain ノードです。

これは普通ですね。

Emissive に何も繋がっていません。これで陰が出ているんですね。

Base Colorの実装を見てみます。

まずLerp ノードがありました。

便宜上、このLerpをLerp1と名付けました。

Lerp1のAはLerp2に繋がっています。

Lerp1のBは以下に示したVector Parameter ノードに繋がっています。

Lerp1のAlphaは以下のTexture Sampleに繋がっていました。

このTexture SampleはTexture Sample2と名付けました。

このTexture Sampleに使用されているTexture のBは以下の様になっていました。

これが以下に示した様な城のBrickを表しているんですね。

Texture Sample2のUVsの実装です。

ここにBrickがもっとRandomに現れるためのMaskと書かれていました。

UVsの実装の目的ですね。

ただ、0.5を掛けただけでBrickがもっとRandomになるとは思えません。サイズが2倍になるだけでしょう。この先の実装も含めた全体的な目的だと思います。

ここのMultiplyノードにはMultiply1と名付けました。

MultiplyノードのAの値を見てみます。

何とPannerノードが使用されています。

公式のDocumentのAnimating UV Coordinates [9]のPannerにはSpeedがありません。

まあ、古いImageをそのまま使用しているんでしょう。

Pannerノードの使用方法はAnimating UV Coordinates [9]を読んだらすぐに思い出しました。TimeにはTimeノードを繋げて、CoordinateにはTexCoord[0]を繋げます。これでPanします。

PannerノードにはSpeedを設定する箇所があるので、X方向だけに動かしたい時はYの値を0にすれば良いです。

このPannerノードを単なるOffsetとして使用する事も出来るそうです。その時はTimeにConstantをセットすれば良いそうです。

この辺を踏まえて以下の実装をもう一回見直すと

PannerノードのCoordinateの実装は単にTexCoord[0]の値に2を掛ける事で、TextureのSizeを半分にしているだけです。

PannerノードのTimeの実装も見てみましょう。

これは単なるConstantをそのMaterialを使用しているStatic Meshの位置から計算しているだけです。

これはPannerノードを単なるOffsetの作成のために利用しています。

言われてみれば、城の壁がPannerしていたらオカシイですね。

これでLerp1のAlphaの実装が理解出来ました。

今度はLerp1のAにあるLerp2の実装を追います。

まずLerp2のAですがLerp3に繋がっていました。

これは最後にします。

Lerp2のBですが以下のVector Parameterに繋がっていました。

ここで色の指定をしています。

最後のLerp2のAlphaですが、

Texture Sample1のRの値にLerpしてClampしていました。

Texture Sample1のRです。

白い部分もあんまりはっきりしていませんね。

だから白を1、黒を0にするためにLerpしてClampしたんでしょう。

以下の城の柱を見ると

Brickと四角の線はほぼ同じ位置かつ同じ大きさです。

なのでこのTexture SampleのUV値は先程のBrickとほぼ同じ値を代入する必要があるはずです。

Brickの大きさや位置を指定している先程のLerp1のAlphaの値を指定しているTexture SampleのCoordinateの実装と同じ実装を使用していました。

当然ですね。

ただしBrickのTextureはこの後で0.5を掛けているので

四角の線よりBrickの方が2倍の大きさになります。

以下のImageをみると

確かにBrickは線からはみ出していますが、2倍の大きさにはなっていないですね。

元のTextureを見るとBrickに使用したGの方が、線に使用したRより小さい事が分かります。

これがBrickの大きさを2倍にしてもそこそこしか線からはみ出していない原因と思われます。

これでLerp2の実装も理解出来ました。

Lerp2のAに繋がっているLerp3の実装です。

基本的にはLerp1、Lerp2と全く同じ構造をしていました。のでここで解説する事はやめます。

ここで一つ気が付いたんですが、Lerp3のAとLerp1のBが全く同じ色を使用しています。のでLerp3のBは実際は見えてないのかもしれません。

この辺まで丁寧に追及するにはこのMaterialの実装のCopyをどこかに作成して、このMaterialを使用したStatic Meshを作成し、Materialの実装を少しずつ変更して変化を確認する必要があります。

しかしそこまでやらなくてもこのMaterialの実装方法が、Stylized Rendering内の他のMaterialの実装方法とそんなに変わっていない事は確認出来たので、これで十分だと思いここで終了する事にしました。

9.4 法線転写をUEで実装する方法を検証

Historiaさんの[UE4] 動的法線転写について[10]を勉強します。

で、軽く読んだんじゃ理解出来ないんで、がっつり読み込む事にしました。

でそうなると結構、[UE4] 動的法線転写について[10]のサイトの内容をそのまま書き込む必要が出て来ます。のでもし苦情が来たらこの部分の内容は全部消します。

まずMaterialのMain ノードのNormalにパスした値がNormalになるので、法線転写はそこに球体の情報をPassすれば出来るそうです。

やり方としては以下の方法で実装するそうです。

最初のBlendはまあ、出来なくても良いです。球のNormalの情報さえPass出来たら今回はOKとします。

でも、想像するにLerpのAに元の法線、Bに球体の法線、Alphaに混合割合を指定したら出来そうではあります。

この場合、混合した後で正規化する必要はあるんでしょうか?その辺は分かりません。

2番目は言っている事は理解出来ました。3D Modelの顔を球で覆ってその球の中だけ法線転写を使用すると言う意味だと理解しました。

三番目はどうやって補間するんでしょう。

これが一番、やり方が分からないです。

うーん。

考えても分かりません。先に進んで答えを見る事にします。

まずModelの準備だそうです。

私は先週、ImportしたVroidのキャラでやります。

ただこのキャラのMaterialがどうなっているのかまだ全然理解していないので、顔や髪の部分だけ簡単なMaterialに置き換える事にします。

[UE4] 動的法線転写について[10]でも

と書いてありました。

まずSkeletal MeshのBPを作成します。

どうぜ後でSphereを追加するんだからBPで編集します。

そのBPのSkeletal Meshに先週作成したキャラを追加しました。

このModelの顔の部分のMaterialです。

このModelの髪の部分のMaterialです。

この二つに使用するMaterialを作成します。

BaseとなるMaterialです。

実装はこんだけです。

これから顔と髪用のMaterial Instanceを作成します。

セットしました。

これから色を調節します。

顔のMaterialのBase Colorに肌と同じ色をセットしました。

うーん。何これ?

こんなに変な色になるの?

試しにUnlitにしたら肌と同じ色である事が確認出来ました。

まあ、法線転写の確認のためだから別に変な色でも問題ないでしょう。

髪のMaterial InstanceのBase Colorにも色をセットしました。

こっちはそんなに変な色ではないですね。

陰はそれなりに写っています。

ただこれだけだと陰が見にくいのでPost Processに影を黒くするMaterialを追加します。

2022-05-02のBlogで勉強したUnreal CG 氏のToon Shader & Custom Shadow - UE4 Postprocess Tutorial [11]の影の部分の実装をそのまま使用して作成しました。

このMaterialのInstanceをPost Process Volumeの以下の箇所にセットしました。

結果です。

何で髪の部分は黒くならないんでしょうか?

他の部分は、Vroidの付属のMaterialなのでPost Processが効かないのは分かりますが、髪は私がさっき作成したMaterialです。

顔の部分と同じになるはずです。

髪のMaterial Instanceを顔のMaterial Instanceと同じにしました。

これだったら法線転写の影響がはっきり確認出来るでしょう。

でももう時間が無くなってしまったので、残りは来週やります。

10. まとめと感想

今週は途中で急な用事が入ってしまったのでいつもの半分位しか勉強出来ませんでした。

まあ、そう言う時もあります。

11. 参照(Reference

[1] CGHOW. (2022, June 11). UE5 Niagara #ScratchPad Module #8 | Voxel FX. YouTube. https://www.youtube.com/watch?v=kftOZ1Cz-ec&list=PLwMiBtF6WzsqfBv2rYkHe93Whx5AY1u6o&index=8

[2] CGHOW. (2022, June 13). Collision Query | UE5 Niagara #ScratchPad Module #9 [Video]. YouTube. https://www.youtube.com/watch?v=kxFgm8B7Tm4&list=PLwMiBtF6WzsqfBv2rYkHe93Whx5AY1u6o&index=9

[3] Cloward, B. [Ben C. (2022, July 28). Radial Blur Post Processing - Shader Graph Basics - Episode 55 [Video]. YouTube. https://www.youtube.com/watch?v=KLOGaHgo2GY

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

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

[6] Customized UVs. (n.d.). Unreal Engine 4.27 Documentation. https://docs.unrealengine.com/4.27/en-US/RenderingAndGraphics/Materials/CustomizedUVs/

[7] Utility Expressions. (n.d.-a). Unreal Engine 4.27 Documentation. https://docs.unrealengine.com/4.27/en-US/RenderingAndGraphics/Materials/ExpressionReference/Utility/#qualityswitch

[8] Utility Expressions. (n.d.-b). Unreal Engine 4.27 Documentation. https://docs.unrealengine.com/4.27/en-US/RenderingAndGraphics/Materials/ExpressionReference/Utility/#featurelevelswitch

[9] Animating UV Coordinates. (n.d.). Unreal Engine 4.27 Documentation. https://docs.unrealengine.com/4.27/en-US/RenderingAndGraphics/Materials/HowTo/AnimatingUVCoords/

[10] 株式会社ヒストリア. (2022, June 30). [UE4] 動的法線転写について. Historia Inc - 株式会社ヒストリア. https://historia.co.jp/archives/11921/

[11] UnrealCG. (2020, June 25). Toon Shader & Custom Shadow - UE4 Postprocess Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=mx_AvrZK3TA

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

<前文>

<Meta(Facebook)の終わりの始まり>

Meta(旧Facebook)のMetaverseに対する不評というか嘲笑が凄いです。

確かに20年前位の任天堂のGameの方がGraphicsが綺麗って言うCNBCの解説は爆笑ものでした。一応下にMeta(旧Facebook)のMetaverseの記事のリンク先を貼っておきます。

https://www.pcgamer.com/mark-zuckerberg-spent-dollar10b-on-the-metaverse-and-all-he-got-was-this-stupid-selfie/

何であんなのを発表するまで誰もそれを指摘しなかったんでしょうか?

Mark氏は裸の王様そのものです。

しかもこれを売ろうとしているんですよ。これ無料のServiceだって使用したくないでしょう。

<これからのアジア人Software Engineerの進むと思われる方向>

結局、これって私が数年前から言っていた米国IT企業による積極的なアジア人排斥が原因なんだと思っています。まあアジア人と言ってもインド人はそれなりに雇われているみたいですので東アジア人と限定した方が良いかもしれませんが。

Fox Newsに代表される右派の嘘を嘘と知りつつ、自分達に都合が良いからずっと騙されたふりしてアジア人をIT業界から排斥していたら、技術やアイデアが無くなってしまったんです。

しかし今更、態度を改めても既に米国のIT企業がアジア人を公平に雇う気がないのはアジア人の技術者達からばれていますから、彼らがアメリカのIT企業に戻って来る事はないでしょう。

そして個人的な見解ですが、これからのアジア人Soft Engineerは最初から独立してTikTokの様な独自のServiceを開始するか、もしくはハッキング技術に特化してそういう企業の情報や価値を盗む方向に進化していくと思われます。

もしくはこの2つを混ぜた形態になっていくかもしれません。

例えば新しい形態の動画サイトを立ち上げて、そのServerはYouTubeのServerをハッキングして無料で使用してしまう。みたいなやつです。

そして究極的には、それらの中から次世代のGoogleAppleになる新しい企業が誕生していくと思われます。

<George R. R. Martin氏がアメリカのz世代に与える半端でない影響について>

ここで注目したいのが、アメリカのz世代です。そのアメリカのz世代の琴線に触れる何かを提供出来る企業が、次世代のGoogleAppleになって行くと考えられます。

彼らは基本的に上の世代嫌っていて、特にFacebookが大嫌いです。何故か日本のアニメ、特にNarutoが大好きで、本人たちが気がついているかどうかは別にしてその行動規範がNarutoの世界で道徳的に正しいと思われる行為に基づいて行動します。

ホントにアニメが彼らに与える影響の大きさには驚くばかりです。

ここで、アニメと同じくらい、彼らに影響を与えているTVがあるんです。

それが、George R. R. Martin氏が書くFantasy 物のTV Seriesです。Game of Thronesは社会現象にまでなりましたし、今、放送中のHouse of the DragonもとんでもないHitになる事は間違いないでしょう。

彼の原作とそれを元に作成されたTV Seriesはアメリカのz世代、いや世界のz世代の考え方に深く影響を与える事になると考えられます。

私は残念ながらGame of ThronesもHouse of the Dragonも見た事ないですし、彼の小説も読んだことないです。ので、George R. R. Martin氏が書くFantasy 物のTV Seriesがどんな思想に基づいて語られているのかは全く知りません。

時間があったら彼の小説は読んでみたいとは思っています。

今週はあんまり心に触れる話題が無かったので前文に書ける内容はこんなもんです。

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

<本文>

1.今週の勉強について

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

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

2.Niagara: CGHOW氏のTutorialをやる

今週はUE5 Niagara #ScratchPad Module #6 | Skeletal Mesh Location with Offset and Scale [1]を勉強します。

内容自体は先週勉強したStatic MeshをSkeletal Meshに変更しただけなので、先週のように一々深堀して勉強はしません。軽くやります。

2.1 UE5 Niagara #ScratchPad Module #6 | Skeletal Mesh Location with Offset and Scale [1]を実装する

今週はいきなり実装します。

まずいつものようにNiagara Systemを作成してFountainを追加します。

いつもの様に要らないModuleを消しました。

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

名前をMy Skeletal Mesh Locationに変更しました。

話は変わりますが、Skeletal ってSpell結構難しくて、突然書くときあれ?ってなったりしていたんですが、UEの勉強で何度も書くので完全に覚えてしまいました。

Map Getノードに[INPUT] New Skeletal Meshを追加しました。

そしてGet Skinned Triangle Data WSノードを追加します。

先週勉強したStatic Meshの場合は以下のGet Triangle WSノードを使用しました。

結構やり方が違いますね。

更にRandom TriCoordノードを追加します。

これは沢山あるTriangleからRandomに一個を選ぶためのモノですね。

更に[INPUT] New Int 32を追加します。

Random Infoに接続します。

Map Setノードに[PARTICLE] Positionを追加しました。

そしてGet Skinned Triangle Data WSノードのPositionの値をSetしました。

これで完成です。

Particle Spawn SectionのMy Skeletal Mesh Location Moduleの

設定を以下の様にセットします。

結果です。

はい。出来ました。

今度はこのNSをLevel上のSkeletal MeshのAnimationにLinkします。

以下のAnimationをLevel上に配置します。

次に先程作成したNSもLevel上に配置します。

そして以下の様にLinkさせます。

Linkの種類はNoneです。

試しにPlayを押すと、

以下の様にParticleを生成しながらMannequinが走っています。

Tutorialと同じ様に調整してみました。

あんまり綺麗ではないです。

今度はScratch Pad ModuleをParticle Update Sectionに移動させて、Skeletal Meshの動くに合わせてParticle の位置も移動する様にしました。

結果です。

これだけではあんまり綺麗ではないです。

これにOffsetを追加します。

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

Static MeshのOffsetの時と全く同じやり方です。

MultiplyノードのBの値は

Mat Getノードに[INPUT] Bを追加してこのBの値をセットします。

結果です。

こっちは前よりは見ごたえありました。

Scaleも追加します。

Scaleのやり方もStatic Meshと全く同じです。

結果です。

以上でした。

2.2 UE5 Niagara #ScratchPad Module #7 | Grid and Brick Pattern [2]を勉強する

流石にこれだけでは短いので次のTutorialも勉強する事にしました。UE5 Niagara #ScratchPad Module #7 | Grid and Brick Pattern [2]を勉強します。

以下に示したBrickを作成していますが、これScratch Padの勉強になるんでしょうか?

今回のScratch Padの実装はSpawn Particle in Grid Moduleがやっている事を

自作するそうです。

Scratch Padの実装ですが、まず以下に示した様に[Particle] PositionをMap Set ノードに追加します。

このPositionのXYZの値をそれぞれ別にInputしたいのでPositionをVectorに変換します。そしてMake Vectorノードを使用してそれぞれ別な値を入力出来る様にします。

はい。

Execution Indexノードを使用します。

これでそれぞれのParticleを管理するみたいです。

Execution Index に繋がったMultiplyノードの結果をMake Vectorのxに繋ぎます。

結果です。

はい。

Gridが出来ました。

分かってしまえば簡単です。

先程の結果にFracノードを追加してMultiplyノードを追加します。

MultiplyノードのBにはMap Getノードにセットした[INPUT] rowの値をセットします。

今度はColumを作成します。

Multiplyの結果からFracの結果を引きます。

CGHOW氏によると沢山の人が沢山の方法でGridの作成をしていますが、これ以上Simpleなやり方は見た事ないそうです。

その結果をMultiplyノードに繋いで更にその結果をYに繋ぎます。

結果です。

結果を弄ると以下の様になりました。

2.3 UE5 Niagara #ScratchPad Module #7 | Grid and Brick Pattern [2]を実装する

それでは実装します。

まずNSを作成してFountainを追加します。そしてEmitterにある要らないModuleを消します。

そしてParticleが動かない時のいつもの設定を行います。

一応、記録に残しておきます。

まずEmitter Update SectionにSpawn Burst Instantaneous Moduleを追加します。

Spawn Burst Instantaneous ModuleのSpawn Countの値は100にしました。

次にEmitter Update SectionのEmitter State Moduleの

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

最後にParticle Update SectionのParticle State Moduleの

Particle State SectionにあるKill Particles When Lifetime Has ElapsedのCheckを外します。

これで一度生成されたParticleは消える事なく生成された場所にずっと存在する事になります。

CGHOW氏がNSで全く動かないEffectを作成する時は、必ずこの設定をしますので、ここに記録を残しておきました。

Scratch Padを追加します。

名前はGridにしました。

[Particle] PositionをMap Setノードに追加しました。

そしてExecution Indexノードを使用して以下の実装を作成します。

因みにExecution Indexノードの機能は以下の様になっています。

このそれぞれのParticleのIndexは一個のParticleが一個の番号しか持てない様に調節出来たはずです。

一寸調べます。

うーん。

取りあえず、Emitter のPropertiesにある

Requires Persistent IDs

の事を言っていたんですが、このIDと先程のExecution Indexの値が同じモノかどうかが分かりません。

今回はここには深入りしません。

時間があったら後で調べます。

結果です。

しかし本来はRowの数は生成されるParticleの数に影響されずに一定にしたいんです。

ので割る事します。

そしてFracノードに繋げます。

そのFracノードの結果をMultiplyノードに繋げます。

これでGrid Moduleの値を以下の様にセットしました。

結果です。

今度はColumnを作成します。

この計算、良く読んでみれば当たり前過ぎました。

結果をYに繋ぎます。

Columnの値を20にしました。

結果です。

Gridが出来ました。

ここからはScratch Padの勉強ではなくNSの調整です。

まずGrid ノードのNumber of Rowの値を端数にします。

すると以下に示した様にParticleがバラバラに配置されるようになります。

Tutorialで説明されたやり方で調整しました。

具体的なやり方はScratch Padの実装とは関係ないので記録はしません。

結果です。

うーん。

あんまり綺麗に並んではいませんね。

でもScratch Padの実装はTutorialと同じなのでこれでも良いでしょう。

完成とします。

2.4 Scratch Padの勉強をする目的を確認する

CGHOW氏のTutorialでも散々説明されていますが、実際の実装では既に存在しているModuleがあり、敢えてScratch Padで一から実装を作成する必要はありません。

ここでのScratch Padの勉強の目的は以下のモノがあります。

  • Scratch Padそのものの使用方法に精通する。
  • Scratch Padに良く使用するParameterに詳しくなる。
  • Scratch Padの実装で良く使用するNodeに詳しくなる。

そして最終的には以下の目的に繋がります。

  • 他のModuleの実装を開いて見た時にある程度は読んで理解出来る様にする
  • Particle Attribute Readerの設定方法を完全に理解する

この辺を忘れないで勉強して行きます。

2.5 CGHOW氏のVFXのShort 動画を見る

ここ一カ月位、CGHOW氏はShort動画に自身が作成したVFXを沢山上げています。

これら全く見ていないです。ので今週はこれを見る事にしました。

これらを見て、これからどのVFXを勉強するとか、このEffectの作り方は全く分からないとか、もしくは単純にUser目線で綺麗とかの感想などを書いていきます。

後、流石に量が凄いので全部のCitationまで書く事は出来ないので、題にLinkだけ貼る事にします。

Stylized Tornado in UE5 Niagara Tutorial | Download Files

PhotorealなEffectだと光って表現するものが多いために、アニメ調の彩度が高い画像の中では、そのままでは使用出来ない場合が多いです。

このEffectはStylizedで作成されているため光っていません。そのままアニメ調のGameに使用出来そうです。

更に、

  • 線がはっきり出てている。
  • 竜巻の特徴が強調されている
  • 風を絵として表現している

がアニメ風の画像に凄く合いそうです。

Swirl FX in UE5 Niagara Tutorial | Download Files

光ってた。

これはそのままではアニメ調のGameには使用出来ないですね。

何かSFチックですね。

とは言ってもじゃこれの作り方知りたくないの?と言われたらやっぱり知りたいです。

Bubble Burst FX in UE5 Niagara Tutorial | Download Files

これScreenshotでは凄さを伝えきれませんが、本当に泡が発生して破裂しているように見えます。

Stylized Dissolving Trail in UE5 Niagara Tutorial | Download Files

これ分解した破片が消えるまでの動きが何とも言えない味があります。

これは特に実装方法を勉強したいです。

Tutorialはこっちですね。

これShort動画からTutorialの動画に飛べないんですね。

Water Shield in UE5 Niagara Tutorial | Download Files

これも凄いです。Stylizeされた水の表現が凄いです。

しかもStylizeなのに透明な部分があります。

Chocolate Flip Fluid in UE5 Niagara Tutorial | Download Files

これ、下の円柱が回転しています。Chocolateがその円柱の回転によって形状が複雑に変化しています。

これは絶対勉強したい。

しかし私の今のPCではこれは動かない。勉強するのはもう一寸先になります。

Interactive Leaves in UE5 Niagara Tutorial | Download Files

Mannequinが動くと葉っぱが舞い散ります。

凄いです。

これは絶対勉強したいEffectです。

Tutorialの動画はここにありました。

Interactive Grass in UE5 Niagara Tutorial | Download Files

これも凄いです。球の箇所だけ草が凹んでいます。球を動かすと凹んでいた草が元に戻ります。

Tutorialはこっちですね。

23分のTutorialで比較的短いですね。

Poison Rain in UE5 Niagara Tutorial | Download Files

これ典型的な光っているEffectなんですが、雨の表現が素晴らしいので敢えて載せました。

Tutorialはここにありました。

Orb Dissolve FX in UE5 Niagara Tutorial | Download Files

この水晶の内側に光が垂れる感じが良かったです。

これ水滴が垂れるようにしたらもっと綺麗になる気がしました。

Optical Flares in UE5 Niagara Tutorial | Download Files

横に線が伸びるのがどうやってるのは分かりません。

後、単純に綺麗です。

Waterfall in UE5 Niagara Tutorial | Download Files

こういう感じで滝を作成したのは始めてみました。幻想的な滝です。

Celestial Area FX in UE5 Niagara Tutorial | Download Files

Gameやアニメに出て来る魔法陣が立体的じゃない事に不満が一寸あります。

このEffectは立体的な魔法陣の作成のヒントになりそうです。

Unreal Engine Crack & Rays Tutorial

この地面のひび割れの作成方法が知りたいです。

Unreal Engine Ice Attack Effect Tutorial

氷が砕けた後に破片が飛び散る所が氷らしく見えた。

氷のMaterialが良い。

Unreal Engine Lava Rocks Effect Tutorial

前の氷のEffectの色違いです。

ですが、Lavaにすると光の功罪がはっきりします。

西洋のGameのように画面が暗い場合、非常に映える映像になる反面、アニメ調の画像では光っている部分がはっきりしないので目立たないEffectになってしまいます。

私が個人的に考えている解決策は、黒と赤で作成して赤い部分を光らす方法です。これ光っている赤の回りは常に黒いので画面がアニメ調でもはっきりして目立ちます。

更に光って無くても黒字に赤なら目立ちます。

Unreal Engine Bloody Ice Death Effect Tutorial

氷に赤も凄く目立ちますね。

Unreal Engine Hit Effect Tutorials

このEffect自体はそんなに興味深いものではなかったんですが、上に示した円状のEffectだけ断トツで目立っていました。

これってこの円状のEffectには凹凸を示す影がないからなのかもしれません。

Effectを光らせないで目立たせる方法として使える技術なのかもしれません。Potentialがある気がします。

Unreal Engine Energy Ball Hit Effect Tutorial

ボールが地面に衝突した時のEffectです。

これ自体は凄いんですが、明るい所でも同じ位凄く見えるんでしょうか?

それを試してみたいです。

Unreal Engine Niagara Cloud Tutorial | Download Project Files

これこの前、勉強した雲のEffectです。

こうやってShort動画で見ると非常に圧巻で、思わずこれどうやって作成したの?ってこの前作成したにもかかわらず思ってしまいます。

EffectをUser目線から見る為にはShort動画でまとめるのも非常に大事だと思いました。

でもYouTubeのShortは一個、CGHOW氏の見た後、全く違う種類のShort動画をお勧めで上げて来てとても操作しにくいです。

Unreal Engine Power Hit Effect Niagara Tutorials

光線系の攻撃のEffectとして作成方法を覚えておきたいです。

これ黒いEffectで光の部分を覆う事で光のEffectが明るい所でもこのEffectが強調されるようになっている気がします。

Unreal Engine Flame Head Material and particle

もうこれはデザインが凄い。の一言です。炎の妖精のデザインが凄いのでEffect自体も凄く見えます。

こういうのを見ると結局凄いVFXって凄いデザインに負っているんだなと思います。

どんなにProgramming Skillがあっても結局デザインのセンスがないと良いVFXは作れないって事です。

Unreal Engine Blood Decal Materials Tutorial

これはNaniteではなくて血のDecalですね。Decalは勉強した事なくていつか勉強しようと思っています。

Tutorialはここにありました。

なんと2019年の動画です。

うーん。一寸自分で試すには古すぎるTutorialですね。

Unreal Engine Toon Explosion from cascade to Niagara Tutorial

これも凄いです。

しかも凄いアニメ調の爆発です。

ただしこれもTutorialは2019年に作成されていました。

Tutorialはここにありました。

流石にここまで古いNiagaraだと、UIも今とはまるで違うはずです。一寸自分で試してみる気はしませんね。

<残りのShort動画>

これ以上古いShort動画を見てもTutorialが古すぎて勉強する事が出来ないので、記録に残すのは止めて見るだけにします。

と思った先から凄いEffectがありました。

Stylized Fire | Toon Fire in Unreal Engine Niagaraです。

これアニメ調の炎の究極形でしょう。

流石にこれ全部見るのは無理でした。

ここまでで中止します。

<CGHOW氏のShort動画を見た感想>

これはYouTube側の問題なのかもしれませんが、もう一寸、見易くしてほしいです。

一個見たら連続で全部、見れるようにして欲しいです。

今の設定では、一個のShort動画を見ると全く別なShort動画が次に現れます。次のCGHOW氏のShort動画を見るためにはBrowserからBackして次のShort動画を選択する必要があります。非常に手間がかかりました。

これでは優れたEffectが有っても見つけるのが非常に困難になります。

というか一個か2個見たら「もういいか。」と言う気分になってしまいます。

Effectに関しては圧巻の一言です。

こんな凄いEffectがあったのかと驚きの連続でした。

<<追記>>

Home画面の以下の箇所から見るとCGHOW氏のShort動画を連続で見る事が出来ました。

来週はここから見て私が思う凄いEffectについて述べます。

3.Materialの勉強

Ben Cloward先生の Rain Drips On The Lens Post-Process Effect - Shader Graph Basics - Episode 54 [3] の実装部分の意味が良く分からない箇所を検証します。

その後で、Ben Cloward先生の別のTutorialを勉強します。

3.1 Rain Drips On The Lens Post-Process Effect - Shader Graph Basics - Episode 54 [3] の実装を検証する

ケツからコードを見て行きます。

MultiplyノードではTexture Sampleノードの白い部分だけ残って黒い部分は消えます。

それが何でDripの形になるんでしょうか?

Aの計算結果を追います。

Roundノードの結果です。

これに先程のTexture Sampleノードの結果を掛けたらMultiplyノードの結果になりますね。

Roundする前はどんなImageだったんでしょうか?

以下のTexture SampleノードのBに繋がっていました。

BのImageです。

拡大するとGradientがありました。

Roundする事でこのGradientしている部分も白くする訳です。

以下のAnimationを保持するSample Textureノードの作成はこの実装で一番複雑なので最後にやります。

Outputノードの一つ手前のMultiplyノード、本当のケツのNodeです。

このMultiplyノードのBの値は先程検証したMultiplyノードの計算結果です。

Aの方の実装を見て行きます。

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

まずRGです。

RのImageです。

GのImageです。

確かRがX方向のNormal、GがY方向のNormalを表していたはずです。

Previewで拡大して見るとこんな感じです。

それに6を掛けて3を引いています。

これは前のDropの実装で2を掛けて1を引いたのと同じ事をもっと大袈裟にやっただけなんでしょうか?

一寸検証してみましょう。

下のGraphは結果を0,1でClampしています。

数字がデカくなるほど、Roundと同じ機能に近づいています。

Roundと同じ事をしていると解釈出来ます。

試しにRoundした場合の結果と比較してみます。

Roundした場合の拡大図です。

6を掛けて3を引いた場合です。

パッと見では変わらない感じがしますね。

ただしDripの実装はClampは使用していません。Clampしない結果がどう影響するのかは分かりません。

6を掛けて3を引いた結果にSaturateしてみます。(Saturateは0,1でClampした場合と同じ結果になります。)

うーん。変わらないですね。

あ、0以下は黒で1以上は赤か緑なんでPreviewの結果は全く同じに見えるのは当たり前でした。

実際のDripの結果で比較してみます。

Saturate有です。

Saturate無しです。

Dripの部分を拡大してみます。

Saturate有です。

Saturate無しです。

む。

Saturate無しの方が、Dripが太くて長いです。

これは実際のDripを比較して検討する必要がありますね。

12を掛けて6を引いた場合です。倍にしてみました。

拡大してみました。

うーん。

あんまり分かりません。

よし。

これらの結果から推測すると、

の役割がかなりはっきりと推測できます。

まずこの部分の役割は、2つあります。

一つ目は以下のGraphで示した様な四捨五入をする事です。

四捨五入をするためなので、x6-3とx12-6、更に言えばx120‐60でも0から1の間の計算結果は大体同じになります。

これはRoundと同じ機能です。

もう一つの機能はRoundのように1から1.5未満を1にしたり、Clampのように1以上の値を1にしない事です。

RoundをするとDripが短く細くなります。

これがどうして起きるのかは一寸分かりませんが、兎に角そうなっています。そのために1以上の値もそのままにしておく。これが2番目の役割です。

この2つの機能を担当していると推測出来ます。

それでは最も複雑な以下のTexture SampleノードのUVsの実装を見て行きます。

以下の様になっています。

まず一番簡単なAddノードのBから見て行きます。

途中でMultiplyノードがあります。

これは一端無視します。

ここに繋がっていました。

これは画面のサイズによってTextureが横長に拡張しないための実装ですね。

個々の意味は分かっています。

この後に以下の掛け算をします。

これするとX軸側に半分の太さになりますよね。

多分。

確認します。

1の時です。

2の時です。

あれ?

変わっていませんね。

色々数字を弄ったんですがこの部分の数字を変えるとどこが変化するのか分かりません。

ここはSkipして別な部分の実装を見る事にします。

今度はBをはずしてAだけ繋いでみました。

結果です。

む。

と言う事は、以下の様に一部だけ白くする表示はBが担当していたということなんでしょうか?

先程のMultiplyノードの値を1,1に変更してBを繋ぎ直しました。

結果です。

確かに一部だけ白くなりました。

しかしそれ以上に大きな変化があります。それは何と、上に向かって移動しています。

Yの値に-1を代入してみます。

結果です。

今度は下に移動するようになりました。

Yの値を‐0.5に戻します。

結果です。

白い部分の長さが2倍位に伸びています。

あれ。

Multiplyノードの意味が分かって来ました。

確認のためにYの値を‐0.25にしてみます。

結果です。

更に2倍の長さになりました。

うーん。Yの謎は解けましたね。

今度はAの実装を見て行きます。

以下に示した様に上2つのノードを外してみました。

結果です。

む。枠のLineが無くなりました。

外した2つのNodeの内Multiplyノードだけを戻してみます。

結果です。

枠が出来ました。

このMultiplyノードは枠を作成しているようです。

後、今の状態だと、落下する速度がそれぞれの枠でバラバラです。

これに今外していたLerpノードを追加すると

以下に示した様に

落下速度の差がほとんど分からなくなります。

これで一応、以下のDripの実装で最も複雑な部分のそれぞれのNodeの機能を確認しました。

この知識を踏まえて、今度はTexture SampleのAからの計算の結果の変化を追ってみます。

AのImageです。

Lerpノードを掛けました。

結果です。

色がマイルドになっています。

ああ。

これでそれぞれのラインで白いヤツが落ちる速度の違いがマイルドになったんです。

Lerpしているから一番黒いのが0.25、一番白いのが0.1でその間に線形で分布されました。ので速度の違いがマイルドになったんです。もしこれがClampだったらある速度以上のヤツは全部同じになってマイルドな速度調整ではなかったはずです。

次はこっちの実装を見ます。

TextureのAのImageに

Timeを足します。

結果です。

当然1以上になるので真っ白です。

でもこれ元の値が違うので、それぞれのLineで1以上ですが違う値を示しているはずです。

確認のためにFracノードを追加してみます。

以下の様に時間が経過する値は大きくなっていきますが、それぞれのLineで値に差があるのが分かります。

この後、Lerpの結果とAddの結果をMultiplyします。

結果です。

勿論、真っ白で何が起きているのか全く分かりません。

Multiplyの後にFracを追加してその結果を見てみます。

結果です。

何と溝が出来ています。

この溝の正体がわかりました。

元々のTextureの色の濃さが変わる継ぎ目に2つの濃さが混じっている箇所が有ります。

この部分も独立して色が変わる様になったんです。

次のAddノードです。

Previewの結果です。

黄色になっています。

これAは灰色なのでRGBの値は全て一緒です。Bは以下の様になっています。

R(x軸)左端が0で右端が2です。

更にG(Y軸)は‐0.5を掛けたので、上端が0で下の端が‐0.5です。

これにAの値を足したので、黄色になったと思われます。

これだけでは何も分からないのでFracノードを追加します。

その結果です。

何これ?

上から下に移動する赤いヤツは分かりますが、右から左に移動する緑のヤツはなんなんでしょう。

右から左に移動する緑のヤツは良く見ると赤が抜けているみたいです。

赤が抜けたので黄色が緑に、赤が黒に変化しているみたいです。

赤のヤツが上から下に移動するの理由は分かりました。Fracに値をしたので、0.9999から0まで値が変化します。それで0になるとまた0.9999に戻ります。この時に真っ赤なLineが現れます。

この値がUV値になる訳です。

このTextureを見ればどんな計算するのか分かるはずです。

何これ?

だそうです。

これをX軸方向にひたすら繰り返して貼ってあったの?

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

最初は真っ黒で途中でいきなり白くなり、段々黒くなります。RGBA全て同じです。

これUの値はどれをとっても同じなのかもしれません。問題になるのはVの値でしょう。Vの値が0.99の時はこのTextureの一番下の色を抽出して、0の時はTextureの一番上の色を抽出する。みたいな事をしているんだと思います。

その結果、以下のImageが生成されていると考えられます。

うーん。

ここまで見ても以下の部分の計算の理屈を完全に理解する事は出来なかったですね。

まあ、今回はこの位で諦めてまた実力がついてから再挑戦する事にします。

3.2 Rain Drips On The Lens Post-Process Effect - Shader Graph Basics - Episode 54 [3] をもう一回だけ見る

もう一回だけTutorialを見る事にします。

これだけ勉強したのでもう一回見たらもっと理解出来る部分があるはずです。

まず、6を掛けて3を引いている箇所ですが、

Contrastを上げるために通常の2を掛けて1を引くのの代わりに使用したと言っていました。

Contrast自体は、私が実際に調べた場合も上がる事は分かりましたが、1以上の値や-1以下の値は必要なのか必要じゃないのならClampした方が良いのかなどの解説は無かったです。

次のLerpノードですが、

DripのSpeedを調節するためと言っています。

はい。

これも先程の勉強でそれぞれのDripのSpeedの差がマイルドになる理屈が判明しました。

以下のTimeとAddノードの解説ですが、

Alphaの値をOffsetに使用しています。と言っていました。

分かり易い!

こういう簡潔な説明が出来るように成りたいです。

以下のMultiplyノードの結果得られるのはDripの最終的なSpeedだそうです。

むむむ。

私、自分の説明では何と言っていましたっけ?

あれ。

でも一応、厳正な検証の結果導き出された結論なので、間違っているとは言えないとは思っています。

ScreenのサイズとTextureのサイズのScalingを調整する実装に2, -0.5 を掛けた所です。

これを掛ける事でSwim laneを適切なサイズに調整するUV値になると言っています。

うーん。

この説明は間違っている訳ではないですが、G値に何故、Negativeな値を代入するのかについての説明にはなってないですね。

以上でした。

これ以上のこの実装部分の理論の理解は自分で勉強するしかないようです。

はい。

今週のMaterialの勉強はここまでとします。

Ben Cloward先生の別のTutorialを勉強する予定でしたが、時間も無いしMaterialの勉強は十分やって満足しているので、来週に回します。

3.3 Materialの検証の記録方法について

Materialの検証を読み直して思ったんですが、どのNodeの話をしているのか分かりにくいです。

物理の教科書でも、式の数が100個とか200個載っている本はそれぞれの式に番号を振ってどの式の話をしているのか分かるようにしています。

のでこれからは、

  1. 最初にMaterial全体の実装のScreenshotを載せて、何度も使用しているNodeには番号を振る。
  2. 具体的なNodeの話をする時はLerpノードの1とか、1番のLerpノードの様に、どのLerpノードの話をしているのか分かるようにする。

をやる事にします。

更に

  1. 沢山のNodeが固まりになって一つの機能を担当している箇所は、Commentで囲み、その塊の機能について解説する

もやる事にします。

具体的にはまず全体のScreenshotを上げます。

ここに複数しようされているNodeには番号を振ります。

実際に番号を振ろうとしたら上記のScreenshotではNodeが小さすぎて名前が読めません。

うーん。

それぞれの塊のScreenshotを上げる必要がありますね。

まずそれぞれのNodeに番号を振ってしまいましょう。

以下に示した様に実際のNodeに番号を振ります。

検索機能を使用して番号を振ると抜けが無くて便利です。

Lerpノードは一個しか使用していないので今回は番号は振りません。

以下の様にそれぞれのNodeに番号を振りました。

今度はNodeをCommentを使用して塊に分割します。

本来ならば、それぞれの機能毎の塊で分割するのがBestですが、その塊の機能自体が分からないから検証するんであって、それぞれの機能毎の塊で分割する事が出来たらそもそも実装の検証なんかしません。

のでここは、Output Nodeの手前で分割しているNodeに注目して

そのNode(今回の場合はMultiplyノード1)のAに繋がる実装、

(Multiplyノード1)のBに繋がる実装、

のような分割をします。

更に先週、勉強して既にNodeの塊の機能が分かっている箇所もCommentで括ります

すると、以下の様に表す事が出来て、それぞれのNodeが小さすぎて名前が読めなくてもNodeの塊であるCommentは読めるようになります。

ここでそれぞれのCommentの実装も表示します。

Adjust Screen Size to Texture Sizeの実装です。

Aは、

に繋がります。

BはB to the Multiply Node 1内のMultiply Node 7に繋がります。

と全てのComment Boxの実装とその繋がりを説明します。

更に、以下に示した部分のようにどのComment Boxにも属していない箇所は、それぞれのComment Boxの中継地点なので

以下の様に番号を振って、

どのNodeに繋がっているのかを示します。

これを最初にやってどのComment BoxのどのNodeの話なのかが後で読んだときに直ぐに分かるようにします。

4.RPGEventの作成

4.1 Widgetのテスト

今週は以下の事を試してみます。

取りあえず今回はテストなので、別なProjectで試してみます。

Widgetを一時的に透明する>

今、開いているWidgetを透明にして新しいWidgetを開きます、そしてそのWidgetが閉じた時に前のWidgetの透明を解除して元に戻します。

こんだけです。

でもこれが出来るのかが分かりません。

まず結果言うと出来ました。

以下のWidgetが表示されています。

Visible Buttonを押すと、今まで開いていたWidgetが透明になって以下に示した新しいWidgetが開きます。

Close Buttonを押すと

このWidgetが閉じて、前のWidgetの透明が元に戻ります。

正し、私が最初に想定していた実装方法よりかなり複雑な方法が必要でした。

その実装方法を解説します。

Widgetを透明にするにはWidgetのVisibility をCollapseにセットすれば良いはずです。

所が、Widget内からそのWidgetそのもののVisibilityを変更する方法が見つかりません。

これ今回は諦めて別な方法を採用しましたが、この方法が判明したらProgrammingの複雑さが一気に改善する可能性が高いので、来週また検討してみます。

それで以下の方法で実装しました。

まずGame Mode 内に、

Event Dispatcherを作成します。

これを使用して最初のWidgetのVisibilityをControlします。

まずLevel BPの

で最初のWidgetを表示します。

その後で先程作成したEvent Dispatcherを今作成したWidgetのVisibilityをCollapseに変更するEventにBindします。

先程Level上で生成したWidget内のButtonをClickすると

以下の実装が実行されます。

ここで先程、作成したGame ModeのEvent Dispatcherを呼び出します。

これでこのWidgetそのもののVisibilityを変更しています。

その後は、新しいWidgetを生成したりとか、WidgetのVisibilityを変更する変数の変更とかの細かい実装をやっています。

4.2 Widget内からそのWidgetそのもののVisibilityを変更する方法が見つかりました

何と、Set VisibilityノードにSelfとセットしたらWidgetそのもののVisibilityにaccess出来ました。

前、試した時は出来なかったんです。

これで、Game Mode BPを通さないでWidgetを透明にする事が出来る様になりました。

後から開いたWidgetが、透明なWidgetAccessして透明なWidgetのVisibilityを変更する方法が必要です。

それも以下の方法で簡単に達成出来ました。

2番目に生成するWidgetWidgetの変数を作成します。

その変数の設定を以下の様にして

2番目のWidgetを生成する時にはParameterとしてその変数の値をPassしなければならないようにします。

そこにSelfを使用して最初の透明になったWidgetをパスします。

これで出来るはずです。

実装しました。

テストします。

Collapse Buttonを押します。

Closeボタンを押します。

はい。出来ました。

こっちのやり方は非常に簡単で、しかも透明になるWidgetのClassが何であってもWidgetである限り普通に使用出来ます。汎用性も最初のやり方より高いです。

来週、このやり方でEventの終了を表示するWidgetを追加します。

5.Open Worldの検証

今週は以下に示した様に、

Assetにある建物を見る事にします。

5.1 Assetにある建物で建物の内側も作成出来るものを探す

<Infinity Blade

Infinity Blade Seriesから見て行きます。

DownloadしたInfinity Bladeは以下のモノがありました。

これらから確認します。

<<Castle>>

まずInteriorDemoから見てみます。

イキナリ部屋の中です。

これ位作成できるなら十分ですね。

でもちょっと歩いたら底が抜けて落ちてしまいます。

これはワザとそういう風に作成しているのかもしれませんがどうなんでしょうか?

以下のLevelは最初のヤツとほとんど同じですね。

以下のLevelは

城の外側を示しています。

何かMannequinが浮いています。

この城のBPを開いたら以下の様になっていました。

何とこの城、3つのStatic Meshから作られています。

その内の一つです。

これは遠くに設置する分には良いかもしれませんが、城の中を歩くためには作られてはいませんね。

以下に示した様に後ろ側は作成していません。

このAssetにある全てのMeshが見たいですね。

以下のLevelを開くと

このAssetにある全部のStatic Meshがありました。

これ全部、内側が無いか、外側が無いです。

うーん。

これが当たり前なんでしょうか?

他のAssetも見てみます。

<<Hideout>>

です。

以下のMapがありました。

最初のDemoMap1を開いて見ます。

こんな感じです。

一寸歩いて見たら裏面側に出ました。

裏面は全く作成されていませんでした。

次のMapですが小さすぎてMannequinが動けません。

うーん。多分Infinite Seriesは全部、私の目的である内側のある建物を作成するためのはかなり改良でもしない限り役に立たないでしょうね。

別なのを見ます。

<City of Brass: Environments

これを見てみます。

以下のMapがありました。

Demo Gardensを見ます。

これは名前の通り庭でした。

しかしどこまで移動してもStatic Meshが崩壊している箇所は無かったです。

多分ですが、これは城や町の中庭や広場を作成するのに使用出来ます。

ただ屋根は無いみたいです。

あくまでも庭の作成のためのAssetですね。

以下に示した様に沢山のStatic Meshがありました。

後ろから見てのしっかり作られています。

City of Brassは内側まで作る必要がある建物の作成に使えるAssetかもしれません。

一寸、Marketにもっとないか調べて見ます。

建物は無いですね。

<Fantasy and Medieval Architecture

今度はこれを見ます。

以下のMapがありました。

Demonstrationを開いてみます。

警告が表示されました。

このAssetには近づかない方が良いかもしれませんね。

Static Mesh自体はしっかり作成されているみたいです。

中身もしっかり作られています。

Static Mesh自体は使えそうです。

<Fantasy Cave Environment

以下のMapを見てみます。

神殿の入り口です。

実際に神殿の中に入れました。

神殿の天井がどうなっているのかは分かりません。

Static Meshは以下のものだけでした。

ただし裏側もしっかり作られていました。

<Greenwood Fantasy Village

このAssetにある家は中身が無いです。

私が今必要としているAssetではないです。

<Low Poly Medieval Interior

Mapがいっぱいありました。

取りあえずMap1を開いて見ます。

凄い細部まで作り込まれています。

うーん。裏側は作っていませんね。

これ表側を2枚重ねて作成しているんでしょうか?

Map1で確認したら裏側は透明になっていました。

これLow Polyじゃなかったらかなり良かったです。

<Medieval Castle Modular

これを見てみます。

何これ?

写真。

凄い本物そっくりです。

でも城がないですね。

ProjectがCrashしてしまいました。

このAssetは私のPCでは重すぎるみたいです。

建物のStatic Meshもありました。

中身も完璧です。

別なMapを開いて見ます。

これは城の城壁でしょうか。

屋根がないですね。

<Modular Fantasy House

以下のStatic Meshがありました。

これ、中身のある家作れますね。

あんまり沢山のAssetを一辺に見たので頭がくらくらして来ました。

今週のAsset探索はこれ位にしておきます。

来週、今週見た内容を整理してもう一回まとめ直す事にします。

6.Gaeaの勉強

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

今週は先週終わらなかったTextureの実装の続きを最初にやっていきます。

6.1 雪のTextureを追加する

Combineノードを追加します。

そしてPort、Snowfall-Snowをinput 2に接続します。

雪が表示されません。

これは前のCombineノードがPin付けされているからで、Fを押す事でPinを移します。

結果です。

Combineノードの設定を変えるのも忘れていました。以下の様にしました。

結果です。

雪の色付けには以下に示した様なWaterの設定で行ったような色の指定とMaskの指定は無いんですね。

比較すると以下に雪の指定が簡単か分かります。

この部分が先週も、そして先々週も理解出来なかったんです。

まあ、今回は一寸気合い入れて見直したので、一発で理解出来ました。

ここまでで先々週までに勉強した箇所の実装が全部終わりました。

またKlaus氏のTutorialの続きをまとめます。

6.2 How To Create An Open World Snow Landscape | Unreal Engine 5 Tutorial [4]の続きを勉強する

ここまでで大まかなColoringは終わりました。

これからは細部の塗装をFlowを使用してやるそうです。

まずSatMapsノードを生成してTexture Portalを繋げます。

このTextureと言うPortal作った記憶がないんですが、まあ実装する時確認します。

結果です。

このSatMapsノードの結果と前のCombineノードの結果をCombineノードを使用して混合します。

GaeaでもCombineノードを大量に使用しているので、Blogで記録するとどのCombineノードをどのCombineノードで混合するのか全く分からないですね。

この点、YouTubeのTutorialは止めて巻き戻して確認すれば良いので便利です。

いずれTutorialと言うか学習教材は全てVideoになるんでしょうね。

新しく追加したCombineノードの設定は以下のようにしていました。

結果です。

更に今作成したCombineノードのMaskにFlowノードを接続します。

このFlowノードにはPort、FTを追加します。

以下のImageを表示するヤツです。

これだと少し強すぎるので、以下に示した様にFlowノードのShaperの値を下げます。

こんな感じになりました。

この結果を次にCombineノードに繋げます。

このCombineノードはWaterの管理をしているヤツですね。

こんな結果になりました。

ここでStep 2が終わりました。

Step 3が始まります。

Step 3は何をやるんでしょうか?

2022-08-14のBlogからKlaus氏のHow To Create An Open World Snow Landscape | Unreal Engine 5 Tutorial [4]の勉強を始めました。

その時にそれぞれのStepで何を勉強するかまとめた記憶があります。

調べたら、以下に示した様にKlaus氏がまとめたのをそのまま写したのがありました。

これを見るとExporting Masksとあります。

UEで使用するためにMaskをPngでExportする為の設定をやるみたいです。

上のStep 3の画面のどこかにExporting Masksって題を入れて欲しかったです。

まず以下のFlowノードをExportとしてMarkします。

どうやってMarkするのかの説明は無いです。

今度はSlopeノードをExportするためにMarkしました。

茶色のPinが付きました。

そういえば先程のFlowノードにも茶色のPinが付いています。

次はBase Shapeに戻ってRiノードにMarkしました。

川のMask用です。

次にSnowfallノードにFxノードを追加して、名前をSnノードに変換してMarkします。

この茶色のMarkを付ける方法が分かりました。

Nodeを選択した状態でF3を押します。

もしくは右Clickだそうです。

これでSnowfallのMaskも出来ました。

これで、Erosion、Snow、そしてRiverのMaskが出来ました。

LakeのMaskがありません。

LakesノードのLakesにFxノードを付けてMarkします。

Fxノードの名前はLake Maskに変更しました。

これだとLakeのDataはRiverも含むんじゃなかったでしたっけ。

ここでKlaus氏のMaskの生成についてのAdviceがありました。

一寸でも必要かなと思ったらMarkしてMaskにしておけ。だそうです。

後からMaskを生成し直すのか結構手間だそうです。

はい。

更にその後で、万が一、後で必要なMaskをExportするのを忘れた場合、全部をRebuildするのではなくHeight Mapを使用して必要な部分だけRebuildする方法などを解説していました。しかしこの説明だけでは具体的にどうやるのかまでは分からなかったです。

次はMaskのBuildについてです。

Build画面を選択します。

BuildするMaskのFormatがPng8である事を確認します。

Tutorialの説明ではMask MapにはPng8、Height MapにはPng16 を使用するそうです。

私は2022-08-01のBlogで述べたようにHeight Mapにはr32を使用しようと思っています。

その理由は、

と考えているからです。

まあ、これは実際に試してみないとこの考えが正しいのかどうかは分かりませんが。

Tutorialでは以下の3つのFormatをPng16 に変更しました。

以下の設定は今回は弄らなかったです。

そして

Build Buttonを押しました。

以下のImageが生成されました。

これでExport Maskは終わりだそうです。

今度はStep 4です。

以下の図によるとStep 4では

Landscape Materialの作成を行うようです。

うーん。

Gaeaの勉強とはあんまり関係ないですね。Landscape 用のMaterialの作成は、Unreal Sensei氏のTutorialで散々勉強したので敢えてここで勉強する必要あるかな。と思っています。

一応、見るだけ見て実際に実装するかどうかは後で考えます。

ここで以下のMaskが突然現れます。

うーん。これは何?

でもLandscape用に作成したMaskは以下のモノだけです。

一応、これらのMaskはDownload出来るそうです。

Landscapeを作成するための画面に移動します。

ここに表示されているMaterialは何処から持って来たんでしょうか?

そのMaterialの作成方法を今から解説するみたいです。

アー良かった。

Materialを開きLayer Blendノードを追加します。

以下の4つのLayerを追加しました。

Main NodeのUse Material AttributeにCheckを入れて

Main Nodeを以下の様にしました。

そしてMain NodeとLayer Blendノードを繋ぎました。

更にそれぞれのLayerとMake Material Attributeノードを繋ぎました。

この辺はLandscape用のMaterialの作成の基本中の基本なのでさらっと行きます。

Mega ScanでDownloadしたTextureをそのまま使用するそうです。

LandscapeCoordsノードの説明で

Mapping Scaleを1009にセットするそうです。

すると、このTextureはLandscapeに対して一回しかApplyされないそうです。

うーん。

知らなかった。

これ文字通り解釈するとTilingが起きないと解釈出来るんですが、そう言う事なんでしょうか?

もっと詳しい話が知りたいです。

ここでTipです。

これらのTipは知っています。

あ、成程、以下の様にしてTilingのサイズを決定していました。

そりゃ、Texture一枚をLandscapeと同じ大きさに拡張したらとても変なLandscapeになります。

当たり前と言えば当たり前でした。

以下に示した様に実装をしました。

これでLandscape用のMaterialの解説は終わりでした。

ここでStep 4はお終いでした。

キリが良いのでここで終わりにします。

7.雪山のMapの作成

7.1 Dynamic Volumetric Skyを使ってみる

何と今月のFree for the MonthにVolumetric Cloudらしきものがありました。

しかもこれ非常に評価が高いです。

突然ですが今週はこれを勉強する事にします。

Example Mapを開きます。

こんな感じでした。

あれ、Volumetric Cloudは使用されていませんね。

BP Dynamic Volumetric Skyが使用されています。

中身を見てみます。

Volumetric Cloudとは書かれていますが、

とは全く違うものですね。

うーん。

これは私が思っていたのとはかなり違いますね。

BP Dynamic Volumetric SkyのDetailを見ると

色々なParameterがあります。

Materialは無いです。

うーん。

Volumetric Cloud用のMaterialはこのBPでは使用していないんでしょうか?

でもこの雲はVolumetric Cloud用のMaterialを使用しないと作成出来ない気がします。

BP Dynamic Volumetric Skyの実装を見ると

DensityとかCloud Top OffsetなどのVolumetric Cloud用のMaterialのParameter名としか思えないものが沢山あります。

このMPC_Cloudを見ると

Material Parameter Collectionなんです。

じゃ、このParameterを呼び出しているMaterialがあるんじゃないと探したら、ありました。

M_ New Volumetric Cloudsです。

このMaterialを開くとまずVolumetric Advanced Outputを使用していました。

はい。もう間違いないです。これがVolumetric Cloud用のMaterialです。

因みに先程のMPC_CloudのDensityやCloud Top Offsetの値もここで使用していました。

ではまず、3d Textureを使用しているのかを調べます。

無かったです。

雲用の3d Textureは以下の9種類しか持っていないので増えたらうれしかったんですが、無いですね。

M_ New Volumetric Cloudsの実装を見てみましょう。

まずはMain Nodeです。

これはVolumetric Cloud用のMaterialの設定ですね。

以下に示した様にMaterial DomainがVolume、Blend ModeがAdditiveになっています。

一番興味のあるExtinctionの実装から見てみます。

Cloud Sample Attributesノードが使用されていました。

先週のBlogや2022-08-14 のBlogに書いていますがUE4: Step-by-Step to Creating Your First Volumetric Cloud Material [5]でCloud Sample Attributesノードについて勉強しました。

Norm Altitude in Layerは雲の底を0、雲のTopを1で返すはずです。

それをここで使用する理由はあんまり分かりませんね。雲の底を薄くしたいんでしょうか?

その先にはExp Densityという

Customノードが使用されていました。

そのCustomノードの実装です。

うーん。

ExpなんでContrastを上げているだけだと思うんですがy=1-e^(-x)がどんなGraphになるのか分からない。

Graphにしました。

うーん。

あんまり0~1で綺麗な変化していませんね。

xの値を10まで増やしました。

はい。

今度ははっきり分かりました。

1に収束するんですね。この式は。

これ見ると0~4までがまあ値として有効でそれ以上大きくなるとほとんど変化しないみたいです。

その先を見るとMain Cloud Alphaと言うCustomノードがありました。

中を見るとゴリゴリのHLSLが書かれています。

ただしOutputはFloat一個です。

Descriptionを読むとMain Cloud Alphaと書かれているので

ここは雲のAlphaを計算している所と解釈しておきます。

その先はMain Cloud AlphaノードのParameterでお終いでした。

うーん。

これじゃどうやって雲のDensity(Extinction)を計算しているのか分かりませんね。

Main Cloud AlphaノードのHLSLが全ての計算をやっています。

でもこんだけ理解出来たら今週は十分です。

もう少しVolumetric CloudのMaterialの実装に詳しくなったら、このMain Cloud AlphaノードのHLSLの実装を勉強する必要がある時が来るでしょう。

今回はこの辺は終わりにします。

7.2  Volumetric Cloud Materials - Building Worlds In Unreal - Episode 33 [6]の検証

先週は、Tutorialをしっかり見直しました。

今週は、先週出来なかった以下の実装部分を検証します。

これはVolumetric Advanced OutputのConservative Densityの実装です。

まずこの実装で解明したい事は以下の雲の形状が

この実装の以下のTexture Sampleにセットされている

以下のTextureから生成されている所です。

なんで雲の形状をZ軸に沿って決定出来るのかが不思議です。

この謎を追います。

まずConservative Densityの機能についてです。

うーん。

何言っているのか分かりません。

以下のTextureを作成して

これと

交換してみました。

になりました。

確かに変化しました。

ただ完全にTextureと同じ形状になったとは言えないですね。

今度は以下の形状にしました。

雲の上の部分を消しました。

結果です。

確かに雲の上の部分が消えています。

うーん。良く分かりません。

他の所から検証します。

このCustomノードは簡単でした。

Densityの値を返していただけです。Norm Altitude は雲の下底で0、上底で1になります。

ので雲の間だけ0以外の値を返すようにしています。

この部分が何故雲の縦の形状を計算するのかはまだ分かりません。

以下のTexture SampleのUV値を計算している部分を見ます。

最初のAddノードはOffsetの値でしょうね。500000.0 cm なので5 km 離れた位置という事でしょう。

次のRGのMaskは使用しているTextureが2dなのでUVしか要らないからでしょう。

その次のWeatherUVScaleは 0.0005を2回掛けています。これはcm^2と言う意味ではなくてUEのInputが小数点5桁?以上は0と認識するためこのような処置を取ったと考えられます。

2.5e-7で割っているので、4000000を掛けている事になります。1cmが40kmになっています。

このTextureの設定を

Clampにしてみました。

すると

以下の様な雲の形状に変化しました。

Wrapの時は以下の様になっています。

WeatherUVScaleの値を 0.0004にすると

雲が大きくなっています。

WeatherUVScaleの値を 0.0006にすると雲が小さくなりました。

この辺は普通のTextureとUVの関係と全く同じです。

この部分の実装は結局はサイズの大きいTextureを扱っているだけで普通のUV値の扱いと全く同じです。

後は以下の部分だけが分かりません。

ああ、分かった。

Cloud Sample AttributeのNorm Attribute Layerは雲の上底で1、雲の下底で0を返します。それのOne Minus値がUV値のV値になっています。

つまりこのTextureのY軸の値は雲の縦の値に一致しています。

これはVoxel毎にその値を計算しているです。

VoxelなのでXYZの位置があります。

このzの値を表しているのがCloud Sample AttributeのNorm Attribute Layerなんです。

だからこのTextureは雲の上下の形状を決定するんです。

一から説明し直します。

この実装では雲のVoxel値を以下の2つのTextureの値から決めています。

まずそれぞれのVoxelには位置がありxyzで指定されています。この実装ではそれぞれのVoxelのxyzの値をUVとして使用して2つのTextureから値を抽出してそれを掛けた値をそれぞれのVoxelの値として決定しています。

まず最初のTexture 、Texture Sample1ですが、VoxelのXYの位置の値を使用してUV値を決め、そのUV値に基づいてそのVoxelの値を決定します。

ここで使用されるのはTexture Sample1にあるTextureのRの値です。

これです。

だから雲を上から見るとこのTextureと全く同じ形をしているんです。

次に、XYの値をUVとして使用した最初のTextureのGの値をU値、

そしてWの値、つまりCloud Sample AttributesノードのNorm Attribute Layerの値をV値として

以下に示した2番目のTexture Sample、Texture Sample2の値を抽出します。

Texture Sample 2にセットされているImageは以下のヤツです。

ここでPointなのはGの値がU値になる事で、Gが白い部分に雲を生成したい場合、

以下の様にUの真ん中に白い線を引いたのでは駄目で

以下の図のようにUの値が1の所を白くする必要があります。

これだったらTable上の雲が出来るはずです。

はい。出来ました。

そして最後にこの2つ目のTextureの値と一つ目のTextureの値を掛けます。

これがこのVoxelの値になります。

今週のVolumetric Cloudの勉強はここまでとします。

7.3  Volumetric Cloud Materials - Building Worlds In Unreal - Episode 33 [6]のまとめ

遂に以下の部分の実装が何をやっているのか判明しました。

この部分のPointは以下の2つです。

  • ここではそれぞれのVoxelの値を計算している。
  • それぞれのVoxelの位置はxyzで表される。このzの値をCould Sample AttributesノードのNorm Attribute Layerは返している。

この2つが理解出来ると残りの計算も何を計算しているのかとか、何がParameterになっているのかが分かります。

雲の計算は全てvoxelを計算しています。なので本来は3d Textureを使用して対応すべきです。しかしその代替策として2枚のTextureを使用して一枚をXY、もう一枚をzの値に対応するようにしたのがこの実装だったのです。

そのためには2枚目のUの値を一枚目のGの値で指定する必要があります。

これがこの部分の実装を理解するのを非常に難しくしていました。

Could Sample AttributesノードのNorm Attribute Layerは雲のZの値に比例した値を返してくれます。ので雲のzの値を指定する時に使用するんです。

他のVolumetric Cloud用のMaterialにCould Sample AttributesノードのNorm Attribute Layerが出て来た時は、この事に注目する事にします。

8.UI Designの勉強

UI Designを直して行きます。

に変更しました。

残りは完成したUIだけ貼っておきます。

以上です。

9.Anime Renderingの勉強

9.1 今回の予定

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

9.2 今週の予定

今週でAnime Renderingの勉強は10回になります。

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

PPLineDrawingの勉強に関してはその後のOriginalの輪郭線をPostprocess 用のMaterialで作成するとこまで予定に入っています。ので半分しか終わらなかったとも言えます。

しかしこれは見通しが甘すぎでした。輪郭線の抽出方法を理解する事はそんなに簡単ではなく、実際、今でもNormal Vectorの差分を取るのにDot Productを使用する方法なんかはあんまり理解していません。

のでこの辺に関しては計画を作り直して、残りの課題をやって行こうと思います。

次の課題は、Originalの輪郭線Materialを作成するためにアニメ調の3d ModelをUEにImportする方法を勉強する事です。

先週、以下のModelをVroidを使用して作成したので、今週からはこのModelをUEにImportする方法を勉強しようと思います。

夏森轄(なつもりかつ)先生の【Blender】セルルック講座 ~ノード、輪郭線、法線転写、RGB分離~[8] の勉強は大体予定通りでしたが、法線転写に関してUEでも出来るのかが分かりません。これについての調査をします。

公式のDocumentのStylized Rendering[7]の勉強はまだ勉強する箇所が沢山あるのでこれからも継続してやって行きます。

来週からの勉強の予定は

  • Vroidで作成したModelUEImportする
  • 公式のDocumentStylized Rendering[7]の勉強
  • 法線転写をUEで実装する方法を検証

を勉強する事にします。

ので来週からの題はアニメレンダリングの勉強にします。

9.3 Vroidで作成した3D ModelをUEにImportする

色々調べたらUEにはVRM4Uと言うPluginを入れるとVroidで作成したModelをUEにImport出来るみたいです。

VRM4Uを使用しない場合はBlender経由でUEにImportする方法もあるみたいです。

VRM4Uで検索したら公式のサイト[9]が見つかりました。

このサイトを参考にしながらやってみます。

取りあえず4.27でやる事にします。

をDownloadしました。

Vroidを動かすための専用のProjectを作成する事にします。

名前はImportVroidにします。勿論Versionは4.27です。

Downloadしたら勝手に解凍してPluginsというFolderが生成されました。

のでそれを以下の場所に配置しました。

Projectを開いてPluginsを確認するとVRM4Uがありました。

EnabledにCheckを入れてProjectを再起動します。

結構ドキドキして来ました。

先週作成したVroidをImportしました。

あ。出来てる

こんな設定があるんですね。Vroidを作成した時は全然知らなかった。

T-poseでImportしたいんで以下のCheckは外します。

Importしました。

思っていたより本格的です。

Level上に配置しました。

陰が結構綺麗に出ていますね。

太陽光の向きを変えてみました。

陰は綺麗に移動しています。

うーん。

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

来週は、このImportしたModelのMaterialなどを検証する事にします。

9.4 公式のDocumentStylized Rendering[7]の勉強

先週の続きをやって行きます。

先週は以下の実装部分を検証しました。

これがWorld SpaceにおけるそれぞれのPixelの位置を表している事が分かりました。

しかしそれならWorld Positionと同じじゃないのかと思い

試してみると、World Positionの方が値のばらつきが大きい事が分かりました。

この違いって重要なんでしょうか?

更にObject PositionノードだとこのMaterialを使用しているObjectの中心を返してくれます。

これとの違いは何かあるんでしょうか?

今週は、これらの検証をします。

更に、

についても検証します。

<Stylized Renderingにある実装、World Position ノードの値、Object Positionノードの値の検証>

先週実装した以下のMaterialを使用して検証します。

まず先週の確認ですが、Pivot Pointが(0,0,0)の時は、

World Spaceの原点を中心にして回転します。

だからObjectを原点に配置した場合は

回転しません。

良く見ると陰は回転しています。

今度は実装を以下の様に変更します。

大体想像付きます。

ObjectがWorld Spaceのどの位置に配置されても、そのObjectの位置でMaterialが回転すると推測されます。

Objectを

に配置してテストします。

はい。

Materialは回転しません。だたし陰がObjectの回りを回転しました。

丁度、Pivot Pointが(0,0,0)の時にObjectを原点に配置した場合と同じです。

これがLevel上どこに配置しても起きるようになりました。

ここまでは分かりました。

Pivot Pointなんだから軸の点を指定している訳で、理屈としても納得出来ます。

でもそれならWorld PositionやObject Positionでも同じ事が出来るんじゃないのか?という疑問が生まれます。今度はこれを検討します。

まずWorld PositionをPivot Pointに使用した場合です。

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

Rotate About AxisノードのPositionにはWorld Positionをパスしています。

更にPivot PointにもWorld Positionを与えたら、全く回転しなくなりそうですがどうなんでしょうか?

全く変化がないです。

それでは今度はObject Position ノードを使用してみます。

結果です。

これは陰は回転しています。

ここまでやったらPivot PointとそれにPassするInputの値の関係性に気が付きました。

Pivot Pointは文字通り、回転する軸の点です。

それでここがポイントなんですが、この軸、Pixel単位で指定出来るみたいです。だからWorld PositionをPivot Pointに使用した場合、それぞれのPixelでそれぞれのPixelが軸になって全く陰が動かなくなりました。

Object PositionノードをPivot Pointに指定した場合は、Object上に貼りつけられたMaterialの全てのPixelの軸がObject Positionになりました。なのでその点を中心に回転しました。

以下の実装の場合は、

値に多少のばらつきがありますが、ほぼObject Positionに近い値に収束しているので、Object Positionと同じ結果になりました。

この結果からRotation About Axis ノードのPivot PointにはObject Positionを使用するのが一番理に適っていると思いました。

Object PositionがStatic Meshの中心に無い場合は、その分調整してPivot Pointにパスすれば良いんです。

ので、以下に示した実装を

敢えて行うより、Object Positionを使用した方が良いとの結論になりました。

<TexCoord[2]とTexCoord[3]の違いについての検証>

TexCoord[2]とTexCoord[3]の違いについて検証します。

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

結果です。

TexCoord[2]とTexCoord[3]をTexCoord[0]に変更しました。

結果です。

全く同じ結果になりました。

この結果から少なくともObjectの位置を計測するために使用されたTexCoord[]は0でも2でも3でもまったく同じであると言えます。

以上です。

9.5 法線転写をUEで実装する方法を検証

Historiaさんの[UE4] 動的法線転写について[10]にそのままやり方が載っていました。

軽く読んだだけですが、このBlogに書かれている事をやれば出来そうです。

英語圏のTutorialも調べてみます。

無かったです。

まずNormal Transferで調べたんですが、そんな英語は存在してないです。

で法線転写の英語名が分からないのでDeep Lで調べたらNormal Vector TranscriptionとかNormal Transcriptionとか出て来ました。

なのでNormal Vector TranscriptionとNormal Transcriptionで検索したんですが、これどうやら生物学の専門用語で全く同じ言葉があるみたいで、それしか引っかかりません。

というか法線転写という技術が日本発祥なんだと思います。

はあ。

凄い。

アメリカ一強の3D Graphicsの世界に日本独自の技術が食い込むのを目撃する日が来るとは。

いや。中国の技術って事は無いでしょうね。

一応、Googleで検索した限りでは法線転写で中国語の結果は表示されませんでした。

日本独自の技術で間違い無いでしょう。

やっぱりこれからの日本の生きる道は、こういうアニメ風のRenderingで作成したGameをアメリカに売る事だと思います。

これならどんなに円安になってもやって行けますね。というか円安の方が特になります。

それで、実際のUEにおける法線転写については来週から勉強します。

Blenderの勉強はどうするの?>

これ考えてなかったです。元々Blenderの勉強をするための枠だったのがUEに戻ってしまいました。

このままだとBlenderの勉強全くしなくなりそうです。

夏森轄(なつもり かつ)先生のTutorialのどれかをやる事にします。ただしこれはUEにおける法線転写の勉強が終わってからやります。

以上です。

10.まとめと感想

今週も途中で時間がなくなってしまいました。今週出来なかったところは来週やります。

11.参照(Reference

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

[2] CGHOW. (2022b, June 11). UE5 Niagara #ScratchPad Module #7 | Grid and Brick Pattern [Video]. YouTube. https://www.youtube.com/watch?v=lO-phNUx_aw&list=PLwMiBtF6WzsqfBv2rYkHe93Whx5AY1u6o&index=7

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

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

[5] WorldofLevelDesign. (2021, February 16). UE4: Step-by-Step to Creating Your First Volumetric Cloud Material [Video]. YouTube. https://www.youtube.com/watch?v=aYxvN5cs-EU

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

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

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

[9] Harube, R. (n.d.-b). VRM4U. VRM4U. Retrieved September 11, 2022, from https://ruyo.github.io/VRM4U/

[10] 株式会社ヒストリア. (2022, June 30). [UE4] 動的法線転写について. Historia Inc - 株式会社ヒストリア. Retrieved September 11, 2022, from https://historia.co.jp/archives/11921/

「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/

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

<前文>

<バイデン政権が320億ドルの学生ローンの免除を決定した件>

私は、バイデン政権が誕生した時、学生ローンの免除こそが今のアメリカに必要な政策で、それをしないバイデン政権は2~3年の内に国民の支持を失う。と予測しました。

しかし私の予測に反してバイデン政権は320億ドルの学生ローンの免除を決定しました。320億ドルと書くと日本人にはどのくらいの金額かピンと来ませんが1ドル136円で計算したら、約4.38兆円です。これを免除したんですから金額的には凄いです。

今週はこれについて書きます。

しかし時事問題について書いてもBlogに貼る時には、1~2週間後なので、既に話題性が無くなってしまうのでもう少しだけ恒常性のある話をします。

先週、前文に一寸だけ書いたBind とProtectですが、これ実は思っていたより深い話だったので、それにFocusしつつ、320億ドルの学生ローンの免除が与える影響について深堀したいと思います。

後、競争原理の原則の観点からも320億ドルの学生ローンの免除が与える影響について深堀したいと思います。

まず金額は凄いんですが、これ良く記事を読むとITTというほとんど詐欺みたいな大学が有って、その大学を卒業するとEngineerとして働けると言う宣伝にのってその大学にローンを組んで沢山のアメリカ人が通ったそうです。

しかし実態はその大学はアメリカの大学の基準をクリアしておらず、その大学で取った単位は全く認められず、卒業してもEngineerとしての仕事を得る事は全く出来なかったそうです。

この辺はあんまり良く分からないんですが、その大学がどうも全米にあってその被害者の数が物凄く多いみたいなんです。

それでその被害者を救済するために320億ドルの学生ローンの免除を組んだそうです。

この辺がどの程度、正しい情報なのか今の時点ではあんまり良く分からないんですが、一応これが正しい前提で話を進めます。

これ、一見凄い国民のためを思った政策のように見えますが、Engineerとして就職出来ないんじゃ、結局学生ローンを借りた人は借金を返す事は出来ません。ので最終的には自己破産するしかないです。そう言う人達の借金を免除する事は一見優しい事に見えますが、結局返ってこないお金をあきらめただけとも言います。

更に、そんなアメリカの基準で大学と認められない大学に通う学生に、国がローンとしてお金を貸したと言うのは、見方を変えれば国が詐欺の片棒を担いでいたわけです。

それを止めたからと言ってそんなにスゴイ事なんでしょうか?

もう一つ言いたい事があります。

それはバイデン政権が誕生した時、学生ローンの免除こそが今のアメリカに必要な政策である。と言ったのは先週話したBindとProtectの欺瞞性を見抜く能力が大学教育を受けている間に身に付くからです。

もう一度、Bind とProtectの関係について分かり易くここでまとめます。

法律を決めたり、施行したりすると全員がそれに従う必要がありBind(束縛)を負担する必要があります。ただしその結果、Protect(保護)の恩恵も受けとる事が出来ます。

分かり易い例が信号です。

みんなが赤信号では止まる。青信号では進む。を守るBind(束縛)を負担する必要が生まれます。その結果、青信号で交差点を渡っても安全であると言うProtect(保護)も受けとる事が出来る訳です。

ではこの法律は公平なのかと言うと、そうではないんだそうです。

信号機が、上流階級の人が交差点に来た時は常に青になる。と設定すると、上流階級の人達はProtect(保護)の恩恵だけを受けて、赤信号で止まるというBind(束縛)を負担する必要が無くなります。逆に一般国民は赤信号で止まる。というBind(束縛)だけを負担して、青信号で安全に渡ると言うProtect(保護)の恩恵を受ける事が出来なくなります。

これがBindとProtectの欺瞞性だそうです。

つまり法律が良い法律なのか悪い法律なのかを見定める為には、その法律が施行された時のBind(束縛)とProtect(保護)を見定めてその負担とその結果得られる利益が平等であるかどうかが大切になってくるんだそうです。

この立場から今回の320億ドルの学生ローンの免除を見ると、ウーン。と言わざるを得ません。

Law Schoolには沢山の学生ローンを抱えながら通う生徒がいます。彼らは法律の専門家ですから。上記のBindとProtectの欺瞞性を見抜くのは簡単でしょう。しかし彼らの借金は免除しないみたいです。となるとそういう借金しながらLawyerになった人達は借金を返すために、トランプ元大統領のような大金を支払う人のために働くしか選択肢が無くなります。

となると彼らは、BindとProtectの欺瞞性を見抜いてその是正のために働くのではなく、逆にもっと上流階級が得になるようなBindとProtectの欺瞞性を助長するために働かざる得なくなります。

これ、私が言っていた学生ローンの免除とは一寸違う事をしている気がしますね。

更に、競争原理の原則の観点からも語りたいと思います。

競争原理の原則は、結果だけ求めてその結果に相応しい報酬を払う。誰が達成したとか、どんな方法で達成したのか、については問わない。結果だけで判断する。を導入してみんなに公平な競争を約束している限り、資源がなくてもどんな辺境でもその国は発展すると言う原則です。

これは、別にどこかの本に書かれている訳ではないですが、井沢元彦氏の逆説の日本史の言霊思想位の真実をついていると思われるので、いつも使用しています。

因みに、以下の話を聞いた時、思い付きました。

アメリカ南部の奴隷を使って生産した綿ってとても生産性が悪く、これだったら普通に給料を払って農家毎に競争させた方がもっと綿を生産出来たそうです。

これって奴隷たちは別に綿を沢山生産したからと言って得になる訳ではないからです。だから頑張らない事に頑張る訳です。

これって今の日本とそっくりです。

頑張らない事に頑張る。

例えば、この前有ったキャンプ場の行方不明事件、警察官が3000人位動員されたらしいですが、見つかりませんでした。その後、捜査していない場所から遺体が発見されたみたいですが、なんでそんな無能なんでしょうか?

それは、この動員された警察官たちは別にここで頑張って行方不明の子を見つけたとしても何も得るものがないからです。

昔のアメリカの南部の奴隷といっしょなんです。頑張っても無駄だから頑張らないんです。

これを3000人の人達の前で行方不明の子を見つけたら一千万円上げます。やり方は問いません。自由にやって下さい。ってやったら直ぐに行方不明の子は見つかったはずです。

しかしそれはやらない。

競争原理の原則が働くと上流階級の人達も競争せざる得ないからです。競争したら、上流階級の人も負ける事になるからです。

しかし余りにも競争原理を無くすと、誰も頑張らなくなって国が弱くなり戦争に負けて上流階級の人達も最後には滅ぶ事になります。

アメリカの南部の奴隷主達も南北戦争でボロクソに負けて死んだか、生き残っても子孫代々、奴隷を使っていた恥すべき人達というレッテルを永遠に貼られる羽目になってしまいました。

この競争原理の原則の観点から、今回の320億ドルの学生ローンの免除を見ると、やっぱりLaw SchoolやMedical Schoolに通う学生のLoanを免除して初めて競争原理の原則が働く事になると考えられます。

ので、この点から見てもあんまり評価は出来ません。

まあ、そうは言っても、320億ドルの学生ローンの免除はする訳ですから、それなりには凄いかもしれませんね。

この辺の評価は後でもっと情報が出てから検証し直してみようと思います。

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

<本文>

1.今週の勉強について

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

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

2.Niagara: CGHOW氏のTutorialをやる

今週はScratch Padの勉強としてUE5 Niagara #ScratchPad Module #3 | Spawn Count on Owner Scale [1]をやります。

それだけだと短いのでその他にFlip Fluid in UE5 Niagara Tutorial | Download Files [2]も勉強します。

血が流れるVFXの作成は非常に興味があります。私のPCではSmoothには動かないかもしれませんが試してみます。

2.1 UE5 Niagara #ScratchPad Module #3 | Spawn Count on Owner Scale [1]を勉強する

まず軽く見たんですが、短い。4分しかないTutorialでした。

これだけだと一寸短いので更にもう一つやる事にします。

最初、このTutorialでは何をやっているのか不明だったんですが、全部見たら分かりました。

以下の様な球の表面にSpriteを生成するとします。

Level上で球のサイズを変更すると

Particleの生成される数は同じなのでスカスカになります。

これを球のScaleに応じて生成されるSpriteの数を調整したい訳です。

球が大きい時は沢山のSpriteを生成します。

球が小さい時は少しのSpriteを生成します。

今回はこれを実装するためのScratch Padを作成します。

いつものようにFountain Emitterを追加したNSを作成します。

要らないModuleを消して以下の様にしました。

結果です。

球の表面にSpriteが生成されています。

何もないLevelを作成してその中にこのNSを配置しました。

サイズを2倍にしました。

生成されるSpriteの数は同じなので球の隙間が広がります。

生成されるSpriteの数を調節する事でこの隙間をどんなサイズの球でも同じにします。

まずEmitter Update Sectionに新しいScratch Pad Moduleを作成します。

Emitter Update SectionにScratch Pad Moduleを作成するのは多分初めてですね。

Scratch Padの名前をSpawn Countにしました。

Map Get ノードに新しいVectorを追加しました。

更にMap Set ノードの+に繋げて以下のParameterを作成しました。

Applyを押します。

そしてこのSpawn Countノードの

Input New Vectorに球のサイズを洗わずOwner Scaleを接続します。

勿論、Spawn Count内のMap Getから直接このOwner Scale を呼び出す事も可能です。

以下の様にSpawn Countの実装を変更しました。

生成されるSpriteの数を決定するSpawn Burst Instantaneous Moduleの

Spawn Countは以下に示した様にIntで指定するので、

Map SetノードのEmitter My SpawnもIntに変更しました。

上記の実装だと球のサイズの数しかSpriteを生成出来ないのでMultiplierを追加しました。

Spawn CountのMultiplierに200をセットします。

更にEmitter Update SectionのSpawn Count Moduleの

Spawn Countに先程作成したEmitter My Spawnをセットします。

結果です。

Scaleを2倍にしました。

結果です。

うーん。そんなに変わっていない気がします。

良く分からないのでScaleを10倍にしてみました。

結果です。

比較のために同じ距離から撮影したScale1倍の結果です。

うーん。正直良く分かりません。

5倍にしてみました。

お。これだと10倍のScaleと比較して球の大きさは半分ですが、Sprite同士の隙間は10倍のScaleと同じ位ですね。

<Name Space Ownerについて>

このTutorialを勉強してName Space OwnerってLevel上に配置されているNSの値をModule内で得る事が出来るName Spaceなのでしょうか?

調べます。

ParametersからOwnerをPickupしました。

これ見るとVelocityとかSystem Local To WorldみたいなLevel上に配置されているNSの値とは関係ないParameterがありますね。

Level上に配置されているNSには以下のCast Shadowがありますが、

このParameterの値をScratch Pad内で得るためにMap Get ノードを調べましたが

Owner Name Spaceを見ても関連するParameterは見つかりませんでした。

UE5 Niagara #ScratchPad Module #3 | Spawn Count on Owner Scale [1]の感想>

このTutorialだけでは量が少なすぎます。

次のScratch PadのTutorialも勉強する事にします。

2.2 UE5 Niagara #ScratchPad Module #4 | LODs [3]を勉強する

Scratch PadにおけるLODの設定方法について勉強するみたいです。

これはCameraからの距離を保持するParameterがどれなのかを勉強すると言い換えても良いと思います。

軽く見ました。

TutorialではCameraからの距離によってParticleが消える例と、Particleの色が変化する例の実装方法を解説していました。

それでは実装してみます。

まずいつものようにNSを作成してFountain Emitterを追加し、Emitter内の要らないModuleを消します。

Emitter Update SectionのEmitter State Moduleの

Scalability ModeにSelfをセットします。

このScalability Modeって何を管理しているのかと思ってCursorを乗せてみたら以下の説明が表示されました。

これ、このParameterの機能を解説してないじゃん。

その直ぐ下のEnable Distance CullingにCursorを乗せると以下のBoxが表示されました。

これにCheckを入れるとEmitterのCullingがCameraからの距離に応じて出来るようになります。更にSleepしたり起こしたり瞬間的にKillしたりも出来るようになります。

と書かれています。

他のParameterも全部Checkしましたが、全部そのParameterの機能についての解説が書かれていました。

何でScalability Modeだけ解説が書かれていないの?

公式のDocumentであるEmitter Update Group [4] を見ると以下の解説が載っていました。

うん。まあ想像していた以上の解説は無かったですが、それでもScalability Modeの機能についてしっかり解説しています。

Scalability Mode にCursorを乗せた時にこの解説が現れないのは、このParameterの機能の紹介を書くべき人がサボったんでしょう。

こういうのは早く直してほしいです。

Scalability ModeにSelfをセットすると以下に示した様にScratch Padを使用しなくてもCameraの距離に応じてSpriteの生成を調節出来るそうです。

しかし今回はScratch Padを使用してCameraからの距離を調節する方法を勉強するのでこの部分の機能は使用しないそうです。

元に戻しました。

Emitter Update SectionのSpawn Rate Moduleの

Spawn Rateの値を500にセットしました。

1秒間に500個のParticleを生成します。

カメラから遠くに移動させます。

この場合も1秒間に500個のSpriteを生成しています。

今度は逆にCameraに近づけました。

この場合も1秒間に500個のSpriteを生成しています。

それではLODを実装するためのScratch Padを追加します。

Particle Spawn SectionにScratch Moduleを追加しました。

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

Camera Queryを使うのか!

昔、一回位使用した事があります。

Get Camera Properties CPU/GPUノードを繋げます。

これでWorld 座標軸におけるCamera の位置が判明します。

更にMap GetノードにParticle Positionを追加します。

これでWorld 座標軸におけるParticleの位置がPassされました。

Subtractノードを利用してParticleとカメラの差を求めます。

その差をLengthノードを使用する事で距離に変換します。

これでCameraとParticleの距離が判明しました。

今度は指定したLODの距離より遠いのかどうかを判断する実装を追加します。

まずGreater ThanノードでCameraとParticleの距離と指定した値を比較します。

このGreater ThanノードのBにはMap Getノードに新しく追加したInput Rangeと繋げます。

これで比較する値はNSから指定する事が出来ます。

そしてGreater Thanノードの結果をSelectノードに接続します。

SelectノードはBooleanを返してBooleanを受け取るので以下の設定になります。

うん?

これだったら要らないんじゃ。

更に前のTutorialでは敢えてTrueなら1、Falseなら0を返していました。このやり方とはどう違うんでしょうか?

この結果をMap Setノードの新しく作成したParameterであるParticle If Particle Farにセットします。

因みにParticle If Particle FarはBool型です。

これで指定したLODの距離より遠いのかどうかを判断する実装は完成です。

Applyを押します。

NSに戻ります。

Particle Spawn SectionにKill Particleノードを追加します。

Kill ParticlesにParticle If Particle Farをセットします。

更にParticle Spawn Sectionにある先程作成したScratch Moduleの

Rangeに100をセットします。

すると以下の結果になります。

Spriteの位置をCameraから遠くに移動させます。

Spriteが消えました。

今度はSpriteの色をCameraからの距離によって変更します。

まずScratch ModuleをInitialize Particle Moduleより前に持ってきます。

これでParameter、Particle If Particle FarがInitialize Particle Module内で使用出来るようになりました。

Initialize Particle ModuleのColorに以下の設定をセットします。

ColorにMake Custom Linear Color from Boolをセットします。

Boolに先程のParticle If Particle Farをセットします。

結果です。

緑色になりました。

Spriteをカメラから放します。

赤くなりました。

今度は赤から緑に突然切り替わるのではなく、徐々に色が切り替わるようにします。

まず先程のScratch Padに戻って

Normalize Distance Rangeノードを追加します。

このNormalize Distance Rangeノードを以下の様にセットします。

TutorialだとStart PositionにMap GetノードのParticle Position、End PositionにGet Camera Properties CPU/GPUのCamera Position Worldを繋いでいます。

これって逆だと思うんで、そこは逆にしました。

そしてこのNormalize Distance RangeノードのNormalized Rangeの値をMap Setノードに繋げました。

Applyを押してNSに戻ります。

まずParticle Spawn SectionのInitialize Particleノードの

Colorに以下の設定を追加します。

今度はColorにLerp Linear Colorsを使用します。

Lerp Factorに先程、Scratch Pad内で作成したNormalize Rangeノードを使用します。

結果です。

黄色いです。

Cameraに近づけます。

ここまで近づけてやっと赤くなりました。

今度はカメラから遠ざけます。

緑色になりました。

更に同様の設定をSprite Attributeに行う事で、

SpriteのSizeをCameraからの距離に応じて変化させる事も出来ます。

Cameraに近い時です。

Spriteの色が黄色(カメラとSpriteの距離が250cmの時)

Spriteの色が緑色の時です。(カメラとSpriteの距離が500cm以上の時)

です。

以上でした。

UE5 Niagara #ScratchPad Module #4 | LODs [3]を勉強した感想>

うーん。結構勉強になりました。

特に勉強になったのはCameraの位置を知る事が出来るGet Camera Propertiesノードの存在です。

このNode一回ぐらい過去に使用した経験があります。が全くその存在自体を忘れていました。

Normalize Distance Rangeノードもほとんど初めて使用しました。

でもこのNodeはその場で計算してしまえばよいですね。

あんまり覚えておく必要はないかもしれません。

後、このNodeはNormalize した長さだけ計算して最初と最後の位置は関係ないみたいですね。

Tutorialのでも近い処で赤く、遠いところで緑になっていましたから。

2.3 Flip Fluid in UE5 Niagara Tutorial | Download Files [2]を見る

正直、今週のNiagaraの勉強はもう十分だと思っていますが、最初にこれもやると言ってしまったので、見るだけ見る事にします。

実装は来週やります。

まず軽く全部見ました。Flip Fluidの使用方法についての解説でした。

兎に角、凄いです。圧巻でした。

これは勉強するしかないです。

まず、Tutorialの手順を以下にまとめます。

新しいLevelを作成して以下のCharacterを追加しています。

このCharacterは持っていませんので代わりのCharacterで代用します。

このPluginを使用する必要があるそうです。

はい。

NSにTemplateを追加する時ですが、いつもと違いNew system from a template or behavior exampleを選択し

そして以下に示したGrid 3D FLIP Hoseを選択します。

このNSを開くと以下の様になっているそうです。

Preview画面です。

Emitter画面です。

Emitterは2つあるそうです。

うーん。自分で確認したい。

でもやりたい気持ちを抑えて熟成させるのも大切です。今週のNiagaraの勉強は既に十分やりました。ここは抑えて見るだけにします。

ここからFlip Fluidに使用されているModuleのParameterの解説に入ります。

まずUser Parameterです。

User ParameterのShow BoundsにCheckを入れます。

すると以下に示した様にPreview画面にBoundsが表示されます。

次に最初のEmitterに行きます。

Emitter Summaryを選択します。

Collusionの欄に以下の項目があります。

Open Boundary Upが選択されています。

更にOpen Boundary Rightを選択します。

すると以下の様になりました。

これは右側のBoundaryの壁が開き、液体がそのまま流れています。

ので以下の様にセットすると液体は地面と衝突しますが貯まる事はなくなります。

こんな結果になります。

今度はParticles Spawn SectionのSet Particle Velocity Moduleを

消します。

結果です。

液体が真下落ちる様になりました。

次にParticles Spawn SectionのSphere Location Moduleを外します。

そして代わりにStatic Mesh Location Moduleを追加します。

Sample Static Mesh Moduleの

Preview MeshとDefault Meshに先程のCharacterをセットします。

このCharacterのSizeは今のBoundaryの設定よりも大きいのでBoundaryの設定を直す必要があります。

またUser Parameterに戻ります。

World Grid Extentsの値を変更します。

以下の値に変更しました。

あ。

これは私のPCでは動かない気がしてきました。

Previewの画面でも以下の様に凄い事になっています。

そしたら何と、今作成したNSをLevel上に配置してしまいました。

うーん。確かにこれでもStatic Meshなら有なのか?

今度は液体の色を変えます。

今度は最初のEmitterのRender SectionのMesh Renderer Moduleを選択します。

すると以下のMaterialを使用しているのが分かります。

このMaterialをCopyしたのを代わりに加工します。

Base Colorを赤にします。

Opacityを1にします。

Metallicは0.2にします。

こんな結果になりました。

もうBoundaryを表示する事はないので、User Parameterの

Show BoundsのCheckを外します。

以下のParameterの値についての解説がありました。

Num Cells Max…の値を上げるとResolutionが高くなるそうです。

次にRender Moduleの3つのParameterについてです。

Render Grid Resolution…についてです。

これはRenderのResolutionの大きさを決めるParameterだそうです。

SDF Particle Size Multについてです。

これの説明が非常に分かり易かったです。

液体の表現ですが、Particle同士が近かったらMergeします。

この近さとはParticleのサイズに負っているそうです。

以下の様にParticleのサイズが大きかったらMerge出来る距離も大きくなります。

このParameterはParticleのサイズを変える事でParticle同士がMerge出来る距離を決定しているそうです。

最後のParameterはSDF Smoothing Radiusです。

この値を上げるとSmoothさが追加されるそうですが、Tutorialに表示された結果を見る限り変わってない様に見えます。

今度はこの液体がCharacterと衝突するようにします。

まずLevel上のNSを選択します。

そしてそのNSのDetail欄にあるStatic Mesh CollisionのTagにColliderと書きます。

今度はCharacterを選択してそのDetailのTagにColliderをセットします。

すると以下に示した様にCollideするようになります。

以上でした。

Flip Fluid in UE5 Niagara Tutorial | Download Files [2]を見た感想>

思っていたより3倍位、知らない内容がありました。

今週は敢えて、Tutorialを見るだけにして実装は来週に回したのは正解でした。実装する前に理解する必要がある内容が結構あります。

一週間掛けて、この内容を消化して、来週の実装を行いたいと思います。

3.Materialの勉強

3.1 先週の続き

先週、Rain On The Lens Post-Process Effect - Shader Graph Basics - Episode 53 [6] を実装しました。その中で以下の2つの理論が良く分からなかったです。

  • 定常の滴の計算
  • SRGBを外した時の設定

これらについてもう一回考えてみる事にします。

<定常の滴の計算>

以下のPowerの計算が良く分からなかったんです。

普通、Powerを掛けると以下の様になります。

-1~0の間は、偶数と奇数で結果が異なるので今は無視します。0~1の間の場合、

Powerの値が1以上の場合は黒さが強調され、0~1未満の場合は白さが強調される結果になります。

つまり先週の例で言うと、Power(x, 10)を計算しているのだから、黒さが強調されるはずなんです。

しかし実際は結構白いんです。

以下の様に試しにFloorを繋げた場合、

こんな結果になります。

更に、この後でSaturateノードを繋げますが、その結果を見ても

Floorを使用した場合より遥かに白いです。

この理由が分かりません。

この謎を検証します。

0未満の値は邪魔なので以下に示した様にSaturateノードを追加します。

あ。直ぐに理解出来ました。

Power(10)してSaturateした場合、0~1の間の値はそのまま残ります。

Floorした場合は、0~1の間の値は全部0になります。

これならFloorの方が黒くて当たり前です。

うーん。

当たり前なのか?

以下にPowerする前のSaturateの時の結果を示します。

白、黒、そして灰色しかありません。

これにPowerをしても灰色の部分が黒くなるだけじゃないでしょうか?

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

やっぱりその通りです。

この結果はFloorと全く同じであるはずなんです。

Floorの結果です。

白い部分が少ない。

あ、分かりました。

白い部分でも1じゃなくて0.9997みたいな部分もあったんです。そういう部分がFloorでは0に切り捨てられているんです。

だからFloorの方が白い部分が少なくなります。

逆にこれPower(x, 10)の黒い部分も本当の0ではなくて、0.0111みたいな値なんでしょうね。

だから0.9以上は白、0.9以下は黒にするNodeを使用すればもっと綺麗にこの値を出せると思います。

そうだ!

Roundノードを使用してみます。

結果です。

比較のためにPower(10)をしてさらにSaturateした値を以下に示します。

今度はほぼ同じ結果になりました。

あ。

このPower(x,10)の何が謎なのかがはっきりとわかりました。

今まで、私が勉強したMaterialの実装はPowerノードを使用する場合は、Power(x, y)のXの値は必ず0~1の間だったんです。だからPowerを使用すると必ず以下の様にContrastが強調される結果になったんです。

ところが、今回Powerノードを使用した箇所は、Power(x, y)の値は-1~1の間だったので Powerを使用する目的が分からず困惑したのが最初の謎です。

次に-1,0、1の3つの値だけが存在している所にPower(x,10)を掛ける意味があるのか?この意味も分かりませんでした。2番目の謎です。

更に、この計算だったらFloorノードを使用しても同じ結果になるはずなのにならなかった。これが3番目の謎です。

この3つの謎が解けないまま先週のMaterialの勉強は終わりにしてしまったんです。

今、この3つの謎はほぼ完全に解けたのでそれをここにまとめます。

まず、三番目の謎であるFloorノードを使用しても同じ結果になるはずなのにならなかった理由ですが、-1,0、1の3つの値だけが存在していると思っていたら実際には-0.995とか0.98とかのある程度の幅のある値だったんです。

これは私の推測ですが、元のTextureを作成した時に黒とか白とか灰色で塗った時に僅かにずれが有ったんだと思います。

それでFloorの時とPowerの計算の結果が変わってしまったんです。

もしTextureの段階で、0、124、255の3つの値だけでキッチリ作成されていたらFloor とPower+Saturateの計算結果は0~1の範囲は全く同じになったんです。

そしてこれが分かると次の2つの謎も同時に解けます。

次の謎の-1,0、1の3つの値だけが存在している所にPower(x, 10)を掛ける意味があるのか?ですが-1、0、1の3つの値だけが存在しているんじゃなかったんです。だからPower(x, 10)を掛ける必要が出て来ます。

もしFloorを使ってしまうと、0.98とかが0になってしまうのでPower(x, 10)とSaturateを使って0.98とかの値も白く残るようにしつつ0.5前後の灰色の値も黒くしたんです。

そして最初の謎である-1~1の間の値に Powerを使用する目的は、-1の値を+1に変換する事です。

でもそれなら別に10でなくても2でも4でも良い訳です。しかし2や4でPowerをしてしまうと2番目の目的を果たす事が出来ません。ので敢えてPower(x, 10)にした訳です。

そして最初の謎に繋がる何故-1の値を+1にする必要があるのかについてこれから検証します。

まずPower(x, 10)を計算する前です。

黒い部分があります。ここに注目して下さい。

Power(x, 10)を計算した後です。

なんと黒い部分は黒のままです。

ここでPower(x, 10)の解説です。

つまりxの値が0以下の場合はClampして0として計算します。と解説されています。

えー。です。

これじゃ今まで考えて来た事が全部ひっくり返ってしまうじゃないですか。

これは疲れた。

この問題は来週また考える事にします。

<SRGBを外した時の設定>

先週、TextureのsRGBを外したらTexture Sample ノードがErrorを表示しました。

以下の方法でErrorを直しましたが、意味を理解していません。

この辺を勉強して理解する事にします。

どのサイトがはっきりと書いている訳ではないですが、複数のサイトを読んでいるとsRGBとLinear RGBには以下の関係が成り立っているみたいです。

と言う訳でsRGBのCheckを外したらLinearになるのはあってそうです。

これ以上の資料が見つからないです。

3.2 Stylized Materials Packの実装を見る

今週は、正直もうMaterialの勉強に疲れてしまってしまってこれ以上やりたくないです。

のでBen Cloward先生のTutorialの勉強は一端やめて、Stylized Materials Packの実装でも読む事にします。

Fresnel Function ノードです。

これは後回しにして、結果だけ確認します。

真っ黒ですね。

One Minusノードを追加しています。

当然、真っ白です。

次はPowerノードを使用しています。

いやいや、こんなPowerノードの使い方ある?

それともPowerノードにはまだ色々な使用方法があるとでも言うんでしょうか?

今週はもうPowerノードを見るのは嫌です。

ので以下の事をする事にしました。

3.3 Stylized Materials Packと同じようなMaterialを自作してみる

以下のMaterialがFresnel Functionを使用している事さえ分かったら同じ様なMaterial、自作出来そうです。

ので今週は、元のCodeは見ないで自作してみる事にしました。

まずは以下の様にしました。

FresnelはFresnel FunctionではなくFresnelノードを使用しました。Inputの値は適当です。

Saturateした後の結果です。

これにLerpノードで黒い部分は白を、白い部分は以下のTextureを使用するようにしました。

結果です。

うーん。いけそう。

値を微調整しました。

もっと中央は白くして線が見えない様にします。

かすれた線が長すぎる気がします。

単純にFresnelの結果を2倍にして1を引きました。

結果です。

かなり良い感じがします。

今度は黒い線をもっと濃くします。

Lerpの後にPowerノードを追加しました。

結果です。

かなり良いですね。

これに輪郭線も追加してみます。

いつも勉強しているPPLineDrawingをPost Processで追加しました。

Edge Line以外で輪郭線を出して、Crease Lineは以下の様に値を変更して作成しました。

うーん。

線が薄い部分があるのとまだ線が太すぎるのを調整出来たらこれでOKでしょう。

色々な角度から見てみます。

灰色の部分は汚く見えますね。

後、手書きに比べると書き込みが足りない気がします。

サイズによってはこれでも良い気がします。

LODによって書き込み量を調節する必要がありますね。

今週のMaterialの勉強はここまでとします。

4.RPGEventの作成

4.1  先週、実装したEventのBug出し

Eventの表示そのものには問題はありませんでした。

ただしStart 画面からMap1に移動した時にSub Levelが生成されるまで3秒位かかりました。

この部分は直す必要があります。

と言うかMap1のLandscapeは全部直したいです。

後、ずっと直せなかったStart 画面のPortionの影を表示出来る様にしました。

因みに直す前の状態です。

そしたら以下の警告が表示されるようになりました。

うーん。

これの直し方でも調べますか?

公式のForumsのObject has overlapping UVs [5] に直し方が書かれていました。

これ読んだら、どうも今直したMaterialの事が問題じゃないみたいです。

調べたら机の上のおいてある水晶玉がこのErrorの元でした。

はい。

公式のForumsのObject has overlapping UVs [5] に載っている直し方はまた後で勉強するとして今回は以下の方法で直しました。

Errorは消えました。

これだけだと少ないのでもう少し何かやります。

Spot lightを更に一個追加して点滅させてみました。

キャラクターが見えます。

Characterが消えました。

実装方法は以下の様にしました。

何の工夫もないです。

4.2 来週の予定

Eventを完了した時に表示されるWidgetを作成します。

そのWidgetを武器を手に入れた時に表示出来る様にしたらEventは完成です。

5.Open Worldの検証

5.1 先週の復習

先々週までの勉強で一応、World Machine やGaeaなどの3nd PartyのSoftwareで作成した一枚、1009x1009のHeight Map並びにMaskを複数枚使用して4x4 km^2程度のOpen World(しかも解像度が1pixel = 1m である)を作成する方法を解明する事が出来ました。

ので次のStepとして、これからは以下の事について勉強するとまとめました。

そして先週は今まで勉強したNaniteの復習をしました。

復習の結果、以下の事が分かりました。

Naniteは2021-12-13から2022-02-06頃までの約3カ月もの間、勉強していましたが、その大半を公式のDocumentであるNanite Virtualized Geometry [7]を読む事に費やしていました。

このDocumentはそれなりに大事な事を解説していましたが、かなりAdvanceな内容を含んでいたりしてNaniteを始めて勉強する人が読むべき内容でない部分がかなりありました。

それを最初に一生懸命読んだんですから、凄い時間を使った割には、望ましい成果を得る事は出来ませんでした。

それで、そのDocumentを読んだ後は、Naniteの簡単なTutorialをやる事にしました。一個だけやっています。

以上がNiagaraに関して勉強した事でした。

その結果、もっとNaniteのTutorialをやってNaniteそのものになじむのが大切であると考え、今週は以下の事をやる事になりました。

更に、Naniteのような最新の技術はやり方が頻繁に変わるので、最新のTutorialで勉強する事にしました。

5.2 NaniteのTutorialを探す

まずYouTubeで検索しました。

一番最初のRyan Laley氏の Unreal Engine 5 Tutorial - Create Nanite Meshes [8] は前回、勉強したやつです。

次のUpside Down氏のUnreal Engine 5 Tutorial-Naniteは3カ月前に作成されたかなり最近のTutorialです。だたUpside Down氏のTutorialはまだ一回も勉強した事ないのでどんなLevelのTutorialなのか、それ以前に信頼に足るTutorialなのかも分かりません。

その後にJSFILMZ氏のTutorialがずらっと並んでいます。JSFILMZ氏はNaniteに特化したTutorialを作成する人なんでしょうか?

これは要確認です。

JSFILMZ氏の以下のTutorialを見たんですが、5.1ではFoliageがNaniteでSupportされているそうです。

5.1っていつReleaseされたんですか!

それすら知らなかったです。これは後で見る事にします。

この後もJSFILMZ氏のTutorialを見たんですが、Naniteだけで11本動画を上げていました。

5.3 JSFILMZ氏のNaniteに関するTutorialを簡単にまとめる

JSFILMZ氏のTutorialを見ればNaniteの初期から現在までの進化が一発で分かるはずです。

これを見て現在のNaniteまでの変化を勉強します。

unreal engine 5 how to enable nanite [9]

JSFILMZ氏のNaniteに関しての一番最初のTutorialです。

JSFILMZ氏は名前の通りFilmを作成するのが目的みたいです。そのためにUnreal Engine 5 を使用しています。そのせいなのかRTX3090 を使用しています。動画中では解説していませんが他のPartsも最高品質なのでしょう。

そういう意味では勉強したからと言ってそのまま使用出来る訳ではない技術が多々あるかもしれません。

ここではNaniteの使用方法について解説しています。

NaniteというかUE5が公開されて直ぐに作られたNaniteのTutorialで、最新の情報を教授してくれている感があります。

Unreal Engine 5 How to Nanite Skeletal Mesh [10]

Unreal Engine 5のデモが公開された時に、Skeletal MeshはNaniteで動かないはずなのに、このデモでは動いているんじゃないか?と言う意見があったんですが、そのやり方を示してます。

Skewed Meshに対してNaniteが使用出来ないので自然とSkeletal Meshに対してはNaniteの使用は出来ない場合がほとんどです。

このUnreal Engine 5のデモに使用されたSkeletal MeshはSkewed MeshではないのでNaniteが使用出来る訳です。

ただし、じゃこのModelで良いからSkeletal MeshにNaniteを使用するやり方を教えて下さい。と思う人達もいるので、その要求に対してのTutorialですね。

unreal engine 5 gameplay with nanite [11]

ここでは実際にNaniteを使用して作成されたLevel内でGame PlayをしてNaniteを試していました。

Tutorialとは一寸違うので省いても良かったんですが、実際に見たらかなり勉強になりました。

Decalが使用されている箇所にNaniteが効いていないのを、実際のGame Playから発見して、UE5からそれを確認したりしています。

あ。そうやってNaniteが効いていないのが分かるのか、とかそうやってNaniteが効いているのかどうかを確認するのかなど、かなり役に立つ情報が得られます。

unreal engine 5 burned forest nanite tutorial [12]

これは以下の有料のEnvironmentをNaniteにしてみた話でした。

途中まで見ましたが結構勉強になります。

このEnvironmentはWorld Partitionは使用しているんでしょうか?

World Partitionを使用しているのならこのTutorialを勉強したらWorld Partition + Naniteが出来る様になりそうです。

Realistic Arid Landscape with Nanite Unreal Engine 5 [13]

以下のLandscapeの紹介でした。

実際の地形を撮影して作成されているそうです。

うーん。確かにTextureに使用している写真は高品質ですが、このLandscapeは一寸ショボくない?

しかもWorld Partitionも使用してない小さなLandscapeだそうです。

Naniteに関しては何も勉強する事は無かったです。

Unreal Engine 5 Nanite Trees [14]

やっとここから最新のNaniteに関する話です。木にはNaniteが効かないと言う話ですが、どうなっているのでしょうか?

5.1の話ですね。

凄い。確かにTreeにNaniteが効いています。

更に凄いのが以下の質感を保っている事です。

凄いです。

Unreal Engine 5 Nanite Grass [15]

前の動画の続きみたいな感じで、今度は草を試しています。

凄いんですがこの草、動きが無いです。

これ設定のせいなのかまだ風でなびく草はNaniteで作成出来ないのか不明です。

後、これはRTX3060 で作成しているそうです。

RTX3060でもこれ位できるのなら、次に買うPCはRTX3060でも良い気がして来ました。

Unreal Engine 5 Nanite High Poly Trees [16]

現実にはあり得ない位、木を密集させてNaniteを試しています。

確かに凄いですが、このテストを行う目的が今一分からないです。

Naniteが効いていればこんなに木を生成してもPCがCrashする事はないというDemonstration的なものでしょうか?

Unreal Engine 5 Nanite Foliage with Wind [17]

基本的は前の草と同じなんですが、こっちは風になびいています。

Unreal 5.1 New Features Nanite Foliage [18]

やっと一番最新の動画に来ました。

5.1がGitでReleaseされたので、今までのFoliageにおけるNiagaraの動画をまとめてもう一回説明した動画みたいですね。

Naniteとは関係ないですが、この人もFoliageが正しく発音出来なくてすみません。って言っていました。Foliageってそんなに特別な単語なんでしょうか?

こっちはGameよりFilm撮影についての解説でした。ただしそれはそれで勉強になったし、かなり面白かったです。

<JSFILMZ氏のNaniteに関するTutorialを全部、見た感想など>

Naniteの情報が最新の情報に更新出来ました。

5.1になったら木や草もNaniteが使用出来る様になるみたいです。

後はNaniteに関する基本的な操作、MeshからNaniteに変更するとか、Level上からNaniteが本当に効いているのかを確認する方法とかが、何故大事なのか、動画を見てると良く分かりました。

Naniteの設定方法などについては一年前からあんまり変わっていないみたいです。

来週は、Naniteの基礎的な復習から勉強し直そうと思います。

まずはQuixelから岩などをStatic MeshとしてDownloadしてNaniteに変換したり、直接NaniteとしてDownloadしたりしてLevel上にNaniteととして配置する方法などを確認する所から勉強し直したいと思います。

6.Gaeaの勉強

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

6.1 How To Create An Open World Snow Landscape | Unreal Engine 5 Tutorial [19]の続きを見る

先々週、水の追加の辺りで訳わからなくなったので、先週は分かる所まで自分で実装してみました。

その結果、

となって結果的に、水の追加のやり方も理解出来ました。

ので今週はその続きから勉強します。

丁度、ここからStep 2が始まりました。

Step 2ではTexturingを行います。

今週はこのStep 2を勉強します。

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

FTと名付けました。

これはTexturingのみに必要なNodeでUnreal に使用するためにExportする場合は、Lakesノードの手前のRiversノードからExportする必要があるそうです。

その理由はLakesノードの後だと以下の様な湖の箇所が平らになってExportされてしまうからだそうです。

この説明をKlaus氏は何回もしていたと思いますが、私がはっきりと認識出来たのは今回が初めてでした。

しかも川の設定をどうするかによっては更にその前のSnowfallノードからExportすべきだそうです。

Water Systemを使用して川を追加する場合は、SnowfallノードからExportすべきなんでしょうか?

Final Output Before Riverと名付けていました。

Riverノードの後でもExportしました。

Final Output After Riverと名付けていました。

FTにOutputを付けました。

LakesノードにもOutput、Lakesを追加しました。

LakesノードとRiversノードをCombineノードで繋げています。

これは何をしているのか分かりません。

解説を聞いたら分かりました。Depthのデータを集めているんだそうです。湖と川の深さのDataを集めています。

Combineノードの設定です。

Maxで混合しています。これだと標高が高い方が選択されると言う事でしょうか?

山に比べて川や湖の深さは取るに足らない大きさなので以下に示した様に何も見えません。

のでLVを使用します。

結果です。

川が見える様になりました。

こういう知っているけど直ぐには使いこなせないTechniqueってどうやったら使用出来る様になるんでしょうか?

ここでCommentが注入されていました。

LakesノードとCombineノードは以下の様に繋ぐ必要があるそうです。

前のLakesノードとCombineノードの繋ぎ方は間違えていたそうです。

うーん。

これLakeノードからCombineノードに繋いだ時に、前のTutorialでLakeノードにはDepthがないから云々って話を聞いた事を思い出していたんです。思い出していたんですがそれをCommentに書くほどの自信がなくてそのままにして次に進んでいました。

今、やっぱりそうだったのかと思いました。

ここで後々のためにRiverやLakeノードのFXノードを作成しておいても良いそうです。

こっちは三番目のOutputからFXを作成していますね。

いや、これは録画した時だからこれも間違っているはずです。

本当は2番目のOutputからFXを作成しないといけないはずです。

RiverノードのOutputはそのままで良いはずです。

RiverノードのOutputですがSnowfallノードのoutputとCombineノードで混合しています。

これは何に使用するんでしょうか?

Combineノードの設定はSubtractです。

雪が被った川の部分は川から消すんでしょうか?

これは実装する時に確認します。

と思って先に進んだら、解説で雪が被った川の部分は川から消す。と言っていました。

当たっていました。

今度はその結果とLakeの結果をCombineしました。

そしてこのCombineノードの名前をCombine_waterに変更しました。

このNodeの名前が変更出来るのは覚えていますが、このNodeの名前を変更するMeritって何なんでしょう?

前にGaeaからExportしたpng fileは名前がみんな同じだったのでUEでImportする時にえらい困りました。

ここでNodeの名前を変更しておくとPng Fileにした時に名前が変わるんでしょうか?

最後にこのNodeにPortを追加しました。

あ、

このPortを選択する時、どのNodeのPortかを聞いているはずです。

その時にこの名前の変更が役に立つのかもしれません。

SnowfallノードにもPortを追加しました。

今度はErosionノードにもFXノードを追加しました。

これは必要は無いですが、後でもっと細かいDetailを追加する時にあったら便利だから作成したそうです。

成程。

別にFXノードの数に制限がある訳ではないので、自分の気が済むだけ、何個でも作っておけば良い訳です。

Tutorialでは以下のような解説がありました。

成程。

計算Costの面から言ってもFXノードを沢山作っても問題ない訳です。

TutorialでFXノードを沢山作っておく利点をもう一個説明していますが、この意味が分かりません。

これは後で実装した時にもう一回、考えます。

新しいGraphを作成します。

Portalsを呼び出します。

やっぱりここでCombine Waterって表示されていました。

これがさっきCombineノードの名前を変更した理由だったんですね。

FTを選択してFXノードと接続しました。

Textureノードを繋げました。

さーて。

ここから分からなくなって来ました。Textureノードの使い方は全く覚えていません。

イキナリTipが表示されました。

ふーん。です。

具体的なやり方はこれからこのTutorialで教えてくれるのでしょうか?

ここでTextureノードにPortalを追加しました。

このTextureノードの結果をあらゆる所で使用するからだそうです。

それがTipで言っていた複数のTextureノードを使用するな。って事でしょうか?

はい。SatMapノードを繋げました。

まずSatMapノードで色付けをするんですね。

こんな色になりました。

あ。

思い出しました。

TextureノードはSatMapノードで色付けをするために必要なTextureを作成するんでした。

うーん。

前の勉強の成果も出ていますね。

草の追加に別のSatMapノードも追加しました。

当然、LibraryからはGreenを選択しています。

こんな結果です。

うーん。

でもこれどうやって草と岩の部分を分けるんでしょう。

はい。Combineノードでした。

CombineノードはUEのLerpノードのような機能もあります。のでCombineノードを使えば2つのSatMapノードの結果を指定した方法で混合出来ます。

前のGraphで作成したFXやPortのどれを使用するのかと思ったら、以下に示した様にFXにSlopノードを繋げてそれを使用しました。

結果です。

うーん。

凄い。

ここでTutorialは緑の色が気に入らないと色々なExampleを試しています。

ここでTipの登場です。

ふーん。です。

どうせ私はUEでMaterialは別に作成します。

まあ、Gaeaでの色の作成は参考程度にする予定ですので、そんなに真剣に選ぶ気はあんまりないです。

今度はWaterを追加します。

新たに又、Combineノードを追加します。

そのCombineノードの三番目のInput(UEのLerpノードのAlphaに当たる)にCombine Water Portを繋げます。

これは先が読めました。

このCombineノードのBのInputには先程のTextureにWaterのSatMapノードを繋げた結果が来ます。

さっきのCombine Waterノードの部分ですが、やっぱりLakesノードのOutputが間違っていました。

Tutorialではここで直しています。

あれ、何か予測したのと全然違う事をしています。

まずLakesノードにDepthのPortを作成しました。

それをFXノードで受け取ってCLUTerノードに繋げています。

ああ。

そう言えば前もこんな方法で作成していました。

CLUTerノードの色を決定しています。

うーん。でもこれを先程のCombineに繋いだらどうなるんでしょう。

湖のある部分だけしか色がつかない気がしますが。

繋いでいますね。

結果です。

うーん。なんで川まで色がついているの?

あ、分かりました。

LakesノードはRiversノードの後に繋がっているからです。

今度はCombineノードにPinを付けて

CLUTerノードの色を変更します。

結果です。

私から見るとそんなに変わってない気がするんですが、航空写真とかを頻繁に見る人からすると全然違うんでしょうか?良く分かりません。

今度はSnowを追加します。

もうやり方把握しました。

と思ったら、今度はSnowfallのPortをCombineノードのBに繋げています。

何で?

Combineノードの設定をMaxに変更しました。

結果です。

うん?何でこうなるの?

これは全く分かりません。

今週はここで終わりにしましょう。来週考える事にします。

7.雪山のMapの作成

Volumetric Cloudの勉強の続きをやっていきます。UE4: Step-by-Step to Creating Your First Volumetric Cloud Material [20]の続きを勉強します。

多分、先週の勉強で実装のほとんどの部分の理解が完了したはずです。

残りの実装を読んで、今週で全部理解してこのTutorialの勉強を終わりにしたいです。

7.1 UE4: Step-by-Step to Creating Your First Volumetric Cloud Material [20]の続きを勉強する

ここは簡単に言えば3D Textureの実装について勉強する部分です。

3D Textureに関しては2022-08-01のBlogで既に一回勉強しています。

更に2022-07-12のBlogUE4: Step-by-Step to Creating Your First Volumetric Cloud Material [20] を最初に勉強した時のまとめをしています。

これらを読み直すと、この部分の実装は既に勉強した内容で、今回特に新たに勉強すべき部分はありません。

一応、復習のために以下に簡単に解説します。

まず3d TextureのUVWをパスするためにWorld Positionノードを使用します。

ただし、UEのUnitはcmで雲はKmが基準です。

単位を統一するために1 km = 1 x 10^5 cm なので10^5で割ります。

UEはLevel上のDetailの数字が小数点6桁以下の場合、0と扱う為、この計算はLevel上のDetailで行う事は出来ません。ここでやる必要があります。

次のAddノードは時間による雲の変化を追加するためのものです。

今回は無視します。

Texture SampleノードのUVsに繋ぎます。

使用しているTextureが3D TextureなのでUVW値がパスされます。

その結果から1を引きます。

雲なので色がある訳ではないのでRのみの値を使用しています。

1を引くのは全部の値を-1~0の間にして、Cloud Texture Maskの値から引くためです。

どれ位の濃度でCloud Texture Maskの値から引くのかをParameterを掛けて決めています。

以上でした。

うん。これでUE4: Step-by-Step to Creating Your First Volumetric Cloud Material [20]の実装は理解しました。

7.2 今までのVolumetric Cloudの復習をします

なんかゴチャゴチャしてVolumetric Cloudを勉強する目的とかが曖昧になって来ているので一回整理するつもりで今まで勉強した内容をここに簡単にまとめます。

それでこれからどうするのかを決定します。

2022-06-26

この時はまだVolumetric Cloudが何なのか全く理解していません。

まだこの時は空一面に雲を作成する方法を模索していて、その一つの手段としてVolumetric Cloudが役に立つのではないのか?との期待からVolumetric Cloudを一寸勉強してみようとなりました。

Unreal Engine 5 Beginner Tutorial | Sky And Clouds [21]を勉強しています。

ここでVolumetric CloudはMaterialを使用する事を初めて知りました。

Unreal Engine 5 Beginner Tutorial | Sky And Clouds [21]は結構良いTutorialみたいです。

と書かれていました。

更に、まとめを読み返しましたが、今見てもかなり有用な情報が沢山あるTutorialでした。

2022-07-12

この週は、Volumetric CloudのMaterialについて初めて集中的に勉強をする事を決めた週でした。

World of Level Design社のUE4: Analysis of Volumetric Clouds and How to Use Them [22]とUE4: Step-by-Step to Creating Your First Volumetric Cloud Material [20] を勉強しています。

細かい点ですが

これ知ってショック受けていました。

<<UE4: Analysis of Volumetric Clouds and How to Use Them [22]のまとめ>>

ここで手動で雲をPaintする方法がある事だけ紹介されていますが、

その具体的なやり方は載ってなかったです。

このやり方は今でも分からないです。

後、地味に大切なEmpty なLevelから一個ずつ関連するActorを追加して空を作成する方法がまとめられているのがこのBlogでした。

<<UE4: Step-by-Step to Creating Your First Volumetric Cloud Material [20]のまとめ>>

これは今日既にまとめているのでSkipします。

2022-07-18

Ben Cloward 先生のVolumetric Clouds - Building Worlds In Unreal - Episode 32 [23]を勉強しています。

こっちはVolumetric Cloudのコストの計測方法などに関するTutorialです。

正直、これは又勉強し直さないと理解出来ない部分が多々あります。のでここではまとめません。

2022-07-25

Ben Cloward 先生のVolumetric Cloud Materials - Building Worlds In Unreal - Episode 33 [24]を勉強しています。

この週は単にTutorialの内容をまとめただけです。実装はしていません。

Volumetric Cloudの実装を3つのPartsから説明していますが、同じく3つのPartsで説明しているUE4: Step-by-Step to Creating Your First Volumetric Cloud Material [20]とは全然違うように見えると書いています。

2022-08-01

ここで、Volumetric Cloud Materials - Building Worlds In Unreal - Episode 33 [24]の実装をしていたら、想像していたのと全く違う結果になって混乱が始まったんです。

でも今見ると、本当に想像していたのと違う結果に成ったのかどうかは、視点を雲のはるか上に移して確認しないと分からないんです。それで実際は想像していた通りだったんです。

でもそれが確認出来る為には、Volumetric Cloudの勉強をやり直す必要がありました。

2022-08-08

ここでVolumetric Cloudに使用するMaterialの最低限の実装について検討しています。

その途中で、UE4: Step-by-Step to Creating Your First Volumetric Cloud Material [20]に最低限のVolumetric Cloudに使用するMaterialが作成されていた事に気が付きます。

そこでUE4: Step-by-Step to Creating Your First Volumetric Cloud Material [20]をもう一回勉強し直す事にしました。

後、雲の上から見るとVolumetric Cloudの全体の形状の確認が出来る事も発見しました。

2022-08-14

ここではUE4: Step-by-Step to Creating Your First Volumetric Cloud Material [20]の3つのPartsの内の2つ

Cloud Volume DetailとFalloff Functionの実装を勉強していました。

あれ?

Cloud Texture Maskについての勉強をしていると思っていたんですが?

まあCloud Texture MaskとCloud Volume Detailは使用しているTextureが2次元と3次元の違いしかないので同じと言えば同じですし。

2022-08-22

先週の勉強です。

Volumetric Advanced Outputについて勉強しています。

<Volumetric Cloudの復習まとめ>

全体の流れと言うか、何が元々疑問だったのかが分かりました。

まず、このVolumetric Cloudの勉強を始めた目的です。

雪山の作成で、雪が降っているのにも関わらず、空全体を雲で覆う事が出来なかったんです。それでVolumetric Cloudを空に追加する事で、空全体を雲で覆う事は出来ないのかと調べたのが最初の目的でした。

Volumetric Cloudを調べている途中で、これは4.26からしか使用出来ない事が判明しました。

この時点で本当はVolumetric Cloudの検証は終り。になるはずですが、同時にVolumetric CloudはUE5でも注目されている技術で、勉強して必ず特になる技術である事も判明しました。しかもVolumetric Cloudを自作するためにはVolumetric Cloud用のMaterialを作成する必要がある事が判明しました。

のでVolumetric Cloudの勉強は継続する事にしました。

この時点で目的が変化しました。それまでの目的は、空全体を雲で覆う事でしたが、ここからの目的はVolumetric Cloud用のMaterialを自作出来る様に成る事になりました。

Volumetric Cloudに使用するMaterialを自作出来る様に成るためには、今あるVolumetric Cloud用のMaterialの仕組みを理解する必要があります。

ので、以下に示したTutorialを勉強しました。

そしてVolumetric Cloud用のMaterialに必要な最低限の実装を作成しました。

所が、それが上手く行かなかったんです。

それでTutorialを見直していたらUE4: Step-by-Step to Creating Your First Volumetric Cloud Material [20]に、最低限のVolumetric Cloud用のMaterialの実装が既に紹介されていたんです。

それであれ?UE4: Step-by-Step to Creating Your First Volumetric Cloud Material [20]は既に勉強したはずなのに、あんまり理解していなかったのか?となってもう一回勉強し直しました。

これがVolumetric Cloudの勉強の最初からの流れです。

7.3 これからVolumetric Cloudをどう勉強するのか?

はい。

取りあえずは先週からの続きで、Volumetric Cloud Materials - Building Worlds In Unreal - Episode 33 [24] を勉強します。これの実装を全部理解します。

ここが大切なんですが、UE4: Step-by-Step to Creating Your First Volumetric Cloud Material [20]で理解した内容が既に身に付いている訳で、その知識と対比させながら勉強する事で、前回Volumetric Cloud Materials - Building Worlds In Unreal - Episode 33 [24]を勉強した時よりもより深く理解する事が目的になります。

これをする事で、Volumetric Cloud用のMaterialの作成に対してより深い理解が出来るようになるはずです。

次にUnreal Engine 5 Beginner Tutorial | Sky And Clouds [21]ももう一回復習します。このTutorialの存在、すっかり忘れていたんですが、結構良いTutorialです。

その後で、Pluginで提供されている他のVolumetric Cloud用のMaterialの実装についても勉強します。

これが終わったら、

これを調べます。

そしてBen Cloward 先生のVolumetric Cloud Materials - Building Worlds In Unreal - Episode 33 [24]をもう一回勉強し直します。

この時点で、かなりVolumetric Cloud用のMaterialの作成方法は理解が進んでいると思われるので、自分で一個作ってみようと思います。

Donut状の雲とか、ピンク色の雲とかでも自作してみます。

今週のVolumetric Cloudの勉強は以上です。

8.UI Designの勉強

今週は、今まで作成したWidgetのDesignをImproveします。

以下の様に変更しました。

以下のWidgetは字がはみ出していました。

後で直します。

以上です。

9.Anime Renderingの勉強

9.1  今回の予定

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

それではそれぞれの勉強をして行きます。

9.2 PPLineDrawingの検証

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

今週はNormal Based Outlineの実装について勉強します。

以下の部分は先週勉強したDepth Based Outlineの実装と同じです。

そう言えばMaterialの所でToon Shadingの復習をしていたらBlur Sample Offsetsを使用していました。

このNodeを使用した場合、見た目は綺麗に整理出来るけど、

を追加する事が出来ないですね。

それぞれのやり方は一長一短がある訳ですね。

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

Scene TextureのOutput、Colorの値はVector3で何もしなくてもRGBになっているはずです。

比較対象のPixelからSubtractしています。

Crease Lineでは比較対象のPixelの値とDot Productしていました。

この辺の数学的な正しさってどこで勉強出来るんでしょうか?

Vectorの差を計算する時に、この場合は単に引き算をすれば良い。この場合はDot Productで計算する必要がある。みたいな。

その結果をClampしています。

Clampする上下の値は以下のInputで決定しています。

全部の値を足します。

この計算方法、前回の時も話しましたが、PositiveとNegativeの場合の差を打ち消し合って値は本当の差より小さくなってしまう時が有る気がしています。

後、4で割らないのも気になります。

最後の工程です。

ここで初めてAbsを使用して絶対値にして、その後でそれぞれの値を足しています。

むー。

差分の計算方法については少し考察したいと思います。

9.3 差分の計算方法についての考察

PPLineDrawingを勉強して正しい差分の計算方法とは何ぞや。という疑問が沸いて来ました。それについて考察します。

まずアニメ風のRenderingをするためには、輪郭線を抽出する事が絶対必要です。

しかしComputerは人間と違い曖昧な規準で輪郭を抽出する事が出来ません。Computerで輪郭線を抽出すると、アニメや漫画の線画とはかなり違う線を抽出します。しかもその抽出された線は、絵として観た場合、かなりショボい線になってしまいます。

PPLineDrawingでは、(私の推測ですが)その対策として色々な方法で輪郭線を抽出する方法を提供する事で、人間の曖昧な輪郭線抽出の基準を再現した訳です。

なので、正しい輪郭線の抽出とは、人間の曖昧な輪郭線抽出をより正確に再現する事が出来る事なんです。

これを前提にして差分の正しい計算方法を考える必要があると思います。

World Normalの差分を計算する時、Dot Productで計算するのか?単に引くのか?4つの差分の合計や平均はどう計算するのか?はその結果表示される輪郭線が、人間の持つ曖昧な輪郭線抽出の基準に近ければ近い程正しい計算方法になると私は考えます。

それに加えて以下の点も考慮する必要があるのかな。と考えています。

<数学的な正しさ>

計算科学、もしくは統計学電磁気学などではひょっとしたら正しい差分の計算方法、というか正しいVectorの計算方法って確立してるかもしれません。もしそうならそれに従うって計算した方が結果に一貫性が出るはずです。

<Parameterの値との一貫性>

個人的な意見ですが、Designerの人がMaterial InstanceからParameterの値を弄って輪郭線の補正をする時に、どのParameterを弄ると線がどういう変化をするのかに一貫性を持たせられる設計が大切と思っています。

予測不可能な変化をするParameterがあると現場のArtistの人達は混乱するだけだからです。

今日勉強したPPLineDrawingのNormal Based Outlineに関して言えば、以下のParameterがClampする差分の最大値と最小値を決定しています。

これはProgrammerの観点から言えば、非常に整合性があります。

しかしCodeを読めないDesignerの人がこのParameterを弄った場合、その結果に一貫性を見出すのは非常に難しいと思われます。

この辺を考慮して差分の計算方法を考えてみるのは価値があると思っています。

9.4 差分に対する考察

差分を計算するのに元にしているのはScene Depth とWorld Normal です。

私はこれに加えて、Custom Depthを使用したらどうかと思っています。がもっと単純に色の違いを比較したらどうでしょうか?

Basic Colorって以下に示した様にかなり輪郭線に一致しています。

輪郭線の抽出用のPost Process Materialを作成する時には、これも考慮します。

9.5 公式のDocumentStylized Rendering[25]の勉強

今週は先週やり残りした2番目のMaterialの実装を勉強しようと思ったんですが、

このInstanceの親Materialを見たら、先週勉強したMaterialと同じでした。

今週は、Foliageに使用されている以下のStatic Meshから

一番目立っている以下のStatic Meshに使用されているMaterialの実装を見る事にします。

Material以前に不思議なのは、このStatic Mesh常にCameraに向かって正対している事です。

これどうやっているんでしょう。

Materialを見て行きます。

使用しているMaterial Instanceを遡って親Materialを見つけました。

中を見て行きます。

PreviewのImageです。

実装です。

あらー。

もう答えを見つけてしまいました。

それでは実装を見て行きます。

まずMain Nodeです。

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

Blend ModeがTranslucentなのは分かります。

Two Sideになっているですが、ひょっとしてこのMaterial、Spriteみたく板に貼っているんでしょうか?

Emissive Colorから見て行きます。

Debug Modeの時は赤単色ですね。

その先にはColorize from mask channelsがありました。

この中身を見て行きます。

まずAlpha Color Blendを使用しない場合ですが、

Main Colorでお終いです。

Alpha Color Blendを使用する場合は、まずLerpノードが来ます。

Aの先は複雑なので最後にみます。

Bですが、

単なる黒で影を表しています。

Alphaですが、One Minusが来て

ここのTexture SampleノードのGに繋がっています。

このTextureのGを見ると

こんな感じです。

Aの先ですが、以下の様になっています。

このLerpノードのAlphaですが、Texture Sampleノードの

Rに繋がっています。

RのTextureはこんな感じです。

これだと先だけHigh Light色がつく感じでしょうか?

影が良く分からないですね。

因みにこのTexture、sRGBにCheckは付いていないですね。

次のOpacityを見ていきます。

Debug ModeのTrueは1ですね。

Falseの方を見て行きます。

Use Texture for Opacity ONLYノードがありました。

Trueの方はColorize from mask channelsで使用したTexture SampleのGに繋がっていました。

Falseの方を追っていきます。

Use Shadowノードに繋がっていました。

当然、簡単なFalseから見て行きます。

Control Opacity fade out rangeに繋がっていました。

最初の部分ですが

これはある距離を超えたら黒くなると言う意味ですね。

その結果と何かを掛けています。

Texture SampleのGでした。

こいつです。

距離が近い時は白をかけるので結果は変わらず、遠い時は黒を掛けるので黒くなって消えると言う事ですね。

Use ShadowノードのTrueの方ですが、

Use mask to create fake shadowに繋がっていました。

これを読んでいきます。

最初のMultiplyノードですが、

Texture SampleノードのGと繋がっていました。

次のNodeです。

この結果とTexture SampleノードのBが繋がっていました。

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

全体的にぼやっとしていますね。

この結果をMultiplyノードに繋いで、

もう一方には、先程計算した以下の結果がきて、

掛け算をしています。

黒い部分は0、白い部分はそのままになります。

書けた結果ですが、

確かに遠くに行くと白色が消えます。

今週はここまでにしてCameraに向かって対面する為の実装は来週、勉強します。

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

<法線転写(Normal Transfer)の続き>

今週は、先週作成したSuzanneの法線転写がない状態とある状態を比較して差を検証します。

たしかTutorialに法線転写の外し方が載っていたのでそれをまず勉強し直します。

ありました。

これの事ですね。

押しました。

うーん。これであっているの?

結果です。

Suzanneの顔の下半分にも光が当たっています。

法線転写がなくてもそんなに不自然な影は出来ていませんね。

思ったよりは影の境界線もSmoothです。

一応、これで法線転写も出来た事にして次に進みます。

<RGB分離>

ここでは影を身体、髪の毛、服と別々に入れて色を変える方法を勉強するそうです。

ただしこの方法はObjectを分離して別々にCell Look ノードを組めない場合のやり方だそうです。

これObjectを分離出来ると、UEにImportした時にCustom DepthをそれぞれのObjectに対して指定出来る(はず)なのでぜひそうしたいんですが、それが出来ない場合もあるってことなんでしょうね。

TutorialではTextureが一つにまとまっていてObjectが全て結合されたModelの場合はそれが出来ないと書かれていました。

このTextureの正しい配置自体が良く分かっていない私は、別々のObjectでも同じTexture上にUV展開した場合もTextureが一つにまとまっていると言うのか良く分かりません。

取りあえずやり方だけ勉強して細かい点はもっとBlenderに詳しくなってから理解する事にします。

RGB分離のやり方ですが、Textureを赤、緑、青と塗るそうです。

???

でも先程、Textureには既に色を塗ってしまったんですが、

これはBlenderではTextureを何枚も別に作成する方法が有るって事なんでしょうね。

Tutorialだと以下の様に塗っていました。

先にTutorialのやり方を全部見る事にします。

そしてShadingで先程作成したTextureを色マスクノードで呼び出し、RGB分離をします。そしてミックスNodeで以下に示した様に繋ぐそうです。

この結果を前に作成した実装の影の色を指定する箇所に繋ぐそうです。

こっちは法線転写と違って簡単そうです。

ちょっと自分でやってみます。

新しいProjectを作成してSuzanneを配置しました。

Textureを作成して以下の様にPaintしました。

Shading画面に移動します。

ここで作成したTextureを読み込む方法が分からなくて結構苦戦しました。

以下にやり方をまとめます。

まず、作成したTextureをSaveします。

その方法ですが、Texture Paint画面で以下に示したImageを押すと開くBoxからSaveを選択します。

そしてShading画面に戻り、Image Textureノードを生成します。

生成したImage Textureに先程作成したTextureを読み込ませます。

そしてSeparate RGBノードを接続します。

以下の様にMixノードと繋ぎました。

Tutorialとは順番が違いますが、結果は同じはずです。

これ最初のMixノードのColor1にどんな色を追加すべきなんでしょうか?

取りあえず以下の様にセットしました。

結果です。

緑色が表示されないですね。

もう時間がないのでこの問題の検証は来週やります。

10.まとめと感想

今週は、MaterialでPowerノードのBaseが0~1でClampされているのを知らなくて全部考え直す必要がでてしまい、精神的な疲れが凄いです。

まあ、来週がんばります。

11.参照(Reference

[1] CGHOW. (2022a, June 9). UE5 Niagara #ScratchPad Module #3 | Spawn Count on Owner Scale [Video]. YouTube. https://www.youtube.com/watch?v=gWz4S0prECM

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

[3] CGHOW. (2022b, June 9). UE5 Niagara #ScratchPad Module #4 | LODs [Video]. YouTube. https://www.youtube.com/watch?v=mLxGuPUCh6g

[4] Epic Games. (n.d.-c. Emitter Update Group. Unreal Engine. Retrieved August 28, 2022, from https://docs.unrealengine.com/5.0/en-US/emitter-update-group-reference-for-niagara-effects-in-unreal-engine/

[5] Epic Games. (2022, March 11). Object has overlapping UVs. Unreal Engine Forums. Retrieved August 28, 2022, from https://forums.unrealengine.com/t/object-has-overlapping-uvs/8073

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

[7] Epic Games. (n.d.-b. Nanite Virtualized Geometry. Unreal Engine Documentation. Retrieved August 21, 2022, from https://docs.unrealengine.com/5.0/en-US/RenderingFeatures/Nanite/

[8] Laley, R. [Ryan Laley]. (2021, June 1). Unreal Engine 5 Tutorial - Create Nanite Meshes [Video]. YouTube. https://www.youtube.com/watch?v=YucYfUbazKY

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

[10] JSFILMZ. (2021b, May 29). Unreal Engine 5 How to Nanite Skeletal Mesh [Video]. YouTube. https://www.youtube.com/watch?v=0CVc2W2uoos

[11] JSFILMZ. (2021c, June 7). unreal engine 5 gameplay with nanite [Video]. YouTube. https://www.youtube.com/watch?v=K5FyZiPiRM8

[12] JSFILMZ. (2021d, July 16). unreal engine 5 burned forest nanite tutorial [Video]. YouTube. https://www.youtube.com/watch?v=qnPOdaWUxJI

[13] JSFILMZ. (2022a, May 1). Realistic Arid Landscape with Nanite Unreal Engine 5 [Video]. YouTube. https://www.youtube.com/watch?v=o1Arix9WLiY

[14] JSFILMZ. (2022b, June 6). Unreal Engine 5 Nanite Trees [Video]. YouTube. https://www.youtube.com/watch?v=lorFbw_dRqY

[15] JSFILMZ. (2022c, June 7). Unreal Engine 5 Nanite Grass [Video]. YouTube. https://www.youtube.com/watch?v=yKg6NxrWOgI

[16] JSFILMZ. (2022d, June 8). Unreal Engine 5 Nanite High Poly Trees [Video]. YouTube. https://www.youtube.com/watch?v=2krvh1uPSm0

[17] JSFILMZ. (2022e, June 15). Unreal Engine 5 Nanite Foliage with Wind [Video]. YouTube. https://www.youtube.com/watch?v=y2GSNmN77wY

[18] JSFILMZ. (2022f, August 21). Unreal 5.1 New Features Nanite Foliage [Video]. YouTube. https://www.youtube.com/watch?v=_oZF6bqXbjo

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

[20] WorldofLevelDesign. (2021b, February 16). UE4: Step-by-Step to Creating Your First Volumetric Cloud Material [Video]. YouTube. https://www.youtube.com/watch?v=aYxvN5cs-EU

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

[22] WorldofLevelDesign. (2021a, February 9). UE4: Analysis of Volumetric Clouds and How to Use Them [Video]. YouTube. https://www.youtube.com/watch?v=8XjEk-CP-kQ

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

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

[25] 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/

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

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

 

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

<前文>

<トランプ元大統領の自宅が捜査された件に関する考察>

今、日本では自民党と旧統一教会の癒着の話題一色ですが、アメリカではFBIによるトランプ前大統領への家宅捜査の話題一色です。

大体、1~2週間前から書き留めておいた物をこの前文に貼っているのでFBIによるトランプ前大統領への家宅捜査の最新情報についてここで書いたとしても、このBlogを発表した時には話題遅れになってしまいます。

のでそういう事はあまりここには書かないで、時間の経過によって価値が無くならない話題についてまとめる事にします。

<<BindとProtect

トランプ前大統領はアメリカ合衆国憲法修正第5条は犯罪者だけが必要な権利で、無罪の人間には全く必要がないものと散々主張していましたが、このFBIの家宅捜査に関しては、アメリカ合衆国憲法修正第5条を根拠に黙秘を貫いています。

英語では、こういう自分の事を棚に上げて他人にだけ厳しい要求をする一貫性のない人をHypocriteと呼びます。

これに対してアメリカの左派言論界は、鬼の首を取ったような大騒ぎで「この件に関してトランプ前大統領は、Hypocriteでない可能性がありますのであまり攻撃しないで下さい。彼が実際に犯罪を犯している場合は、彼の言っている事と今やっている事に矛盾は生じません。」みたいな皮肉たっぷりのコメントで溢れています。

その中で非常に勉強になったコメントがありました。

それは法にはBind(拘束)とProtect(保護)の2面性があるという話です。

一端法律が制定されると皆がそれに従う必要があります。それがBind(拘束)です。しかし皆がそれを守る事によりProtect(保護)が生まれます。

例えば、赤信号は止まる。青信号は進むと言った単純なものでもみんながそれに従う、つまり赤信号は止まる。と言うBind(拘束)される事で、青信号の時は安全に交差点を渡れる。というProtect(保護)が生まれます。

このBind(拘束)とProtect(保護)は常に一体となっていなくていけないんですが、法律は作り方によっては幾らでもこの割合を変化させる事が出来るそうです。

例えば、先程の信号の例だと、特権階級の人が交差点を渡る時は、いつも青になるようにします。するとこの人達はProtect(保護)を受けるだけでその対価であるBind(拘束)を払わなくて済むわけです。

逆に、いつも赤信号になる人達も出るとします。するとこの人達は、交差点に来るために赤信号でずっと止まらなければならなくなります。つまりこの人達はBind(拘束)を払うだけでその対価であるProtect(保護)を受ける事が出来なくなります。

このBind(拘束)とProtect(保護)の問題は全ての法に存在する問題だそうで、我々のような立場が弱い庶民は法律の話になったら法律そのものについてよりもその法律の持つBind(拘束)とProtect(保護)が誰に負担を強いて誰に利益を提供しているのかに関心を持つべきなんだそうです。

そしてトランプ元大統領に代表されるアメリカ右派の連中は、常に自分達はProtect(保護)だけを得て、自分達以外はBind(拘束)だけを負担するように法律を制定、もしくは施行しているんだそうです。

こういう観点から良い法律と悪い法律を判断する考え方がある事は初めて知りました。

勉強になりました。

<<ロシアに核の秘密を売ったのか?>>

これも今、この記事を書いている段階では本当の事は分かりません。しかしもしそれが本当だとしても私は驚きません。

Fox Newsに代表されるアメリカ右派は、メキシコからの不法移民の時、不法にアメリカ国内に侵入した家族の乳飲み子を親から引き剥がしても何とも思わない連中です。そんな彼らがアメリカ国内の白人だけ大切に扱うわけないでしょう。彼らがアメリカ国内の白人に聞こえの良い事を言うのはそれが金や票になるからだけです。

Fox Newsに代表されるアメリカ右派の言論に踊らされた人達って結局は騙されているんですよ。

彼らは嘘ついている訳ですから、騙す対象であるアメリカ国内の白人に対して幾らでも気持ちの良い事を言える訳です。それを真に受けてそれこそ救世主の再来のように詐欺師を扱った訳ですから、その代償はとてつもない大きな何かを払わなくてならなくなるでしょう。

それがロシアに核の秘密を売った事だとしても私は驚きませんね。

<<悪いのは右派だけなの?>>

これも私は言いたい。左派の連中だってこの30年間、アメリカ右派の政治で得していたんです。特に白人で男性は。

今更、我々だけは別です。みたいな顔して出て来ても、はぁとしか思えないです。

お前らだって、先程の例で言えばメキシコからの不法移民の乳飲み子が親から引き剥がされて泣いているのを見て、ゲラゲラ笑ってたじゃん。

アメリカの国境が破壊されるって右翼の嘘を、嘘だと分かっていてもそのままにしていたじゃん。

アメリカに住んでいる白人がヨーロッパで迫害されて死ぬ思いでアメリカに逃げて来た時、先住民たちが「ここは俺たちの土地だからお前らヨーロッパに返れ。」て言ったのかって聞きたいです。

その先住民たちの子孫が、南米の独裁国からアメリカに逃げて来たら、アメリカに住んでいる白人全員で「ここは俺たちの土地だからお前ら南米に返れ。」って言って実行したじゃないですか。

今更、左派の連中が一寸だけ良い顔しても、はあ。としか思えません。

<<CNNだけ微妙に違うコメントをしている>>

トランプ元大統領の核兵器に関する機密書類を自宅に隠し持っていた言い訳ですが、大統領権限で機密を解除して持ち帰った。と言っています。

これ、CNN以外の左派のCommentでは、大統領に機密書類の解除をする権限はありません。しかもそれらの機密書類を持ち帰ったのって大統領でなくなった後ですよね。という意見が述べられていました。

ところが、CNNのCommentだけ機密文書を持ち帰ったのかどうかは問題じゃない。みたいな訳わかんない論理でトランプ元大統領の言い訳に反論していました。

CNNって左派の代表メディアみたいに思っていましたが、CNNって他の左派のメディアと比較してLevelが低いんじゃね。と思いました。

<<トランプ元大統領が家宅捜査された件を中々日本のメディアが報道しなかった件>>

CNNって他の左派メディアと比較してLevelが低い。と言う話をして思い出したんですが、日本のメディアも凄くLevelが低いんじゃと感じました。

元大統領を家宅捜査するためには、99%有罪で、しかもその証拠が自宅にある事が確実である場合にのみ可能だって、最初から散々アメリカのメディアが言っていました。つまり家宅捜査が入った時点でトランプ氏の有罪はほぼ確定しているんです。しかもそれが核兵器に関する機密文書だって言うんだから、これはアメリカの歴史始まって以来の大事件である事は間違いないんです。

下手したらアメリカの共和党が崩壊するかも知れない位の大ニュースなんです。

それなのにこのニュースが日本で報道されたのが家宅捜査が開始してから3日か4日後です。

日本の終わり方は半端じゃないと思いました。

トランプ元大統領の自宅が家宅捜査された件に関する私の意見をここにまとめてみました。

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

<本文>

1.今週の勉強について

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

  1. Niagara: CGHOW氏のTutorialをやる
  2. Materialの勉強
  3. RPGのEventの作成
  4. Open Worldの検証
  5. Gaeaの勉強
  6. 雪山のMapの作成
  7. UI Designの勉強
  8. Anime Renderingの勉強
  9. Niagara: CGHOW氏のTutorialをやる

2.Niagara: CGHOW氏のTutorialをやる

今週はUE5 Niagara #ScratchPad Module #2 | Custom Drag [1]を勉強します。

2.1 UE5 Niagara #ScratchPad Module #2 | Custom Drag [1]を勉強する

今回は、Scratch Pad内にサイズや色の違うParticleのみをDragする実装を作成するそうです。

こういう実際に使用出来る実装の作成も勉強になりますが、何かもっと根本的な内容のTutorialも欲しいと思っています。

個人の感想をここに書くと、このScratch Padって結局Niagaraそのものの実装を理解しないと分からないんですよ。

Niagaraの仕組みって以下のParametersに表示されているVariable(変数)に

指定された値をAssignする事で色々なVFXを実装しているんです。

このそれぞれのVariable(変数)が実際にどの機能に関係する値を保持しているのかを完全に把握する事は不可能ですが、例えばParticle ColorだったらParticleの色に関する情報を保持しているVariableだろうと推測は出来ます。

これを理解しておかないとScratch Padの実装になった時、何をしているのか全く理解出来なくなります。

しかし逆に言えば、この辺の説明を1分位付け加えるだけでTutorialはNiagaraの初学者にも格段に分かり易くなると思っています。

個人の感想は終わりにしてTutorialの続きを勉強します。

このScratch Padの実装のために新しいNiagara Systemを作成しました。

いつも通り、Fountain Emitterを追加します。

Particle Spawn SectionにあるInitialize Particle Moduleの

Sprite Size Modeを以下の様に実装して、2つの大きさのParticleを50:50の割合で生成します。

Uniform AOr BFloatはDynamic Inputの一種で、指定したAとBをDistribution Weightの値に応じて生成する機能を持っています。

以下に示したRandom Uniformと違い指定したAとBの値だけ生成します。

ここでParticle Update SectionにおけるDrag Moduleの

Dragの値を10に変更すると

以下の結果の様になります。

Screenshotでは分かりにくいですが、大きなParticleも小さなParticleも全く同じ様にDragされています。

これをScratch Padを用いてSizeに応じてDragの強さを変える実装を作成します。

まず以下に示した右端のボタンをClickしてShow Parameter ReadsとShow Parameter Writesを選択します。

その後でParticle Update SectionにあるDrag Moduleを選択して

このModuleで使用しているParameterを調べます。

Transient Physics DragとTransient Physics Rotational Dragの二つが使用されています。

このTransientというScopeがどこを指しているのかは良く分かっていません。Tutorialの解説を聞いて理解する事にします。

Particle Update SectionにScratch Pad Moduleを追加しました。

この位置で良いのかは分かりません。駄目な時は直します。

Scratch Padを開いてまず名前を変更します。

ここはDragに関する実装は作成しないで、Particleの大きさに関する実装を作成するそうです。

Map Get ノードにParticle Sprite Sizeを追加します。

でも、これってSpriteのSizeでParticleのサイズじゃないんじゃない?

コメントでも以下の様に言っています。

Tutorialを見るとお構いなしに続きを作成しています。

とりあえずTutorialに従って続きをやります。

Break Vector 2Dノードを追加しました。

このXの値をGreater Thanノードを使用してBと比較します。

BのTypeはFloatに変更しました。

そしてMap Getノードに繋ぐ事でScratch Pad ModuleからInput出来る様にしました。

この後の実装です。

このやり方は先週のTutorialでやった方法と一緒です。

Applyを押します。

Scratch Pad の実装は終わって、NSに戻って来ます。

まず今作成したScratch PadであるCustom Drag ModuleをDrag Moduleの上に移動させます。

そしてDrag ModuleのDragに以下の様な実装を追加します。

更にCustom Drag ModuleのMy Sizeに1.0をセットします。

結果です。

Sizeが1より大きいSpriteにはDragが10掛かっています。

Greater Thanなので1以上じゃないです。1より大きい値です。

これ英語だけや日本語だけで考えている時は絶対間違えないんですが、英語から日本語、もしくは日本語から英語に訳すときにGreater Thanを以上って言ってしまう時が多々あります。

Less Thanは未満と言う適切な言葉が有るんですが、Greater thanにそのままあたる言葉はないので訳すのが非常に面倒な言い回しです。

後、Scratch Pad Moduleの実装でInput ParameterをGet Map Module内に作成しましたが、

これがCustom Drag Moduleの

Selectionに表示されて

値をここで指定出来る事はTutorialで解説してほしかったです。

この後、Tutorialは色々調整して以下の様なVFXを作成しています。

が、あんまり本筋とは関係ないのでこれはSkipします。

以上でした。

2.2 もう少し何かを勉強する

これだけだと一寸短いのでもう少しだけ何かを勉強する事にします。

Niagara Systemの基礎の勉強に集中しすぎたので、今度はUE5のNSで最新の機能について勉強する事にします。

Content Exampleを見てたら、そう言えば昔、UE5に新しく追加されたSampleを一通り見たのを思い出しました。調べたら2022-04-18のBlogでCGHOW氏がUE5に新しく追加されたSampleを一通りReviewした UE5 Content Example | Niagara Fluids | Chaos Destruction [2]を勉強していました。

これを見直すと

  • Fluid Simulation
  • IK Rig
  • Chaos Destruction

の3つが紹介されています。

じゃ、これらのどれかを勉強しようかな。と思ったらFluid Simulationは私のPCでは計算出来なかったと書かれていました。

うーん。

じゃこれらは新しいPCを買ってから勉強します。

そう言えば先月新しいPCを買おうと思って値段を調べたら余りにも高くて買うのを止めたんですが、以下のPCの値段はどうなっているんでしょうか?

安い!

凄く安くなっています。

これは待って正解でした。

上記のUE5の最新のNSは新しいPCを買ってから勉強します。

それで色々なTutorialを見たんですがClouds in UE5 Niagara Tutorial | Download Files [3] を勉強する事にしました。

一番最初にCGHOW氏のTutorialを勉強した時、UE4でこれと全く同じEffectのTutorialを実装したはずです。

しかもその時、雲の色が光を当てても変わらず、そのやり方が分からないで断念した記憶があります。

調べたら2021-08-022021-08-09のBlogで勉強していました。

読み直すと結構、苦労しています。

まずこのTutorialで使用されているModuleと今のNSのModuleが全く違うので同じ機能を追加するために別なModuleを探して使用しています。

そしてとうとう怒りのコメント

しかも以下に書いたように、雲を光らせる事が出来なくて

最後に断念しています。

しかしこのTutorial、CGHOW氏のTutorial集の一番最初にあるのでほとんどの人がこれを最初に勉強すると思うんですが、

いきなりSub UVを使用しています。

これはNiagaraのVersionが古くて今のNiagaraでは再現出来ない事を除いても、初心者にはかなりLevelが高く挫折しやすいTutorialでしょう。

2.3 Clouds in UE5 Niagara Tutorial | Download Files [3] を勉強する

まず軽く全部見ました。

雲を光らせる部分ですが、何か所か今まで見た事がない設定を弄っていました。これをやったら雲が光るんだと思います。

それでは実装してみます。

まずNSを作成します。

Render SectionにあるSprite Renderer Moduleの

MaterialにM_Smoke_subUVをセットします。

これSub UVを使用しているのでもう少し丁寧な解説をしてほしかったんですがTutorialは凄い勢いで先に進んでしまいます。

今回は別にSub UVの復習をするのが目的ではないのでTutorialの同じペースで勉強します。

Sub Image Sizeを以下の様にセットします。

Particle Update SectionにSub UV Animation Moduleを追加します。

Sub UV Animation ModuleのEnd Flameが63になっているのを確認します。

この後、Velocity Moduleなどを弄って以下の様にしました。

この辺は重要じゃないので記録しません。

EmitterのPropertiesの

Local SpaceにCheckを入れました。

確かLocal SpaceにCheckを入れるとNSがLevel上で動いたときに生成されたParticleも一緒に動くはずです。

今回のVFXにこれが必要なのか疑問が残ります。

一応後でこれが無い場合との違いを確認します。

TutorialでやっているようにLevel上に配置します。

小さい。

大きくします。

まずParticle Spawn SectionにあるInitialize Particle Moduleの

Uniform Sprite Size MinとUniform Sprite Size Maxの値を以下の様にします。

あれ。これってSpriteのSizeを決めていたっけ?

ここはParticleのSizeだと思ったんですが。

調べて見たら、Particleのサイズを変えるようなParameterは存在しませんでした。私がParticleのサイズを調節してるParameterだと思っていたのはSpriteのSizeを調節するParameterでした。

NS_Cloudのサイズを調整します。

Particle Spawn SectionにあるShape Location Moduleの

Box Sizeを以下の様にしました。

結果です。

更に雲の発生量を増やすためにPropertiesの

Sim TargetをGPUに変更します。

勿論、Fixed BoundsにCheckも入れます。

そしてEmitter Update SectionのSpawn Rate Moduleの

Spawn Rateに5000をセットします。

こんな感じになりました。

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

ただし以下に示した様に枠から少しはみ出しています。

これをUser Parameterを使用して直します。

Particle Spawn SectionのShape Location Moduleの

Box SizeにUser Box Sizeをセットします。

すると以下に示した様にLevel上に配置したNS_CloudのDetailにBox Sizeが表示されます。

以下の値にすると

大体ぴったりします。

Play中の画面です。

中々良い感じです。

しかし以下の様に突然雲が消える時があります。

これはPropertiesのFixed Boundsのせいです。

数字を増やします。

結果です。

確かに雲が消える事は無くなりましたが、角度によってはちらつきが出ます。

雲の移動が観察出来ないので、Particle Spawn SectionのAdd Velocity Moduleの

VelocityのMaximumの値を100にし、

かつParticle Update Sectionの

Curl Noise Force Moduleを追加して以下の設定にしました。

結果です。

PCが凄い音しています。

私のPCではこれは結構きついかもしれません。

Emitter Update SectionのSpawn Rate Moduleの

Spawn Rate を2000に落とします。

結果です。

これでやる事にします。

EmitterをDuplicateします。

2つ目のEmitterの設定を変更します。

Particle Spawn SectionのInitialize Particle Moduleの

Sprite Size を以下の様に大きくします。

更にParticle Update SectionのScale Color Moduleの

Scale Curveの値を0.2に下げました。

そしてParticle Spawn SectionのAdd Velocity Moduleの

Add Velocityの値を変更しました。

結果です。

この辺はあんまり真剣にやる事は無かったんですが一応、きちんとやりました。

この後、NS_CloudのCast Shadowにチェックを入れています。

うーん。

何をCheckしているのか分かりません。

この後、Tutorialでは3つ目のEmitterも作成しているのですが、私のPCが持たなそうなので、これはSkipします。

やっと次に光の追加をやります。

一つ目のEmitterをDuplicateします。

まずPropertiesのGPUをCPUに変更します。

GPUはLight RenderはSupportしていないからです。

あ。

これ忘れていた。

Render SectionにあるSprite Renderer Moduleを消してLight Renderer Moduleをセットします。

要らないModuleは全部消しました。

Particle Spawn SectionのInitialize Particle Moduleの

Color Modeの設定を以下の様にしています。

まず、Random Hue/Saturation/Valueを選択しています。

そしてColorのVの値を10,000にしています。

更に Hue Shift Rangeも-1~1にセットしています。

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

Vの値を10,000にしたらRの値が10,000になっています。

またRender SectionのLight Rendererに戻って

Affect TranslucencyにCheckを入れます。

これってひょっとして。

調べたら以下の説明が表示されました。

やっぱり。

これにCheck入れたら半透明なモノにもこの光の影響が現れるって事でしょう。

はい。とうとう雲が光の反射光を受けて光りました。

一年間の謎が解けました!

Tutorialでは最後にSprite Renderで使用しているMaterialのLighting Modeを

から

に変更しています。

Surface Forward Shadingでは

となるそうです。

結果です。

凄いんですが、私のPCでは処理が追いつかずカクカクしています。

以上です。

2.4 Clouds in UE5 Niagara Tutorial | Download Files [3] を勉強して

一年間も謎のままだった雲の光らせ方がとうとう分かりました。

まず一つ目は、Light Rendererを使用しているEmitterのParticle Spawn Sectionの

Initialize Particle Moduleの設定を以下の様にする事です。

当然ですが、光が強くなければ雲を反射光で光らす事は出来ません。

次にLight Renderer Moduleの

Affect TranslucencyにCheckを入れる事です。

最後に雲の生成に使用しているMaterialのLighting Modeを

Surface Forward Shadingに変更します。

一年前に作成したCloudのNSを見つけました。

この実装に上記の3つを変更させた結果です。

雲が反射光で光っているのが確認出来ます。

出来ていますね。

3.Materialの勉強

先週、途中で止めたと思っていたんですが、一応全部終わらせていました。ので今週はBen Cloward先生の次のTutorialであるRain On The Lens Post-Process Effect - Shader Graph Basics - Episode 53 [4] を勉強する事にします。

軽く全部見ました。

カメラに水滴が着いたEffectを作成しています。

Unityで理論を解説していました。

実装内容は以下の非常に簡単なMaterialですが、

以下の関数を自作していて

この関数の実装が物凄く複雑です。

しかもUnreal では作成方法だけ解説していてその実装のものになる理論はあまり解説されていません。Unityによる実装でも元の理論についての解説はあまりないのかもしれませんが、見て確認する必要はあります。

3.1 Rain On The Lens Post-Process Effect - Shader Graph Basics - Episode 53 [4] を見る

Unityの実装から見ると実装そのものが理解出来ない可能性があるので、まずUnrealの実装を見て、実装そのものは理解した後で、Unityの実装を見る事でその実装の元にある論理を勉強する事にします。

UnrealにおけるWeather Screen Dropsの実装を見る>

ここは何故、そんな実装をやるのかとかその計算の裏にある理論はどうなっているのか。とかは考えずに淡々と実装方法だけ見て行きます。

まず以下のTexture Sampleノードを使用しています。

ここに使用されているTextureはDownload出来るそうです。後でしましょう。

そのTexture SampleノードのUVsの計算です。

Screen Resolution ノードは画面のPixel数を返すNodeのはずです。1920 x 1080みたいな数字か返ると思われます。

Component MaskノードでXとYの値を分離しています。1920と1080になったんでしょうか?

それをDivideノードで割っています。1920/1080 = 1.777…ですね。

これにAppend ノードで1を追加して(1.777, 1)のVectorにしています。

その値をTexCoord[0]ノードで掛けています。

うん。

分かりました。これってTextureのサイズが正方形なので画面に合わせて変形しているんです。

でもこの計算だと横長になりそうです。

その後のMultiplyノードはTextureのサイズを調整しているだけです。

Texture Sampleノードの後の実装です。

RGとAlphaの値でRGBのVectorを作成しています。2を掛けて1を引いているのは、値のRangeを0~1から-1~1に変更したからでしょう。Normal Mapにでも使用するのでしょうか?

続きです。

やっぱりそうでした。

でもその後でMaskしてRGだけパスするなら何で最初にAlphaの値を足したんでしょうか?

Rangeを-1~1に変換したBの値は以下の実装で使用していました。

そのためにBの値も一緒に計算したみたいです。

そのNormalの値ですがNormalとして出力する前にMultiplyノードである値を掛けています。

この値はTutorialの説明によればMaskの値だそうです。

このMaskの実装を追います。

まずTexture SampleのBの値からTimeノードの値を引いています。これは時間による変化を出すためです。

ただ引くのが良く分からないです。いずれnegativeな値になってしまうんじゃないでしょうか?

その後でFracノードに繋いでいます。

Fracノードの機能って何でしったけ?

忘れてしまいました。

公式のDocumentであるMath Material Expressions [5] によると

と言う事だそうです。

つまり0~1の間の値を返すみたいです。

そこに-1~1の間の値に変換されたBの値にSaturateした値を掛けています。-1~0はSaturateされて0になり、残り半分の0~1の値はそのままのはずです。

うーん。

これが何を計算しているのか不明です。

Tutorialに説明がありました。

-1~1の間の値に変換されたBは元々はTexture SampleのAlphaの値です。何とこのAlphaには時間によって変化する滴と定常な滴の2つがAlpha値の違いとして保存されているそうです。それが-1~1に変換された時に0以下の値のモノは定常な滴、0以上の値は時間によって変化する滴なんだそうです。

それでこの実装の意味が分かりました。Bの値が-1から0の間の滴は計算結果が0になり、全くTimeノードの影響を受けなくなります。

となるとここまでの計算では定常な滴の値が0として計算されてしまっています。

定常な滴の分を別に計算して足す必要があります。

それを以下の部分でやっています。

まず定常な滴は-1から0までの値としてBに保持されているので-1を掛けてPositiveにします。

PowerノードはContrastを付けるための調整です。

そしてSaturateノードで0から1の範囲に調整して、時間によって変化する滴の計算結果と合わせます。

最後にこの計算結果と前に計算したNormal Mapの結果を掛けます。

以上です。

うん。Unrealの解説を聞くだけで実装方法だけでなくその元になっている理論も全部理解出来ました。

実装してみます。

3.2 Rain On The Lens Post-Process Effect - Shader Graph Basics - Episode 53 [4] を実装する

テスト用にそれっぽいLevelを作成しました。

ここにGlobal Post Process Volumeを追加します。

そんなActorは無いです。

どうやら普通のPost Process Volumeの名前を変更しただけみたいです。Post Process Volumeを追加します。

Post Process VolumeのInfinite Extent (Unbound)にチェックを入れます。

そしてPost Process MaterialにMaterialをセットします。

セットしたMaterialがきちんと働いているのか確認するために以下の実装をしてみます。

結果です。

真っ黒になりました。

効いています。

それではまずMaterialの実装からやっていきます。

まずこれから実装するMaterial Functionを作成しました。

以下の様になりました。

それではMF_Weather_Screen_Dropの実装を作成します。

まずTextureをImportしました。

中身を確認します。

Rです。

Gです。

一見、Rと全く同じかと思いましたが、影の方向が違いますね。

後、sRGBにチェックが入っています。

RとGの値は後でNormal Mapとして使用するのですが、これそのままで良いんでしょうか?

Bです。

おお、これはかなり違いますね。

そしてAlphaです。

ああ、成程。

黒い点が定常な滴、白い点が動く滴になっています。

Textureを追加しました。

このTexture SampleノードのUVsの実装から作成します。

これが画面にどんな影響を及ぼすのかを一寸確認したいです。

まず比較のために以下の実装をしたMaterialをPost Processに使用します。

結果です。

横に拡大してみます。

画面のサイズが横に拡大するにつれて、滴も横に広がっています。

もはや滴には見えません。

今回の実装の場合です。

結果です。

横に拡張してみます。

滴のサイズは変化しません。

代わりにTextureの繰り返しが増えました。

まあ、想定していた通りですが、実際にその通りになると結構感動します。

ただこの計算方法だと画面が横に広がる場合は対応出来ますが、縦に広がる場合は滴が大きくなるだけですね。

まずTexture SampleノードのRGの値からNormal Mapを作成します。

うーん。

ここでもsRGBからRGBに変換していないので元からTextureのsRGBの設定がOffなのかもしれません。後でTutorialのUnityの時のTextureの設定を確認します。

次にこのNormal Mapに掛けるMaskの実装をします。

動的にサイズが変化する滴のMaskから作成します。

先程のTextureのBの値ですが、以下に示した様にそれぞれの滴によって0から1の間の値が振り分けられています。

この値にTimeノードの値を追加する事で滴の動きがバラバラになります。

それがこのBの値の役割でした。

まず、Timeによって変化する滴の値を実装しました。

次に定常な滴がここに表示されないように実装を追加します。

TextureのAlphaは以下に示した様に定常な滴は黒で表示しています。

これが上記の計算では0になっています。

0を掛ける事で動的に動いている滴から消える訳です。

確認のためにSaturate ノードの結果を見たら

真っ黒です。

何で?と調べたら

Texture SampleのAlphaの値をBではなくAに繋いでいました。

直しました。

Saturateノードの結果です。

ああ、成程。

この計算によって定常な滴だけではなく滴が無い部分も値が0になるんですね。

今度は定常な滴のMaskを作成します。

ここはまず-1を掛けた結果から見て行きましょう。

この白い点が定常な滴です。

残りは要らないので黒くします。

ここでTutorialの実装ではPowerしてSaturateしています。

が、白い部分以外を黒くするだけなら、Floorノードを使用した方が早い気がします。

ので試してみました。

結果です。

あれ、白い部分が凄く小さくなってしまいました。

あ、それでPowerノードを使用していたんです。

Powerノードの結果です。

うーん。Powerノードは0~1の間の値にはContrastを付けるはずです。

これ-1~0の間の値はどうなるんでしょうか?

計算してみました。

うーん。これじゃ動的な滴も追加されてしまいます。

動的な滴は最低限の大きさがある。って仮定しているのかもしれませんね。

しかしAddノードを見ると

動的に点滅している滴のMaskが白くなる瞬間がありません。

と思ったら録画した映像にはありました。

これは、訳わからん。

次に行きます。

Maskの計算結果をNormal Mapに掛けます。

滴が消えたり現れたりしています。

これでMF_Weather_Screen_Dropは完成です。

Materialに戻って繋いでみました。

結果です。

うーん。まあ画面に滴がついているように見えなくもないって感じです。

最後にTextureのsRGBの確認だけします。

やっぱりsRGBのCheckが外れています。

ここだけ直します。

Checkを外しました。

何とTexture SampleノードがErrorになってしまいました。

こんな説明がされています。

Texture SampleノードのSampler TypeをLinear Colorにしろ。と言っています。

しました。

Errorは消えましたが、このSampler TypeはNormalなんじゃないでしょうか?

うーん。Linear Colorでも良いんでしょうか?

良く分かりません。

結果です。

あれ?

明らかに滴感が増しています。前の結果と比較するとかなりマシになりました。

うーん。定常の滴の計算箇所と言い、最後のsRGBの設定と言い良く分からない箇所がありますが、これ以上頭が回転しないので今週のMaterialの勉強はここまでにします。

これらの問題は来週、頭がすっきりしてからもう一回考える事にします。

3.3 Stylized Materials Packを見る

Anime Renderingに関係しますが、以下のPackが非常に興味深いので一寸だけ見る事にします。

これです。

2022-05-02のBlogに書いていますが、Toon Renderingで以下の様に影を付けましたが、

本当は、

こういう影が付けたかったんです。

どうやって作成したんでしょうか?

Materialを見ると以下の実装がされています。

そんなに複雑な実装ではないですね。

Fresnelと

Texture Sampleの

合成で作成しています。

Texture Sampleに使用されているTextureは

単なる線ですね。

流石に今、この実装を読む気力はないので実際に読むのは来週以降になりますが、非常に興味深いです。

4. RPGEventの作成

4.1 Eventの表示

一週間考えたんですが、以下の形式でEventを表示する事にします。

Eventが開始された時は以下のポーズ画面を開いてEventボタンを押すと

現在開始しているEventを表示するようにします。

以下の様にしました。

イベントを押します。

透明な画面が被っているので何が何だか分かりません。

Event画面が開くときは、Pause画面を一端消して、

Event画面を閉じる時にもう一回Pause画面を開くようにしました。

結果です。

閉じるを押します。

Pause画面に戻ります。

このEvent画面がEvent毎に変わる様にします。

後これとは別に、Eventが開始した時にEventが開始された事を知らせるWidgetを表示したいです。

最初のEventの開始はMap1に着いた時にします。

本当は会話の途中でEventを開始したかったんですが、それをやると会話を虱潰しに当たる必要が生じてUserに全ての会話を聞く事を強要する事になります。

のでかなり強引ですがMap1に初めて来た時にEventを表示する事にします。

出来ました。

以下のCodeを追加してこのWidgetを最初にMap1に着いたときだけ表示するようにしました。

更にEvent Start Screen Widgetに以下の実装を追加してPause Menuから開いた時とMap1に着いたときのボタンの機能の違いに対応しました。

4.2 久しぶりにRPGの実装をいじった感想

Eventの実装を追加する事自体は簡単なんですが、今まで書いた膨大なCodeがどうなっているのかが分からなくなってしまっています。

この部分のCodeを変えたらどこに影響が出るのかが不明になってしまいました。時間が空きすぎました。

もう何か最初から作り直したい気分です。Map1のWorld Compositionも今見るとかなり変な作りになっています。

まあ、今はコツコツやって行って最後にまとめてこれだけに集中して仕上げればなんとかなりそうではあります。

10分位Playしてみましたが楽しく遊べる事は遊べました。

5. Open Worldの検証

5.1 これからの課題

先週の最後で、これからは以下の事を勉強すると書きました。

この中でLandscape用のMaterialの作成方法とFoliageを使用した草や木の追加方法についてはやり方は既に分かっています。

Water Systemを使用した川や湖の追加、とNaniteを利用した岩の配置の方法が大体は分かっていますが完全には分かっていません。

<Naniteの復習>

まず今まで勉強したNaniteの復習からやる事にします。

Blogを見直してNaniteに関してどんなTutorialで勉強したのかとその結果、何を理解し何が実装出来る様になったのかについてを整理します。

量が膨大になるので別な節を作ってやる事にします。

<Water Systemの復習>

UE5におけるWater Systemを勉強した事があるのかは覚えていませんが、UE4のWater Systemなら勉強した記憶があります。

これも過去のBlogを調べて、どんなTutorialで勉強したのかとその結果、何を理解し何が実装出来る様になったのかについてを整理しておきます。

5.2 今まで勉強したNaniteの復習

過去のBlogを読み直して今までのNaniteに関して勉強した内容をまとめ直す。

2021-12-13

ここで初めてNaniteの勉強をしました。

公式のDocumentであるNanite Virtualized Geometry [6] を読んでその内容を簡単にまとめています。

この週はまだ最初の2つの節を読んだだけですね。

2021-12-20

Nanite Virtualized Geometry [6] の続きを読んでその内容をまとめています。

ここで気になる内容が書かれていました。

Naniteが使用出来ない条件に

Custom Depthが入っています。

これCharacterの輪郭線を出すために使用する予定だったんですが、CharacterにはそもそもNaniteを使用しないのでCustom Depthを使用しても大丈夫だと解釈しているんですが、どうなんでしょう?

後、Spline Meshも使用出来ない一覧に入っています。Water SystemってSpline Meshの一種だった気がしますが。

これも確認が必要です。

それだけじゃなくてMaterialに関しては以下の機能を使用する事も出来ないそうです。

Decalはあんまり勉強した事ないですが、近い将来勉強しようと思っていた分野です。

これDecalを使用したMaterialにはNaniteが干渉しないのか、そもそもDecalが一個でも配置されたらそのLandscape上ではNaniteが全く使用出来ないのかのどちらかなのかが分からないです。

前者だったらそんなに問題ないですが、後者だと結構大問題ですね。

2021-12-26

Nanite Virtualized Geometry [6] の続きを勉強しています。

今、Nanite Virtualized Geometry [6]を読みながら、Blogにまとめてある内容と比較しているんですが、Blogに書いてある内容とNanite Virtualized Geometry [6]の内容が微妙に違っています。

Nanite Virtualized Geometry [6]のNanite Fallback Mesh and Precision Settingsの内容の大部分は更新されて新しくなっているみたいです。

これは後で読み直す事にします。

ここでは、Nanite Virtualized Geometry [6]のNanite Fallback Mesh and Precision SettingsとPerformance and Content Issuesについて一生懸命まとめていますが、あんまり理解しているとは言えないですね。

そもそもこの辺の知識が無くてもNiagaraの基礎は使えそうです。

2022-01-10

Nanite Virtualized Geometry [6]のData Sizeを勉強してその内容についてまとめています。

と言うか全然まとめてなくて、何書いてあるのか全く分からんから一字一句訳してみます。と全部訳しています。その中で訳の意味が通じない部分を検証して多分、こう言う事を言っているのではと推測しています。

やっている内容は理解出来ますが、もう少しまとめてくれ。と読んでて思いました。

内容自体に関しては、多分こういう話をここではしているんだろうと言う推測までは出来ていますが、その推測が合っているのかは今でも不明です。というかこの部分、理解出来なくてもNaniteで作成する事に何の支障もない気がします。

Skipして良い内容だと思います。

2022-01-17

Nanite Virtualized Geometry [6]の残りの節であるVisualization ModesとConsole Variables and Commandsについて勉強しています。

今、Nanite Virtualized Geometry [6]を見直すと、Visualization ModesとConsole Variables and Commandsの間にAuditing Nanite Contentと言う節が有るんですが、これについてのまとめはありませんでした。

Visualization ModesとConsole Variables and Commandsは前の2つの節と違ってNaniteを使いこなすためには勉強して使用方法を理解しておく必要がありそうです。

<ここまでのまとめ>

何かNaniteはえらい沢山勉強した記憶が有るんですが、その割にあんまり成果が出なかったというかあんまり理解していないんです。

これBlogをまとめてその理由が分かりました。

Naniteの勉強のそのほとんどの時間は公式のDocumentであるNanite Virtualized Geometry [6]を読む事に費やしていたからでした。

このDocument、読んでおいて損はないですが、絶対読まないとNaniteが使用する事が出来ないと言うものでもありません。更に後半部分の内容はNaniteの使用を一通り経験した後でないと理解出来ないようなAdvanceな内容がかなりあります。

これをNaniteを全く使用した事ないのに全部理解しようとしたんですから、大変なのは当たり前です。

まあ、でもこういう勉強をしておくと、後で理解した時にああ、あの時読んだ内容はこういう意味だったんだと理解出来ます。ので全く無駄になったわけではないはずです。

2022-01-24

ここではNanite Virtualized Geometry [6]の勉強が終わったので、次はもう少し実践的なTutorialで勉強したいと言って他のNaniteのTutorialを探しています。

それだけです。

2022-01-31

 Unreal Engine 5 Tutorial - Create Nanite Meshes [7] を勉強しています。

前の週で調べたNaniteのTutorialの中で、一番良さそうなのを選んだみたいです。Ryan Laley氏のTutorialでした。

氏のYouTube Channelを見たらAuthorized Instructorって表示がありました。

これってどうやったら取れるんでしょう?

試験みたいなのがあるんでしょうか?

しかし久しぶりに。Ryan Laley氏のYouTube Channelを見たら非常に精力的に新しいTutorial SeriesをUploadしていました。

これは注目する必要がありますね。

肝心のTutorialを勉強した内容ですが、そのまとめを読むと結構面白いです。

例えば以下のMaterialの実装を見て、

こんな実装は初めて見た。とうろたえています。

ただ、今このやり方でNaniteの設定をするのが最適なのかは分かりませんね。World Partitionでも一寸前の設定方法と今の設定方法は全く違っています。Naniteの設定方法はもっと最新のTutorialで勉強し直す事にします。

2022-02-06

Unreal Engine 5 Tutorial - Create Nanite Meshes [7] の勉強内容とその前に勉強したNanite Virtualized Geometry [6]の内容を比較しています。いますが本当に一寸しかやっていません。

Naniteの勉強は以上でした。

<Naniteの勉強まとめと来週の予定>

今までNaniteの何を勉強したのかは分かりました。来週からはNaniteの最新のTutorialを探してそれを勉強する事にします。

5.3 Water Systemの復習

こっちはまとまって勉強した記録は出て来ませんでした。

これに関してはKlaus氏がWater System込みのLandscape作成用のTutorialを作成しているはずなのでそれを先に調べます。

以上です。

6.Gaeaの勉強

先週、 How To Create An Open World Snow Landscape | Unreal Engine 5 Tutorial [8]のTutorialを勉強したんですが途中で止めています。残りを勉強する事にします。

6.1 How To Create An Open World Snow Landscape | Unreal Engine 5 Tutorial [8]を実装する

先週のBlogを読み直すと「もう何をやっているのかが分からなくなってしまった。のでここで終わりにします。」と書いてありました。

何の対策も無い状態で続きから始めてしまうと、この何も分からないまま最後まで勉強を続ける。と言う恐ろしい結果になる可能性があります。

それで先週勉強した箇所を先に実装してみます。

実装する事で、先週勉強した内容の理解が深まって、今週勉強する内容が全く分からない。となる事態を防げる事を期待しての事です。

それでは始めます。

一応、先週のまとめを参考にしながらもTutorialを見ながら実装する事にします。

まず以下のTipを見逃していました。

まあ一個でもKlaus氏のTutorialをやったらこの事は知っています。

以下の実装から始まっています。

取りあえずそっくりに作りました。

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

Tutorialを見るとPerlinノードの設定が細かく記録されています。

記録通りにセットしました。

念のためにTutorialでも確認します。

先週のBlogにまとめた以上の事はやってなかったです。

Perlinの結果です。

何か私のは山じゃなくて穴があいていますね。でもこれでやってみます。

Warpノードを追加した結果です。

先週のBlogには以下の様に書いていますが一応確認します。

あってました。

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

こんな感じです。

川が出来ているのか良く分かりません。近づいてみます。

出来てました。
Blogには以下の様に書かれていました。

しました。

結果です。

Terrainが変化した事は分かりますが、どう変化したのか具体的に言えと言われると言えません。

次にThermal Shaperノードを追加します。

LandscapeがFuseつまり溶けた感じになりました。

比較のために、Riverノードの結果を同じ位置からScreenshotにしました。

TutorialだとThermal ShaperノードのParameterの値を少しだけ弄っているので一寸だけ変更しました。

Shapeの値を変更する事でConcaveもしくはConvex な形状(凹凸のある形状)に変化出来ると説明されています。

これ少し試してみます。

ShapeがNegativeの時は、Concaveな形状(凹のある形状)になるそうです。

Shapeが-100の時です。

Shapeが100の時です。

確かにShapeが100の時の方が谷が無くなって全体的に平らになっています。

Shapeが-100の時は全体的になだらかになってはいますが谷は残っています。

どちらの値でも全体的にはなだらかになっています。

またWarpノードを追加します。

結果です。

おお。

Tutorialの例とは全然形が違いますが、Mesa(テーブル状の台地)が出来ています。

この上にTerraceとErosionを追加してMesaを完成させるそうです。

そのためにまずFractional Terracesノードを追加します。

結果です。

おお。段差がよりはっきり現れました。

この辺なんか地層が出来ています。

UEのBookmarkみたいな機能がほしいですね。

一端近づいて詳細を確認した後に前の俯瞰図を見る為の位置にパッと戻れると非常に楽です。

Terranceが多過ぎるので少し減らします。

TutorialではTerraceが多すぎなのかもしれませんが、私のTerrainは適切な気がします。

でもこれは勉強なのでTutorial通りにGradientノードでFractional Terracesノードの調整をします。

Gradientノードの設定です。

結果です。

うーん。Terraceが増えている気がします。

Tutorialで確認します。

うん。あってました。

GradientノードのClampのMaxはDefault値が100なのでその半分にしたからTerraceが減っていると表現していました。

後、Tutorialの例だとFractional Terracesノードを追加した時も別にTerraceが増えてないです。

これはSeedによって生成されるTerranceが変わるので傍目にはあまりTerraceが増えてなく見えるSeedもあるみたいです。TutorialではSeedの値を変えてTerraceを増やしていました。

後、Fractional Terracesノードの結果の変化をReal timeで見る為のPinの使用に関しては先週のBlogでまとめてあるのでここでは省略しました。

Erosionノードを次に追加します。

とうとうErosionノードの登場です。

結果です。

あれ、全体的に平らになってしまいました。

Erosionもそんなに見えないし。

あ、これがSedimentなのか。

Sediment Removalの値を40にします。

ErosionノードはApply Changes を押して初めて変化したParameterの値が適応されます。

結果です。

確かにSedimentが無くなってErosionがはっきりしています。

特に谷底の変化が顕著です。

Sediment Removalの値が40の時です。

Sediment Removalの値が0(Default値)の時です。

この結果を見るとErosionノードを追加する時は常にSedimentに気を付ける必要がありますね。

確認のためにTutorialを見たら以下のRandom Sedimentationの値を162にしていました。

ので同じようにしました。

結果です。

ただこのRandom Sedimentationの機能が分かりません。

GaeaのTutorialを勉強していて、機能を説明するBoxが表示されるようになるButtonか何かがあったはずです。

一寸調べます。

2022-04-11 から2022-05-23のBlogを見直しましたが見つかりませんでした。

ただGaea Beginner Tutorial Series : Part 1 – Interface [9] の復習が出来たので良かったです。

Gaea Beginner Tutorial Series : Part 1 – Interface [9] はGaeaのUIについての解説をしています。勉強した時は余りに退屈で非常に苦しかったんですが、Blogにまとめてある内容を今、読み返すと非常に役に立つ事が書かれていました。

これは後でしっかり復習すべきですね。

今勉強している How To Create An Open World Snow Landscape | Unreal Engine 5 Tutorial [8]の勉強が終わったら、Gaea Beginner Tutorial Series : Part 1 – Interface [9] の復習をする事にします。

Random Sedimentationについてなんですが、公式のDocumentであるNode ReferenceのErosion [10]に解説がありました。

これは地学の知識がないと理解出来ないです。

一応、この文章を読んだ限りの理解で語ると以下の様になります。

まず前提としてSedimentation(沈殿)のProcessにはある種のランダムが関係しているみたいです。

これは川の底に沈殿物が貯まる場合を想像すると何となく理解は出来ます。

ただこのランダムが本来のErosionの場合はほとんど影響しないそうです。

え、そうなの。

川の底をイメージしたら流されてきた砂とかランダムに沈殿しそうなんだけど。

じゃあ、何で敢えてこのParameterを作成したのかと言うと、特殊な場合、例えば沈殿がある場所にしか起きないみたいな設定を追加した場合に必要になるからだそうです。

うん。

何となく分かりました。

でもこの解釈、最初の「Sedimentation(沈殿)のProcessにはある種のランダムが関係している」が地学的な観点から見て正しくないと成り立ちません。

のである程度理解出来たかも。位にしておきます。

次にErosionノードをもう一回追加します。

先週のBlogでも書きましたが、

Erosionノードを何回も分けて追加する本当の理由は分かりません。

ただErosionノードを追加したら以下の様に

折角、除去したSedimentがまた生成されてしまいました。

そこでBlogに書いたようにMinを押します。

これによって

となるそうです。

結果です。

確かに先程まであったSedimentが無くなりました。

比較のためにこのErosionノードの前の状態をScreenshotしました。

2つ目のErosionノードを追加した場合、山の部分の侵食が目立っています。

確かにTutorialの言っている効果は確認出来ました。

Tutorialの解説も聞き直しましたがBlogでまとめられている以上の説明は無かったです。

次に行きます。

次は雪を追加します。

そのためにSnowfallノードを追加しました。

結果です。

Terrainのほとんど全てが雪に覆われてしまいました。

Snow Lineの設定を25にします。

結果です。

これでもほとんど雪に覆われています。

Tutorialの結果と大違いです。

あんまりTutorialと違う結果になるのも嫌なので以下の設定に変更しました。

その結果です。

Blogに書かれているのでSettle-Thawの値も上げましたが

こっちは良く分かりません。

Tutorialでも確認してみます。

TutorialではSettle-Thawの機能についての解説は特にありませんでしたが、Intensityの値も弄っていました。

同じ様にしました。

公式のDocumentであるNode ReferenceのSnowfall [11]では以下の解説がありました。

と言う事は、SettlingとThawingの意味が分かればこのParameterの意味も分かる?

Thawingは雪や氷などの固体が溶ける事だそうです。

Settlingはその場に留まる事を意味する時もあります。

あ。これなら理解出来ました。

雪の溶ける割合を示すParameterでしょう。

それを理解してからSettle-Thawの値を0にしたり100にしたりして結果を比較すると100の時の方が雪の量が増えていました。

Blogに書かれた以下の解釈は多分、間違いですね。

Snowfallノードは雪を表すNodeですのでその下の岩の亀裂を管理するのは少しオカシイ気もしますし。

次にこの太陽光が当たる方向の雪を溶かします。

そのためにSun Light ノードを以下に示したように追加します。

ここでSunlightノードはSnowfallのMeltピンに接続する必要があります。

結果です。

あんまり変わっていませんね。

Blogを見たら以下の事を更にしていました。

やってみます。

結果です。

おお、今度は太陽光が右側から当たっているのが分かる位には雪の溶け方が違っています。

Tutorialの内容も一応確認したら2つ目のErosionノードにPin as Underlayを付けていました。

このPin as Underlayの機能は、さっきGaea Beginner Tutorial Series : Part 1 – Interface [9] の復習をしている時に出て来ました。

調べたら2022-05-02のBlogに以下の様に書かれていました

つまりSatMapsノードで色を追加する時の元のTerrainをこのNodeから使用すると言う事みたいです。

Tutorialでは更にSnowfallノードのSnowlineの値も少しだけ下げていました。

一応、少しだけ下げました。

結果です。

雪の量が増えました。

はい。最後にWaterを追加します。

まずRiverから追加します。

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

結果です。

次にLakeを追加します。

結果です。

どう見ても多すぎます。

Lakeの量を減らします。

ここから良く分からない部分です。

まず、RiverノードにUnderlay Pinを追加します。

そしてMaskノードをLakesノードのMaskに繋げます。

MaskのEditを押して

以下の部分を赤く塗りました。

結果です。

げ。谷底の水が無くなってしまいました。

更に中央の赤い印をつけた部分にはほとんど水が溜まっていません。

Maskをやり直します。

以下の様に塗り直しました。

これ一端塗った場所を消す方法が分かりません。

今度はこんな結果に。

うーん。

今週はここまでにして残りは来週直す事にします。

でも先週、訳わからなくなった水の追加の部分がそれなりに理解出来ました。来週やる時にはもっと理解が深まっていると思われます。

今週の勉強は結構、Gaeaの理解が深まりました。

7.雪山のMapの作成

今週もUE4: Step-by-Step to Creating Your First Volumetric Cloud Material [12]の続きを勉強し直す事にします。

7.1 Volumetric Advanced Outputについて

UE4: Step-by-Step to Creating Your First Volumetric Cloud Material [12]でまだ実装内容を理解していない最後の部分であるVolumetric Advanced Outputについて勉強します。

これです。

公式のDocumentであるVolumetric Clouds Reference [13] にVolumetric Advanced Material Output Expressionの説明がありました。

要するにVolumetric Cloudをもっと細かく設定出来るNodeであるって事です。

それは分かっています。

と思ったらそれぞれのInputについて詳しい解説がありました。

<Phase G

Phase Gは光の錯乱する方向を定義していました。

Per SampleのSampleが何を指しているのかが分かりません。と言うかPer Sampleじゃない時は、何を基準にして錯乱の方向を決定しているんでしょうか?

まあ、そうは言っても自分でこのNodeと同じ機能を持つMaterial Functionを実装する訳ではないので、この位の曖昧な理解でも問題ないでしょう。

<Phase G2

これPhase Gと全く同じ解説ですね。

<Phase Blend

成程。だからPhase GとPhase G2がある訳ですね。

となるとPhase Gで0、Phase G2で1を指定してPhase Blendで0.5を指定した場合と、Phase Gで0.5、Phase G2で1を指定してPhase Blendで0を指定した場合は、どちらのPhase も0.5になるという解釈で良いんでしょうか?

テストしてみます。

Phase Gで0、Phase G2で1を指定してPhase Blendで0.5を指定した場合です。

Phase Gで0.5、Phase G2で1を指定してPhase Blendで0を指定した場合です。

全然違う。

うーん。

ならばPhase Blendの値を0にしてPhase G2の値を色々変えてみます。

これは全く同じでした。

この後色々試したんですが、最初の考え方で合っている気がします。最初の例も一見全然違う様に見えましたが良く見ると結構そっくりです。

この考え方で合っていると信じて先へ行きます。

何とVolumetric Advanced OutputノードのInputの最初の3つの意味が既に解明出来ました。

これは全部理解出来そうです。

<Multi Scattering Contribution

これは全部理解出来そうです。

はい。

Successive Octaveって何の事でしょう?

他のMuti Scatteringの項目も全てこのSuccessive Octaveを調節しています。

OctaveってFrequencyを倍々したものを呼ぶそうです。Frequencyが2,4、6、8なのをSuccessive Octaveと呼んでいるんでしょうか?

この辺はもっと情報がないと理解出来ませんね。

Successive Octaveが何なのかを知っているのは常識みたく解説していますが、そのSuccessive Octaveを説明しているサイトが一個も見つからないとなると、これ以上の理解をするのは一寸無理です。

<Multi Scattering Occlusion

これもSuccessive Octaveが何なのか分からないと理解出来ません。

<Multi Scattering Eccentricity

これもです。

<Conservative Density

これも本当に理解するためにはVolumetric Cloudを作成するための式を知らないと無理です。

その式の中にMedium Conservative DensityというParameterがあるんでしょう。

このInputに関してはBen Cloward 先生のVolumetric Cloud Materials - Building Worlds In Unreal - Episode 33 [14] で実際に使用した例があるのでその実装を勉強する時に勉強する事にします。

8.UI Designの勉強

先週、作成した先攻後攻を決める演出をGameに組み込みます

選択した結果に応じて適切な次のEventを呼び出せるようにします。

このWidgetを今まで使用していた先攻後攻を決めるWidgetの代わりに生成するようにします。

今まで使用していたWidgetはMy Find First WidgetというVariableに保持されるような設計になっていました。

この変数がどこに使われているのか不明です。

ので検索で確認しました。

どこにも使用されてないようです。

これでGame中に先週作成された先攻後攻の演出が使用されるはずです。

テストします。

最初の先攻後攻を選択する場面です。

普通に表示されました。

先週作成した通りに動きました。

だだし右下にボタンが残っていたりカードにCursorをカードに合わせた時に色が変わるのがあまり目立ってなかったりしています。

この辺は後で直します。

戦闘が開始し次のターンになりました。

先攻後攻を選びます。

はい。

普通に選べました。

この後以下に示した様に魔法選択のWidgetが消えなくなってしまいました。

このBugを直します。

関係がありそうな実装部分をCheckしましたが問題は見つかりませんでした。

もう一回Gameをやってみました。

Stage 7までGameをやったんですが、このBugを再現出来ませんでした。

このBugに関しては後で検討します。

カードの選択に関しては以下の様に直しました。

左のカードがCursorを載せた時の色です。

これなら左が選択されている事はUserに伝わります。

後、ボタンも必要ないので消しました。

9.Anime Renderingの勉強

9.1  今回の予定

今回、初めてのAnime Renderingの勉強として、10回程度ここで勉強する予定です、

以下に勉強する予定の内容を書いておきます。

それではそれぞれの勉強をして行きます。

9.2 PPLineDrawingの検証

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

<Depth Based Outline

今週は、Depth Based Outlineの実装について勉強します。

ぱっと見ですが、こっちは一般的なOutlineの抽出ですね。

まずここで、上下左右のPixelのScene Depthの値を取るための計算をしています。

Scene Texel Sizeを掛けてScene Depthの1Pixelのサイズに調整しています。

TextureのPixelだからTexelが正しい言い方なんですね。

Voxelは何かスッと納得出来たんですが、Texelは何かPixelとどう違うのか?何か同じな気がします。UVとXYのようなみんなが使ってるから何となく使用しているけどよく考えると同じじゃないという気がします。

次の部分で中心のTexelのScene Depthの値からの差分を取っています。

次にParameterで最大値を指定してClampしています。Clampの最小値は指定した最大値*-1でした。

特にCommentは無いです。

空とかの隣のObjectなんかは差分がとんでもない事になりそうですし。Clampしておくのは理解出来ます。

次は全部の差分を足します。

うーん。

ここが分からない。全部足したら±0になり易くなる気がします。絶対値取って足して4で割った方が差分が出やすくない?

そしてその結果をLine Shapeにパスしています。

むむ。

この計算だと理論上は-4~4の間の値がPassされると考えられます。

まずPowerですが、0~1の値をPowerした時はContrastを大きくします。

以下に例を示します。

1以上の値でPowerした場合は黒さがUpされ、0から1の間でPowerした場合は白さがUpしています。

しかし今回は0以下の値をPowerする場合もある訳です。

0以下の値をPowerした場合、以下に示した様に奇数と偶数で結果が全く変わります。

この後Clampして0と1の間の値へ変換していますが、これPassされた値がNegativeだった場合、Powerの値が奇数だったら全部0になります。所が偶数の場合は0にはならずにPassされた値がPositiveだった時と同じ値になります。

これだとPowerの値を指定する段階で奇数の値を入力するか偶数の値を入力するのかを考慮する必要が出て来ます。

更に1以上の値だった場合もPowerの性質がContrastを付ける。から単に指数的に値を大きくする。に変化します。

Passされた値が1以上だった場合、後でClampするのでPowerの値に関係なく全部1に収束します。

これ以外にもPassされた値が-1以下だった場合も考える必要があります。

この辺の問題を回避するために、上下左右の差分の絶対値を足して4で割った値をClampして、その後でPowerした方が安全な気がします。

うーん。

でもひょっとするとScene Depthの場合、ここで書いた内容は気にしなくて良いのかもしれません。

例えばScene Depthの場合、比較対象のPixelの左右のどちらかの値が比較対象のPixelと違う場合はあっても、左右両方の値が比較対象のPixelと違う場合はあんまり想像出来ません。

こういうScene Depth特有の縛りがあるのかもしれません。

良く分かりません。

この辺の疑問はもっとOutlineの抽出についての知見が高まったら理解出来るのかもしれません。

一応、今回はこんな疑問を感じたと言う事だけ記録に残しておいて、後でもっとOutlineの計算に対しての理解が高まった時に検証する事にします。

それ以外の点については特に理解出来ない部分も無いです。

以上です。

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

もう2,3個、Materialを見る事にします。

今週は以下の柵のMaterialを見てみます。

以下のMaterialが使用されていました。

最初のMaterialから見てみます。

結構複雑です。

ここは同じですね。

Falseから見ていきます。

<Mask & Color Wood

Mask & Color Woodです。

ここはいつものLerpノードを3つ使用して色とTextureをAlpha値に基づいて混合している部分ですね。

Lerpノードを順番に見て行きます。

まず最初のLerpのAlphaは距離による実装の変更です。

Bの遠い時は、

単なるこの色を使用しています。

近い時は以下のLerpの結果を使用します。

Alphaの実装です。

Mask Parameterノードは初めて見るノードですね。

DefaultではGにセットされていました。

Texture SampleノードにセットされているTextureを以下に示しました。

何か凄い芸術的なTextureです。

Gには以下の値が入っていました。

この白い部分つまり先程のLerpノードのBには以下の色がセットされていました。

そのLerpノードのAには最後のLerpノードが繋がっていました。

このLerpノードのAlphaにはSwitch Parameterノードが繋がっています。

これも初めて見るNodeです。

Default値ではTrueになっています。

Trueの実装を追います。

以下の実装がありました。

あれ、一つ前のLerpのAlpha値と同じ?

調べたら全く同じ設定でした。

多分Texture SampleノードのUV値がちがうんでしょうね。

このLerpノードのBには以下の色が、

そしてAには以下の色が

セットされていました。

<Creates UV Offset from number

Mask & Color Woodにあった二つのTexture SampleノードのUV値を計算する実装です。

こんな実装です。

Pannerノードがあります。TimeにWireが繋がれていると言う事は時間によってTextureが移動すると言う事です。

なんで柵のTextureは移動しないんでしょう。

TexCoord[0]ノードにParameterを掛けていますね。まあ普通のUV値ですね。それをPannerに繋げてその計算結果をTexture SampleノードのUV値に返しています。

下のTexture SampleノードはSwitch Parameterです。

DefaultではTrueにセットされています。

その場合のUV値は先程の上のTexture SampleノードのUV値と一緒です。

Falseの時は

を単に繋いでいます。

World Off SetがTrueだった場合、この2つのTexture Sampleノードは全く同じ結果になると思います。

<Creates a single number obtained from…

PannerノードのTimeの値を計算している部分です。

これ見るとTimeによって変化していませんね。それぞれのObjectの位置によって別な値が生成されることによって、MeshのMaterialの模様にずれをもたらす為の実装の様です。

<Create world vector for water height

最後に一番最初のSwitchノードでTrueを返した場合の実装を見て行きます。

Water Level Multiplyを使用した場合です。

最初のLerpノードのAlphaから見て行きます。

またLerpノードがあります。

World Position with Scaleノードは何をしているんでしょうか?

World Positionを入力された値で割っているだけでした。

そのObjectの配置されている高さによってA(0)になったりB(1)になったりするんですね。

その値がそのまま最初のLerpノードのAlpha値として返されます。

1の時はMask & Color of Woodで計算された値、0の時はMask & Color of Woodで計算された値にWater Level Darknessノードの値を掛けた値になります。

以上でした。

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

先週、色付けしたSuzanneに法線転写(Normal Transfer)を追加しました。

しかし結果を見ると法線転写出来ているのか分かりませんでした。

ので今週は、

をこのSuzanneに実装して本当に法線転写が出来ているのか確認します。

BlenderのSuzanneのProjectを開いたら以下のSuzanneが表示されました。

あれ、出来ている。

そうか。

以下の設定で白丸を選択したら上記のImageが表示されるんでした。

これを見るとSuzanneの鼻の部分が平らになっていませんね。

選択出来ていなかったんでしょうか?

確認します。

半球と法線転写したSuzanneの顔の部分のObjectを消してみました。

うーん。鼻の部分も消えていますね。

良く分かりません。

今週の目的のRGBミックスの実装をやります。

2022-06-192022-06-26のBlogに前に勉強したRGBミックスの内容がまとめられていました。それをまず読み直します。

要は以下の実装を作れば良いみたいです。

まずこれを作成します。

しました。

結果です。

顔の上部に関しては法線転写は出来ていますね。

顔の下部はいつも影になっています。

これでは見にくいので2022-06-26のBlogで勉強した

も追加で実装します。

ここに出ているMultiplyノードが見つかりません。

Tutorialを見直したらMix ノードとなっていました。Mixノードで探したらありました。

以下の実装になりました。

結果です。

Suzanneの顔の上部には目などの影は生じていません。

Lightを動かして見ました。

綺麗とは言い難いですが顔の上部は法線転写は効いています。

しかし顔の下半分はずっと影のままになっています。

うーん。

なんで?

来週考える事にします。

最後に折角作成したSusanneの色を塗ったTextureを使用して影の変化を見ようと思います。

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

MaterialのNodeはBlenderとUEで違いますが、底の理論は同じなのでBlenderのNodeの機能を理解したら、どこにTextureを追加すれば良いのか直ぐに分かりました。

結果です。

うーん。前よりは見栄えが良いですね。

Lightを動かしてみます。

やっぱり顔の上半分だけ法線転写が効いていますね。

法線転写が無い状態との比較が必要ですね。

来週やります。

10.まとめと感想

今週は普段より集中していて普段の1.5倍位出来そうな勢いでした。あんまりやり過ぎるのも体に良くないので、途中からSaveして意識的に量を減らしました。

11. 参照(Reference

[1] CGHOW. (2022, June 8). UE5 Niagara #ScratchPad Module #2 | Custom Drag [Video]. YouTube. https://www.youtube.com/watch?v=8ogtukZWwkI

[2] CGHOW. (2022a, April 6). UE5 Content Example | Niagara Fluids | Chaos Destruction [Video]. YouTube. https://www.youtube.com/watch?v=TgYtTbHHoMs

[3] CGHOW. (2022b, June 13). Clouds in UE5 Niagara Tutorial | Download Files [Video]. YouTube. https://www.youtube.com/watch?v=SrhS0075Qls

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

[5] Epic Games. (n.d.). Math Material Expressions. Unreal Engine. Retrieved August 21, 2022, from https://docs.unrealengine.com/5.0/en-US/math-material-expressions-in-unreal-engine/#frac

[6] Epic Games. (n.d.). Nanite Virtualized Geometry. Unreal Engine Documentation. Retrieved August 21, 2022, from https://docs.unrealengine.com/5.0/en-US/RenderingFeatures/Nanite/

[7] Laley, R. [Ryan Laley]. (2021, June 1). Unreal Engine 5 Tutorial - Create Nanite Meshes [Video]. YouTube. https://www.youtube.com/watch?v=YucYfUbazKY

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

[9] Klaus. (2022a, January 12). Gaea Beginner Tutorial Series : Part 1 - Interface [Video]. YouTube. https://www.youtube.com/watch?v=H-vTeYYHJPM&list=PLyNtvXvNIFMMHnW1_-hXO3RNPp_Z5CExF&index=1

[10] Quadspinner. (n.d.-a). Erosion - Gaea Documentation - QuadSpinner. Gaea Documentation. Retrieved August 21, 2022, from https://docs.quadspinner.com/Reference/Erosion/Erosion.html

[11] Quadspinner. (n.d.-b). Snowfall - Gaea Documentation - QuadSpinner. Gaea Documentation. Retrieved August 21, 2022, from https://docs.quadspinner.com/Reference/Snow/Snowfall.html

[12] WorldofLevelDesign. (2021, February 16). UE4: Step-by-Step to Creating Your First Volumetric Cloud Material [Video]. YouTube. https://www.youtube.com/watch?v=aYxvN5cs-EU

[13] Epic Games. (n.d.). Volumetric Clouds Reference. Unreal Engine Documentation. Retrieved August 21, 2022, from https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/LightingAndShadows/VolumetricClouds/VolumetricCloudsReference/

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

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

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

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

 

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

<前文>

<Nancy Pelosi下院議長の台湾訪問について>

これについては私の中で色々な考えが交錯しているのでそれぞれ短くまとめる事にしました。

最近の私の思想は以下に集約されます。

自由な競争、何か成果なのかをはっきりと決めて、どうやってそれを実現したのかや、誰が実現したのかは問わない。そしてその成果にあった対価を必ず払う。をしっかり守っている限り、どんな辺境で資源の無い国でも発展する。逆に、どんな大国でもこの自由競争が無くなった瞬間から衰退する。

この観点から今のアメリカを見るとアジア人に対して積極的に自由競争から排他し続けたため国の衰退が始まっています。

これは本当は30年位前から始まっていたんですが、アメリカは日本人が稼いだ金を奪う事と他のアジア人、特に中国人の知的成果を奪う事で、衰退をごまかす事が出来たんです。

それがとうとう出来なくなりました。

一つ目の理由は日本人が働かなくなったからです。

いくら働いても成果がでなければ人間、働くのを止めます。

日本人は大体30年位前から一部の業界を除いて働くのを止めてしまいました。これは知的生産と言う意味においてです。中村修二氏の青色ダイオードの発明のような知的な生産をもって働いているとみなしています。決してただ会社に通っている事を働いていると定義しているのではありません。というか会社には通っているけどなんの知的生産もしてない事を働いていないと定義しています。

そしてその結果として日本から奪うお金が無くなってしまったんです。

そして次にアメリカは他のアジア人、特に中国人をアメリカで働かしてお金を稼ぐ事を考えました。しかもそのアジア人をアメリカから追い出せば正当な報酬を払わないで済む事に気が付いて、どんどんアメリカから追い出してしまいました。この一番分かり易い例が、Huaweiの副社長がスパイ容疑で追い出された件です。

私がアメリカにいた時は、Facebookだったかで中国人留学生に散々働かしてた後、わざとVisaを申請しないで成果を丸どりしていたらしいんですが、それに絶望したある中国人留学生が職場の窓から飛び降り自殺した。事件を聞きました。

アメリカ人は、こうやってアジア人が苦労して育てた木になった果実だけを奪っていたわけです。

流石にアメリカに留学するような知的階級の中国人ももう気が付いた訳です。アメリカ人が言うアメリカンドリームが単なる詐欺だって事に。

そういう大きな流れから見た今回のNancy Pelosi下院議長の台湾訪問について、私の私見をここにまとめます。

<<何故4時間で着く場所に7時間もかけて到着したのか?>>

これが私が一番言いたい事ですが、兎に角アメリカの民主党って何もしないんです。やるって言ってうだうだしているんです。

台湾訪問に関しては賛成、反対の両方の意見がありますが、彼女の政治信条を知れば、彼女が中国共産党を捨てて民主国家である台湾を支持するのは直ぐに推測出来ます。だったらスパッとやれば良いのに、何でそんなグタグタ時間をかけてやるんでしょうか?

これは自由競争がないからなんでしょうね。

生まれた家で行ける大学が決まってしまう。そしてそういう大学を出て初めて競争のスタートラインに立てるわけで、最初から競争相手がいないから、うだうだやっていても競争で負ける事がないんでしょうね。

私はこれ、アメリカの終りの始まりに見えました。

<<何故、中国はあんなに怒ったのか?>>

アメリカに一寸でも住んだ事があればアメリカが台湾を見捨てる選択が存在しないのは分かります。

なのに、何であんなに中国は怒ったんでしょうか?

私にはそれが不思議でした。

私は、アメリカについてはその辺の専門家より全然知っていますが、中国についてはほとんど無知です。何故、中国がそんな態度に出るのか全く理解出来なかったです。

まず、中国はアメリカに対して火遊びをするな。と散々警告していましたが、在米歴10年の私から見れば、火遊びしているのは中国政府のように見えます。台湾問題に関して言えばアメリカが共和党になろうが民主党のままでいようが引くと言う選択はありません。

このまま中国が引かなければ必ずアメリカとの戦争になります。

その戦争でどちらか勝つのかは別問題ですが、戦争になるのは避けられません。

本当に中国共産党にその覚悟があるのか、測りかねました。

<<中国人知的階級と共産党の関係は良好なのか?>>

これが知りたい。

中国共産党が中国人知的階級に対して、アメリカが払わなかった正当な対価や地位を積極的に与えているのか?それともアメリカより惨く奪っているのか?を知りたいです。

ここが米中戦争が起きた時に勝敗を分けるキーポイントだと思っています。

私はアメリカの事情は知っていますが、中国の事情は知りません。ので全くの推測ですが、あんまり大切に扱わなくなってる気がします。

ので彼らが表面上は共産党に忠誠を誓っていても心の底ではアメリカより中国共産党に敵意を持っている可能性はあります。

この場合は最後の最後で、中国共産党を裏切るので米中戦争はアメリカの勝利で終わる可能性が高くなります。

逆に中国共産党から大切に扱われているなら、アメリカにとって最も恐ろしい存在になります。アメリカとの戦争はthe First Opium War(アヘン戦争)の再来だ。この戦争に負けたらまた中国人は白人の奴隷にされる。との信念に基づいて戦う訳です。非人道的な兵器だってどんどん開発するでしょう。戦争は泥沼化します。

更にHackingの問題もあります。私はHardは全然詳しくないですが、IntelのChipはHackingしやすいような設計に元々してあるという噂は良く聞きます。そしてそれは元々は、日本がアメリカを出し抜いた発明をした時にその成果を奪う為に敢えて付けたものだったらしいんですが、それが今は中国がアメリカの機密をHackingして手に入れるために役に立っているそうです。

私がアメリカにいる時に聞いたのが、中国のスパイ機関はホテルにHackingしてアメリカの議員が愛人といつ会っているのかを全部知っているという話でした。

これはまあマイルドな例ですが、これ位は今でもやっていると噂されている訳です。

これに対して中国のSystemをアメリカはHacking出来ないらしいんです。どうやって防いでいるのか不明ですが、兎に角出来ないらしいんです。

この辺の技術格差は中国知的階級の扱いに直結しています。ので私は中国人知的階級と共産党の関係は良好なのかが知りたいわけです。

<<一部のアメリカ人の訪台だけは止めておけと言う意見が間違っている件について>>

一部のアメリカ人が主張している中国は平和を望んでいるがNancy Pelosi下院議長が訪台したから仕方なくこういう事態が起きた。と言う意見は完全に間違っています。

それは、アメリカ人全体が、ネットから全ての行動を監視かつ管理されて、中国政府から厳しい指導を受けても全然、平気と言うのならそうですが、そうじゃないでしょう。

しかも私の見立てでは来年か再来年には中国は台湾に軍事侵攻します。

もうアメリカは腹くくって中国と戦争するしかないんです。

<<台湾が中国の一部であると日本政府が認めた件について>>

これも嘘です。

日本政府は日中国交正常化の時に、台湾が中国の一部である事を認めろと言われてそれを拒否しています。それに対して当時の中国の最高権力者であった鄧小平氏は、両国の合意出来ない問題は未来に持ち越す事にします。と言ってその場でYesともNoとも言わなかったんです。

だから本当は、日本政府は、台湾が中国の一部であると認めてもいないし、否定してもいないんです。

今週は、Nancy Pelosi下院議長の台湾訪問について思いつくままに色々書き連ねました。

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

<本文>

1.今週の勉強について

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

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

この中で成果があまり出ていないのが、UI Designの勉強です。この時間をGDi4K氏のTutorialの勉強に当てた方が効率が良いのは確かですが、それをやってしますとUEの勉強だけでGameの作成をほぼ止める事になってしまいます。

2.Niagara: CGHOW氏のTutorialをやる

今週は先週まで勉強したUnreal Engine 5 Niagara Beginner Tutorial - UE5 Niagara Starter Course! [1]の総括をやります。そして時間があったらCGHOW氏の

を勉強します。

2.1 Unreal Engine 5 Niagara Beginner Tutorial - UE5 Niagara Starter Course! [1]の簡単なまとめ

2022-06-19のBlogからこのTutorialを勉強しています。以下にそれぞれの節の簡単なまとめをします。

<Create Project

Tutorialでは本当にProjectの作り方から教えているみたいですね。

Niagaraの勉強はUEの初心者には難しすぎます。Projectの作り方も知らない人が勉強するのは無理です。

更に私の意見として以下の事をまとめています。

  • Niagaraの勉強は必ずMaterialの基礎を理解した後で行うようにしましょう。
  • Materialを理解するには線形代数の知識が必要です。

<Create Niagara System and Emitter

Niagara Systemの作成方法について解説しています。

コメントとしてTutorialではSystemとEmitterの違いについて全く説明していないけどここで説明した方が良いのでは?と書いていました。

Niagara UI

NSのLayoutについての解説です。

<Difference between Emitter and System

EmitterはNSとは違いLevel上に配置する事は出来ません。

<Basic of Emitter

EmptyなEmitterからParticleを発生させる方法について説明しています。

正しここで作成しているEmitterには、初心者には理解が難しいModuleを使用していたり、説明部分に間違いがあるのではと色々書いてありました。

<Instance Parameter in System

Instance Parameterを使用してSystemから複数のEmitterのある値を操作する方法を教えています。

これをここで教えるのはかなりハードルが高い気がします。

<User Parameter

User Parameterを作成してLevel上に配置したNiagaraのInstanceの値をDetail上から変化させる方法を教えています。

この前のInstance Parameterと言い、この辺りから急に難易度の高い内容になっています。

<Local Space

EmitterのPropertiesにあるLocal Spaceについての解説です。

NSがLevel上で移動しながらParticleを生成した場合に違いが生じます。

Basic of EmitterからUser Parameterまで結構難解な内容を教えていたと思ったら急に簡単な内容に戻りました。

GPU

NiagaraGPUを使用する方法について説明しています。

Light RendererはGPUからは使用出来ないそうです。

<Emitter Summary

Emitter Summaryに指定する方法について解説していました。

この機能は、Niagaraを販売と化した時に、必要になる機能だそうです。購入者はあまりNiagaraに詳しくないのは当然なので、全部のModuleを調節する事はできません。そこでEmitter Summaryを使用してNiagaraに詳しくない人でもある程度、微調整が出来るようにするそうです。

<Life Cycle(Loop Type)>

Emitter Update Section内のEmitter State ModuleにあるParameterであるLife Cycleについての解説です。

<LODs(Scalability)>

Scalability Modeについてです。

2022-06-26のBlogを読むと色々書いていますが、これって自分で調べた事かTutorialに書かれていた事なのかはっきりしません。

<Spawn Modules

以下のModuleについての簡単な解説をしています。

<Shape Location

Particle Spawn SectionのShape Location Moduleについてです。

<Velocity

Add Velocity Moduleについて教えています。

ここではRotation Coordinate Spaceの値がLocalとWorldでLevel上のVelocityの掛かり方が変化する事についても解説しています。

<Force

Gravity、Vortex、Curl Noise、Drag、そしてPoint Attracterについて解説しています。

<Inherit Velocity

Inherit Velocity Moduleについてです。

このModuleを使用すると、以下の様な事が出来ます。

NSを右に動かします。するとParticleはその勢いをそのまま保持して右に飛んでいきます。

<Update Overlife (Size, Color, Rotation)

これは何を言っているのかと思ったら、Particle が生成した後で、そのParticleのSize、Color、そしてRotationを変化させる方法を解説しています。

ここではParameterにCurveをセットする方法が説明されています。

<Solve Forces and Velocity Module

2022-07-18 のBlogには、TutorialではSolve Forces and Velocity ModuleとSprite Renderer ModuleはUpdate Overlife (Size, Color, Rotation)の中で解説されていますが、この2つは全く違う内容なので別枠で解説します。

Velocity ModuleやForce Moduleを使用する時はこのModuleは必ず使用しなければなりません。

<Sprite Renderer Module

Sprite Renderer Moduleの設定方法についての解説です。

これ、Sprite についての解説がないまま、ここまで来てしまいましたね。

ここで教わる事で実用的なのはSorting Modeですかね。

<Using Sub UV

Sub UVについてもう教えるのか?と驚きです。

Materialの設定方法から実装までを駆け足で教えています。

<Mesh Renderer

Mesh Rendererを使用してMeshをParticleとして生成してNSで使用する方法を教えています。

<Stop Mesh Velocity and Rotation on Collusion

地面にぶつかったMeshが跳ね返らないでそのぶつかった位置にそのまま残る様にします。

ここでは、Parameterの設定を弄る事で、簡単なProgrammingを組める事を示しています。

Ribbon Renderer

Ribbon Rendererを使用してRibbon Effectの作成方法について教えています。

Ribbonの理論については私が2021-07-04のBlogでまとめた内容が一番分かり易いです。

Ribbon Material

Ribbon に使用するためのMaterialの作成方法について解説しています。

<Beam Emitter

Beam Emitterの作成方法について教えています。

<Light Renderer

Light Rendererの生成方法についてです。

<Component Renderer

Component Rendererの生成方法についてです。

<Event (Location、Death、Collusion)

はい。ついにEventについての解説が来ました。もうここまで来るとNiagaraの基礎編も最後の部分って感じになります。

それぞれのEventの作成方法について説明しています。

<Static Mesh Location

Static Mesh を使用してParticleを発生させる位置を指定するModuleです。このModuleの使用方法を教えています。

正直このModuleの使用方法は、もっと最初で教えるべきでしょう。

<Skeletal Mesh Location

Skeletal Mesh を使用してParticleを発生させる位置を指定するModuleです。

<Morph Effect

Morph EffectをLerp Particle Attributes Moduleを使用して作成する方法について教えています。

<Fire Material

最後に今まで勉強した知識を活用して、火のEffectを作成しています。

2.2 Unreal Engine 5 Niagara Beginner Tutorial - UE5 Niagara Starter Course! [1]の感想

まとめていて思いましたが、あんまりにも内容が濃すぎて、全部は書ききれなかったです。

省略した部分にもかなり大切な内容があります。

もしCGHOW氏が初心者用のTutorialとしてこのTutorialを作成したんだけどどう思うと私に相談したと仮定して、それぞれの節に対しての感想を書いて見たいと思います。

<Create Project

要らないです。

Projectの作成方法を知らない人が、Niagaraの勉強をするのは早すぎます。全く理解出来なくて終わります。更にNiagaraが理解出来る様になるためには先にMaterialの基礎を理解する必要があります。そしてMaterialの基礎を理解するためには線形代数の知識が必要です。

<Create Niagara System and Emitter

順番としてこれを最初に持っているのは鋭いと思います。

SystemとEmitterについて解説する前に、公式のTutorialであるNiagara Overview [2]やNiagara Key Concepts [3]を先に読んでもらうと、このTutorialが非常に分かり易い事が学習者に分かってもらえると思います。

Niagara UI

ここはCGHOW氏、独自のLayoutの設定方法について解説しています。要らないと思います。

DefaultのLayoutでも十分見やすいのでDefaultのままで良いと思います。

<Difference between Emitter and System

これも独自な節は作成しないでここの内容は、前のCreate Niagara System and Emitterでついでに教えてしまえば良いと思います。

<Basic of Emitter

ここで最低限のEmitterの設定方法について教えています。

<第一部のまとめ>

ここまでで、第一部です。

ここまで勉強すると以下の事が理解出来るようになっているはずです。

  • Niagaraを勉強するためには先にMaterialの基礎を理解する必要がある。
  • NiagaraSystemEmitterParticleで構成されている。
  • 更にSpawn Updateに分かれている。
  • SystemEmitterParticle更にSpawn Updateが何をやっているのか大体は理解している

そして以下の事が出来る様になります。

  • EmitterにModuleを追加する事により最低限のVisual Effectを自作出来るようになる

これだけ出来るようになれたらNiagaraの最初の勉強としては十分でしょう。

<Instance Parameter in SystemとUser Parameter

この二つをここで教えるのは早すぎます。後に回します。

<Emitter Summary

これらもここで教えるのは早い気がします。

ここは、折角最低限のVEを自力で完成させたのだから、次はそのEmitter内のModuleの設定についての解説か、そのEmitterに追加する事で、VEをもっと複雑なものにする内容を教えるべきだと思います。

ので

<Local SpaceGPUとLife Cycle(Loop Type)とLODs(Scalability)>

をここで教えるか、

<Spawn とShape LocationとVelocityとForceなどのModule

を先に教えるべきだと思います。

更にここで、

<Static Mesh LocationとSkeletal Mesh LocationSolve Forces and Velocity Module

についても教えてしまうべきです。

<Inherit Velocity

これは教えても教えなくてもどっちでも良い気がしています。

ここで先程の、Instance Parameter in SystemとUser Parameterについて教えるべきだと思います。

Emitter Summaryに関しては最後の炎のEffectを完成した後で教えても良い気がします。

ここまでで第2部とします。

<第2部のまとめ>

ここまで勉強すると以下の事が理解出来るようになっているはずです。

  • EmitterPropertiesであるLocal SpaceGPULife CycleLoop Type)そしてLODsScalability)などの機能の意味を理解し、かつ自分で操作する事が出来る
  • ほとんど毎回使用するModuleであるSpawn Shape LocationVelocityForceの機能を理解し使いこなせるようになる。
  • Instance Parameter in SystemUser Parameterを使用してSystemNSInstanceから値を設定出来るようになる。

これらの事が出来る様になります。

ここからが第3部になります。

<Update Overlife (Size, Color, Rotation)

ここでは更に複雑なModuleを習います。そしてModuleのParameterにCurveなどのDynamic Inputを設定する方法を勉強します。

<Using Sub UV

Sub UVの使用方法について勉強します。

<第3部のまとめ>

第3部では以下の事が理解出来るようになります。

  • Size, Color, Rotationなどの更に複雑なModuleについて
  • ModuleのParameterにCurveなどのDynamic Inputが使用出来る事、
  • Curveの使用方法
  • Sub UVの使用方法

順当に知識が詰めている気がします。

第4部です。

<Mesh RendererRibbon RendererとBeam EmitterとLight RendererとComponent Renderer

ここでは色々なRendererについて学びます。

これらのRendererの仕組みとそれぞれを0から実装出来る様になります。

第4部はこれだけです。

<Morph Effect

第5部です。第5部はMorph Effectを勉強した後で、最後の仕上げとして炎のEffectを作成します。

以上です。

それぞれの節について感想を書く予定でしたが、途中からこのTutorialをもっと初心者向けに整理したらどんな順番にすべきか?に変わってしまいました。

2.3 Unreal Engine 5 Niagara Beginner Tutorial - UE5 Niagara Starter Course! [1] をまとめ直す

前の節をもう一回整理します。

<第一部>

Niagaraの基本中の基本を勉強する。

以下の事が理解出来る、もしくは実装出来る様になります。

  • NiagaraはSystem、Emitter、Particleで構成されている。
  • 更にSpawn とUpdateに分かれている。
  • EmitterにModuleを追加する事により最低限のVisual Effectを自作出来るようになる

Tutorialで対応しているのは

  • <Create Project>
  • <Create Niagara System and Emitter>
  • Niagara UI>
  • <Difference between Emitter and System>
  • <Basic of Emitter>

です。

<第二部>

ここでは以下の3つの事を更に学びます。

  • EmitterPropertiesの機能についてです。
  • VFを作成するためにほとんど毎回使用するModuleの機能や使い方です。
  • SystemNSInstanceなどのEmitter外からEmitterModuleの値を設定する方法です。

Tutorialで対応しているのは、

  • <Local Space>、<GPU>、<Life Cycle(Loop Type)>、<LODs(Scalability)>
  • <Spawn Modules>、<Shape Location>、<Static Mesh Location>、<Skeletal Mesh Location>、<Velocity>、<Force>、<Inherit Velocity>、<Solve Forces and Velocity Module>
  • <Instance Parameter in System>、<User Parameter>

です。

<第三部>

ここでは3つの事を勉強します。

  • Size, Color, Rotationなどの更に複雑なModuleについてとそのParameterCurveを使用する方法について
  • Sub UVの使用方法
  • Sprite Rendererの機能について

Tutorialで対応しているのは、

  • <Update Overlife (Size, Color, Rotation)>
  • <Using Sub UV>
  • <Sprite Renderer Module>

です。

前の節のまとめではSprite Renderer Moduleを抜かしていました。

<第四部>

ここでは色々なRendererについて学びます。色々なRendererの仕組みとそれぞれを0から実装出来る様になります。

  • Mesh Renderer
  • Ribbon Renderer
  • Beam Renderer
  • Light Renderer
  • Component Renderer

Tutorialで対応しているのは、

  • <Mesh Renderer>
  • <Stop Mesh Velocity and Rotation on Collusion>
  • Ribbon Renderer>
  • Ribbon Material>
  • <Beam Emitter>
  • <Light Renderer>
  • <Component Renderer>

です。

<第五部>

第5部は以下の事について勉強します。ここでEventを忘れていました。ので最後の炎のEffectは第六部に回します。

  • Event
  • Morph Effect

対応しているTutorialは、

  • <Event (Location、Death、Collusion)>
  • <Morph Effect>

です。

<第六部>

最後です。

炎のEffectで実際のVFXを始めて作成します。

  • 炎のEffectの作成
  • Emitter Summaryの使い方

対応しているTutorialは、

  • <Morph Effect>
  • <Fire Material>
  • <Emitter Summary>

です。

この順番の方が絶対理解しやすいはずです。

これについてはもう少し深堀してこのTutorialを参考にして初心者向けのTutorialを自分でも作成してみます。

2.4 UE5 Niagara #ScratchPad Module #1 | velocity Condition [4]を勉強する

やっとScratch Padの勉強が出来ます。今週は最初のこれをやります。

今回はScratch Padを使用して以下の様なParticleの速度はPositiveの時はは赤、Negativeの時は緑のProgrammingを実装します。

まずいつものFountain Emitterを持つNSを作成します。

New Scratch Pad ModuleをParticle Update Sectionに追加します。

作成したら名前を変更します。

ここを変更する事で名前が変更出来るみたいです。

やってみます。

Velocity Conditionに変更しました。

Moduleの名前がVelocity Conditionに変更されています。

Moduleの位置を移動させます。

このModuleではVelocityとColorについてのParameterを扱う予定なのでScale Color ModuleとSolve Forces and Velocity Moduleより前に移動しました。

Scratch Pad Moduleの中身です。

TutorialはここのMap GetとMap Setについてあんまり詳しい解説はしていませんでした。

このScratch Pad内で自由にCodeを書くためには以下に示したParameterが何をやっているのかの説明が必要だと思います。

ので一寸勝手に追加する事にしました。

NiagaraにはParameterと言うDefaultで作成されているVariable(変数)があります。これらはParticleなどのある特徴(例えば寿命やサイズ)に関する値を保持しています。

例えばParticle VelocityはParticleのVelocityの値を保持しています。

Map Get ノードはこれらのParameterをGetする事ができます。

以下の例はParticle VelocityをGetしました。

Map Get ノードのこの機能によってParticle Velocityの値を使用してCodeを書く事が可能になりました。

Map Set ノードは逆にParameterの値を変更する事が出来ます。

以下の例ではParticle Colorの色を白に書き変えました。

このScratch Pad ModuleではMap GetノードとMap Setノードの機能を使用して色々なProgrammingの実装を行います。

それではここにParticleの色がVelocityがPositiveの時は赤、Negativeの時は緑になるコードを書いていきます。

Break Vectorノードを追加しました。

これは実際の速度はz方向だけ必要だからです。

z方向の速度がPositiveかNegativeかを見るためにLess Thanノードを追加します。

このLess ThanノードのPinを見るとTypeが指定されていません。

Select/ifノードを使用して以下の様な実装を作成します。

これでVelocityがPositiveの時は緑、Negativeの時は赤を返すようになりました。

Select/ifの設定方法については以下に示します。

まずSelect/ifノードを生成します。

+を押してLinear Colorを選択します。

Selectorの右隣の鉛筆を押してBooleanを選択します。

それぞれのLinear Colorにそれぞれの色をセットしSelectorにLess Thanノードの結果を繋ぎます。

このSelect/ifノードの結果をMap SetのColorに繋ぎます。

これでParticle Colorの値がVelocityがPositiveの時は赤、Negative の時は緑に変更されるようになりました。

最後にApplyを押します。

これはCompileみたいなもんなのでしょうか?

これ押さないとScratch Padに書いたコードは実行されません。

結果です。

あれ、色が変化していません。

Scale Color Moduleが後からColorの値を上書きしていました。このModule入らないので消します。

結果です。

VelocityがPositiveの時は赤、Negativeの時は緑になっています。

今度はParticleのサイズも変形してみます。

Map SetにSprite Sizeを追加します。

TutorialではSpriteのサイズを変更していますね。

まあ、どっちでも同じ結果なので気にしないでやっていきます。

Select/ifノードは以下の様に設定しました。

そして以下の様にMap Setノードに接続しました。

最後にApplyを押すと

以下の様になりました。

うーん。

本来ならこれで終わりですが、Scratch Pad内ではVelocityがPositiveかNegativeだけ返すようにして、その他の実装はScratch Padの外側でModuleで組みたい人もいると思います。

それをこれからやります。

Map Setノードに新しいParameterを作成します。

ScopeはParticleでtypeはFloatです。

名前はIfVelZeroとしました。

以下に示した様にここにSelect/ifノードを繋げました。

Map Setノードに直接BoolタイプのParameterを作成してセットする事が出来るのにTutorialでは何故わざわざFloatで作成しているのでしょうか?

まあ、あんまり気にしないで先に進みます。

を押しました。

NSに戻ってParticle Update SectionのVelocity Condition Moduleを選択して

Show Parameter Writesを選択すると

以下に示した通り、このModule内で値が書き換えられたParameterであうIfVelZeroが表示されます。

そしてParticle Update SectionにColor Moduleを追加し、

その設定を以下の様にします。

まずColorにLerpをセットします。そしてStart Colorに赤、End Colorに緑をセットします。

Lerp Factor、つまりMaterialのLerpにおけるAlphaに先程作成したParameterであるIfVelZeroをセットします。

結果です。

はい。このやり方でもVelocityに応じて色を変化させる事が出来ました。

今度は速度に応じてSpriteのサイズを変更します。

Particle Update SectionにScale Sprite Size Moduleを追加します。

Scale Sprite Size ModuleではVelocity Condition Moduleで指定したIfVelZeroの値を使用するので、Velocity Condition Moduleの後にセットします。

Scale Sprite Size Moduleの設定はColor Moduleと同じです。

Lerp Floatの設定では普通にAlphaになっていますね。何でColor ModuleではLerp Factorと言うのでしょうか。

更に別なやり方、Lerp Particle Attribute Moduleを使用する方法もあります。

このModuleの設定は以下の様にします。

まず Lerp AlphaにIfVelZeroをセットします。

そしてColorのLerp ColorにCheckを入れてColor AとColor BにLocal Value をセットします。

そのLocal Valueに赤と緑をセットします。

結果です。

Sprite Sizeも同様にセットしました。

結果です。

2.5 UE5 Niagara #ScratchPad Module #1 | velocity Condition [4]を勉強した感想

Scratch Padの部分だけ勉強するなら半分の時間で済みますね。今回は一応全部勉強しました。

ただ全部やった方が勉強になるのは確かです。

これからこのTutorialのシリーズを勉強して行きますが、一応全部やる事にします。

3.Materialの勉強

今週も、Ben Cloward 先生のPost Process用のMaterialとFluid Ninja VFX Toolsを勉強します。

3.1 Underwater Post-Process Effect - Shader Graph Basics - Episode 52 [2] を実装する

先週は、時間がなくて実装するところまで出来ませんでした。

今週は実装をやります。

<Depth Fogの実装>

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

この実装の理論については先週、散々勉強したので今週は結果を色々見る事にしました。

Level上に奥行がないとFogが掛かっても良く分からないのでいかのように岩を配置しました。

こんな感じで本当に適当に配置しました。

それではこれにDepth Fogを掛けてみます。

Default値です。

ほとんど何も見えません。

Divide値を2000(20m)に変更してみます。

結果です。

Objectが僅かに見える様になりました。

本当に20m先から視界が無くなるのか確かめるために20mの長さのCubeを置いてみました。

Cubeの端から視界が無くなっています。

この結果から推測すると先週のScene Depthノードの考え方は合っていそうですね。

Divideの値を7000にしてみました。

70m先まで見えるはずです。奥に配置した岩も見えるはずです。

はあ、これだけでもかなり海底感が出ていますね。

<Lens Distortion

実装結果です。

端に行く程画面が歪んでいます。

因みにLerpノードのAlpha値の結果は以下の様になっていました。

<全部を合成する>

Screen WarpingをCopy Pasteしました。

Tutorialに沿って値が変わっている箇所など直しました。

更にSquare Maskを追加します。

Screenの端ではこのEffectの効果を少なく、もしくは無くすために赤線で囲った部分の実装が追加されています。

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

結果です。

歪みは綺麗に表示されていますが、端が何か変です。

でも実際にscuba divingとかで海を潜ったらこう見えるのかもしれません。

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

Lens Distortionの画面を2倍のサイズにする部分をTexCoord[0]の代わりに使用します。

結果です。

比較のために元の画像も載せておきます。

Edge Blurringを追加します。

画面の真ん中だけShapeにしてEdgeをBlurにするためにVignette MaskをLerpノードのAlphaに接続します。

結果です。

全然、画面の真ん中だけShapeにしてEdgeをBlurになっていません。

これ画面より鋭い値を抽出するためには、Vignette Maskの値がNegativeになる必要があります。

でもSaturateノードを使用して敢えてVignette Maskの値を0と1の間に調節しています。

Vignette Maskの結果は以下の様になっています。

この白い部分にBlurの掛かった部分が適応され黒い部分に元々の映像が使用されます。灰色はその混合した映像が使用されます。

これ見ると真ん中が最も歪んだ映像になるべきです。

一寸Tutorialを見直して確認します。

分かりました。Tutorialでは以下の部分は使用していませんでした。

結果です。

今度は真ん中の部分が一番Shapeで端がBlurになっています。

うーん。何かTutorialと少し実装が違いそうな部分が何か所がある気がします。

これは後で確認します。

Depth Fogを追加します。

結果です。

Tutorialにあった蛍光色の映像が現れるBugは無いですが、その他のBugは同じ様に現れています。

蛍光色の映像が現れるBugは無い理由が分かりました。私の実装は元からDepth Fogの値をSaturateしていました。

次に画像がずれているBugを直します。

Depth FogのScene DepthノードのUVに

こっちのUV値を使用します。

結果です。

ずれが無くなりました。

これで一応完成です。

今週は一寸用事が出来てしまってこれ以上Materialにさける時間が無くなってしまいました。

ここで一端終了として、残りは来週やる事にします。

4.RPGEventの作成

4.1 Dialogueの直しの続き

先週、終わらなかったDialogueの直しの続きをやっていきます。

あれ。このDialogue一応直っていますね。

こっちもおかしくないですね。

全部の村人と会話しましたがおかしな会話をする人は一人もいませんでした。

Dialogueは全部直っていました。

4.2 Eventの表示の追加

これも急な用事が出来たため中止にします。来週やります。

5.Open Worldの検証

5.1 先週作成したOpen Worldの検証

以下の事について検証します。

<Playして違和感はないか?>

兎に角Playしてみます。

この警告については後で調べます。

この場所ではLandscapeは非常にSmoothで手動で直す必要は全く感じません。

移動してみます。

山との境目です。

ここはデコボコしていました。

山を登ってみます。

基本的には非常にSmoothです。

しかし中には以下に示した様なPolygonがはっきり見える箇所にありました。

白い部分のLandscapeの状態も確認したかったのですがこれ以上山を登る事が出来ないのでここで断念します。

世界の端が見たくて走っていますが、全く現れません。

Exponential Height Fogの効果だと思いますが、遠くが見えません。このせいで世界の端にたどり着くためにはどんだけ走る必要があるのか予測出来ないので、端まで走るのに凄い気力が必要になっています。

面白いGameを作成するためには、このあまり遠くが見えないというのは重要な要素なのかもしれません。

この後、数分間走り続けましたが端までたどり着く事は出来ませんでした。Give upです。

調べたら商業用のOpen Worldでも144 km^2、つまり一辺の大きさが12km位みたいです。4kmだったらその3分の1ですのでかなり膨大に感じるのは当然かもしれません。

違和感に関しては全く感じませんでした。

<World Partitionがしっかりと効いているのか?>

次にWorld Partitionについて調べます。

<<範囲外のStatic Meshはしっかり消えるのか>>

以下の場所(Landscapeの左下)にCylinderを配置しました。

Play画面から見たCylinderです。

wp.Runtime.ToggleDrawRuntimeHash2Dを使用します。

Exponential Height FogのせいでMeshが消える前にMeshが見えなくなってしまいました。

Exponential Height Fogの位置を下げて霧を消しました。

Mesh がぎりぎり消えるか消えない位置に来ました。

Meshは既にこんな大きさになっています。

一寸離れました。

色が紫色に変わりました。

Meshが消えました。

World Partitionが効いているのは分かりましたが、これでは大きすぎます。

もっと小さい範囲でMeshを消したいです。

World Settingの以下の値を変更してみます。

以下の様に変更しました。

Cellのサイズを1500 cmつまり15mにしてLoading Rangeを30 mにしました。

wp.Runtime.ToggleDrawRuntimeHash2Dはこんな感じです。

少しだけ離れました。

Meshが消えました。

wp.Runtime.ToggleDrawRuntimeHash2Dは紫色になりました。

これだと消えるのが少し早いかもしれません。

まあ、出来てるのは確認出来ました。

<<Landscapeも範囲外なら消えるのか?>>

いきなり山が消えているのが確認出来ました。

wp.Runtime.ToggleDrawRuntimeHash2Dはこんな感じです。

一寸だけ下がります。

wp.Runtime.ToggleDrawRuntimeHash2Dは以下の様になりました。

ああ、分かりました。

Landscapeはwp.Runtime.ToggleDrawRuntimeHash2Dで表示されているCellの分だけ表示されるんです。

緑の線から右に4列あったのが3列になっています。

LandscapeにもWorld Partitionが正しく働いている事が確認出来ました。

<World Partitionの注意点>

何点かWorld Partitionを使用するに当たって注意した方が良い点がある事に気が付きました。

一つ目はMeshの大きさです。

Meshは大きさが全然違うわけです。小さい草のようなMeshは直ぐに消えてもらった方が良いですが、岩などの大きなMeshも小さいMeshと同じように消えるのは一寸へんな気がします。

Meshの大きさによってWorld Partitionの働きを変える事は出来ないのでしょうか?

二つ目はNaniteとの併用です。

岩や瓦礫を配置するようになったら当然、Naniteを使用します。World PartitionとNaniteの併用を勉強する必要があります。

三つ目はFogとの併用です。

Exponential Height Fogをある高さ以上で使用する場合は、視界に制限が発生してある程度以上の奥は見えなくなります。

また今週のMaterialで作成したDepth Fogの様なPost Processを使用した場合も、視界に制限が発生してある程度以上の奥は見えなくなります。

これらのFogを発生させる事で、PlayerがLandscapeの端を目で確認する事を難しくなります。その結果、Playerは実際のLandscapeより大きく感じる事が可能になります。

これらのFogを使用した時に、視界の外側にあるMeshやLandscapeをわざわざ生成する必要なないはずです。

例えば視界が70mだとしたら70mより遠くのにあるMeshはWorld Partitionでも消えるように設定すべきなのでしょうか?

この辺の最適解が分かりません。

<Landscapeの歪みは許容範囲か?(1009 pixel x100は適切か)>

以下の様に近づいて見ると分かりますが、全然Smoothじゃない箇所が沢山あります。

これが1009 pixel x100倍のせいで発生しているのか、高さの倍率(x70)のせいで発生しているのかは分かりません。

更にこれ位は許容範囲なのかどうかも分かりません。

この後、Landscape用のMaterialをしっかり作り込んで、Foliageを追加したらこの位のデコボコは目立たなくなるのかもしれません。

特にWorld displacementとかの機能を追加したらこの位のデコボコは分からなくなる気がします。

今回は、許容範囲内と考えておきます。

<高さの指定について>

これは今の時点じゃ良く分かってないんですね。

R16 なので、1024mまではOKだと解釈しています。Landscapeを作成した時にzはX70の設定だったので

1024 cm * 70 = 71680 cm

最高700mです。なので高さが問題になる事はないと思っています。

実際、遠くから見る限り、かなりSmoothです。

<<X70は適切だったのか?>>

Klaus氏は自信のTutorialでPngのHeight Mapの場合、512m以上にすると歪みが生じやすいといっています。

Pngが32Bitsだった場合、RGBAなので4で割って8 bitsが高さに使用出来るBit数になります。2^8 = 256です。Scaleで100倍にすると256mになります。その2倍なので200倍です。

この意見だと200倍位は大丈夫となります。

今回は70倍なので全然、余裕だと思います。正しこれはGaeaの使い方をもっと理解してから更なる検討が必要です。

今、考えられるのはこの程度です。

<<LandscapeのLocation のzは0で作成したが、これは適切だったのか?>>

Landscapeを横から見ると以下の様になっていました。

赤い線がZ軸が0の位置ですので、そのほとんどは0より下に存在しています。

これが正しいかどうかはGaeaの作成した時がどうだったかによるだけでしょうね。

後はExponential Height Fogの位置にも影響するかもしれません。

<PC