UE4の勉強記録

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

「Unreal Engine 4.xを使用してRPGを作成する」の足りない部分を作成する 雪山Mapの作成 Part 2

f:id:kazuhironagai77:20220321000301p:plain

<前文>

アメリカ史観における原爆投下>

火垂るの墓と言うアニメがあります。

アメリカ人の間では概ね「当時の日本人の目から見た戦争の悲惨さを描いた良作である。」との評価を得ています。

このようにアメリカ人は、結構、相手の立場に立って考える事が出来き、その結果、自分と違う考え方の人との接点を見つける事が出来ます。

所で逆に、我々日本人は、アメリカ史観から見た第二次世界大戦をどれだけ理解しているのでしょうか?

そしてそのアメリカ史観に基づいて、日本の国益や日本人の利益を守るための議論をどれだけ出来るでしょうか?

今週はそんなお話です。

アメリカ政府は、連日のロシア軍のウクライナへの攻撃に対して、アメリカではプーチン大統領並びにロシア軍に対して戦争犯罪を犯していると大抗議しています。

しかし一般のアメリカ人からは、

ウクライナ市民への攻撃や都市への空爆戦争犯罪なら、広島や長崎への原爆投下は戦争犯罪じゃないのか?」

との疑問が挙がりました。

これに対するアメリカ人が考える正しい解答がRedditに載っていました。

多くの日本人にとっては、この考え方は初めて聞くモノだと思います。しかしその考え方は、日本人なら全員、知っておくべき内容だと思いました。ので、今週はそれを紹介します。

まず、戦争犯罪は負けた方だけが裁かれると言う考え方です。

戦争で勝った方の戦争犯罪は裁く方がいないのでやったもん勝ちと言う考え方です。

個人的には、これはかなり真実な気がします。

この人達は、広島や長崎の原爆投下も戦争犯罪であるが、アメリカの戦争犯罪を裁ける国はないから、裁かれていないだけ。と考えています。

次の意見は、最初のに似ていますが、戦争で負けるのが戦争犯罪になると言う考え方です。

正義も糞もない考え方ですが、これもかなり真実です。勝った方が負けた方に全部、責任を押し付けてお終いと言う考え方です。

ただ、これを公に認めると次の戦争から何をしても勝つしかなくなります。

それこそ、核でも化学、生物兵器、何でも使用するようになるし、戦争が始まったら焦土になるまで戦い続けるしかなくなります。だからこの意見を言う人は、回りからかなり批判されます。が、その批判はこの解答に対してあんまり説得力がないです。

この意見を言う人達が、根拠にするのがNuremberg裁判で、戦争が終わってからドイツを裁く法律を作って遡ってナチスを裁いた事を上げています。

ここまでは知的階級というか、法律や歴史、国際関係の専門家の意見で、アメリカ人全体からすると極めて少数です。少数ですが専門家の意見なのでそれなりに尊重されて扱われます。

こっからが一般的なアメリカ人の考え方になります。

広島や長崎の原爆投下が戦争の早期終結につながったので、必要悪だった。

この意見を聞くと、日本人ではかなり怒る人がいますが、実はこの意見、アメリカ人の間でもかなり穏健派に属する人達の意見です。左派の人が多く、マイノリティーのために自らを犠牲にして活動してくれたりする良い人が多いです。

次の意見がアメリカ人の大半が思っている意見で大体、70~85%位のアメリカ人はこの意見が正しいと思っています。

日本は、原爆を落とされてもしょうがない程、悪い事(特に中国に対して)をしていたので、広島や長崎の原爆投下は犯罪ではない。

はい。

原爆投下より罪が重い事って何なんでしょうね?

例え旧日本軍部の関連が、そんな凄い戦争犯罪をしていたとしても、その罪を関係ない市民が償う必要があるんでしょうかね。

もう、日本人としてはこの考え方に対しては色々言いたい事がありますが、兎に角、これが大多数のアメリカ人の考える広島や長崎の原爆投下への正しい歴史観です。

そして、ここからが私が言いたいポイントです。

この考え方が正しいかどうかが問題ではなく、この考え方を軸にして世界の人は議論を発展させて、何が正しいのかを決定していくんです。

例えば、そのRedditの議論は、以下の様な流れで進んでいきました。

まず、ロシアよりの意見を代弁する人たちが、日本と同じ罪をウクライナがやっている。だから原爆使用しても犯罪じゃないと言おうとしています。

それに対してアメリカよりの意見を代弁する人たちは、日本の罪はそんな軽いもんじゃないです。とんでもない罪を犯していたんです。と主張して始めています。どんな罪なのかは分かりません。

そこに中国が直ぐに乗って来ました。

私は、昔から中国の政府機関がReddit内でスパイ活動を行っていると思っていますが、この意見を言っている人も中国のスパイだと思います。

日本が第二次世界大戦中に中国に対して犯した犯罪はとんでもないものである。それはアメリカの言っている通りである。更に日本はその事に対して十分な謝罪がされていない。と主張します。

それに対して、アメリカ寄りの意見を代弁する人たちは、前後の日本人は2発の原爆投下で悔い改めた(Repentance)のでもう今の日本人に罪を問う必要はない。と返します。

(この悔い改めた(Repentance)も英語で議論する時には非常に重要な概念になりますが、今回の主旨とは離れてしまうので無視します。)

すると中国側は、本当にそうでしょうか?と突っ込んできます。

そこで中国側は731部隊と皇族との関係を持ち出し、日本が皇族を戦犯として裁いていないのは日本人が悔い改めた(Repentance)ふりをしているからである。と主張し始めます。

これは、アメリカよりの意見を言う人たちにとってもかなり衝撃(正直、私もびっくりしました)だったらしく、中国の言っている事は一理あります。と答えていました。

もっともうがった見方をすれば、中国の発言は日本がこんなに悪い事をしていたから原爆落としても良いと言うアメリカ人の主張を補佐してくれる意見です。なのでアメリカ人にとっては受け入れられやすい意見でもあります。

そして中国側が、アメリカ側にこう切り出しました。

日本が、第二次世界大戦中に中国に対して犯した犯罪を、これからアメリカが厳しく取り締まるなら、中国としてはアメリカに協力しても良い。と

そしてアメリカよりの意見を代弁する人達も何となくですが、それがBestかなって感じで話が進んでいきました。

これ読んで私は、今回の戦争で中国がロシアを裏切ってアメリカに付く事が有れば、それはアメリカが日本を中国に売る約束を裏でした時だなと思いました。

まあ、それは兎も角としても、中国にしてもロシアにしても、英語で議論する時は、アメリカ史観に合わせて論理を展開します。そして日本や日本人も英語で会話する時、つまりほとんどの外国人と会話する時は、そのアメリカ史観に基づいて議論しなければ、自分達の意見を聞いてもらえない事態になります。

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

<本文>

1.今週の予定

先週と基本的に同じです。

  • Niagara: CGHOW氏のTutorialをやる
  • Material :Projectionの勉強の復習
  • RPGStoryの改善
  • Open Worldの検証
  • World Machineの勉強
  • 雪山のMapの作成
  • Game DesignポケモンHxHの念能力( 戦闘システムの作成)
  • Blenderの勉強

Lumenの勉強は中止します。

2.Niagara: CGHOW氏のTutorialをやる

今週は Coin FX in UE4 Niagara Tutorial [1]を勉強する事にしました。

f:id:kazuhironagai77:20220321000404p:plain

こんな感じのEffectです。

これも多分ですがMeshを使用して作成するはずです。

2.1  Coin FX in UE4 Niagara Tutorial [1]を軽く見る

どうやって勉強するのかの作戦を考えるためにまず軽く見ます。

前半は、コインのEffectの作成についてで、使用するコインをMayaで作成しています。

後半が、以下のMaterialを使用した

f:id:kazuhironagai77:20220321000428p:plain

以下に示したようなEffectの作成をしています。

f:id:kazuhironagai77:20220321000445p:plain

こっちの方が複雑で、一回見ただけでは何をやっているのか良く分からなかったです。

まあ、やってみましょう。

2.2 Coinを作成する

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

f:id:kazuhironagai77:20220321000506p:plain

f:id:kazuhironagai77:20220321000517p:plain

ちょっとだけTutorialとは違いますが、取りあえずこれでやってみます。

以下の部分を変更して、FBXでExportします。

f:id:kazuhironagai77:20220321001132p:plain

UE5でImportしました。

f:id:kazuhironagai77:20220321001154p:plain

CoinのUV Mapです。

f:id:kazuhironagai77:20220321001214p:plain

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

f:id:kazuhironagai77:20220321001239p:plain

f:id:kazuhironagai77:20220321001317p:plain

こんな色になりました。

f:id:kazuhironagai77:20220321001337p:plain

角度を変えてみます。

f:id:kazuhironagai77:20220321001356p:plain

Meshの粗さは目立ちます。

色々微調整して以下の様にしました。

f:id:kazuhironagai77:20220321001415p:plain

取りあえず、これを使用します。

2.3 Coin Emitterを作成する

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

Render SectionのSprite Renderer Moduleを消してMesh Renderer Moduleを追加します。

f:id:kazuhironagai77:20220321001441p:plain

Mesh Renderer ModuleのMeshに先程作成したCoinを追加します。

