UE4の勉強記録

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

UE5の勉強 -LandscapeのみのGameを作成する-

1.今週の予定

<LandscapeのみのGameを作成する>

Virtual TextureのLandscapeのMaterialのサイズのBugを直す。これだけです。

Niagaraの勉強>

Power Spell in UE5.1 Niagara Tutorial | Download Files[1]を実装します。

<Materialの勉強>

Ice Shader Part 2 - Advanced Materials - Episode 6 [2]を実装します。

<戦闘システムの続きを作成する>

Magic and Spell Sound PROの音を外して別の音源から効果音を追加します。

<Gaeaの勉強>

先週は内容をあまり上手くまとめられなかったのでそこを直します。

その後で、Data GroupにあるそれぞれのNodeの特性を直します。

<Houdiniの勉強>

FOUNDATIONS | OVERVIEW [3]の続きを勉強します。

<Volumetric Cloudの勉強>

YouTube用の動画を撮影してみます。

DirectXの勉強>

 C++ DirectX 12 Game Engine - [S01E03] - Creating A Game Engine [4]のAn Application Interfaceを勉強します。

2.LandscapeのみのGameを作成する

今週は以下に示したVirtual TextureのサイズがLandscapeとRockで100倍位違うBugを直します。

2.1 色々試した事をまとめる

先週、一寸時間が空いている時に色々試してみました。

結論から言うと何をしてもRockの上のTextureのサイズは変化しなかったんですが、やった内容の記録をしておきます。

<Runtime Virtual Textureの設定を変える>

Runtime Virtual Textureの

以下の設定が投影されるTextureのサイズと関係があるのかと思って弄ってみました。

Textureの解像度が上昇するだけでTextureのサイズは変わらなかったです。

Size of the virtual texture in tilesの値が9の時、

Size of the virtual texture in tilesの値が10の時、

Textureの解像度が上がっています。

<LandscapeのMaterialのUVの指定をLandscapeCoordsノードで行う>

MacroのUVはTexCoord[0]ノードで行っていましたが、それぞれのLayerのTextureのUVは元々LandscapeCoordsノードで指定していました。

逆にTexCoord[0]ノードに変更してみます。

結果です。

何の変化も無かったです。

<Material Instanceの値が影響していないのではないか?>

Virtual Textureの値はMaterialから送られているのでMaterial Instanceで値を変化してもその影響をVirtual Textureは受けないのではないのかと思いました。

Material内のParameterのDefault値を変更してみました。

結果です。

何の変化も無かったです。

あれ。

今、思いついたんですが、TexSize Farの方の値は弄っていませんでした。

こっちが効いてる可能性があります。

<TexSize Farの値を変更する>

LandscapeのMaterial InstanceのTexSize Farの値を変更してみました。

結果です。

直った。

Sizeが完全に一致しました。

あー。成程

原因が判明しました。

原因はこれです。Distance_Blendノードです。

これのStart Offsetの位置が通常のLandscapeとVirtual Textureでは同じになっていないんです。

2.2 Distance_BlendとVirtual Texture

この結果を分かり易く説明するために以下のMaterialを作成しました。

Distance_Blendのみで作成したMaterialです。

これをLandscapeに使用します。

黒い部分には近距離用のSizeのTextureを使用し、白い部分には遠距離用のSizeのTextureを使用します。

ここにVirtual Textureを使用します。

Runtime Virtual Texture Outputノードを追加してVirtual Textureではどのような結果になるのかを検証します。

Virtual TextureによってLandscapeのMaterialの情報をパスされたRockを配置します。

Rockの白い部分はLandscapeのMaterialがVirtual TextureによってPassされた部分です。

Cameraからの距離が正しく計算されていれば、岩の周りのLandscapeの色と同じように岩の色は黒くなるはずです。

しかし実際は白くなっています。

これが、先週のBugの原因です。

いや。

原因が判明しました。

もうこのBugは直せないのかと半分諦めていましたが、原因は解明しましたね。

では対策を考えます。

2.3 Distance_BlendとVirtual Textureを同時に使用出来ない問題に対する対策

調べたら対策らしい事を説明しているTutorialが出て来ました。

Adding virtual texture blending and distance based scaling with RVT | UE5 Landscape tutorial series [5]です。

C:\Insert Name Here氏が作成したTutorialでこの人のTutorialは初めて見ました。

Landscapeの作成がMainのChannelですね。

これは勉強になりそうなChannelを見つけました。

後、南アフリカの人ですね。初めて聞くAccentです。

一時間もある長いTutorialなので大事な所だけ抜き出してまとめます。

21分ごろから実装しています。

Runtime Virtual Texture Replaceを使用します。

DefaultにはDistance_Blendノードを繋げ

Virtual Texture Outputには以下の実装を使用しています。

そしてこのRuntime Virtual Texture Replaceの結果を今までDistance_Blendノードの結果を繋いでいた箇所に繋ぎます。

うーん。

Tutorialは全部見ていませんが、多分これで出来るでしょう。

やってみます。

最初のVirtual Texture Output Levelノードですが

View Propertyノードを選択して

そのNodeのParameterからVirtual Texture Output Levelを選択する事で作成します。

出来ました。

テストしてみます。

Start Offset VTの値を弄ったらRockの白い部分が黒くなりました。

使い方が分かりました。

LandscapeはBlend RangeとStart Offsetを使って黒と白の割合を調整します。

Virtual Textureを使用しているStatic MeshはBlend Range VTとStart Offset VTを使用して黒と白の割合を調整します。

に実際に実装してみます。

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

他のLayerも同じように実装しました。

テストします。

微調整をした結果ですが、RockのVirtual TextureとLandscapeのMaterialの模様が完璧に一致しています。

Rockの結果です。

これくらいの遠くから見る分にはほぼ完ぺきになりました。

正し近づくと問題は結構あります。

まず以下に示したVirtual Textureの伸びている部分が結構あります。

次に地面と岩の境目が結構はっきり見えます。

こういう部分を上手く隠すのがVirtual Textureなので一寸期待外れな結果ではあります。

2.4 Foliageを試してみる

こんな感じです。

上から見た状態です。

うーん。

Distance Blendの切り替わるタイミングがVirtual TextureとLandscapeで全然違っているように見えます。

M_DistanceBlend_VirtualTextureで確認します。

Landscapeと岩のVirtual Textureの色が同じようになるようにParameterを調整しました。

結果です。

何と、

岩のVirtual Textureの色が最初は黒で時間が経つと白くなります。

後は以下の

PowerとMultiplyの値を変更させるべきでしょうか?

試しにPowerの値を1.5にしてみました。

この辺は色々弄りましたが、あんまり綺麗に変化する事はないです。

この状態で元のMaterialに戻してみます。

こんな感じですね。

やっぱりTextureが伸びた感じになっている箇所は結構あります。

Foliageの設定を色々試したら以下のような岩の配置が出来ました。

岩が無い状態です。

Height Mapによる不自然な凸凹が観察されます。

この不自然な凸凹がFoliageの岩によって完全に隠れました。

岩の部分はNaniteが完全に効いています。

この岩の配置をもう少し工夫したらLandscapeの不自然な凸凹は完全に隠せます。

Distance Blendの近距離の範囲が少なすぎる気がします。

今週はこれくらいで止めておきます。

最後に今週やった内容をまとめます。

2.5 今週のLandscapeのまとめ

今週は以下に示したVirtual TextureのMaterialのサイズがLandscapeと比較して100倍位大きくなってしまうBugを直しました。

このBugの原因はLandscapeのMaterialにDistance Blendノードを使用しているから起こります。

公式のDocumentであるRuntime Virtual Texturing [6]でも以下の様に述べられていますが

Runtime Virtual TextureはCameraからの距離に影響受けません。

ので以下のような実装に変更する必要があります。

この結果、以下に示した様にRuntime Virtual Textureの部分のMaterialのサイズがLandscapeのMaterialのサイズと同じようにする事が出来るようになりました。

この方法を使用してFoliageで岩を派生すると

以下に示した様な不自然な凹凸のあるLandscapeを

以下の様に自然な岩で隠す事が出来ます。

これで今までの大きな問題であった以下の2つが解決した事になります。

  • Landscapeの不自然な凹凸をどうやって直すか?
  • Virtual Textureのサイズがオカシイ点

正し、以下の新しい問題も発生しています。

<新たな問題>

<<Virtual Textureの歪み>>

以下に示した様な歪みが存在します。

この辺はParameterを調整すれば消えるのか、その辺も分かりません。

Virtual TextureのParameterをじっくり勉強する必要があります。

<<Blend Distanceの近距離の範囲>>

Blend Distanceの近距離の範囲が思いのほか狭いです。

Cameraから2~3メートル位しかないです。

更に、Virtual Textureの近距離は、なんか時間が経つと遠距離に代わったりします。

近距離の範囲をもっと拡大する必要があります。

<<Virtual TextureのNormal Vector>>

Virtual TextureのNormalは実装していません。無くても問題ないかと思っていましたが、これももう一回考える必要がありそうです。

<<Foliageに使用するMeshの種類を増やす>>

今はRockが一種類しか使用していません。もう少し種類を増やした方が良いです。

