UE4の勉強記録

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

「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の負担はどうなのか?>

これは非常に気になっているんですが、どうやって調べたら良いのか全く分かりません。

<<どうやってPCへの負担を調べるのか?>>

色々検索したんですが、Landscapeに使用しているMaterialのLayer数が多いと負担が増す。みたいな話が見つかっただけでした。

<<負担を減らす方法について>>

一つだけ言えるのは、さっきやったように以下のCell SizeとLoading Rangeの値を小さくする事です。

LandscapeのCostを確認する方法がまだ分からないので絶対とは言えませんが、まあ多分負担は減ると思います。

5.2 これからの課題について

これは来週からやります。

6.Gaeaの勉強

先週の間違った結果

をどうやって直そうかと思ったんですが、どこを間違えたのかを発見できる程Gaeaをまだ理解していません。

そこで考えたんですが、Klaus氏の別なTutorialを何個かやってみて、基本的な流れを理解してみる方がGaea自体の理解に繋がる気がします。

のでKlaus氏の別のTutorialをやる事にしました。

これはCGHOW氏のTutorialを勉強して分かった事ですが、最新のTutorialをやる方が全体を早く理解出来る様になります。

小説を読む時は最初から読まないと何が起きているのか全く理解出来ません。だからTutorialの勉強もそうだと思って古いTutorialから勉強を始めると、今のSoftwareとUIもVersionも違って何をやっているのか全く理解出来なくなります。Softwareの使用方法を勉強する時は、兎に角、最新のTutorialから勉強した方が良いです。

のでKlaus氏が作成した最新のTutorialを勉強する事にします。

6.1 How To Create An Open World Snow Landscape | Unreal Engine 5 Tutorial [5]を軽く見る

軽く途中まで見ましたが、最初の半分はGaeaでLandscapeを作成する方法を解説しています。この部分を今週は勉強する事にします。

Klaus氏の今回のTutorialは気合の入り方が違います。

Gameでも始まったのかと思いました。

インド人って敢えて喋らないだけで普通にイギリス人みたいなアクセントで喋れるんですね。

Narrationを聞いていたらイギリス人が喋っているのかと思いました。

以下の手順で作成するそうです。

Qualityが凄い!

PerlinノードにWarpノードを繋げた所から始まっています。

以下のButtonを押すと

となるそうです。

しかしKlaus氏、今回のTutorialは気合の入り方が違いますね。

ここには記録出来ませんが音楽も凄いし、何か新しいTutorialのTemplateになりそうです。

Perlinノードの解説です。

Default値のままだと高低さが有る過ぎるのでClmpを適応します。

Clmpを押すと以下のClamp Min、Clamp Maxが表示されます。

Clamp Maxを半分にします。

高低が穏やかになりました。

Clampと言う事は最大値以上は全部、最大値と同じになるはずです。でも結果を見ると平らな個所が生成されていないですね。

何をClampしたんでしょうか?

高低差が穏やかになったのは良いんですが、鋭さが無くなり全体的に砂漠のようになってしまいました。

鋭さを追加するために

を適用します。

以下のParameterが表示されるので

値を上げます。

以下に示した様に鋭さが増しました。

次はwrapノードについてです。

このNodeについてはDefault値のままで特に何もしませんでした。

次にRiverノードを追加します。

これはRiverを追加するためではなく、谷を削り出すために使用しているそうです。

更にTipとして以下の解説がありました。

Riverノードを追加した後のLandscapeです。

確かに平らな個所に高低差が付いて谷が出来ています。

これをもっと激しくするためにWidthとDowncuttingの値を上げます。

次は少しFuseするためにThermal Shader ノードを使用します。

ここでFuseと言っていますが溶かすって意味なんでしょうか?

確かに一寸溶けた感じになっています。

Tutorialの解説によるとThermal ShaderノードはConcaveもしくはConvex な形状(凹凸のある形状)を作成するそうです。

Thermal ShaderノードのShapeがNegativeの時は、Concaveな形状(凹のある形状)を作成するそうです。

うーん。

でもLandscapeは溶けた感じになってますよね。

良く分かりません。

またWarpノードを接続します。

以下の様なLandscapeになりました。

このLandscapeを元にTerraceとErosionを使用してMesa type Structuresを作成するそうです。