f:id:kazuhironagai77:20220321001457p:plain

こんな感じです。

f:id:kazuhironagai77:20220321001514p:plain

この時点でかなり良い感じです。

要らないModuleを全部外して、

f:id:kazuhironagai77:20220321001532p:plain

以下の様な状態にしました。

f:id:kazuhironagai77:20220321001602p:plain

Coinの数を10枚に増やします。

Emitter Update SectionのSpawn Burst Instantaneous Moduleの

f:id:kazuhironagai77:20220321001619p:plain

Spawn Countを10にします。

f:id:kazuhironagai77:20220321001642p:plain

当然、これだけだと、同じ位置に10枚のCoinが生成されているだけなので

f:id:kazuhironagai77:20220321001700p:plain

Initialize Particle SectionにSet Particle Position Moduleを追加して

f:id:kazuhironagai77:20220321001718p:plain

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

f:id:kazuhironagai77:20220321001737p:plain

Zの高さをそれぞれのCoinに沿って変えたいので、Return Normalized Exec IndexにCoinの厚さを掛けた物を返します。

結果です。

f:id:kazuhironagai77:20220321001755p:plain

うーん。Coinの厚さが200cmもあるのかこれは。

実際にPlay画面で見るとそんなに厚くはないですね。

f:id:kazuhironagai77:20220321001815p:plain

精々、40 cm位です。

単位が良く分からないです。

このCoinが空から落ちて来るEffectを作成します。

Particle Update Sectionに先程、Particle Spawn Sectionに作成したPositionをDuplicateしてセットします。

f:id:kazuhironagai77:20220321001833p:plain

Coinが落下するAnimationを表示するように以下の設定を組みます。

f:id:kazuhironagai77:20220321001853p:plain

結果です。

f:id:kazuhironagai77:20220321001910g:plain

ゆっくり過ぎて落下している感じじゃないです。

Life timeを調節する事で落下速度を早くします。

Particle Spawn SectionのInitialize Particle Moduleの

f:id:kazuhironagai77:20220321001932p:plain

Life Timeを0.5に下げました。

f:id:kazuhironagai77:20220321001949p:plain

更に、Emitter Update SectionのEmitter State Moduleの

f:id:kazuhironagai77:20220321002006p:plain

Loop Durationに1.5をセットします。

f:id:kazuhironagai77:20220321002022p:plain

こんな感じに成りました。

f:id:kazuhironagai77:20220321002040g:plain

随分、早くなりました。

今度はCoinが落ちる時に、少しばらける様にします。

まず、Particle Update SectionのPositionの

f:id:kazuhironagai77:20220321002057p:plain

Curveの値を以下の様に変更します。

f:id:kazuhironagai77:20220321002122p:plain

そしてBの値を

f:id:kazuhironagai77:20220321002138p:plain

以下の様にCurveにします。

f:id:kazuhironagai77:20220321002157p:plain

結果です。

f:id:kazuhironagai77:20220321002220g:plain

Tutorialの続きを見てたら、さっきのCurve間違っていた。こっちが正しかったと突然変更になりました。

f:id:kazuhironagai77:20220321002242p:plain

こんな感じです。

f:id:kazuhironagai77:20220321002303g:plain

色々な数のCoinに対応出来る様に改良します。

Emitter Parameterに新しいParameter、Position Gap Calを追加します。

f:id:kazuhironagai77:20220321002321p:plain

Emitter Spawn SectionでPosition Gap Calの値をセットします。

f:id:kazuhironagai77:20220321002339p:plain

f:id:kazuhironagai77:20220321002347p:plain

後はこのParameterを必要な個所で使用するだけです。

Emitter Update SectionのSpawn Burst Instantaneous Moduleの

f:id:kazuhironagai77:20220321002405p:plain

Spawn Countに先程、作成したParameterであるPosition Gap Calをセットします。

f:id:kazuhironagai77:20220321002424p:plain

更にParticle Spawn SectionのSet Particle Position Moduleの

f:id:kazuhironagai77:20220321002445p:plain

BにMultiply FloatをセットしてAに20.0、BにMake Float From Intをセットし

f:id:kazuhironagai77:20220321002504p:plain

BにPosition Gap Calをセットします。

最後にParticle Update SectionのSet Particle Positionの

f:id:kazuhironagai77:20220321002526p:plain

BのCurveに以下の値をセットします。

f:id:kazuhironagai77:20220321002552p:plain

結果です。

Coinが5枚の時です。

f:id:kazuhironagai77:20220321002611p:plain

7枚の時です。

f:id:kazuhironagai77:20220321002627p:plain

勿論、10枚の時も大丈夫です。

f:id:kazuhironagai77:20220321002644p:plain

Userが自由にこの値を変更出来る様にします。

以下に示した様にEmitter Spawn SectionのPosition Gap Calを

f:id:kazuhironagai77:20220321002701p:plain

User Parameterに変更します。

やり方は以下の様にRead from New User Parameterを選択するだけだそうです。

f:id:kazuhironagai77:20220321002721p:plain

SystemのSystem SettingにUser Parameters Moduleが追加されました。

f:id:kazuhironagai77:20220321002736p:plain

選択すると以下に示した様になっていました。

f:id:kazuhironagai77:20220321002756p:plain

Level上に並べてそれぞれの

f:id:kazuhironagai77:20220321002814p:plain

を変更すると以下に示した様になりました。

f:id:kazuhironagai77:20220321002837g:plain

角度によってはかなり綺麗に見えます。

f:id:kazuhironagai77:20220321002903p:plain

ただ、はっきり言って汚くなっている箇所も結構あります

以下に示した黒い部分の境界はカクカクし過ぎて汚いです。

f:id:kazuhironagai77:20220321002930p:plain

なんでこういうのが発生するのかは分かりません。

PCの能力不足でしょうか?

2.3 アニメ調のEffectに変更してみる

先週の考察で、まず黒枠の作成が必要であると悟ったので、

以下の方法でNormal のBの値が低い部分を黒くしてみました。

f:id:kazuhironagai77:20220321002952p:plain

結構望み通りの黒枠が出来ました。

f:id:kazuhironagai77:20220321003007p:plain

所が横から見ると、

f:id:kazuhironagai77:20220321003032p:plain

Coinの横が真っ黒になってしまっています。

これ以外の方法は思いつきませんでした。

これから黒枠の作り方を研究します。

こんなの簡単に思いつくだろと思ったんですが以外と難しいです。Normal Mapの隣の値が取れるのなら、それと比較する事が出来るんですが、そのやり方が分かりません。

Fresnelノードを使って2色にします。

f:id:kazuhironagai77:20220321003051p:plain

f:id:kazuhironagai77:20220321003059p:plain

うーん。

あんまりですね。

これは適当にやっても上手く行くものではないですね。

本当は、今週からは、このように自分で工夫して改良して独自のアニメ調のEffectの作成をする方を主力にして行こうと思ったんですが思ったより難しいです。

これだけやっていると本当に時間の無駄になりかねないです。

それで考えたんですが、黒枠が出せれば後は黒枠とCGHOW氏のTutorialをミックスさせることでアニメ調のEffectに改良出来ると思うんです。

まず黒枠の作成方法を勉強してみるのが手かもしれません。

3.Material : Projectionの勉強の復習

今週はProjection Series の最後のTutorial、Tri planar Projection Normal Maps - Shader Graph Basics - Episode 30 [2] を復習します。

3.1 前の勉強の復習

以前、何を勉強したのかの確認を行います。

2022-02-06Blogの復習>

兎に角、難しくて理解出来ないかもしれないと書いてあります。それでも敢えてまとめると以下の様に成ると書かれていました。

f:id:kazuhironagai77:20220321003145p:plain

今、ほぼ完全に理解した後でこのまとめを見ると大体合っています。

全然理解出来ない状態からは程遠いです。

それでは具体的に見て行きます。

前の週に作成した上下左右のあるTexture用のTri-Planar ProjectionのMaterialを使用しています。Material Functionは使用していませんね。

f:id:kazuhironagai77:20220321003202p:plain

アー良かった。

先週、Material Functionを作成するのは面倒だったので結局やらなかったんです。今週、Material Functionの作成からやり直さないといけなかったら大変でした。

View Port 1のView ModeをWorld Normalにセットしています。

f:id:kazuhironagai77:20220321003249p:plain

地味な部分ですが、この辺のやり方は完全に忘れていました。

f:id:kazuhironagai77:20220321003309p:plain

その通りですが、今回はこの辺の復習はパスする事にします。前回、全部確認して一応、自分の解釈で合っているとの確証を得たのと、これ以上掘っても新しい事実はそうそう見つからないと考えられるからです。

その後で、正しいNormal Mapと先週、作成したTri-planar Projectionを使用したNormal Mapを比較して先週、作成したTri-planar ProjectionがNormal Mapを正しく表示していない事を確認しています。

f:id:kazuhironagai77:20220321003326p:plain

確か、これより簡単に確認出来る方法を後で、編み出したはずです。その辺はしっかり確認する事にします。

この後、何でNormal Mapを使用した場合、間違った結果になるのかについて解説しています。

f:id:kazuhironagai77:20220321003343p:plain

この辺は全く覚えていません。

以下の様にまとめられていました。