<<CliffのLayerのMaterial>>

今回、岩を並べて判明したのが、岩は白っぽいLayerにあいます。

今はCliff Layerには茶色を使用していますが、白っぽい色に変更した方が良いかもしれません。

<<Maskに灰色があるとLayerが混合します>>

これが全部のLayerにFoliageを配置する時に悪影響が出そうです。

今、具体的にどこが悪いのかは分かりませんが、これも今から警戒しておいた方が良い気がします。

今週のLandscapeの作成はここまでとします。

2.6 おまけ

Distance BlendingもRuntime Virtual TextureもLandscapeの作成にはとても有益な手法です。

この2つが同時に使用出来ない事を知った時、ショックと何故か「やっぱりな」と思う気持ちが同時に湧きました。

そしてこの事について述べているTutorialやSiteがほとんどなかったのも驚きとともに「やっぱりな」と思う気持ちが湧きました。

普通にLandscapeについて勉強していたらDistance BlendingとRuntime Virtual Textureを同時に使用してみるはずです。

にもかかわらずDistance Blending とVirtual Textureを同時に使用するとVirtual TextureのTextureのサイズがとんでもなく大きくなる事について述べている人がいないのは何故なんでしょう。

Landscapeの作成はLevel DesignerやEnvironmental Designerの仕事と思われますが、彼らはこの辺の設定はどうしているんでしょうか?

とても不思議です。

これはMaterialから自作してLandscapeを作成している人ってほとんどいないって事だと思います。

みんな調子の良い事を言っていますが、MaterialからLandscapeを作成出来る人は一万人に一人位しかいないんでしょうね。

今回、奇しくもC:\Insert Name Here氏のTutorialに出会ってDistance BlendingとRuntime Virtual Textureを同時に使用する方法を学習する事が出来ました。

まだ、色々な問題があるので完全に身に付けたとは言えませんが、それでも一通りのやり方は理解出来ました。

これって武術で言ったら秘伝を学んだのと同じです。

Aと言う技とBと言う身体操作があって、同時に使用出来たら無敵だと思ってそれぞれを身に付けたら、後でその2つを同時に使用するのは無理だと判明した。

それで諦めかけていたら、AとBを同時に使用する方法がある事が分かって、それを身に付けた。

って感じです。

そう!

NARUTOでSage ModeとNine Tail Modeが同時に使用出来るようになったのと同じです。

そういう意味では今回のDistance BlendingもRuntime Virtual Textureを同時に使用する方法を学んだことはかなりの収穫です。

3.Niagaraの勉強

今週は、Power Spell in UE5.1 Niagara Tutorial | Download Files[1]を実装します。

3.1 Power Spell in UE5.1 Niagara Tutorial | Download Files[1]を実装する

やって行きます。

<準備>

Power Spell用のLevelを作成します。

Exponential Height Fogを追加します。

Fog Inscattering Colorの値を

黒から灰色に変化します。

Level Sequenceを追加します。

名前はLS_PowerSpellにしました。

これを開くと以下のような画面がContent Browserと同じ場所に現れました。

使用するAnimation Sequenceを探します。

いつも使用しているModularRPGHeroesPolyart

から以下のAnimation Sequenceを選びました。

追加しました。

Tutorialが言っているようにAttack02_MagicWand AnimをAnimationに追加しました。

以下に示した様な黒い影が動くようになりました。

こんな感じだったのか今一自信がないのでTutorialを見直しました。

全く同じです。

真っ黒なAnimationで再現されています。

Timelineも同じです。

Animationの最後に

Set End Timeを指定します。

このBoxは以下の矢印にCursorを合わせた状態で右Clickすると表示されます。

<Materialの作成>

Materialを作成します。

使用したいキャラの

Materialを見ると

以下のようなTextureを使用しているのが分かりました。

当然、Normal Mapは無いです。

このMaterialと全く同じ作りで作成します。

しました。

実装部です。

またLevel Sequenceに戻ります。

Skeletal Mesh Component0を追加します。

今度はSkeletal Mesh Component 0に

Material Element0を追加します。

この後、先週のBlogの通りにElement 0に先程作成したM_PowerSpellを追加しましたが、

Level SequenceのAnimationは真っ黒のままです。

Tutorialを見直します。

同じやり方をしています。

うーん。

あ。

分かりました。

Level上に光源が無いんです。

MaterialにEmissive Colorを追加する事で

光源の影響が無視出来るようにします。

結果です。

こんな感じになるの。

これはこれで雰囲気ありますね。

偶然ですが、背景の灰色と全く同じ配色の箇所があるので背景の灰色を少しだけ暗くします。

うーん。

良い感じです。

今度はMaterialにParameterを追加します。

今度はMaterial Element 0のParameterに

先程作成したParameterが表示されるようになりました。

Timelineにある以下のBarの

赤丸で囲った部分を引っ張って左側に移動しTimelineの表示を以下の様に変化しました。

このTimelineの操作方法はあんまり知らない部分です。

Material Element 0のParameterを追加しました。

今度はこのParameterを使用してCharacterの色が白くなったり黒くなったりする所を設定します。

以下の様にTimelineを入れて

以下の様にFrame毎に色が変化するようにしました。

<Cameraの調整>

以下に示したCameraのIconを押します。

以下の様にCameraに関して要素がTimelineに表示されるようになりました。

Tutorialと完全に同じではないですね。

Camera CutsとCine Camera Actorの間にAnime SequenceであるAttack 02 Magic Wand Animが表示されています。

Camera Cutsは何か知らんけど途中から表示されるようになりました。

Camera Componentを選択して

Sensorの値を逆にします。

Previewの画面の表示が縦長になりました。

先週のBlogで

Exopenって書いていましたが、これ

Exponential Height Fogの事でした。

Exponential Height FogをTimelineに追加しました。

更にHeight Fog Component0とFog Max Opacityを追加して以下の様になりました。

Fog Max Opacityの値を以下の様に設定しました。

<腕を赤く光らせる>

Skeletal MeshからStatic Meshを作成します。

Static Meshを開きTextureのどこが前腕と手を担当しているのかを調べます。

こんなのどこが手を担当しているのか分かりません。

大体合っていたらOKにします。

次の作業を行うにはこのUVをTextureとしてExportする必要があります。

調べたんですがやり方が分かりません。

その前に以下に示した様にTutorialでは新しく作成したCameraから写した映像が映っています。

私のは以下に示した様に新しく設置したCameraの映像は右下に小さく写っているだけです。

理由が分かりました。

以下に示した様にProspectiveにあるCine Camera Actor

にCheckを入れます。

すると以下の表示が現れ

新しいCameraから撮影した映像が表示されるようになります。

それよりもNormal TextureのExport方法です。

New Bingに質問してみます。

出来ないって言っていますね。

いや出来たはず。

過去のBlogを調べてみます。

うーん。

見つからなかったです。

私が出来たと思ったのはLandscapeをHeight MapとしてExportする方法でした。

分からん。

今回はこの部分は諦めます。

ただ全部あきらめるのは悔しいので、以下に示した適当に作ったTextureでこの部分の実装を試してみます。

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

先程作成したTextureがキャラのどの辺をCoverしているのか確認します。

お、惜しい。

確かに手袋の辺りがすこしだけ白くなっています。

Textureの白い部分を少しだけ増やしてみました。

結果です。

Textureを更に改良して以下の様にしました。

これならそれなりに手も光るでしょう。

これでやってみます。

ParameterであるTempの値を6000にセットしました。

手の先が光っています。

Level Sequenceに戻ってTempの値を以下の様にセットしました。

まず最初のKeyです。

手の温度は0です。

次のKey Frameです。

手の温度は7,500度です。

三番目のKey Frameです。

手の温度は10,000度です。

最後のKey Frameです。

手の温度は0です。

完全に実装する事は出来ませんでしたが、これぐらいでOKにします。

<一瞬だけ1.3倍にする>

Characterのサイズを一瞬だけ1.3倍にします。

しました。

<Post Process Volumeの追加>

Post Process Volumeを追加します。

Infinite ExtendにCheckを入れます。

更にChromatic Aberrationの値を5にします。

結果です。

5ぐらいだとあんまりブレているように見えません。

TimelineにPost Process Volumeを追加しました。

Intensityは以下の箇所にありました。

以下に示した3つの箇所にKey Frameを追加しました。

以下にKey Frameの結果を示します。

Niagaraを追加する>

まずNiagaraに使用するMaterialに使用するTextureを作成します。

出来ました。

これを使用してMaterialを作成します。

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

更に以下にParticle Colorノードを追加します。

そしてDynamic Parameterを追加します。

これでMaterialは完成みたいです。

次にNiagara Systemを作成します。

いつもの様にFountainを追加しています。

Sprite Render SectionにあるMaterialに

先程作成したMaterialをセットします。

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

Emitter Update SectionにあるSpawn Rate Moduleの

Spawn Rateの値を5にします。

Particle Spawn SectionにあるInitialize Particle Moduleの

Uniform Sprite Size MinimumとUniform Sprite Size Maxの値を以下の様にします。

Particle Update SectionにDynamic Material Parameters Moduleを追加して

Layerに以下の実装をしました。