Mesaって何?

調べたらテーブル状の台地を指す言葉だそうです。こんなの地学でも勉強してないと全く馴染みのない言葉です。

まずTerraceを追加します。

そのために今回はFractal Terracesノードを追加します。

おお。Terraceが形成されています。

先週は何がTerraceか全く分かりませんでしたが、今は良く分かります。このLandscapeを見てTerraceがどこか一目瞭然です。

まあ、一寸は成長しているのかもしれません。

これではTerranceが多過ぎるので少し減らします。

Fractal Terracesノードで生成されるTerranceの量を減らすには、Gradientノードを使用するそうです。

以下の様にGradientノードをFractional Terracesノードに接続します。

おお、そう言う事だったのか。

Gradientノードの値を変化させる前にFractional TerracesノードをPin止めします。

これでGradientノードを選択しても3D ViewにはFractional Terracesノードの結果が表示されます。

Gradientノードを選択します。

そしてClmpを選択します。

Clamp Maxを減少させます。

こんな結果になりました。

これでFractional Terracesノードの設定が完了したのでPinを外します。

更に、Erosionノードを追加します。

こんな結果になりました。

Erosionノードにある以下のParameterを見ると分かるように

Defaultでは大量のSedimentが追加されています。

Sedimentsって何?

調べます。

Sedimentって液体の底に貯まるモノの総称だそうです。

あれ、そう言えば沈殿物ってSedimentって言ったような。うーん。試験管の底でSedimentって言ったらすぐに分かったんですが。

これを外すのですが、以下に示したParameterであるSediment Removalの値を増やして外します。

結果です。

うーん。今一Sedimentが排除されたのか良く分かりません。

この辺は、実装する時に詳しく検証する事にします。

ここでまたTipの登場です。

Erosionノードは数回に分けて使用した方が結果が良い。と言っています。

これは知っています。

でもこれ一個のErosionノードのParameterを一つ変更したら、そのErosionノードの他のParameterは弄らないという意味なのかもしれません。

ここで山を見ると確かにErosionが追加されていますが、形状はあんまり変化していません。

これらの山の形状を変化させるために次のErosionノードを追加しました。

しかし今度は前のErosionで作成してSediment Removeを消したくはないんです。山にだけErosionを追加したいだけなんです。

それには以下の方法で対応するそうです。

まず2番目のErosionノードを選択して以下のMinを押します。

TutorialによるとErosionは以下の様に考えられるそうです。

まず、表面があります。その表面にErosionが形成されます。そしてErosionで削られたSedimentはそのErosionの下側に貯まります。

つまりErosionの下側にある表面の上にSedimentは貯まります。

ここでMinを選択するとSurfaceの上に貯まっているSedimentは全部排除されErosionが刻まれた表面だけが残るそうです。

結果です。

うーん。あんまりSedimentが取れた状態には見えません。

この辺も実装する時に検証します。

次はSnowを追加します。

そのためにSnowfallノードを追加します。

結果です。

これは多すぎます。

雪の量を減らすためにSnow Lineの値を上げます。

こうなりました。

これだと一寸少なすぎる気がします。

更にSettle-Thawの値を上げました。

Settle-Thawも地学の専門用語みたいなんですが、この場合は何を指しているのか分かりません。

一応調べたんですが、岩の亀裂に貯まった水が凍った時に肥大化して岩を割る現象をThaw Settlementと呼ぶ事以外は分かりませんでした。

結果です。

更に、雪は太陽光が当たる箇所だけ良く溶けるそうです。

それを再現するために、SunlightノードをSnowfallノードのMelt pinに繋ぎます。

ここでまたTipです。

うーん。Hiddenとは言っていますが、Snowfallノードを見る限りはPortは見えています。

結果です。

今度はSnowfallノードのMeltingの値を上げます。

太陽光のあたる場所の雪は全部溶けるようにしました。

結果です。

そして最期にWaterを追加します。

まずはRiverノードを追加します。

結果です。

ここで最初のRiverノードが作成したRiverとほぼ同じRiverが形成される理由やSeedを変えてもRiverが山を貫いて形成される事がない理由について説明しています。

自分が理解した範囲でまとめると、川が形成される箇所は既に今のLandscapeの形状で決定されているので幾らRiverノードの形状を変えてもそんなに川の形状が変化する事は無いそうです。