f:id:kazuhironagai77:20220321003358p:plain

うーん。

Normal Mapを展開するCoordinateと通常のTextureを展開するCoordinateが違うと言う事は分かっていますが、どう違うのか今でも分かっていません。

更に、Normal Mapを展開するのはTangent Spaceですが、通常のTextureを展開するのはどのCoordinateなのかも分かっていません。上記に書かれたようにWorld SpaceだとするとProjectionと同じになってしまうので、Tutorialの言う通りUV Space上が正しい気もします。でもLocal Spaceが一番正しいような気もします。今週はこの辺をしっかり確認しましょう。

f:id:kazuhironagai77:20220321003412p:plain

この部分は今回もスキップします。

Ben 先生の以下のセリフだけ覚えておきます。

f:id:kazuhironagai77:20220321003428p:plain

ここから具体的な実装に入ります。

Normal MapにおけるTri-Planar Projectionの計算結果をResult ノードのNormalに接続している箇所の直しです。

f:id:kazuhironagai77:20220321003533p:plain

通常のTextureはWorld Spaceの座標内に存在していると考えて計算されています。しかしNormal MapはTangent Spaceにあると考えて計算されています。

ので、Transform Vectorノードを使用して座標変換を行います。

うーん。この説明を見ると、先程の通常のTextureが展開される空間は、World Spaceで問題ないみたいです。はい。

この後で、Tri-Planar Projectionの結果と正しいNormal Mapを比較して

f:id:kazuhironagai77:20220321003552p:plain

と結論づけています。

そして

f:id:kazuhironagai77:20220321003607p:plain

これは正しいですが、この後、何をしているのか理解出来なくなってTutorialの言うままに作成しています。

今、覚えている範囲で、ここで何をしているのかをまとめるとNormal MapのCoordinateはTangent Spaceのものなので、通常のTextureの計算と合うようにWorld Spaceに変換したはずです。

その上で、軸の間違いを調整したはずです。

ただこの辺は、この週の次の週(2022-02-14のBlog)の検証で詳しくやっているはずなので、ここでは深く入り込みません。

f:id:kazuhironagai77:20220321003626p:plain

2022-02-14Blogの復習>

この週の前の週(2022-02-06Blog)の勉強は、Normal MapのTri-PlanarのProjectionの作成方法について

f:id:kazuhironagai77:20220321003652p:plain

の様にまとめましたが、最後の間違いの部分を一つ一つ直して行く具体的な方法の意味が全く理解出来ませんでした。

確か、この週の勉強でその具体的な方法が何をやっているのかを解明したはずです。その辺に注目しながらBlogを読んでいきます。

最初から、凄い弱気になって出来なかった時の伏線を張っています。

f:id:kazuhironagai77:20220321003710p:plain

この回のBlogは本当によくやったと思います。まさかこの状態から、具体的な実装が何をやっているのかをほぼ完全に解明したんですから。

アメリカの諺でGarbage in, garbage outというのがありますが、この逆もまた真ですね。Ben 先生の尋常ならざる優れた教育で勉強すると、その勉強成果もまた非凡な結果に成ると言う良い見本です。

Ben 先生のような優秀な人を指す四字熟語ってないのかなと思って調べたら、なかったです。

良く考えたら、英語で賢者を意味するGuruとかPunditって複雑過ぎて普通の人が理解出来ない事象を、普通の人が理解出来るように説明出来る人ってニュアンスがあります。

こういう発想自体が、東アジア自体にないですね。

「普通の人が理解出来ない内容を理解出来る僕、えらい。」から「普通の人が理解出来ない内容を、普通の人が理解出来るように説明出来る僕、えらい。」にならずに「普通の人が理解出来たら僕えらく無くなるから、絶対、分かり易く解説しない。」に変化してしまうのは何でなんでしょうね。

神ならざる私にこの理由を解明出来る訳ありませんが、東アジア人の賢人層が、アメリカ人の賢人層に比べて器が小っちゃく見えてしまうのは仕方ないですね。

何となく実装方法を検査しても何も理解出来ないで終わるのは予測出来ます。ので仮説を立ててその仮説に基づいて検証すると言っています。

以下にその仮説を示します。

f:id:kazuhironagai77:20220321003724p:plain

うーん。

今思えば、この仮説を立てた事が、実装内容が理解出来た原因です。確か、最初の仮説は間違っていて次の仮説が合っていたはずです。

でも大切なのは仮説を立てて検証する事だったんです。

しかし、この週のBlogは神懸っています。単に仮説を立てただけじゃなくて、その仮説の根拠をまず言及しています。

まず最初の仮説である「Tangent SpaceからWorld Spaceへの変換」を実装しているの根拠です。

f:id:kazuhironagai77:20220321003741p:plain

あれ。

これ読むと最初の仮説も正しい。と言うかこれは何処かでやる必要がありますよね。

何か今の自分の理解も少し混乱しているかもしれません。

このままBlogの流れを追っていきます。

次に以下の部分が、この週の前の前の週にやった上下左右のあるTextureの裏表を直すのに使用した実装と全く同じ事をしているので

f:id:kazuhironagai77:20220321003757p:plain

同じ事をここでもしているのだと言う仮説です。

うーん。

やっぱり最初の仮説も正しいし、この仮説も正しいはずです。

気になったので、この週のBlogを最後まで読みました。そしたら分かりました。

間違っていたのはこの2番目の仮説で、ここでやっている実装は全て、最初の仮説である「Tangent SpaceからWorld Spaceへの変換」を実装しているだけでした。

その中で、この週の前の前の週にやった上下左右のあるTextureの裏表を直すのに使用した実装と全く同じ事をする必要があったために、たまたま、その実装を使用したのでした。

はい。

それではまた続きをまとめます。

最初の部分の実装をみます。

f:id:kazuhironagai77:20220321003814p:plain

これを調べている内に、Tangent Spaceの座標が分からない事に気が付いて、それを先に調べる事にしました。

Tangent Spaceは簡単に言えば、それぞれのVertex上にある座標軸と言う事がわかりました。

f:id:kazuhironagai77:20220321003827p:plain

が以下の2点が良く分からないと言っています。

f:id:kazuhironagai77:20220321003851p:plain

この辺、非常に鋭いです。

2番目の疑問はすぐに解消しました。

f:id:kazuhironagai77:20220321003904p:plain

この後で、Normal MapをBase Colorとして使用した以下の図を利用して

f:id:kazuhironagai77:20220321003917p:plain

Tangent Spaceの座標が以下の様になると予測しています。

f:id:kazuhironagai77:20220321003934p:plain

一応、今の時点ではこの座標軸は正しいとなっています。

次に以下の様なBoxにNormal MapをBase Colorとして表示します。

f:id:kazuhironagai77:20220321003954p:plain

これでWorld Spaceの座標と、Tangent Spaceの座標の違いを検討しました。その結果、

f:id:kazuhironagai77:20220321004702p:plain

と言う事が判明しました。

おおお。です。今読み直しても鳥肌ものです。

そしてこれが、Tutorialの実装である

f:id:kazuhironagai77:20220321004726p:plain

部分と完全に一致している事が分かりました。

次の変換部分ですが、

f:id:kazuhironagai77:20220321004740p:plain

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

f:id:kazuhironagai77:20220321004757p:plain

つまり、何故これをやっているのか今一良く分からない。Vertex Normal WSノードとAbsolute World Positionノードの関係が良く分からないので良く分からないと書いています。

うーん。

この部分の解明は今回頑張ります。

最後の変換部分です。

f:id:kazuhironagai77:20220321004815p:plain

Signを使用して、TextureのProjectionの裏返しの向きを直す実装と全く同じやつです。

Blogの説明だと全部の手順が分からないですね。

Projectから前の実装を探してきました。

以下の様な実装でした。

f:id:kazuhironagai77:20220321004833p:plain

上下左右あるTextureの裏返しを直すやり方と全く同じでです。結果も同じになるでしょう。

後、実装を確認したらこれは実装の最後の部分ではなく最後から2番目の部分で、

f:id:kazuhironagai77:20220321004849p:plain

が最後でした。

分かりました。やっている事は3つだけです。

以下の計算結果を

f:id:kazuhironagai77:20220321004907p:plain

それぞれの軸のxに掛ける。

-1を掛ける。

Vertex Normal WSと

f:id:kazuhironagai77:20220321004923p:plain

を行う。

この3つを行使して軸の向きを直します。

<復習まとめ>

Tri planar Projection Normal Maps - Shader Graph Basics - Episode 30 [2]で何をやっているのか大体、思い出しました。

Normal MapをTri-PlanarでProjectionする時は、今までの実装に追加してTangent SpaceとWorld Spaceの座標軸の変換を考える必要があります。

Result ノードのNormal に接続する場合は以下に示した様にTransform Vectorノードを使用するだけです。

f:id:kazuhironagai77:20220321004948p:plain

Texture Sampleの後でWorld SpaceからTangent Spaceへの変換は非常に複雑です。

f:id:kazuhironagai77:20220321005001p:plain

まず、Normal MapをBoxに貼りつけてWorld Spaceの座標軸とTangent Spaceの座標軸を比較します。

f:id:kazuhironagai77:20220321005017p:plain

すると

f:id:kazuhironagai77:20220321005035p:plain