Emitter Update SectionにあるSpawn Rate Moduleを消してSpawn Burst Instantaneous Moduleを追加します。

Spawn Countの値も10にします。

Emitter Update SectionにあるEmitter State Moduleの

Loop BehaviorをOnceにします。

この設定だけあんまりやった事が無いです。

Particle Spawn SectionにあるInitialize Particle Moduleの

Color Modeの設定を以下のようにします。

ここまでは本当の惰性で書いていました。

これからが問題です。

Render SectionにあるSprite Renderer Moduleの

AlignmentとFacing Modeの設定を

変え、

Particle Spawn SectionにAlign Sprite to Mesh Orientation Moduleを追加します。

Errorが表示されているので

Fixを押して直し、設定を以下の様に変更しました。

うーん。

結果です。

Alignmentは当分考えたくないです。

ここはSkipして先に進みます。

Particle Update SectionにScale Sprite Sizeを追加します。

Particle Update Sectionに

Scale Sprite Size Moduleを追加します。

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

Particle Spawn Sectionにある

Initialize Particle Moduleの

Lifetimeの値を小さくします。

最後にPropertiesの

Local SpaceにCheckを入れます。

これでNiagara Systemは完成です。

やっぱりAlignmentの所はよく分からんです。

後はまあ大体、簡単でした。

次はこのNSをSequenceに追加します。

こんな感じで追加しました。

最初のKey Frameです。

これはここから前にNSが発生しないようにSpawnをDisableしています。

EffectはBakeされないのでFrameで止める事が出来ません。

ので大体の感覚でScreenshotを取りました。

まあ、いい感じです。

Render SectionにLight Renderer Moduleを追加します。

Color Addの値を以下の様にします。

結果です。

Screenshotが上手く取れませんでした。

<集中線を追加する>

以下の集中線を作成しました。

Medi Bangは流石に漫画を描くために開発されただけあって集中線の作成はお手の物です。

一瞬で上記の集中線が出来ました。

そういえば集中線って英語でなんて言うんでしょう。

確認します。

CGHOW氏は単にFrame Flashと呼んでいました。と言うか呼んでいません。これとだけ言っています。

調べたらConcentrated Lineでした。

そのままです。

このTextureを使用して以下のMaterialを作成しました。

Niagaraの設定はよく分からないので

以下のような集中線が出るようなEffectを作成しました。

これをLevel Sequenceに追加します。

結果です。

良い感じです。

最後に撮影してここに載せようと思ったんですが、よく考えたらGifでAnimationを撮影するAppを入れていませんでした。

ネットで検索したら

が出てきたのでこれをInstallして撮影します。

こんな感じです。

Screen to GifがどこにInstallされたのか分かりません。

そんなSoftあるんかいな。

分からないけどまあ、大丈夫でしょう。

今はこのAppに関係している時間が無いです。

4.Materialの勉強

今週はBen Cloward先生のIce Shader Part 2 - Advanced Materials - Episode 6 [2]を実装します。

4.1 Ice Shader Part 2 - Advanced Materials - Episode 6 [2]を実装する

まずIceのTextureを手に入れます。

先週、

ここからIceのTextureをDownloadしようと思っていましたが、実際にDownloadしようとしたらBrowserに入っているVirus対策SoftがBlockしました。

のでここからDownloadするのは止めてBen Cloward先生のIceのTextureをScreenshotをTextureにして以下のようにしました。

これを使用します。

前のTutorialで作成した氷のMaterialのBase ColorにこのTextureをBase Colorに繋げました。

結果です。

なんかこっちの方が氷っぽいです。

次に以下の実装を追加します。

結果です。

うーん。

何か変です。

IceのRockを見たら

こんな結果になってしまいました。

間違いが分かりました。

Transform Vectorノードの設定はWorld SpaceからTangent Spaceが正しかったです。

結果です。

今度は先週のBlogにまとめたようにCameraを動かすと氷のTextureがObjectの内側にあるように見えます。

ただしこの実装の理屈は全く分かりません。

後、Rockに適応した時はやっぱり変です。

Tutorialの結果を見ると歪みが全くないんです。

ただ、Tutorialも岩の形状を見せてはいません。

ひょっとするとこの状態の岩は同じように変になっているかもしれません。

ここは先に進んで確認します。

次の実装を追加しました。

これTextureのサイズで割っているので本当は512にする必要があります。

あれ。

前よりはるかにマシになっています。

色々弄ったら以下の様になりました。

これはかなり氷っぽいです。

弄った値は以下の2点です。

特に理由があるわけでないです。

ここに先週考えていた、Lerpで透明な氷の実装と今週の実装を混合する事を試してみます。

LerpのAlphaには取りあえずPerline Noiseを追加しました。

結果です。

Rockです。

こっちの方が遥かに氷に見えます。

更に以下のParameterを追加して微調整してみました。

結果です。

どう考えてもこっちの方が氷っぽいです。

更に色も追加してみます。

結果です。

岩です。

凄い氷っぽいです。

更に微調整してみました。

ドっから見ても氷でしょう。

青みを消してみました。

最後にSpecularの値を上げてみました。

ここで時間切れです。

残りは来週やる事にします。

5.戦闘システムの続きを作成する

5.1 先週のメールについて

先週、Epic Games社から以下のMailが送られて来ました。

つまり、Magic & Spell Sounds PROから使用している音源は全て外して別の音を追加する必要があります。

5.2 音源を探す

魔王魂[6]

まず魔王魂[6]から見る事にします。

久しぶりに訪れたらSiteの見た目が全然違っていてびっくりしました。

効果音に魔法がありました。

ここにある効果音で全部、対応出来そうです。

特に雷の効果音が良かったです。

かなり質が高いです。

良かった。

Magic & Spell Sounds PROの音源の代わりが見つからないと焦っていました。

利用規約を確認します。

大変分かり易くまとまっていました。

著作権を明記する必要があります。後は常識の範囲で運用すれば問題ない事ばかりです。

Mixkit [7]

もう時間がないので、魔王魂氏の効果音をそのまま使用させてもらおうと思ったら、このサイトが検索に引っかかって来ました。

試しに雷(Thundering)の効果音を調べてみました。

赤い線で囲った部分の効果音を聞いたら、音源に会社名が入っていてしかも右上に7日間だけFreeとか書いています。

何だこれ?

全然、Freeじゃないじゃないか。と思ったら、この赤い線で囲った部分は広告でした。

その下の音は普通にFreeで利用出来るみたいです。

効果音の長さがそれぞれ違います。長いのになると20秒位のもあります。

これ音源の加工はしても良いのでしょうか?

Licenseを確認します。

このサイトの利用規約も簡潔にまとまっています。

Video Gameへの利用も商業作品への利用もOKと書かれています。

音源の加工もOKと書かれています。

更に詳しい解説がUser Termsに載っているそうです。

そっちも見てみます。

詳しい解説と言ってもさらに9個増えただけです。

全部確認します。

Game制作に関係してそうなの部分だけ抜き出します。

まずアダルト関係の利用は駄目だそうです。

まあ、これは納得です。

ギャンブル(Gambling)もダメだそうです。

これはお金を実際に掛けるGameに使用しては駄目なのか、Dragon QuestなどのJRPGによくあるGame内にカジノ店がある場合も駄目なのかは不明です。

日本人の感覚だと実際にお金を掛けなければギャンブル(Gambling)にならないと解釈しますが、アメリカの基準だとGame内にカジノ店がある場合も駄目な場合が多いです。

以下に示したUser Termsの7にAustralia(オーストラリア)のVictoria州の法律に基づいて実施するとあります。

Australia(オーストラリア)か。

Australia(オーストラリア)は英語圏の中でも法律の運用が厳しい事で有名です。

更に、日本人に対しては人種差別と巧妙に混ざって信じられない位、厳しい対応をしてくる時があると聞いています。

数年前にAustralia(オーストラリア)の入管で日本人が児童ポルノの携帯容疑で逮捕されました。

が、実際はアダルト関連のAppを携帯に入れていただけだったそうです。しかしそれが向こうでは普通みたいです。

これはGame内にカジノ店がある場合も駄目と考えるべきですね。

exploitation of childrenですが、これは初めて聞く概念でした。

New Bingに聞いてみましょう。

あれ、New BingのSiteが全部日本語になっています。

exploitation of childrenについて質問したら、その話題には答えられません。と出て来ました。

え、何で?

日本語版だから。

英語版に入ろうとしたら英語版には入れません。

あ、これはLocalizationされている可能性があります。

中国では天安門事件についてNetで調べる事は出来ませんが、同じ事を言語毎にやってる訳です。

何でexploitation of childrenについて回答出来ないのか質問したら今度はしっかりした回答がありました。

うーん。

これはかなり大きなTopicですね。

まずChildren がMinor Childと定義されています。

これは5歳児とかのいわゆるChildrenだけでなく成人していない、つまり18歳以下の未成年者全てを指していると思われます。

一応、New Bingでも聞いてみます。

Minor ChildはUSならば18歳以下です。と答えている所からここでは未成年全般を指していますね。

Bingの回答がどれだけ正しいのかは別問題ですが私の解釈とも一致しますし、Minor Childは未成年全般を指していると解釈して先に進みます。