次はLake ノードを追加します。

結果です。

多すぎます。

ここでMaskノードを使用してLakeを小さくしました。

結果です。

何か川も小さくなっていますね。

この説明を聞いたんですがあんまり理解出来ません。一寸頭を休ませる必要があるかもしれません。

今週はここまでにしてまた来週、勉強する事にします。

7.雪山のMapの作成

7.1 今週は何を勉強するのか?

World of Level Design社のUE4: Step-by-Step to Creating Your First Volumetric Cloud Material [6]の最初の部分を勉強する事でVolumetric Cloudに使用するMaterialの作成に必要な最低限の実装を理解する事が出来ました。

ので今週もUE4: Step-by-Step to Creating Your First Volumetric Cloud Material [6]の続きを勉強し直す事にします。

と言っても同じ事を繰り返しても意味がないので、前にUE4: Step-by-Step to Creating Your First Volumetric Cloud Material [6]の何を勉強したのかを先に復習します。

2022-07-12のBlogを見直すとUE4: Step-by-Step to Creating Your First Volumetric Cloud Material [6]の勉強内容が記録されています。

それを読み直すと、

<Cloud Volume Detail

先週勉強した実装の次に以下に示したCloud Volume Detailを作成しています。

これは3D Textureを組み込んだ初めての実装になります。

うーん。でもこの3D Textureの実装そのものの理論ややり方が既に理解しています。のでこれだけだと少し簡単過ぎますね。

この先の実装を見てみましょう。

Cloud Texture Maskの実装の結果に追加しているだけでした。

あー分かりました。

これはCloud Volume Detailの計算結果をCloud Texture Maskの実装の計算結果から引いているんです。その分だけ雲が薄くなっているはずです。

ここは簡単なので次に行きます。

<Height Fall Off

次はHeight Fall Offの値を計算しています。

所がTutorialではここは何をやっているのか分からないので解説はなし。と言って解説なしでで終っています。

この部分の実装について検証しますか。

今週はこれをまずやる事にします。

<Volumetric Advanced Output

次はVolumetric Advanced Outputです。

これについても検証します。

<雲を動かすための実装>

最後に雲を動かすための実装をしています。

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

7.2 Cloud Volume Detailの実装と検証

Cloud Volume Detailの実装の内、以下に示した最低限の部分だけ実装して直接Extinctionに繋げてみました。

結果です。

これだと流石に雲が濃すぎてなにも分からないですね。

今度はこの計算結果を、先週作成したCloud Texture Maskの結果に掛けてみました。

掛け算ですので0.1を掛ければ1でも0.1になります。のでCloud Volume Detailの計算結果が白くてもCloud Texture Maskの計算結果が黒い部分は黒くなるはずです。

黒くなるとその部分は透明になるので雲の隙間が生成されるはずです。

結果です。

はい。予測通り雲の隙間が生成されました。

しかしこの結果は、先週作成したCloud Texture Maskだけの結果とほぼ同じです。

これは、Cloud Volume Detailに使用している3D Textureの方が白いので、Cloud Texture Maskの結果だけが強調されるためです。

Cloud Volume Detailの結果をCloud Texture Maskの結果に影響させるためにはCloud Volume Detailの計算結果をもっと黒くする必要があります。

ここでTutorialでは、以下に示した様に

1を引く事で黒くしています。

ここで使用している3d Textureの値は0~1の間のはずなので、1を引いたら-1~0までの値に変化します。

これをCloud Texture Maskの計算結果に掛けるのではなく、足します。

Negativeの値を掛けたら全部Negativeになってしまうので、足している訳です。

全く同じ方法で実装します。

結果です。

雲にパーマでも掛かったような感じに変化しました。

これ掛け算でもやり方によってはCloud Volume Detailの結果をCloud Texture Maskの結果に影響させる事は出来ますね。

試しに以下の実装を組んでみました。

One minusを使用してCloud Volume Detailの結果を黒くします。

その後の掛け算はそのままにしています。1以上の値をかけたら白さが増します。0~1の間の値を掛けた時は白さが減ります。

計算結果が0以下1以上になると後の計算が面倒なのでSaturateノードを追加します。