と言う事が判明します。

ので

f:id:kazuhironagai77:20220321005051p:plain

f:id:kazuhironagai77:20220321005057p:plain

f:id:kazuhironagai77:20220321005104p:plain

その通りに軸を変更します。

更に、以下の手順を追加します。

軸の向きが逆な物は-1を掛けます。

-方面だけX軸が裏返しになっている物は、

f:id:kazuhironagai77:20220321005124p:plain

を掛けます。

正と負の軸が逆転してる軸は

f:id:kazuhironagai77:20220321005137p:plain

を掛けます。

以上です。

3.2 Tri planar Projection Normal Maps - Shader Graph Basics - Episode 30 [2]を軽く見る

ほぼ上記の理解で合っているはずですが、もう一回、Tutorialを見て確認します。

結構、説明していませんね。

後、実装する順番ですが、後から計算する方を先に実装していました。逆にやると何か問題が起きるのかもしれません。

3.3 Tri planar Projection Normal Maps - Shader Graph Basics - Episode 30 [2]を復習する

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

Tutorialは球にNormal Mapを貼り付けて比較していましたが、それは分かりにくいので私が2022-02-14のBlogでやったBoxに直接貼り付けるやり方で比較する事にします。

まず先週までの上下左右のあるTextureのProjectionのMaterialを作成します。

<上下左右のあるTextureのProjectionのMaterialの作成>

流石にこの辺になると前の実装方法も忘れて来てるので、復習も兼ねて記録する事にします。

<<Directional Projection>>

f:id:kazuhironagai77:20220321005209p:plain

f:id:kazuhironagai77:20220321005216p:plain

一定方向だけ歪みのないProjectionです。

<<Directional Mask>>

歪んでProjectionされている箇所だけMaskします。

f:id:kazuhironagai77:20220321005236p:plain

f:id:kazuhironagai77:20220321005244p:plain

<<Tri-Planar Projection>>

一応、低精度のやつも作成しました。

f:id:kazuhironagai77:20220321005305p:plain

f:id:kazuhironagai77:20220321005314p:plain

<<上下左右のあるTextureのTri-Planar Projection>>

流石にこれを一から作成するのは骨が折れるので先週のBlogを一寸だけ参考にさせてもらいます。

Grid Textureを貼って確認すると以下の様な結果が出て来ます。

f:id:kazuhironagai77:20220321005419p:plain

まずXY軸が逆になっているのを直します。

f:id:kazuhironagai77:20220321005438p:plain

するとProjectionが以下の様になります。

f:id:kazuhironagai77:20220321005458p:plain

負の軸のProjectionだけ裏返しにする実装は以下のものですが

f:id:kazuhironagai77:20220321005516p:plain

Xだけ逆なので、

f:id:kazuhironagai77:20220321005534p:plain

(-1,1,1)を掛けます。

以下の実装になりました。

f:id:kazuhironagai77:20220321005549p:plain

f:id:kazuhironagai77:20220321005556p:plain

<Normal Mapの使用>

f:id:kazuhironagai77:20220321005616p:plain

はい。こうなりました。

ここからTutorialと一寸だけ違うやり方でやる事にします。

まずこのNormal を貼り付けたCubeとWorld Spaceの座標を比較して以下の結果を得ます。

f:id:kazuhironagai77:20220321005634p:plain

流石にこれを今確認するのは大変なので、これは2022-02-14のBlogのBlogからそのまま持ってきました。

上記の結果から軸だけ抜き出すと、

f:id:kazuhironagai77:20220321005648p:plain

となります。

まずこの部分を作成します。

f:id:kazuhironagai77:20220321005706p:plain

結果です。

f:id:kazuhironagai77:20220321005721p:plain

ここで本当は、

f:id:kazuhironagai77:20220321005737p:plain

を次にやるんですが、これの意味が今一分かってないので、先にProjectionの直しをやります。

f:id:kazuhironagai77:20220321005752p:plain

これです。

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

f:id:kazuhironagai77:20220321005805p:plain

結果、

f:id:kazuhironagai77:20220321005818p:plain

となりました。

今度はx軸とy軸のyに-1を掛けます。

f:id:kazuhironagai77:20220321005838p:plain

結果、

あれ、何かオカシクなってしまいました。

うーん。

やっぱり全部確認しながらやらないと訳わからなくなった時にどこまで戻れば良いのか分からなくなります。

もう一回やり直します。今度は全部確認します。

3.4 Tri planar Projection Normal Maps - Shader Graph Basics - Episode 30 [2]をもう一回、復習する

以下の場所からやり直します。

f:id:kazuhironagai77:20220321005912p:plain

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

f:id:kazuhironagai77:20220321005929p:plain

前回の結果と同じでした。

f:id:kazuhironagai77:20220321005949p:plain

を掛けます。

f:id:kazuhironagai77:20220321010007p:plain

結果です。

ここが間違っていました。X軸は正のY軸の向きが直っていました。

今度はx軸とy軸のyに-1を掛けます。

f:id:kazuhironagai77:20220321010026p:plain

結果です。

f:id:kazuhironagai77:20220321010042p:plain

うーん。

これなら分かります。

この最後の部分を直すために、

f:id:kazuhironagai77:20220321010100p:plain

この計算をします。

これ絶対、この方法を編み出した人は行列で解いていますよね。

取りあえずX軸だけやりました。

f:id:kazuhironagai77:20220321010119p:plain

結果、Back、つまり負のX軸のxの向きが正しくなりました。

f:id:kazuhironagai77:20220321010136p:plain

全部の軸で実装すると

f:id:kazuhironagai77:20220321010153p:plain

となり、全ての軸でTangent SpaceからWorld Spaceへの移行が完成しました。

最後、確認のためTransform VectorノードでWorld SpaceからTangent Spaceに戻してNormalに接続します。

f:id:kazuhironagai77:20220321010210p:plain

結果です。

f:id:kazuhironagai77:20220321010224p:plain

f:id:kazuhironagai77:20220321010240p:plain

f:id:kazuhironagai77:20220321010249p:plain

f:id:kazuhironagai77:20220321010300p:plain

f:id:kazuhironagai77:20220321010310p:plain

f:id:kazuhironagai77:20220321010325p:plain

全ての方向で一致しています。

出来ています。

<3つの実装方法の意味についての仮説>

今週の実装において3つのNormal Mapの向きを変更するための実装方法の機能について、以下の仮説が考えられるようになりました。

今週はもうこれ以上Materialの勉強する時間が取れないので、来週以降検討するための記録をしておきます。

最初の実装です。Signノードを使用するやつです。

f:id:kazuhironagai77:20220321010349p:plain

掛けた軸の負の側の値のみを裏返します。

f:id:kazuhironagai77:20220321010403p:plain

上記の場合、Y軸のxにこの計算結果を掛けると、

f:id:kazuhironagai77:20220321010422p:plain

となると思われます。

-1を掛ける

f:id:kazuhironagai77:20220321010444p:plain

掛けた軸の正と負の両方の軸の向きを逆にします。

以下の場合、

f:id:kazuhironagai77:20220321010502p:plain

以下の様になると思われます。

f:id:kazuhironagai77:20220321010518p:plain

最後の

f:id:kazuhironagai77:20220321010535p:plain

f:id:kazuhironagai77:20220321010551p:plain

f:id:kazuhironagai77:20220321010617p:plain

する機能があると思われます。

これは来週以降、検討します。

4. RPGStoryの改善

4.1 兎に角GameをPlayする

GameをPlayして思いついた事を書き記していきます。

f:id:kazuhironagai77:20220321010647p:plain

まずSkip出来ません。

最初のMoveは一回位見たら十分です。スキップ出来るようにする必要があります。

f:id:kazuhironagai77:20220321010703p:plain

操作の説明で、Space Keyが抜けていました。

Game を始めるボタンを押したらボタンが初期設定の形に戻ってしまいました。

Map1に移動しました。

f:id:kazuhironagai77:20220321010720p:plain

Playerの操作するキャラが狩人のままです。弟子に戻す必要があります。

最初から金貨を1000枚も持っています。

f:id:kazuhironagai77:20220321010737p:plain

最初は所持金は0のはずです。

昼と夜の変化が早すぎます。

f:id:kazuhironagai77:20220321010755p:plain

時間じゃなくて歩いた歩数で昼と夜が変化するようにしたいです。

f:id:kazuhironagai77:20220321010811p:plain

最初のNPCの会話はそれなりに分かり易いです。

武器を手に入れる必要がある事が分かります。

f:id:kazuhironagai77:20220321010833p:plain

宿屋に人がいません。宿に泊まる事が出来ません。

Monsterと戦わないで隣の村に行くための裏道が、寂しすぎます。

f:id:kazuhironagai77:20220321010854p:plain

Itemを配置して拾えるようにします。

村人の会話は2つの要素が抜けていました。

一つ目は武器を買うために必要なお金をどうやって貯めるのかのヒントです。

もう一つは、実際に武器を手に入れ、Monsterを倒したら、次のMissionを提示するため、会話が変わる必要があります。

f:id:kazuhironagai77:20220321010917p:plain

山の中に落ちている剣ですが拾っても消えません。

バグです。

f:id:kazuhironagai77:20220321010934p:plain