大体理解しました。

exploitation of childrenは未成年に不利益となるような行為すべてが含まれます。

具体的には以下の事が当てはまります。

  1. 子供を不法に働かす事。
  2. Matt Gaetz氏が調査されていたような未成年との淫行。
  3. Epic Games社が裁判で負けたような、未成年の情報をその親の許可なしで収集する行為。

まあ、常識で考えて駄目な事ばかりです。

1と2に関しては、普通の人間なら絶対やらない事なので問題は無いでしょう。

3に関しては注意が必要で、未成年だってGame内でCheatしますし、Cheatした人間にはGameへの参加を禁止する必要があります。のでCase by Caseだと思います。しかしそのための情報収集もexploitation of childrenに当たる可能性があります。

ここは裁判所の判断次第かもしれません。

日本人が気を付けないといけないのは、日本でよく聞く「未成年だけど絵だから問題ない。」は主張であると言う事です。

その主張が裁判で通るかどうかはその時次第だと言う事です。

特に英語圏でその主張が通るかどうかは熟慮する必要があります。

exploitation of childrenに関してはこれぐらい知っておけば問題ないでしょう。

hate speechに関しては第二次世界大戦の旧日本軍の信望者でもない限り、日本人は被害者に当たる場合がほとんどなので、常識の範囲で行動していれば問題ないはずです。

○○人は泥棒。みたいな意見は日本でも許されない発言である事を考えれば日本で許されない事は英語圏でもやっぱり駄目だという事です。

defamatory contentですが、誹謗中傷と言う意味です。

misleading or deceptive conductは相手を勘違いさせて何かをさせる行為の事です。

この辺は日本の常識で対応していれば問題ないでしょう。

残りの規約は、まあ常識的な事しか述べていません。

後、Mixkit [7]から効果音は使用しました。と記入しろとは書いていませんね。

Australia(オーストラリア)の法律は知りませんが、アメリカでは基本的なRuleとして書いてない言ってない事は全部やってOKです。

多分、「Mixkit [7]から効果音は使用しました。」と記入する必要は無いでしょう。

文句が来たら、その時点で真摯に対応すれば全く問題ないです。

かなり厳しめに解釈しましたが、使用するのにあたって全く問題ないですね。

これも候補に入れておきます。

5.3 効果音をDownloadしGameに追加する

まあMixkit [7]に関しては色々調べましたが、音源を加工する必要があり、それは音楽が苦手な私としてはなるだけやりたくない事なので、ここは全部、魔王魂[6]さんの効果音を使用させてもらう事にします。

うーん。

どうやってやろう。

まずUE5のProjectを起動しました。

こいつを消すしかないですね。

以下のBPでMagic_Spell_Sounds_PROを使用しているみたいです。

正しここにWidgetは表示されていない可能性があります。

とは言うものの、まずこれらのBPに使用されている効果音から準備します。

以下の効果音が使用されていました。

以下のようなEffectでした。

マジカル22の音が合いそうです。

うーん。

Fireballが発射した時にドフュンと鳴るのが良い感じです。

音自体は少し長いかもしれません。

でも取りあえずはこれで良いです。

次はAnim_polearm_04_attack_A_me_Iceの効果音を変えます。

次は氷のEffectです。

当然、効果音は氷の効果音から探します。

氷01と氷05がこのEffectにあってそうです。

両方試してみます。

氷05がかなり合っています。

これで行きます。

Anim_polearm_04_attack_A_me_Lightingです。

こんなEffectでした。

雷01と雷03が合いそうです。

試してみます。

うーん。

どっちも甲乙つけがたい。

かなり良い感じに仕上がります。

取りあえず雷01をセットしておきます。

Anim_polearm_05_take_damage_Doubleです。

こんなEffectです。

マジカル16

マジカル15

マジカル10

マジカル2

水13

辺りが使用出来そうです。

以外と水の効果音が合いそうな気がします。

全部試してみます。

マジカル10が最もよかったです。

他の効果音は長すぎでした。

Anim_polearm_05_take_damage_Healingです。

こんな効果です。

合う効果音を探してみます。

マジカル27です。

マジカル21です。

マジカル11です。

マジカル01です。

全部テストしました。

更に追加でマジカル15とマジカル16も行いました。

良かったのがマジカル01、マジカル15、マジカル21です。

この3つの中から選びます。

マジカル21にしました。

マジカル01は他の2つと比較すると一寸短いです。それが単調さに繋がる気がしました。

マジカル15は音が最後物切れしています。それが余韻が無い感じを少しだけ与える気がしました。

Anim_polearm_05_take_damage_meです。

ダメージを食らった時のAnimationです。

効果音を選びます。

戦闘効果音から選びます。

戦闘12

戦闘3

戦闘1

この3つが良い感じがしました。

全部、効果音として追加して確認しました。

戦闘12が一番良い感じでした。

Anim_polearm_05_take_damage_Switchです。

こういうEffectです。

合う効果音を探します。

戦闘02

これが凄く合いそうです。

これを試してみます。

うーん。

短すぎました。

このEffect結構長くてもう少し長い効果音が必要です。

先程Downloadした

水13

が長さがぴったりでした。

これにしました。

Attack02_MagicWandAnim_meです。

以下のEffectです。

戦闘02を使用したら合っています。

これにします。

Skeleton_Mage_Charge_Attack_meです。

効果音です。

これに合う効果音を探します。

闇04

前からこの効果音には闇04が合うと思っていました。のでこれをまず試してみます。

うーん。悪くはないですが、他のも試してみます。

マジカル16の方が合いますね。

マジカル16はまだどこにも使用していないのでここで使用する事にします。

最後はLevel BPにある以下のNodeです。

これ、何の効果音か覚えていません。

Monsterが召喚される時の効果音でした。

ボイス・鳴き声にあるモンスター03が良いですね。

今度はFake Monsterを召喚する時です。

同じ音で良いです。

これでMagic & Spell Sounds PROの音源は全部外したはずです。

テストしてみます。

大体は良かったですが、

  • Monsterの召喚
  • 炎の攻撃
  • 位置交換の魔法

は合ってないです。

Monsterの召喚はもっと燃える感じが良いです。

戦闘02が合っている気がします。

と思ったら戦闘02はす既に使用済みでした。

レトロ効果音にあるレトロ28が短くて良いかもしれません。

これを試してみます。

Fake Monsterの召喚では

レトロ26にします。

これも短くてEffectに合いそうです。

炎の攻撃音ですが、全く合っていません。

それになんか雨降っている感じがします。

うーん。

魔法にある炎07を試してみます。

位置交換の魔法です。

どんな効果音を使用していたのか、既に忘れています。

実際にGameをPlayして確認します。

分かりました。

水がブクブクする音を使用していたんです。

まあ合っていません。

魔法27はどうでしょうか?

何処も使用してないみたいです。

試してみます。

実際にPlayさせて使用しましたが、2つのEffectが同時に発生するため、音が2倍のVolumeになっています。

音のVolumeを小さくします。

半分の大きさにしました。

テストします。

うーん。

これでもまだ少し大きい気がします。

にしました。

テストします。

うん。

これだと丁度いい音の大きさです。

後、対戦相手の魔術師がMonsterを召喚した時の効果音が長すぎます。

Monster03に変更してみます。

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

5.4 Magic_Spell_Sounds_PROを消す

消しました。

これで著作権違反を犯す可能性は消えました。

この後、GameをPlayしました。

特に音が消えたとかは無かったです。

Magic & Spell Sounds PROのサイトを見ると

Not For Saleになっていました。

今週の戦闘システムの作成はこれで終わりにします。

6.Gaeaの勉強

6.1 先週の復習

先週のGaeaの勉強は先々週の内容をまとめようとしたんですが、あんまり上手く出来なかったです。

今、読み直して要点をもう一回まとめ直します。

はい。

分かりました。

これ「6.1 先週の勉強の復習」で全部の内容を言っているんです。

同じ事を6.2でも6.3でも言おうとしているので内容が繰り返しになって訳分からなくなってしまったんです。

で、何で同じ事を何回も言おうとしたのかと言うと、6.1でまとめた内容に何か重大な抜けがあると感じたんです。

その抜けを補おうとして6.2でまとめ直したんですが、それでも足りないと思い6.3で更にまとめ直したんです。

所が、その抜けを補う事が出来ないだけでなく更に迷走してしまったのが先週の勉強でした。

うーん。

でも読み直すとそんなに悪くも無いですね。

同じ事を繰り返し述べている嫌いはありますが、それなりに大切な内容を語っています。

6.2 Data GroupのNodeについて(基本の4つのNodeについて)

もう一回、Data GroupのNodeについてまとめ直します。

2023-03-06のBlogでまとめた時はMaskの灰色の部分の影響がよく分かってなかったです。

今回は灰色の部分がどの程度作成されるのかについても検証します。

以下のTerrainを作成しました。

これを使用してNodeの影響を見ます。

<Soilノード>

うーん。

太陽の影響を消したい。

白いのか灰色なのかがよく分かりません。

2Dで見てみました。

よく分からん。

拡大します。

お、やっぱりかなり灰色です。