そして計算結果を掛けます。

結果です。

何か雲には見えないですが、Cloud Volume Detailの影響は確認出来ます。

Cloud Detailの値を変更してみます。

0.4にしました。雲がほとんど見えなくなりました。

10にしました。

Cloud Volume Detailの影響はほとんど確認出来なくなりました。

7.3  Height Fall Offの検証

Falloff Functionです。これを検証します。

まずこの計算結果が繋がっているCloud Texture MaskのSubtractノードとの関係性を調べます。

Cloud Biasの値を変化させてみます。Default値は0.2です。

0にしました。

雲の横幅が大きくなっているように見えます。

0.5にしました。

雲の横幅が小さくなっているように見えます。

本当に雲の横幅が確認のために上から見てみます。

Default(0.2)の時です。

0の時です。

間違いなく雲の横幅が大きくなっています。

0.5の時です。

雲の横幅が小さくなっています。間違いないです。

見る角度によって雲の横幅が変化しているように見えるのではなく、本当に雲の横幅が小さくなっています。

そこにこのFalloff Functionを付けるとその中のParameterであるFallofUpperとFallofLowerによって

上下の雲の厚さが調節出来る様になります。

この理由を検証します。まずCloud Sample Attributesノードです。

このNodeが雲の縦の厚さに関する値を管理しているようです。上の解説を読むとNorm Altitude In LayerはTopを1、Buttonを0として値を返すとあります。

ほとんど計算は同じですがOne Minusノードを使用していないLowerから見て行きます。

Exp(-x)を使用しています。

この計算結果から予測するとTopが1、Buttonが0の値を返すのでそれに25を掛けたら、雲の本当の底だけ1に近い値で後はほとんど0になります。

次にOne Minusノードを使用しています。

ので値が逆になります。

雲の本当の底の部分だけ0に近い値で後はほとんど1になります。

この後、Upperの計算結果と掛けています。

Upperの方はまだ計算していませんが、1と仮定して先に進みます。

Maxノードで最小値を0.01にします。

これは単にこの次のStepで1をこの値で割るので0で割る形にならないための処置でしょうね。

その値で1を割ります。

これで100から1の値になるはずです。

雲の本当の底の部分だけ100に近い値で後はほとんど1になります。

0.2を掛けます。20から0.2の間の値になります。

雲の本当の底の部分だけ20に近い値で後は0.2になります。

それをCloud Texture MaskのTexture Sampleから引きます。

雲の底の部分だけ消える訳です。

Upperの部分の計算はこのLowerの計算の逆になるので雲の上の部分だけが消えます。

この実装は初めて検証したので細かい間違いはあるかもしれませんが、まあ大筋の流れは合っていると思います。

今週のVolumetric Cloudの勉強はここまでにして残りは来週やる事にします。

8.UI Designの勉強

先週、検証した先攻後攻を選ぶUIを改良します。

1週間考えたんですが、ここはDesignを自分で考える場にします。UIそのもののProgramming自体は、別に勉強します。

一人でGameを製作するとしたらDesignもある程度は勉強する必要があります。

のでそれをここでやります。

このUIを改良します。

Widget内で全部作成出来る、2枚のCardのどちらかを引いて先攻後攻を決めるDesignにしました。

Cardのデザインは以下の様にしました。

イラストは自分で作成しました。

サイズを以下の様に指定したら

Imageが以下の様になってしまいました。

これ、前も成ったんですが理由が分かりません。

調べたんですが良く分からないです。

適当に弄っていたら以下のDraw asの設定を

Imageに変更したら

直りました。

こういう問題は結構焦ります。

以下の部分だけ作成しました。

CursorがCard上に載っている場合、Cardの色が紫色になります。

カードを一枚選択しClickします。

選択したCardが表側に返り、先攻か後攻が決定します。

カードの配置は毎回変わる為、先攻を取る確率は常に50%になります。

実装は以下の様にしました。

特に工夫もない普通の実装です。

まだ実際のGame内で動くようにはなっていません。それは来週やる事にします。

今週はこれだけです。

9.Anime Renderingの勉強

今週もアニメレンダリングの勉強をしていきます。

9.1 Anime Renderingについて

暫くの間、以下の文は毎回貼らせて頂きます。

こっちもです。

9.2 今回の予定