以下の警告が2回も表示されます。

f:id:kazuhironagai77:20220321011005p:plain

掲示板を読んだときのみ表示されるように変更します。

Monsterを倒して、Levelが上がりました。

f:id:kazuhironagai77:20220321011021p:plain

まず、Levelが上がるのが速過ぎます。最初の一体を倒したらLevelが上がるのは良いかもしれませんが、その後はもう少しゆっくりLevelを上げるように直します。

最初に覚える魔法が弱すぎます。

折角、魔法を覚えたら戦闘で使って見たくなるはずです。効果が凄いけど魔力が足りないから1回しか使用出来ないような強さに設定し直すべきです。

戦闘後の報酬も必ず貰えるようになっています。報酬は20%位の確率でもらえるように設定し直します。

f:id:kazuhironagai77:20220321011041p:plain

石像の閉じるボタンが紛らわしいです。

f:id:kazuhironagai77:20220321011059p:plain

はいといいえで、「いいえ」を選択したらWidgetを閉じれるようにします。

Item Shopではまだ全てのItemが買えるようになっています。

f:id:kazuhironagai77:20220321011117p:plain

職業や、Eventによって買える内容が変化すべきです。

Game Modeの以下の部分がErrorを発していました。

f:id:kazuhironagai77:20220321011133p:plain

原因は後で解明します。

5.Open Worldの検証

5.1 A Boy and His Kiteを見る

f:id:kazuhironagai77:20220321011200p:plain

まず、Projectを作成しました。

28GBもあります。

Projectが完成したので開いてみます。

f:id:kazuhironagai77:20220321011216p:plain

以下に示したWidgetが表示されました。

f:id:kazuhironagai77:20220321011234p:plain

GDC_Landscape_01.umapを開けばMain Levelが開けるとあります。

f:id:kazuhironagai77:20220321011249p:plain

World Compositionが聞いているはずなので、全部のSub Levelもついでに開く事はないと思いますが、ちょっと怖いです。が開いてみます。

f:id:kazuhironagai77:20220321011305p:plain

Persistent Levelには何もないですね。

Levelsを開いてみると

f:id:kazuhironagai77:20220321011324p:plain

何か想像していたのと違います。

これがSub Levelなんでしょうか?

World Compositionを開きます。

f:id:kazuhironagai77:20220321011344p:plain

うーん。

これ見ると一辺のサイズは精々20kmですね。

260kmだとこの10倍になりますね。とても出来るとは思いません。

それぞれのLayerを見てみます。

f:id:kazuhironagai77:20220321011358p:plain

Streaming Distanceは50,000と書かれていました。

f:id:kazuhironagai77:20220321011418p:plain

と言う事は50,000cm なので500mですね。

f:id:kazuhironagai77:20220321011439p:plain

こんな小さい点だけ特別に作成したんでしょうか?

Levelsから見ると3つのSub Levelがあります。

f:id:kazuhironagai77:20220321011457p:plain

Background Levelsを選択したら

f:id:kazuhironagai77:20220321011515p:plain

原点にあるSub Levelでした。

更にFaunaというLandscapeを持たないSub Levelがありました。

f:id:kazuhironagai77:20220321011533p:plain

いやそれ以前にこれらはSub Levelなんでしょうか?

Sub Levelだったら以下の部分にPersistent Levelと同じようなLockやOpen Level BP Button が表示されるはずです。

f:id:kazuhironagai77:20220321011551p:plain

良く分かりません。

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

f:id:kazuhironagai77:20220321011608p:plain

結構、PCが音しています。

手前の草が綺麗ですね。

f:id:kazuhironagai77:20220321011632p:plain

奥の山は、World Machineで作成したんでしょうか?

雲も何らかの方法で作成していますね。

中を探検してみます。

f:id:kazuhironagai77:20220321011652p:plain

歩いていると草が現れました。

これはProcedural Foliage Toolで作成していそうです。

f:id:kazuhironagai77:20220321011712p:plain

ここはTexture Repetitionがはっきり見えますね。

f:id:kazuhironagai77:20220321011733p:plain

水はどの方法で作成したんでしょうか?

一端、Playを停止してSub LevelをLoadして確認する事にします。

一番、重要そうなStarting_shotをLoadしました。

f:id:kazuhironagai77:20220321011752p:plain

あ。LoadしたらLock Buttonなどが表示されました。

それはそうだわ。

何か今週はボケボケです。

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

f:id:kazuhironagai77:20220321011808p:plain

Landscapeの設定がみたいです。

Landscapeを選択してWorld Outlinerで調べるとLandscapeProxy1となってました。

f:id:kazuhironagai77:20220321011826p:plain

うーん。LandscapeはtypeにLandscapeと表示されていた気がしますが。

でも使用しているMaterialは載っていました。

f:id:kazuhironagai77:20220321011839p:plain

これを調べます。

これはMaterial Instanceで元のMaterialは以下の奴です。

f:id:kazuhironagai77:20220321011856p:plain

開いてみます。

f:id:kazuhironagai77:20220321011915p:plain

まずは、Procedural Foliage Toolを見てみます。

f:id:kazuhironagai77:20220321011928p:plain

ありました。

以下のGrass Typeが使用されています。

f:id:kazuhironagai77:20220321011945p:plain

最初のGreen Grass Type 01を見てみます。

f:id:kazuhironagai77:20220321012002p:plain

Cull Distanceは5000から始まって8000で終わっています。

f:id:kazuhironagai77:20220321012016p:plain

UUが1cmならば50mで始まって80mで終わっている事になります。

うーん。

凄い参考になります。

River RockなんかもProcedural Foliage Toolで生成しているんですね。

f:id:kazuhironagai77:20220321012042p:plain

LandscapeからPaintを選択してLayersを見ると

f:id:kazuhironagai77:20220321012100p:plain

こんなに沢山のLayerがありました。

しかも全てのLayerはNo Weight Blendを使用していました。

うーん。

Materialに戻ってLayerを探したんですが良く分かりません。

Landscape Layer Blendを使用していません。MatLayerBlend_Standardが使用されています。

f:id:kazuhironagai77:20220321012118p:plain

良く分かりませんね。

これ以上見ても良く分からないので一端中止します。

一応、確認出来たLandscapeの大きさは25km位で、260kmは良く分からないですね。

でも、分かった事も結構あります。

まず、Stream Levelの設定が5kmになっている事です。

これ位が普通で、それより小さい場合のSeamlessなLoadingは別なLoadを使用すべきなんでしょうね。

草の生成はProcedural Foliage Toolを使用しています。やり方はTutorialに書かれていたのとほぼ同じでした。

LandscapeのLayerはLandscape Layer Blendを使用しないで作成されていました。

このやり方は上級者向けなのか、それとも古いやり方で、Landscape Layer Blendを使用して作成する方がより正しいやり方なのかは不明です。

湖をどうやって作成したのかは、調べませんでした。

後、雲ですね。

明らかに雲が追加されています。この雲の作成方法は勉強する必要があります。

5.2 Creating Open World Landscapes with New UE5 Preview & World Partition [3] を見る

GDi4K氏のTutorialはUEのOpen World 関連のTutorialを上げているのは知っていましたが、見た事ありませんでした。ので今週はGDi4K氏のCreating Open World Landscapes with New UE5 Preview & World Partition [3] を見る事にします。

まず、軽く全部見ました。

かなりしっかりしたTutorialでした。

出来たばかりのTutorialでUE5 Previewを使用して作成しているのも好印象です。

Virtual Textureを使用しています。これが何の事が良く分かりません。

本当は、試しに全部やるつもりだったんですが、このVirtual Textureが初めて聞く機能だったのでちょっと二の足を踏んでしまいました。

5.3 Open Worldの検証の目的の確認

元々、Open Worldの検証の目的は、一辺が16 kmぐらいある巨大なLandscapeをWorld Compositionを使用して作成するのが目的だったんです。

その方法が分からないので、Tutorialで一気に最新かつ最適なやり方を学んでしまおうと思ったんです。

所が、頼りにしていたSmart Poly 氏のTutorialでは、World Machineを使用していたり、Landscapeのサイズそのものが4kmだったりで、そのままでは使用出来ない事が判明したので、他のTutorialを探したんですが良いのが見つかりません。

ちょっとだけ手詰まり感が出て来ました。

5.4 これからの課題

一辺が16 kmぐらいある巨大なOpen Worldを作成するための方法の検証はこれからも続けるべきですが、具体的に毎週、何をするかはきちんと決めておかないと時間だけ浪費して何の成果も生まない結果になってしまいます。

  • Landscape作成方法全般の勉強
  • Smart Poly氏のTutorialをやる
  • 先程のGDi4K氏のTutorialをやる
  • World Compositionの復習をやる

この辺の勉強をしつつ16 kmぐらいある巨大なOpen Worldを作成するための方法も検討するというStanceで行く事にします。

6.World Machineの勉強

先週のTutorialが有料版についてしか書かれていなくて、もうWorld Machineの勉強は中止しても良いかなとも思っているですが、山がWorld Machineで生成した物とUE4のLandscapeで生成したのでは全く違う事に気が付きました。

UE4のLandscapeで生成した山がぼっことしていて、悪い意味で漫画チックなんです。

f:id:kazuhironagai77:20220321012218p:plain