Soilには以下のParameterしかないです。

Powerの値を上げると以下の様になりました。

白い部分がそんなに細かく分かれなくなりました。

これは実際にMaskとして使用する時はGIMPでGrayの部分を白黒に変換した方が良い気がします。

<Heightノード>

Height Mapはとんでもない使い方が出来る事に気が付きました。

まずNormalizedにCheckを入れます。

するとTerrainの一番高いところが100、一番低い所が0になります(多分)。

ここでFall Offを0にします。

すると

灰色の部分が消えます。

Soilノードと違い灰色の部分を完全に消す事が出来ます。

更にHeightにあるMinとMaxの値を弄る事で

特定の高さをだけを白くする事が出来ます。

例えば以下の様にセットします。

すると70%より低く40%より高い部分だけが白くなります。

ついでにFall Offの影響も調査しておきます。

Fall Offが0の時です。

Fall Offを10%にしました。

白い箇所の大きさはそのままで黒い部分が灰色に変化しました。

Fall Offは白い部分の面積を増やしています。

<Slopeノード>

これも前回はParameterの使い方がよく分かってなかったです。

Parameterの使い方は基本的にはHeightノードと同じです。

MinとMaxで挟んだ所が白くなります。

Fall Offの値によって灰色の部分が増えます。

Fall Offの値を0にしました。

灰色の部分が無くなりました。

今の設定では0~45度の間が白くなっています。

30~60度の間が白くなるように設定を変えました。

はい。これでUE5のAuto Material(World Aligned Blendノード)の機能と全く同じ事をMaskでする事が出来るようになりました。

<Textureノード>

これは本当に何をやっているのか不明です。

Parameterもこんなに沢山あります。

結果もこんなに灰色です。

あんまり使用したくないNodeです。

Textureノード以外の使用方法が大体判明しました。

やっぱりParameterをしっかり確認しないと駄目ですね。

2023-03-06のBlogを見ながら復習していますが、その時の勉強ではNodeの機能についてかなり間違えて解釈しています。

6.3 Data GroupのNodeについて(残りのNodeについて)

以下のNodeについてもう一回検証します。

<Angle>

AngleのParameterです。

Fall Offが0ですが、

灰色の部分がありますね。

これは太陽光の影響でMaskにしたら消えるかもしれません。

Parameterを弄ってみました。

白が点々と存在しています。

Azimuthの値です。

Azimuthって何だよ。

前から気になっていたんです。

以下に示した様に太陽光の位置を指定する時にも出て来ます。

これってDirectional Lightでしょう。

なんでXYZで指定しないで、こんな訳分からん座標を使用しているんでしょう。

調べました。

はい。理解しました。

しましたがこれってかなり天動説的な考えに基づいた測定方法ですね。

以下に簡単にまとめます。

ある人が太陽の向きを図りたいと思ったとします。

何かを測定するには座標が必要です。

その座標を以下の様に指定します。

自分を中心として地面に円を描きます。

更にこの地面の円を元に半球を想定します。

まあいわゆるPolar Coordinate(極座標)です。

座標が決まると要らない情報は消す事が出来ます。

地面や空は要らないので消します。

更に以下の様に

  • 測定する位置
  • 太陽が見える円表面の位置

で測定者や太陽の位置を代用すると以下の様な黄色の線で代用出来ます。

この黄色の線を地面に投影した線も追加すると以下の様に三角形を書く事が出来ます。

Polar Coordinate(極座標)は2つの角度で位置を指定します。

一つの角度は以下に示した赤で示している角度です。

これが、Azimuthかと思ったら、これはAltitudeと呼ぶそうです。

もう一つの角度は以下に示した地面に投影された黄色い線から計算します。

この投影された黄色い線の角度を計算するには、地面に書いた半円に座標を指定する必要があります。

こんな感じです。

ここからがPointなんですが、北を0度に指定します。そして東を90度、南を180度、西を270度に指定します。

となるとおのずと投影された黄色い線の角度も決定します。

こんな感じにです。

こっちの角度をAzimuthと呼ぶそうです。

簡単に説明します。って簡潔に説明するって意味じゃなくて、小学生でも理解出来るように説明します。って意味だったのか!

と言いたくなるような長々とした説明ですが、Azimuthで検索して出てきたSiteの説明が分かり易くなかったんです。

更にNew Bingで質問して帰ってきた答えも同じようでした。

ので、小学生でも理解出来るように説明しました。

これからの時代はこういう説明が出来る能力を持っている奴が勝つ時代が来ると思っています。

ので今回は長々と説明しました。

<Curvature>

2023-03-06のBlogではこのNodeの意味はよく分からなかったと言っています。

これはDefaultの設定が以下の様になっていて

その結果が

こんなんだからです。

見やすいようにParameterを調整します。

うーん。

いくら調整しても点々ですね。

調べたらCurvatureってそれぞれの点に対して計算しています。だったらこのような点の集合になるのも納得です。

ただMaskとして使用するには役に立たないと思います。

<Details>

これはParameterが一個しかなくて何をしても真っ黒でした。

そうだ。公式のDocumentを読む事にします。

公式のDetails[8]のサイトです。

これ見るとPixelが8192 x 8192の時にもっと細かい部分が表現出来るようにするみたいです。

まあ、関係ないですね。

<Distribution>

公式のDistribution[9]を見るとdistribution mapを作成する。と書いてありました。

でもDistribution Mapって普通に解釈すると人口が多いところに沢山Dotがあるような何かの分布を地図上に示しているのを指します。

これはそういうのは無いですね。

まあ、こういう点々系のMaskを使用する事はないと思うので分からなくても良いです。

<Dither>

Dither型のImageを作成します。Maskとは関係ないです。

Growth

植物が生える部分をMaskします。

これParameterが以上のようになっていますが、公式のGrowth [10]にも

なんの解説も載っていません。

確かKlaus氏のTutorialでこれについて解説していたのが有ったはずです。

調べたけど無かったです。

<Occlusion>

このNodeはSkipしようかなと思ったんですが、Parameterを弄っていたら以下のようなMaskとして使用出来そうなImageが出来たのでしっかり勉強する事にしました。

公式のOcclusion[11]を見ると

と書かれています。

Parameterは以下の様になっています。

でParameterの説明がこれしかないです。

ここで言うPowerとMultiplierのParameterは何処にも無いです。

Occlusionの計算方法が分からないので何とも言えないです。

これは後で勉強する事にします。

<ProTrusion>

これは2023-03-06のBlogでも述べていますが、とんがっている箇所を抜き出します。

何をもってとんがっているのかが分かりません。

山だってとんがっている訳でこの細かさを見ると岩のとんがり具合を抜き出しているみたいです。

ParameterのPowerの値を最大にしました。

これは山のもっとも尖っている部分を示していますね。

ここで2023-03-06のBlogのNodeの勉強は終わっています。

ので今週もここまでとして残りのNodeは来週検証する事にします。

7.Houdiniの勉強

今週もFOUNDATIONS | OVERVIEW [3]の続きを勉強します。

7.1 Tool Workflowを勉強する

まず以下のようなGridが配置された状態で始まっています。

Network Paneを見るとGrid_Objectと言うNodeがあります。

これは多分、Gridと言うObjectを配置すれば同じGridが表示されるはずです。

試してみます。

出来ました。

Tutorialではこの後、Iを押したりAを押したりして

Color1ノードを追加して以下のようにGridの一部を選択しています。

Iを押したりAを押したりしたんですが、Color1ノードは追加されませんでした。

しかし以下の様にGridの一部を選択する事は出来ました。

これで試してみます。

よく考えたら勉強しながら実装するのは大変です。

今週はTutorialのやり方をまとめるだけにします。

来週、今週のまとめを利用して実装する事にします。

Cを押して以下のRadial Menuを開きます。

いやこれRadial Menuで合っているよな。

ちょっと心配になったので調べる事にしました。

あれ、日本語のSideFXのThumbnailが。

Siteに飛んでみたら

SideFx公式の日本語のRadialメニュー[12]がありました。

え。

こんなのあったの?

何これ?

しかもシーンのビュー操作を見たら

あんなに苦労して意味を判明させたTumble、Track、Dollyが一言で解説されています。

えー。

ナニコレ?

しかも私が今勉強しているのと同じTutorialが日本語字幕付きで載っている。

まあ、Viewをビューって訳しているのはアレですが。

英語でこれに該当するDocumentが見つからない。

まあ良いです。

続きをやります。

さっきのRadial MenuからModelを選択して以下のRadial Menuを表示します。

今度はPolygonを選択して以下のRadial Menuを表示させ

PolyExtrudeを選択します。

赤い線が表示されるのでそれを引っ張って以下の様にします。

Network PaneにあるPoly Extrude1ノードを選択して

そのParameterのDivide Intoの設定をIndividual Elementsに変更しました。

そしてInsetの値を上げます。

以下の様になりました。

ふーん。です。

それよりまだ30秒しかTutorialを勉強していません。

今度はGroupの値を37-43から36-44に変更しました。

両端に新たにExtrudeされました。

これはPolygon36とPolygon44が新たにExtrudeされる対象として選択されたという事でしょう。