今回、初めてのAnime Renderingの勉強として、10回程度ここで勉強する予定です、

以下に勉強する予定の内容を書いておきます。

それではそれぞれの勉強をして行きます。

9.3 PPLineDrawingの検証

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

先週の最後に以下の様に述べましたが、

全部の実装を読むのが先でした。

ので今週は、Crease Lineの実装を読みます。

<Crease Line

パッと見では先週勉強したEdge Lineとほとんど同じ実装に見えます。

最初にEdge Lineと違う箇所を抜き出してみます。

以下に示した前半部分の実装はEdge Lineの実装と全く同じに見えます。

先週、調べるのを忘れていたんですが、前にLineの太さを調節した時に、HorizonとVerticalが逆だったです。

Horizonの値を大きくすると縦の線が太くなり、Verticalの値を大きくすると横の線が太くなりました。

実装が逆になっていると思って確認したら以下に示した様に

HorizonがX、VerticalがYにセットされていました。

???です。

でも一寸考えたら理解出来ました。

Pixelサイズで考えると、縦の線が太くなると言う事は横のサイズが大きくなっているんです。つまりHorizonの値を大きくすると縦の線が太くなる訳です。

逆に、横の線が太くなると言う事は、縦のサイズが大きくなっています。つまりVerticalの値を大きくすると横の線が太くなります。

それではEdge Lineと違う実装をしている後半部分を見てみましょう。

Edge LineではScene Depthを使用していましたが、こっちはWorld Normalを使用しています。

比較対象である真ん中のPixelの値とのDot積を計算しています。

Normalのような3つの要素を持つVectorの差分を計算する時はDot積を使用するんでしたっけ。

正直、知りません。

これはTake Noteしておいて後で同じ様なVectorの差分を計算する実装に遭遇した時に確認します。

その次のStepですが、1を追加して0.5 を掛けています。

これはNormal の値が-1から1の間なのでそれを0~1の間に変換したものと考えられます。

次です。

これが意味が分かりません。

差分を取るんだから最後は足すか引くかする必要があると思うんですが、掛けています。

掛けても差分が取れるんでしょうか?

その後Power Nodeを追加していました。

これは0と1の間の値のContrastを強調するためにやっているはずです。

Clampしています。

この後、LerpノードのAlpha値として使用するので0~1以外の値があると困る訳でここでClampするのは納得です。

ただ0~1の間でClampするならSaturate Nodeを使用した方が、計算CostがFreeになるからそっちの方が良いのではとは思いました。

最後のLerpノードの部分の実装は先週勉強したEdge Lineの実装と全く同じです。

以上です。

<Crease Lineの実装を読んだ感想>

結局、Edge Lineの実装との違いは、Pixelの差分を見るのに、Scene Depthのような0~1の値が一つだけ存在している場合と、Normal Mapの様に-1~1の値が3つ存在している場合ではやり方が違うという事でしょう。

そこは理解出来たんですが、この実装以外にNormal Mapの差分を計算した実装を見た事がないので、この計算方法の理論と言うか考え方を推測する事が出来ません。何と言うか手掛かりが足りないです。

この部分の実装は、Normal Mapの様な-1~1の値が3つ存在している場合の差分は、こうやって取るやり方もある位に、今回は留めておくことにします。

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

先週は木のMaterialを分析しましたが、木以外のMaterialもかなり不思議なのがあります。

以下のObjectは岩なのか木なのか不明ですが、使用しているMaterialは興味深いです。

今週はこのMaterialを分析します。

見ると以下の2つのMaterialを使用していました。

まずM_Bush_Clumpsから見ます。

まずResult Nodeから見ていきます。

これって普通の設定ですね。

以下の様にSpecularとRoughnessの値を指定しています。

これは先週と先々週勉強したMaterialと同じです。

Base Colorですが、以下に示した様な4つのLerpノードから構成されています。

最後のLerpノードから見て行きます。

Fresnel reflectionを追加しています。

Fresnel reflectionで白くなる箇所に黄色を追加しています。

Previewの映像を見るとそんなに黄色くはないですが、球の端にFresnel reflectionが観察出来ます。

先程のLerpノードのAの部分を遡ってみます。緑色を担当している部分です。

Distance BlendノードがAlphaに繋がっています。