それに比べて、World Machineで作成した山は何て言うか本物の山のようにカクカクしているんです。

f:id:kazuhironagai77:20220321012246p:plain

この辺の質の違いが何処から来るのか分かりませんが、兎に角違います。

やっぱりこの辺を見るとWorld Machineかそれに類するSoftware の使用方法は勉強する必要があると思います。

6.1 User Guide5. Layout Generator [3] を読む

以下の部分が無料版にはないので、出来ないじゃないかと思うんですが、

f:id:kazuhironagai77:20220321012325p:plain

一番最初に見つけたんですが、このShape Deviceを使用すると

f:id:kazuhironagai77:20220321012519p:plain

ほぼ似たような事出来るんです。

f:id:kazuhironagai77:20220321012536p:plain

のでその辺を関連づけながら読んでいきます。

<Layout Generator Options

この辺の項目は無料版には全くないですね。

Rendering Modeが

f:id:kazuhironagai77:20220321012600p:plain

と似た機能なような気がします。

Use Breakupですが、

f:id:kazuhironagai77:20220321012617p:plain

の事でしょうか?

Invert Valuesは

f:id:kazuhironagai77:20220321012635p:plain

と同じですね。

Shape List Buttonですが、

f:id:kazuhironagai77:20220321012649p:plain

これの事を指しているのかもしれません。

最後のFile Buttonですが、

f:id:kazuhironagai77:20220321012706p:plain

がそうでしょう。

全然、無いと思ったら結構類似の機能がありました。

これなら無料版でも結構出来そうです。

<Creating and using Layout Shapes

あんまり詳しく説明されていません。

色々、自分で弄ってみます。

<<Rectangle>>

f:id:kazuhironagai77:20220321012731p:plain

以下のようなShapeを作成します。

f:id:kazuhironagai77:20220321012748p:plain

作成した後で、動かす事は出来ません。

いや出来るのかもしれませんが、その方法は分かりません。

<<Circle>>

f:id:kazuhironagai77:20220321012811p:plain

基本的にRectangleと同じです。

<Polygon

f:id:kazuhironagai77:20220321012839p:plain

左Clickで以下のような形を作成します。

f:id:kazuhironagai77:20220321012858p:plain

完成したら右Clickします。

Polygonは完成した後で、位置を移動させたり、Vertexを一個だけ選択して移動させたり出来ます。

f:id:kazuhironagai77:20220321012929p:plain

<Pass

Passです。

これもPolygonと同じで、左Clickで位置を選択して完成したら右Clickします。

f:id:kazuhironagai77:20220321012955p:plain

Polygonと同じように一個のVertexを選択して移動させる事が出来ます。

f:id:kazuhironagai77:20220321013017p:plain

<Subtractする方法>

Tutorialに出来ると書かれているのにやり方が載っていないのがこれです。

以下の図はRectangleで作成したTerrainからCircleを引いたものです。

f:id:kazuhironagai77:20220321013045p:plain

やり方はCircleを選択した状態でCtrlを押してCircleを作成するだけです。

次は以下の部分の解説です。

f:id:kazuhironagai77:20220321013105p:plain

しかしこの部分は無料版では使用出来ないみたいです。

<Transforming Shapes

DragするとShapeを望みの位置に移動出来ると書かれてます。

いや出来なかったはずと思ってもう一回試したら出来ました。

f:id:kazuhironagai77:20220321013129p:plain

Rectangleの位置を移動させてみました。

更に右Clickすると以下の表示が現れます。

f:id:kazuhironagai77:20220321013148p:plain

<<Rotate>>

Rotateを選択しました。

f:id:kazuhironagai77:20220321013208p:plain

Rectangleを回転させる事が出来ました。

<<Scale>>

Scaleを選択すると大きさを変化する事が出来ます。

f:id:kazuhironagai77:20220321013232p:plain

<<Translate>>

当然ですが位置を移動出来ます。

f:id:kazuhironagai77:20220321013255p:plain

<<Transformation Center>>

Shiftを押しながら回転させると中心が変わるとありますが、差がないですね。

良く分かりません。

<Vertex-based shape options

PolygonとPathについてです。

PolygonでTerrainを作成して右Clickしてみたら

f:id:kazuhironagai77:20220321013326p:plain

<<Bezier Path>>

Bezier Pathを選択すると以下に示した様にVertexが2点に分割されVertex同士のInterpolationの角度を変更出来ます。

f:id:kazuhironagai77:20220321013347p:plain

<<Perform Curve Smoothing>>

これはTutorialには解説が無かったんですが、試したら

これが

f:id:kazuhironagai77:20220321013409p:plain

こんな感じにSmoothになりました。

f:id:kazuhironagai77:20220321013443p:plain

<Vertex Editing

一つ一つのVertexも編集出来るそうです。

f:id:kazuhironagai77:20220321013506p:plain

RectangleのVertexにもあるのか試したら無かったです。

<<Enter Precise Value>>

以下の様にVertexの位置を値で指定する事が出来ます。

f:id:kazuhironagai77:20220321013528p:plain

<<Value Key-Point>>

Tutorialには「選択したVertexがInterpolateするのかそれともKey Frameとして手動で値を持つのか決めます。」と書かれていますが、VertexがInterpolationで値が決まる事があるんでしょうか?

ああ、何となく分かりました。

Vertexの値がInterpolateする時、それはSmooth Curveを適用した時です。

Value Key-Pointを選択したままSmooth Curveを掛けてみました。

以下に示した様にValue Key-Pointを選択したVertexの位置は変化していない歪みを生じています。

f:id:kazuhironagai77:20220321013552p:plain

今度はValue Key-Pointを外してSmooth Curveを掛けてみました。

f:id:kazuhironagai77:20220321013609p:plain

うーん。あんまり変わらないですね。

良く分かりません。

<<Delete Vertex>>

当然Vertexを消します。

<<Subdivide Vertex>>

以下に示したVertexのうち真ん中のVertexのSubdivide Vertexを選択しました。

f:id:kazuhironagai77:20220321013634p:plain

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

f:id:kazuhironagai77:20220321013656p:plain

となりのVertexの中点に2つの新しいVertexが生成されました。

<<Break Vertex Welds>>

これは無料版は使用出来ないみたいです。

<<Vertexを選択したままの状態で、右ClickをしながらDragすると>>

以下に示したGraphが表示されそれぞれのVertexの高さを調節出来るそうです。

f:id:kazuhironagai77:20220321013730p:plain

無料版でも、この機能は使えるんですが、実際のVertexの高さは変化してないみたいです。

<Vertex Welding

Weldingとは溶接と言う意味です。

2つのVertexを重ねると出来るみたいに書かれていますが、出来ているのか良く分かりません。

以下の図で2つのVertexを重ねました。

f:id:kazuhironagai77:20220321013754p:plain

この状態で下に示したPolygonの部分を移動させてます。

f:id:kazuhironagai77:20220321013839p:plain

すると以下に示した様に

f:id:kazuhironagai77:20220321013858p:plain

Passの形状も同時に変化しました。

うーん。

出来ていました。

更にこの状態だと

f:id:kazuhironagai77:20220321013919p:plain

Break Vertex Weldsが使用出来るようになってます。

Break Vertex Weldsを選択してPolygonを移動させると

f:id:kazuhironagai77:20220321013939p:plain

今度はPassはPolygonの動きに従って移動しなくなりました。

あれ?

今気が付いたんですが、

f:id:kazuhironagai77:20220321013956p:plain

が使えるようになっています。

これ、Shapeを選択した状態じゃないと使用出来ないんですね。

これは最後に勉強します。

<Fractal Breakup

これは恐らく以下の部分の解説ですね。

f:id:kazuhironagai77:20220321014022p:plain

<<Intensity>>

Intensityを上げると

f:id:kazuhironagai77:20220321014043p:plain

以下の様に成ります。

f:id:kazuhironagai77:20220321014104p:plain

<<Frequency>>

FrequencyですがIntensityが0の時は何の変化もしません。Frequencyが高い時は大きな変化を示しました。

以下のTerrainはFrequencyが0の状態です。

f:id:kazuhironagai77:20220321014128p:plain

今度はFrequencyを最大まで上げました。

f:id:kazuhironagai77:20220321014150p:plain

はい。

<<Roughness>>

Roughnessが0の状態です。

f:id:kazuhironagai77:20220321014214p:plain

RoughnessがMaxの状態です。

f:id:kazuhironagai77:20220321014238p:plain

単純にTerrainがゴツゴツすると解釈する事にします。

<Sourcing vs. Modifying terrain with a Layout Generator

これは以下の様に繋いだ時と

f:id:kazuhironagai77:20220321014305p:plain

以下の様に繋いだ時

f:id:kazuhironagai77:20220321014322p:plain

の違いについて述べている様です。

試しに

f:id:kazuhironagai77:20220321014340p:plain

と繋いでみたら以下の様になりました。

f:id:kazuhironagai77:20220321014402p:plain

面白いので色々遊んでみました。

以下に示した様なPerlin Noiseで作成したTerrainにShapeで窪地を追加する事も出来ました。

f:id:kazuhironagai77:20220321014438p:plain

以下のDeviceの

f:id:kazuhironagai77:20220321014459p:plain