別に不思議でもなんでもないです。

今度はGrid1ノードを選択して

RowsとColumnsの値を変更します。

10から12と13にしました。

結果です。

うーん。

何でこういう風に配列されているの?

Tutorialを見たら、ここで言いたかったのはExtrudeは純粋にPolygonのNumberで指定さているだけなので、RowやColumnの値が変わるとどの場所がExtrudeされるのかも変わるって事だけでした。

それは理解しています。

でこれを毎回直すのは面倒なので以下の方法を使用するそうです。

Color1ノードとPoly Extrude1ノードの間にGroup1ノードを追加します。

今はこんなになっています。

全部が選択された状態です。

そしてKeep in Bounding RegionsをEnableします。

すると以下に示したBoxが表示されます。

Boxを拡大すると

その中に選択されているPolygon全部がExtrudeされるようになりました。

このやり方ならGridのPolygonのRowsとColumnsの値を変更しても

同じ位置でExtrudeします。

うーん。

成程としか言いようが無いです。

別な方法を次に紹介しています。

今度はGroup Range1を追加します。

最初にGroup NameをInput_Groupに変更しました。

すると以下の様に全部がExtrudeしました。

ここでSelectの値を1 of 2に変更しました。

一個置きと言う意味でしょうね。

結果です。

その通りの結果になりました。

GridノードとColorノードをDuplicateします。

Aを押してEdgeを選択します。

AってEdgeを選択するためのShortcut Keyでしたっけ。

確認します。

2023-02-19のBlogを見るとEdgeの選択方法を勉強しています。

ただしここでは

以下の方法でEdgeを選択していました。

Shortcut KeyのAは

Faceの選択の所で少しだけ述べられています。

しかしAを押すとEdgeが選択出来るとは書かれていません。

Tutorialを良く見直すとAを押す前に3を押しています。

この3がEdgeを選択出来るようにするShortcut Keyかもしれません。

207 Shortcuts for Houdini [13]によると

3はEdgeを指していました。

そのようです。

2023-02-19のBlog によると、AのShortcutとしての機能は2つのFaceを選択した時、その間のFaceも選択するそうです。

TutorialではそれをEdgeでやっているみたいです。

更に、Tutorialではその後に

Shiftも追加して前に選択した部分が選択されたままで新しいEdgeを追加して行っています。

そうして以下の四角形のEdgeを選択しました。

まだCを押してRadial Menuを表示してそこからModel、Polygonを選択して以下のRadial Menuを表示し

Poly Extrudeを選択します。

と思ったらPoly Bevelを選択しました。

フェイントです。

Poly Bevelノードが追加されました。

Poly BevelノードのParameterであるDistanceの値を変更します。

Bevelが作成されました。

Blenderの勉強は2カ月で止めてしまいましたが、Bevelが何なのかは覚えています。

たった2カ月で諦めてしまいましたが、それなりには役に立っていますね。

今度はBoxを追加しています。

正直???です。

Tutorialがこれから何をやろうとしているのか全く分かりません。

次にColor2ノードを選択して

Alt+DragでColor3ノードを作成し、

先程のBox1に追加します。

Alt+DragでDuplicate出来るのはUEと同じですね。

Color3ノードから可視化をEnableして

以下のBoxを表示します。

Color3ノードのParameterであるSizeの設定を以下の様に変更します。

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

更にAxis Divisionの値も以下の様に変更しました。

結果です。

うーん。

何でこうなるの?

3何だから3つに分割されるんじゃないの?

あ、Vertexの数が3なのか。

やっぱり以下の値にすると言って変えました。

またFeintです。

やっぱりVertexの数ですね。4,2,4になっています。

Houdiniはy軸が上を向いているのがUEと違う所です。

このBoxのCorner Edgeを探したいとします。

Corner EdgeはEdgeの角度が90度になっているやつだそうです。

そんなの全部じゃん。

取りあえず先を見てCorner Edgeが何を指しているのかを確認します。

はい。

分かりました。CornerにあるEdgeを指していました。

最終的にはCorner Edgeを抜き出してそれに先程のPoly Bevelノードを追加して以下のようなObjectを作成しています。

やり方を以下にまとめます。

まずCorner Edgeだけ抜き出すためにGroupノードを追加します。

そしてこのGroupノードのParameterのGroup Typeに

Edgesを選択します。

そしてGroup Nameに

Edge_Groupをセットします。

これでこのGroupで選択されたEdgeの名称がEdge_Groupになりました。

次に以下に示したInclude by EdgesをEnableさせて

Min Edge AngleとMax Edge Angleにそれぞれ89と91をセットしました。

うーん。

何でこれでCornerのEdgeが選択されるの?

以下のEdgeだって90度で交差しているじゃん。

うーん。

繋がっている全てのEdgeの角度が90度のEdgeを選択しているのか。

ORじゃなくてANDなのか。

多分これですね。

Poly BevelノードからAlt+DragでPoly BevelをDuplicateして

Group2ノードに繋げました。

Poly BevelノードのParameterであるGroupの

前の設定を消します。

更にDistanceの値を調整すると

以下のような結果になります。

これを見ると全てのEdgeにBevelが生成されているのが分かります。

Groupに先程作成したEdge_Groupを指定します。

結果です。

CornerにあるEdgeだけBevelしました。

Divisionの値を3に増やして

BevelのEdgeの数を増やしています。

今週はここまでですね。時間がなくなってしまいました。

8.Volumetric Cloudの勉強

今週は、Volumetric CloudのMaterialを交換してDefaultの雲より本物っぽい雲の作成方法を録画します。

それをDaVinci Resolveを使用して編集してみます。

8.1 Volumetric Cloudの作成方法の録画

まずVolumetric Cloudのましな作成方法の動画を撮ります。

撮りました。

Alt+F9で録画を始めたんですが、Alt+F9で録画が止まらなくて焦りました。

後で気が付いたんですが、F9じゃなくてF10を必死に押していました。

後、副のMonitorにMaterial Instanceを移してParameterを操作していました。

8.2 先週の復習

DaVinci Resolveの使い方を簡単に復習します。

そして先程撮影した動画を編集します。

大体読み直しました。

やり方が分からなくなったら読み直します。

8.3 動画の編集

取りあえず、DaVinci Resolveに上げて要らない端の部分を切り取りました。

うーん。

マイクが無いので今回はまだ音なしです。

これCutした後でも16分もあります。

予定では2分位で終わる長さに収めるはずでした。

何がそんなに動画を長くしてしまったんでしょう。

他にやる事思いつかないので以下のようにBGMを追加しました。

Titleを追加しました。

こんな感じです。

これはサムネとして絵で作成してそれをここに張り付けたいですね。

今気が付きましたが、Project名がUntitled Projectになっていました。

普通にProjectをSaveしたら直りました。

ただ何処にSaveされているのかが分かりません。

調べます。

色々場所を書いているSiteが出てきたんですが、その場所に行ってもこのProjectのFolderが無いです。

How to MOVE a DaVinci Resolve Project File Location EASILY! – Tutorial [14]がその辺について解説しているみたいなので見てみます。

右下にある以下に示した家のIconをClickして

以下のWindowを表示します。

更に以下に示したProjectの左にあるIconをClickします。

すると以下に示した様なProject Librariesが表示されます。

ここからOpen File LocationをClickして

その後は力ずくで見つけました。

開いたFolderから以下に示した所にありました。

当然、C Driveです。

この保存場所をD Driveに変更します。

Add Project LibraryをClickして

D Driveに新しいProject Libraryを作成しました。

ここに先程のProjectをCopyしてPasteしました。

まだたくさん勉強しないといけない部分が在りそうです。

今度はRenderingしてみます。

Saveする箇所をしっかり整理する必要があります。

VideoのFolder内がぐちゃぐちゃです。

BGMは先週Downloadした音源です。

DaVinciResolveはこれ何のFolderなのか全く分かりません。

DaVinciVideoですがこれはDaVinciのProjectが入っています。

DestopとUnreal Engine5はNvidiaで録画した映像です。

最後のVideoFromDaVinciがDaVinciからExportしたYouTube用の動画が入っているFolderです。

もう訳分かりません。

Renderingが終わりました。

一寸だけ動画を見ましたが問題ないです。

文字も普通に読めます。

動画のRenderingってCPUでやるんですね。

CPUの稼働率が100%になっていました。

GPUも使用するようにする設定とか無いんでしょうか?

下のこの部分まで録画されているのは嫌ですね。

この部分は消したいです。

今CGHOW氏の動画で確認したらCGHOW氏はこの部分は普通に映していました。

まあいいか。

VideoのFolder内は以下の様に整理しました。

BGMは動画用のBGMを保存しておきます。

DaVinci ProjectはDaVinci Resolveで作成したProjectを保存します。

DaVinci Resolveは何をするFolderなのか不明なのでそのままにしておきます。

Video From DaVinciはDaVinci ResolveからRenderingしたYouTube用のVideoを保存します。

Video From Nvidiaは以下に示した様に

Nvidiaで録画したVideoを保存します。

Nvidiaの設定も変更しました。

DaVinci Resolveの設定も直す必要がありました。

名前を変えたFolderを新しいProject Libraryとしてつなげる方法がわかりません。