距離によってAとBを使い分けています。

これも先週勉強したMaterialと理屈は同じです。

色々距離を変えてみたんですが、違いは分からなかったです。

距離が近い方の実装です。

この部分は先週までに勉強したMaterialと同じですね。

遠い方の実装です。

これも全く同じ仕組みです。

<M_Bush_Lines

こっちの実装も見てみます。

Result ノードの実装です。

Blend ModeがModulateになっています。

先週勉強した木のMaterialでは

となっていました。

こっちは更にShading ModelがDefault Litになっていますし、全然違いますね。

実装です。

うん。

これ良く分かりません。

黒い部分が1、白い部分が緑色になっていますが、実際のMaterialは以下に示した通り、

黒い部分(白い部分)は透明、白い部分(緑色の部分)はウーン。緑と言えば緑色かなという感じです。

<M_Bush_Linesを自作してみる>

上記の実装の結果に納得出来ないので自作してみる事にしました。

新しいMaterialを作成してそのResultノードを以下の設定にしました。

Blend ModeをModulateにした場合、Shading ModelはUnlitにセットする必要があるみたいです。

Shading ModelがDefault Litの時、Emissive ColorにConstantノードを繋げたら

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

Shading ModelをUnlitに変更したら警告が消えました。

しかもPreviewの球が見えなくなりました。

はい。解決しました。

Blend ModeがModulateの場合、1つまり白は透明になるんです。

今週のStylized Renderingの勉強は以上です。

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

今週は先週PaintしたSuzanneに法線転写(Normal Transfer)を実装します。

<法線を転写したい部分だけをオブジェクトとして分離>

まずこれからやります。

顔の部分だけ選択しました。

顔の部分はX Rayで右向きで大まかなFaceを選択し、選択出来ないFaceや選択してはいけないFaceはその後、一個ずつ選択し上記のようにしました。

Pを押しました。

選択した部分が別なObjectになったようです。

Suzanneの顔の部分だけがきれいに分離しているのか確認します。

出来ていますね。

そう言えば先週、Suzanneの顔のMeshが選択出来ないと言っていました。

これはSuzannの顔の部分は別なObjectになったので、Suzanneの顔のMeshを選択するためには、Object Modeに戻ってSuzanne001を選択した後にEdit Modeに移動する必要があるからでした。

普通に出来ています。

<UV球の追加>

球を追加しましたがその球を半透明にする方法が分かりません。

多分半透明にならなくても大丈夫でしょう。

Object ModeでUV球を選択した状態で右Clickし、以下のBoxを表示させShad Smoothを選択します。

UV球がSmoothになりました。

Edit Modeに戻り以下の様な形に変更しました。

Sub Divisionを追加します。

結果です。

これ以上細分化したら私のPCが持たない気がします。

<顔Objectの設定>

今度は顔Objectの設定をします。

顔Objectを選択してData Transferを追加します。

更にPropertyから以下の設定も行います。

結果です。

出来てない?

あ。

これやる前にToonの影の設定をこのProjectで行う必要がありました。

これです。

うーん。これは来週やる事にします。

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

10.まとめと感想

今週は、Materialの勉強している途中で急な用事が入ってしまったので、集中力が切れてしまいました。

その割にはそれなりに最後まで出来たので、まあ良かったです。

11.参照(Reference

[1] CGHOW. (2022, June 12). Unreal Engine 5 Niagara Beginner Tutorial - UE5 Niagara Starter Course! [Video]. YouTube. https://www.youtube.com/watch?v=NcJ1ZP7tFUk

[2] Epic Games. (n.d.-b). Niagara Overview. Unreal Engine. Retrieved June 19, 2022, from https://docs.unrealengine.com/5.0/en-US/overview-of-niagara-effects-for-unreal-engine/

[3] Epic Games. (n.d.-a). Niagara Key Concepts. Unreal Engine. Retrieved June 19, 2022, from https://docs.unrealengine.com/5.0/en-US/key-concepts-in-niagara-effects-for-unreal-engine/

[4] CGHOW. (2022, June 8). UE5 Niagara #ScratchPad Module #1 | velocity Condition [Video]. YouTube. https://www.youtube.com/watch?v=LQg_kz9yUYg&

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

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

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

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

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