3D Terrainを見ると以下の様になっていました。

f:id:kazuhironagai77:20220321014517p:plain

凄いです。

うーん。これ商業レベルじゃない?

<Importing and Exporting Shapes

以下の部分の解説のようです。

f:id:kazuhironagai77:20220321014538p:plain

Import出来るか試すためにはまずExport出来ないと思ったんですが、Exportは出来ないみたいです。

これが無料版だから出来ないのか、それとも何かをすると出来るようになるのか不明です。

SVG と AI formatで作成された物ならImport出来るそうです。

試しに以下のImageを作成してpngでSaveしてそれをsvgに変換して

f:id:kazuhironagai77:20220321014558p:plain

Importしてみました。

以下に示したようなへんな図が表示されています。

f:id:kazuhironagai77:20220321014615p:plain

ちょっと良く分かりませんね。

<Curve Editor

これは一体何の話をしているのかと見ていたらありました。

f:id:kazuhironagai77:20220321014648p:plain

ただし選択出来ません。

のでこの勉強はSkepします。

<Shape Properties

最後に以下の部分の勉強をします。

f:id:kazuhironagai77:20220321014707p:plain

<<Default Value>>

Default Value (Height)が低い状態です。

f:id:kazuhironagai77:20220321014729p:plain

Default Value (Height)が高い状態です。

f:id:kazuhironagai77:20220321014748p:plain

これは想像通りなんですが、この後に以下の方法でVertex単体の高さを変化させる事が出来ないんです。

f:id:kazuhironagai77:20220321014807p:plain

値自体は変化しているのかもしれませんが、Viewの変化がないです。

<Opacity

BackgroundとこのShapeの混合具合を示すそうです。

現状、Backgroundは0なのでOpacityが下がるほどShapeが低くなっています。

f:id:kazuhironagai77:20220321014830p:plain

f:id:kazuhironagai77:20220321014850p:plain

となっています。

<Falloff distance

これが

f:id:kazuhironagai77:20220321014912p:plain

こうなります。

f:id:kazuhironagai77:20220321014929p:plain

FalloffのDirectionはExternalとInternalのどちらかが選択出来ます。

Internalを選択すると

f:id:kazuhironagai77:20220321014947p:plain

f:id:kazuhironagai77:20220321014958p:plain

f:id:kazuhironagai77:20220321015021p:plain

のように内側にFalloffします。

FalloffのCurveですが、以下の内のどれかから選択出来ます。

f:id:kazuhironagai77:20220321015041p:plain

Customを選択すると以下に示した様に

f:id:kazuhironagai77:20220321015058p:plain

先程、選択出来なかったCurve Editorが選択出来る様になりました。

f:id:kazuhironagai77:20220321015118p:plain

ただ、Tutorialが説明するような沢山の機能はないみたいです。でもCurveを手動で設定するのに必要な機能は全部ついています。

<<Fade>>

FadeですがTutorialには解説がありません。

f:id:kazuhironagai77:20220321015146p:plain

Fadeが高い状態です。

f:id:kazuhironagai77:20220321015207p:plain

Fadeが低い状態です。

f:id:kazuhironagai77:20220321015232p:plain

FalloffともOpacityとも違う独特の変化をします。

良く読んだらTutorialに説明がありました。

f:id:kazuhironagai77:20220321015249p:plain

どれくらいFalloffの設定が影響するかを指定していたんですね。

最後のShape Breakupです。

0の時です。

f:id:kazuhironagai77:20220321015306p:plain

指定したのと全く同じ形状をしています。

最大値の時です。

f:id:kazuhironagai77:20220321015324p:plain

指定した形と全然、違う形になりました。

指定した形からどれくらい離れるかを管理するみたいですね。

以上です。

今週のWorld MachineのTutorialは非常に勉強になりました。これは勉強して大正解でした。

7.雪山のMapの作成

先週、雪山用のMaterialを途中まで作成して時間が無くなってしまったんでした。

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

7.1 Distance Blendを使用する

はい。もう実装方法を忘れてしまっています。先週のBlogを読み直すと以下の方法で作成するようです。

f:id:kazuhironagai77:20220321015355p:plain

あ。思い出した。

Distance Blend ノードを使用するんです。

f:id:kazuhironagai77:20220321015434p:plain

でもこれそれぞれのLayer毎にサイズの違うTextureを用意してやるんでしょうか?

うーん。

もう一回、Unreal Sensei氏のHow to HIDE Texture REPETITION in Unreal Engine - UE4 Tutorial [5]で勉強し直します。

How to HIDE Texture REPETITION in Unreal Engine - UE4 Tutorial [5]におけるDistance Blendのやり方>

まず以下の様にDistance BlendノードをBase Colorに繋ぎます。

f:id:kazuhironagai77:20220321015455p:plain

すると以下のScreenshotの赤線で示したような

f:id:kazuhironagai77:20220321015511p:plain

Blendの境目が見れます。

Start Offsetの値を小さくすると

f:id:kazuhironagai77:20220321015532p:plain

Blendの境目が遠くに移動します。

今度はBlend Rangeの値を大きくします。

f:id:kazuhironagai77:20220321015557p:plain

Blendの境目が曖昧になりました。

はい。

これがDistance Blendノードの機能です。

これをそれぞれのLayerのTextureに使用します。

そう。

このやり方が分からないです。

Tutorialでは以下の様に実装していました。

まずLandscapeCoordノードに2種類の値を別々に掛けます。

f:id:kazuhironagai77:20220321015621p:plain

それぞれ別のTexture Sampleノードに繋ぎます。

f:id:kazuhironagai77:20220321015638p:plain

Lerpノードでつなぎます。

f:id:kazuhironagai77:20220321015700p:plain

むむむ。良く分かりました。

でもLerpノードを使用するならDistance Blendノードは白黒で値を返す必要があるんじゃないでしょうか?

私の結果は、白と灰色位なんですけど?

f:id:kazuhironagai77:20220321015721p:plain

一寸心配なんで以下の様なMaterialを組んでテストします。

f:id:kazuhironagai77:20220321015742p:plain

結果です。

f:id:kazuhironagai77:20220321015802p:plain

白黒になっていました。

Distance Blendノードは白黒で値を返していましたね。

<Distance Blendを実装する>

まずLayer1のMaterial functionを以下の様に改良しました。

f:id:kazuhironagai77:20220321015823p:plain

ParameterではなくFunction Inputを使用しています。

f:id:kazuhironagai77:20220321015836p:plain

こうする事でそれぞれのLayerでDistance Blendに関するParameterを別々に設定できるからです。

Lerpの部分です。

f:id:kazuhironagai77:20220321015854p:plain

以下の様にParameterを設定しました。

f:id:kazuhironagai77:20220321015916p:plain

こんな感じです。

近い状態です。

f:id:kazuhironagai77:20220321015935p:plain

少し離れた状態です。

f:id:kazuhironagai77:20220321015954p:plain

離れた状態です。

f:id:kazuhironagai77:20220321020011p:plain

離れた状態です。

f:id:kazuhironagai77:20220321020039p:plain

遠いTextureのSizeから調節します。

Texture Size Far = 0.001です。

f:id:kazuhironagai77:20220321020104p:plain

このサイズだとTexture Repetitionは全くないですね。もう少しサイズを小さくしてみます。

Texture Size Far = 0.01です。

f:id:kazuhironagai77:20220321020127p:plain

赤線で囲った辺りにTexture Repetitionが出ています。

Texture Size Far = 0.005です。

f:id:kazuhironagai77:20220321020148p:plain

まだわずかにTexture Repetitionが見られます。

Texture Size Far = 0.0025です。

f:id:kazuhironagai77:20220321020207p:plain

Texture Repetitionはギリ、分からないぐらいでしょうか。

念のため、Texture Size Far = 0.002に下げました。

f:id:kazuhironagai77:20220321020230p:plain

取りあえずこれでOKとします。

今度はTexture Size Near の値を調節します。

Texture Size Near = 0.1です。

f:id:kazuhironagai77:20220321020251p:plain

流石にこれはTexture Repetitionが凄いです。

Texture Size Near = 0.05です。

f:id:kazuhironagai77:20220321020308p:plain

まだTexture Repetitionがあります。

Texture Size Near = 0.01です。

f:id:kazuhironagai77:20220321020327p:plain

Texture Repetitionはないですね。

Play画面で確認します。

f:id:kazuhironagai77:20220321020349p:plain

うーん。

まあ良い感じです。

最終的には以下の様な値になりました。

f:id:kazuhironagai77:20220321020406p:plain

<Layer Snow BのDistance Blendを調整する>

まず分かり易いように、Layer Snow BのTextureをLandscape全体にPaintしました。

その結果です。

f:id:kazuhironagai77:20220321020429p:plain

凄いTexture Repetitionしています。

でも離れると

f:id:kazuhironagai77:20220321020501p:plain

Texture Repetitionは確認出来ないですね。

こっちは色々試したんですが、

f:id:kazuhironagai77:20220321020519p:plain

近い距離でTexture Repetitionを消す事は出来ませんでした。

多分、駄目なTextureなんでしょう。

このLayerは使用しない事にします。

ただ良く分からない部分もあります。

このTextureを使用するとBlendしている境界が全く分からないです。

うん。

でももうあきらめました。