色々試したんですが、もう新しいFolderを別に作成してしまいました。

のでこんなになりました。

新しく出来たResolve Project Library 2にこれから作成されるDaVinci ResolveのProjectは保存されるようになります。

一応、これで完成です。

8.4 サムネ用のIllustrationを作成する

サムネがどうやって作成されているのかよく分かってないんですが、一応作ってみます。

調べたらYouTubeのサムネのサイズは1280×720ピクセルだそうです。

以下のIllustrationを作成しました。

DaVinci Resolveで加工したら以下の様になりました。

一寸Impactが欠けますね。

こういう加工は慣れ親しんだMedi Bangでやるべきでした。

いやこれは初めて作成するThumbnailにしては会心の出来でしょう。

9.DirectXの勉強

9.1  C++ DirectX 12 Game Engine - [S01E03] - Creating A Game Engine [4]の先週の勉強内容を復習する

先週、何を勉強したのかについてもう忘れてしまったので復習します。

まず先週のBlogを読み直します。

思い出してきました。

まず先週は新しいProjectを追加してそのProjectのPropertiesの設定をBlank Projectと同じにしました。

その過程で、Blank Projectの設定が

正しく表示されていない事に気が付きました。

この原因は、前にBlank ProjectのPropertiesの設定をした時に、Configurationの値が

All ConfigurationではなくDebugになっていたからでした。

本当はAll Configurationで指定する必要がありました。

今週はこのBugをまず直します。

そしてそれが終わったらC++ DirectX 12 Game Engine - [S01E03] - Creating A Game Engine [4]のAn Application Interfaceを勉強します。

9.2 Blank ProjectのPropertiesの設定の間違いを直す

今Blank ProjectのPropertiesを開くと以下に示した様な

設定になっています。

勿論これはAll Configurationにおける設定で、

Debugに戻すと

以下のようになります。

この設定はAll Configurationでも表示されるべき設定です。

直します。

LinkerのSystemも直していきます。

これです。

直しました。

これでBlank ProjectのPropertiesの設定の間違いは直しました。

9.3 C++ DirectX 12 Game Engine - [S01E03] - Creating A Game Engine [4]のAn Application Interfaceを勉強します

まず軽く全部見ます。

ここではApplication Classを追加しています。

これの目的が今一よく分からないんですが、WinMain()関数からProjectを実行しないでこのApplication ClassからProjectを実行するみたいな事を言っています。

そんな事って出来るんでしょうか?

2つのProjectを一つのSolution内で実行した事が無いので、この辺の設定がどうなっているのかよく分からないです。

Game EngineであるOlympus側で実行するとGame ProjectであるBlank Projectも実行されるようにするんでしょうか?

その時にはBlank ProjectにあるWinMain()関数は要らないって事なんでしょうか?

ここの説明だけではよく分かりませんね。

そしてApplication Classの元になるInterfaceも作成しています。

このInterfaceを作成する目的が、これがまたよく分かりません。

以下に示した様にPlatform Folder、WIN32 Folderを作成して

その中にApplication ClassのInterfaceであるIApplication Interfaceを作成しています。

これから推測するとWIN32以外を使用した場合のInterfaceは別に作成して、今回はWIN32を使用するのでIApplication Interfaceを継承するApplication Classを作成するって事なのかな。と思います。

まあ、これらの疑問はこれから勉強を続けていく内に理解出来るようになるでしょう。

以下にAn Application Interfaceの内容をまとめます。

まずFolder Viewに移動します。

Episode 3のOlympusEngine FolderのBlank Project FolderのSource Folderに

Application.h FileとApplication.cpp Fileを追加します。

Solution Viewに戻ってBlank ProjectのSource Filterの

Private Filterに先程作成したApplication.cppを追加します。

Public Filterには先程作成したApplication.hを追加します。

Application.cppの実装です。

Application.hの実装です。

CPP Fileにこれらの関数の実装を追加します。

ここでなんでInterfaceを作成しないといけないのかについて延々と説明しているんですが、やっぱりその説明が納得出来ない。というかSimpleに意味不明です。

ここはSkipしてInterfaceの作成方法をまとめます。

またFolder Viewに戻ります。

以下に示した様にOlympus 内のSource Folderに

Platform Folderを追加して更にWIN32 Folderを追加してその中にIApplication.cppとIApplication.hを作成します。

更にWinEntry.hを追加します。

またSolution Viewに戻ります。

今度はOlympus Projectの

Private FilterにPlatform Filterを追加し更にそのPlatform FilterにWIN32 Filterを追加します。

Public Filterにも同様にPlatform Filterを追加し更にそのPlatform FilterにWIN32 Filterを追加します。

先程作成したFileを以下の様に追加します。

ああ。

分かって来ました。

このIApplicationはOlympus Game EngineのFileなんです。

違うProjectのInterfaceを継承するにはどうするのかを知る必要がある訳です。

まあ、まだ先程のTutorialの説明が何を言っているのか完全には分かりませんが、前よりは理解出来るようになりました。

今度はIApplication.cppに実装を追加します。

#Include “Olympus.h”

がErrorになっています。

それは以下に示した様に

IApplication.cpp FileはOlympus.hがあるFileより一つ戻って2つ進んだFolderに入っているからです。

このErrorを直すために以下の方法をとります。

Propertiesを開いてC/C++のGeneralを選択します。

ここからAdditional Include Directoriesに

Sourceを追加します。

これFilterなのかFolderなのか分かりません。

それは実装する時に確認します。

Errorが消えました。

Tutorialではこのやり方だとFolderをBackwardではなくForwardに前進出来ると解説しています。

Private FilterからSource Filterに戻るのがBackwardで、Source Filterから順に全部のFileを調べるのがForwardに当たるんでしょうか?

ムズイ。

IApplication.hの実装です。

まずはApplication.hの実装をそのままCopyします。

InterfaceなのでVirtualを追加します。

=0も追加します。

Interfaceの作成方法はもう覚えていません。

ここでConstructorの実装をCppに追加しました。

ここでAn Application Interfaceは終わりです。

<An Application Interfaceを勉強した感想>

まあやったことはApplication Classを作成した事とその親InterfaceであるIApplication Classを作成した事だけです。

しかしその理由がよく分からない。特にApplication ClassをBlank Projectに作成したらWinMain()関数が要らなくなるの?

この辺の事がよく分からないです。

でもそれは先に進めば明らかになるので、あまり気にしないでおきます。

後、違うProjectからInterfaceを継承するのはどうやるんでしょうか?

その辺は次の章で勉強するみたいです。

9.4 「DirectX 12の魔導書」の先週の勉強を復習する

これも何を先週勉強したのかすっかり忘れてしまったので先週のBlogを読んで復習します。

「3.3 画面色のクリア」を読んでまとめたんでした。

そんだけですね。

9.5 Command ListとCommand Allocatorを実装する

今、教科書を読んだんですが3.3.1に載ってる遅延実行は、C++の入社試験Levelの基礎的な話だったので実際に実装して試すまでも無かったです。

のでその次の3.3.2にあるCommand ListとCommand Allocatorの実装を行います。

その後で3.3.2に書かれている内容について論じる事にします。

まずID3D12CommandAllocator型の変数とID3D12GraphicsCommandList型の変数を宣言します。

名前はそれぞれ_cmdAllocatorと_cmdListです。

それぞれにCommandAllocatorとCommandListをAssignします。

どちらもID3D12Device型のObjectである_devにあるMember FunctionからAssignしています。

前々からID3D12Deviceの機能はCommand listなどのDirectX12のRenderingに必要なObjectを作成する事である。と推測していましたが、やっとここでそれが正しい事が証明されました。

公式のDocumentであるID3D12Device interface (d3d12.h) [15]を見ると

Create Command List ()関数もCommand Allocator ()関数もしっかり載っていました。

教科書にはここまで実装したら一回実行してResultの値がS_OKである事を確認しましょう。

と書いていますが、これって実行しただけで確認出来るんでしょうか?

Bingで質問したら以下の実装で確認したら

と言って来ました。

いや、便利過ぎるでしょう。

早速試してみます。

何もPrintされません。

出来てそうですね。

念のためBreak Pointを追加して確認しました。

出来ていました。

<Command Allocatorって何?>

ここでCommand Allocatorという新しいObjectが出て来ました。

これについて教科書の3.3.2で簡単に説明していました。

大体は教科書の説明で理解しました。

要するに沢山のCommand Listを保存しているMemoryの事と理解しました。

今週の「DirectX 12の魔導書」はここまでとします。

9.6 HLSLシェーダーの魔導書を勉強する

今週は3.1.7の実装をやります。

Sample03_01を起動しました。

では教科書に書かれている通りにCodeを追加していきます。

うーん。いきなりよく分からん型が出て来ました。

3.1.6に定数Bufferについての解説が載っています。

これを読み直します。

うーん。

定数Bufferとは要するにCPUのMemoryにあるDataをGPUのMemoryに送るためのClassという事らしいです。

公式のDocumentのConstant Buffer [16]によると

Create Buffer()関数を使用してConstant Bufferを作成して下さい。と書かれています。

あれ?

調べたらConstant Buffer Classがありました。

ここでConstant Bufferを作成しているのか。

Source Fileを眺めていたら以下のInit()関数ないでConstant Bufferを作成しているようです。

この中にCreate Buffer()関数があるんでしょうか?

うーん。

ない!

代わりにCreate Committed Resource()関数がありました。

よく見たら公式のDocumentのConstant Buffer [16]はDirectX11の説明でした。

このConstant Buffer Classを読んだんですが、理解するための時間が一寸足りないです。

来週、もう一回Constant Buffer Classを読み直す事にします。

この変数が何をしているのか理解出来たら、大体このClassが何をやっているのかは分かりそうです。

でもそれを追求するのは来週やる事にします。

今週はここまでです。

9.7「Direct3D 12 ゲームグラフィック実践ガイド」の続きを勉強する

<先週の復習>

先週、何を勉強したのか確認します。

教科書の「2.3.3 Swap Chainの生成」を読んでIDXGI Factoryの実装までしたみたいです。

「2.3.3 Swap Chainの生成」は最後まで読んだんでしょうか?

確認します。

読んでなかったです。

Swap Chainを生成するのにIDXGI Factoryが必要なんです。先週はそのIDXGI Factoryの生成まで読んで終わっています。

先週、勉強した内容を簡潔にまとめると

  • Double Bufferingとは
  • Double Bufferingを行うのがSwap Chain
  • Swap Chainを作成するにはIDXGI Factoryが必要

です。

教科書の「2.3.3 Swap Chainの生成」はここからSwap Chainの作成方法について解説しています。

まず「2.3.3 Swap Chainの生成」を読んでまとめます。

その後でSwap Chainの実装を行います。

<「2.3.3 Swap Chainの生成」の続きを読む>

最後まで読みました。

が結構、内容が多くて今週で全部をやる事は無理です。

簡単に内容をまとめます。

  1. DXGI_SWAP_CHAIN_DESC構造体を使用したSwap Chainの設定の指定
  2. DXGI_SWAP_CHAIN_DESC構造体のそれぞれの設定の解説
    • Buffer Disc構造体
      • Refresh Rate構造体
      • Format列挙体
      • Scaling Order 列挙体
      • Scaling 列挙体
    • Sample Disc構造体
    • Buffer Usage 列挙体
    • Swap Effect 列挙体
    • Flag 列挙体
  3. 先週生成したIDXGI FactoryのMember FunctionであるCreateSwapChain()関数を使用してSwap Chainを生成する
  4. Swap Chain が生成出来たかのCheck。
    • 出来てなかった場合はSafe Release()関数を用いて安全に開放
  5. Back Buffer番号を取得するためにIDXGISwapChain3を作成など

ね。多すぎて訳分からんでしょう。

1~3までがSwap Chainの生成です。4で出来たSwap ChainのCheck。5で何とSwap ChainからSwap Chain3を生成しています。

5は内容が多すぎます。別枠で勉強する必要があります。

4は単にSwap ChainのCheckをしているので別枠で勉強する必要は無いと思ったらSafe Release()関数なんてのを使用しています。これも別枠で勉強する必要があります。

となると

  • 今週:DXGI_SWAP_CHAIN_DESC構造体について
  • 来週:CreateSwapChain()関数を使用してSwap Chain
  • その次の週:生成したSwap ChainのCheckとSafe Release()関数の勉強
  • その先の週:Back Buffer番号を取得するためにIDXGISwapChain3を作成

と言う予定になります。

今週は、DXGI_SWAP_CHAIN_DESC構造体についての勉強とその実装まで行う事にします。

<DXGI_SWAP_CHAIN_DESC構造体>

DXGI_SWAP_CHAIN_DESC構造体はSwap Chainを生成する時に使用するCreateSwapChain()関数の二番目のParameterです。

のでDXGI_SWAP_CHAIN_DESC構造体を作成する必要があります。

このDXGI_SWAP_CHAIN_DESC構造体は

で宣言します。構造体ですので{}が必要です。

うん。

構造体はStructだよな。

うん。

合っています。

でそのDXGI_SWAP_CHAIN_DESC構造体をCreateSwapChain()関数でParameterとして使用するためには、以下の設定を指定する必要があります。

こんなのコピペして終わりじゃ。

と思ったら教科書ではチクチク全部、説明しているんです。

もう、絶対この部分をSkipするなよ。と釘を刺されているかのようです。

うええ。

と思ってもやるしかないです。

まあ、ぱっと見るとBuffer Descで半分を占めています。

このBuffer Descを理解出来たら半分は終わりです。

公式のDocumentであるDXGI_MODE_DESC structure [17]を見ます。

これ見ると6つしか変数がないです。

WidthやHeightが何を指しているのかは明白です。

次のRefresh Rateも同様です。

Formatからよく分かりません。

何のFormatなんでしょう。

教科書を見ても公式のDocumentを読んでもよく分かりませんね。

画像をMonitorに表示するには沢山のFormatがあってそれを指定する必要があるんでしょうか?

この辺の前提条件をはっきり説明してほしいですね。

ScanlineOrderingも同様です。

公式のDocumentであるDXGI_MODE_SCANLINE_ORDER enumeration[18]によると

となっていますが、そもそも一般人はRasterがどんなMethodを使用してImageを作成しているか知りません。

ああ、そうだ前提条件って軽んじらえているけど、何かを新しく勉強する時には物凄く重要だったんです。

英語を勉強中の日本人が洋書を読むと、何が書いてあるかさっぱり分からないと言います。

これでほとんどの日本人は単語が分からないからと間違った結論を出しますが、本当はその本が掛かれた前提を知らないから読めないんです。

私は本があると読まずにはいられない読書病だったので、日本語の本だけじゃなく英語の本も滅茶苦茶読みました。

それで辿り着いた結論は、これです。

これは凄く重要な内容なので、来週時間を取ってまとめます。

今週はもう本当に時間が無くなってしまったのでこれでお終いです。

10.まとめと感想

今週から書く量を減らして、余裕を作る事にしました。

もうちょっと余裕が無いと、途中で倒れてしまうかもしれないからです。

とは言っても今週もギリギリ最後まで終わらせる事が出来ました。

11.参照(Reference)

[1] CGHOW. (2023, March 6). Power Spell in UE5.1 Niagara Tutorial | Download Files [Video]. YouTube. https://www.youtube.com/watch?v=dRf_kLc8ajw

[2] Ben Cloward. (2022, November 3). Ice Shader Part 2 - Advanced Materials - Episode 6 [Video]. YouTube. https://www.youtube.com/watch?v=G-5bhff4f-M

[3] Magee, R. (n.d.). Foundations | Overview | SideFX. https://www.sidefx.com/tutorials/foundations-overview/

[4] OlympusMonsTutorials. (2021, March 17). C++ DirectX 12 Game Engine - [S01E03] - Creating A Game Engine [Video]. YouTube. https://www.youtube.com/watch?v=YgZSSE3qZqA

[5] C:\Insert Name Here. (2022, February 1). Adding virtual texture blending and distance based scaling with RVT | UE5 Landscape tutorial series [Video]. YouTube. https://www.youtube.com/watch?v=zD_IPknrdyM

[6] Joker Sounds Co. Ltd. (n.d.). 魔王魂. 魔王魂. https://maou.audio/

[7] Mixkit. (n.d.). Mixkit - Awesome free assets for your next video project. https://mixkit.co/

[8] Details - Gaea Documentation - QuadSpinner. (n.d.). QuadSpinner Gaea Documentation. https://docs.quadspinner.com/Reference/Data/Details.html

[9] Distribution - Gaea Documentation - QuadSpinner. (n.d.). QuadSpinner Gaea Documentation. https://docs.quadspinner.com/Reference/Data/Distribution.html

[10] Growth - Gaea Documentation - QuadSpinner. (n.d.). QuadSpinner Gaea Documentation. https://docs.quadspinner.com/Reference/Data/Growth.html

[11] Occlusion - Gaea Documentation - QuadSpinner. (n.d.). QuadSpinner Gaea Documentation. https://docs.quadspinner.com/Reference/Data/Occlusion.html

[12] Radialメニュー. (n.d.). https://www.sidefx.com/ja/docs/houdini/basics/radialmenus.html

[13] ShortcutWorld. (n.d.). https://shortcutworld.com/Houdini

[14] Creative Video Tips. (2021, May 4). How to MOVE a DaVinci Resolve Project File Location EASILY! - Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=TsKwaJtQFA0

[15] S. (2023b, February 14). ID3D12Device (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/nn-d3d12-id3d12device

[16] S. (2022e, October 31). Introduction to Buffers in Direct3D 11 - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/direct3d11/overviews-direct3d-11-resources-buffers-intro#constant-buffer

[17] DXGI_MODE_DESC structure (Windows). (2018, May 18). Microsoft Learn. https://learn.microsoft.com/en-us/previous-versions/windows/desktop/legacy/bb173064(v=vs.85)

[18] DXGI_MODE_SCANLINE_ORDER enumeration (Windows). (2018, May 18). Microsoft Learn. https://learn.microsoft.com/en-us/previous-versions/windows/desktop/legacy/bb173067(v=vs.85)