<DirtのLayer用のDistance Blendを実装する>

以下のMaterial FunctionにDistance Blendを追加します。

f:id:kazuhironagai77:20220321020541p:plain

出来ました。

f:id:kazuhironagai77:20220321020557p:plain

f:id:kazuhironagai77:20220321020605p:plain

内容は前とほぼ一緒なのでスキップします。

結果です。

f:id:kazuhironagai77:20220321020625p:plain

奥のTextureを直して行きます。

TextureSizeFar=0.01に変更しました。

f:id:kazuhironagai77:20220321020650p:plain

今度は近くのTextureを直して行きます。

Texture Size Near=0.25の時です。

f:id:kazuhironagai77:20220321020712p:plain

TextureのSizeが大きすぎます。Texture Repetitionがおきないギリギリまで小さくします。

Texture Size Near=0.3の時です。

f:id:kazuhironagai77:20220321020736p:plain

これより大きくするとTexture Repetitionが起きてしまいます。

Start Offsetの値を-5000に変更しました。

するとTexture Repetitionが見えます。

f:id:kazuhironagai77:20220321020822p:plain

まあ、Dirtの部分は少ないのでごまかせるでしょう。

Blendの調整をします。

終結果です。

f:id:kazuhironagai77:20220321020839p:plain

f:id:kazuhironagai77:20220321020851p:plain

Texture Repetitionはどこにもありません。

これだけ調整してコツがわかりました。

Textureは繰り返す回数が多くなると必ずTexture Repetitionが現れます。ので一枚のTextureの数をなるだけ多くする事が大事です。

しかし大きすぎるとPlayerの操作するキャラの周りの地面とかに違和感が生じます。

のでそこだけは必ず正しいサイズでTextureを貼る必要があります。

ここで、Playerの操作するキャラの周りの地面に既にTexture Repetitionが現れていたらそのTextureは交換した方が良いです。

しかし100m先のTextureにTexture Repetitionが現れるのは当然なんです。

だからそれをStart OffsetとBlend Rangeで調節してTexture Repetitionが現れる前に遠距離用のTextureに繋ぐんです。

遠距離用のTextureはかなり大きくしても違和感は生まれません。人間の目は遠くの物の細部には気を取られないんです。のでかなり大きくして絶対にTexture Repetitionが現れない様にします。

これがコツです。

SnowにDirtをpaintして以下の様になりました。

f:id:kazuhironagai77:20220321020911p:plain

取りあえずはOKです。

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

8.Game DesignポケモンHxHの念能力( 戦闘システムの作成)

先週、何をやったのか全くおぼえていなかったのでBlogを見直したら、

f:id:kazuhironagai77:20220321020933p:plain

と書いてありました。

全く覚えていませんでした。

8.1 取りあえずGameで遊ぶ

絶対勝てない様に設定していた2面で勝利してしまいました。何が起きるか分かりませんね。

やっぱりそれなりには面白いです。

が魔法も何が使用出来るのか分かっているとそれも予定調和になってしまって、敵のMonsterと味方のMonsterが揃った瞬間に勝てるのかどうかが分かってしまいます。

まあ、今は対戦相手の魔術師は魔法を使用しませんので、そうなってるだけですが。

面白い事は間違いないです。

8.2 Stage 10 まで作成する

Stage 10まで作成します。

細かい点は後から変更ます。

<Stage 1

敵:妖精族3体

<Stage 2~4

敵:妖精族2体、亡霊族1体

<Stage5~7

敵:妖精族2体、ゾンビ族1体

<Stage8~9

敵:妖精族1体、ゾンビ族2体

<Stage10

敵:妖精族1体、亡霊族2体

とします。

これで作成します。

凄い簡単に組めちゃいました。

f:id:kazuhironagai77:20220321021029p:plain

テストします。

Stage 2~4から先に進めません。ジャンケンで負けると絶対に勝てなくなります。

Stage 2~4から先に進むにはもっと強力な魔法が必要です。

8.3 魔法を考える

以下の魔法を考えました。

  • 味方の中央と右翼のMonsterを交換するSwitch(右→中央)の魔法。
  • 敵のMonsterを眠らせて攻撃出来ない様にする。

うーん。

後は思いつかない。

後、敵のMonsterの攻撃を止めるには、別に眠らせるだけじゃなくて魔法の壁を作っても良いですよね。何でも良いわけです。

後攻の時はどうしましょうか?

次のターンも眠ったままなのかそれとも、先攻の時した使用出来ない魔法にするのか?

眠りの魔法がまだ考えないといけない事が沢山あるので、今週はSwitch(右→中央)の魔法を実装する事にします。

8.4 Switch(右→中央)の魔法を実装する

こっちも思っていたよりは難しいそうなので来週実装する事にします。

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

9.Blenderの勉強

9.1 Selection Methodの復習

<毎日やった事>

毎日、以下のやり方を復習していました。

f:id:kazuhironagai77:20220321021118p:plain

Blenderを起動するところから測っても全部やるのに3分かかりません。

しかしもうこの5つのやり方は完璧に覚えました。

休日の日だけ頑張っても前の週に何を勉強したのかを思い出すだけで終わってしまいます。つまり全く勉強の成果が出ない状態になってしまっている訳です。

しかしたった3分の復習でも毎日やると忘れないです。

これが勉強の効果を出すコツなんです。

Totalの勉強量で言えば3分毎日繰り返しても21分です。Blenderが起動するまでネットのNewsを読んだりしているわけで実際の勉強量はもっと短いです。それでこの効果です。

もし私が、先週、Blenderの勉強の成果が出てないとダメだしせずに同じ勉強方法を続けていたら、今週のBlenderの勉強も無駄になったはずです。

やっぱり効果や成果は厳しく測る必要があるんです。更に言えば何度もこまめに測る必要もあります。

<先週端折ったSelection Methodについて>

先週、以下に示したSelection Methodは要らないと思い

f:id:kazuhironagai77:20220321021142p:plain

勉強内容から端折ってしまったんですが

Niagaraの勉強で使用したCoinを作成している時に、Loop Selectionが出来たらいいのに。と思う場面が実際にありました。

以下に示したCoinの側面を一気に選択したかったんです。

f:id:kazuhironagai77:20220321021201p:plain

のでこの3つのやり方もやっぱり覚える事にしました。

<Loop Selection

f:id:kazuhironagai77:20220321021223p:plain

Coinで試してみます。

f:id:kazuhironagai77:20220321021241p:plain

あれ?

Loopが横向きに行ってほしいのに縦になっています。

<Ring Selection

f:id:kazuhironagai77:20220321021304p:plain

これはFaceの選択じゃなくてEdgeでした。

f:id:kazuhironagai77:20220321021321p:plain

しかも向きが縦方向でした。

<EdgeのLoop

f:id:kazuhironagai77:20220321021343p:plain

結果です。

f:id:kazuhironagai77:20220321021406p:plain

これは望んだ横方向のEdgeを選択しています。

でもFaceの横方向の選択方法じゃなかったですね。

うーん。

<FaceのLoop

Alt を押しながらFaceを選択

<EdgeのLoop

Alt を押しながらEdgeを選択

<EdgeのRing

Alt + Ctrlを押しながらEdgeを選択

でも覚えておきます。

9.2 先週までの復習

2022-02-14Blogの復習

全部やりました。

一応、この週のBlogに載っている内容は全部覚えています。

2022-02-21のBlogの復習>

流石にこの週の勉強した内容も覚えていました。

2022-02-28のBlogの復習>

これを勉強しようとしたところで時間が無くなってしまいました。今週はちょっと別な用事が入ってしまいました。これ以上Blenderの勉強に時間を取る事が出来ません。

うーん。仕方ないです。

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

10.まとめと感想

今週は、もう勉強を止めようかと思ったWorld Machineが突然、絶好調になりました。

こういう事もあるんですね。

それぞれの分野もそれなりには進捗しています。

Blenderの勉強はいつも最後にまわしているので時間が無くなると割を食ってしまいます。

MaterialでBen先生がToon Shadingの基本についての動画を上げていました。これは緊急で来週勉強する事にします。

来週、突然急用が出来てしまったので来週の勉強はお休みします。

11.参照(Reference

[1] CGHOW. (2022, January 20). Coin FX in UE4 Niagara Tutorial | Download Files [Video]. YouTube. https://www.youtube.com/watch?v=wDgz6w6Uv9g

[2] Cloward, B. [Ben Cloward]. (2022, January 20). Triplanar Projection Normal Maps - Shader Graph Basics - Episode 30 [Video]. YouTube. https://www.youtube.com/watch?v=VUoI_IESK7U&list=PL78XDi0TS4lEBWa2Hpzg2SRC5njCcKydl&index=30

[3] GDi4K. (2022, March 4). Creating Open World Landscapes with New UE5 Preview & World Partition [Video]. YouTube. https://www.youtube.com/watch?v=FwGmE5f5SDA

[4] World Machine Software. (2019, February 14). 5. Layout Generator. World Machine Software User’s Guide. Retrieved March 20, 2022, from https://help.world-machine.com/topic/layout-generator/

[5] Unreal Sensei. (2020a, August 7). How to HIDE Texture REPETITION in Unreal Engine - UE4 Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=yCRzOdo4b68