UE4の勉強記録

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

12章8節Landscape and Foliage API ランドスケープ(landscape)と枝葉(Foliage)APIを使用したマップの生成 part2

<前文>

f:id:kazuhironagai77:20181202234933p:plain

前回は、C++から枝葉(Foliage)を自動作成する方法を勉強しました。今回は、実際に実装してみます。

<本文>

<目的>

C++から枝葉(Foliage)を自動作成する方法を、実際に実装してみます。

<方法>

Step.0

前回、途中まで作成したプロジェクトをそのまま使用します。

f:id:kazuhironagai77:20181209135753p:plain

f:id:kazuhironagai77:20181209135802p:plain

f:id:kazuhironagai77:20181209135811p:plain

Step.1

ランドスケープ(landscape)を作成します。

f:id:kazuhironagai77:20181209135840p:plain

Boxが本当にランドスケープ(landscape)から境界を得ているのかを調べるため以下のコードを足しました。

f:id:kazuhironagai77:20181209135900p:plain

f:id:kazuhironagai77:20181209135909p:plain

Boxはランドスケープ(landscape)から境界を得ているようです。

次にサンプルコードにあるようにUFoliageTypeクラスからTArrayを使用してFoliageType変数を作成します。

f:id:kazuhironagai77:20181209135929p:plain

f:id:kazuhironagai77:20181209135938p:plain

エディター上からFoliageType変数にmyFoliageを指定する事で初期化しました。

f:id:kazuhironagai77:20181209135957p:plain

本当にFoliageTypesが初期化されているか以下の方法で確かめます。

f:id:kazuhironagai77:20181209142658p:plain

少なくとも1つのFoliageTypeが初期化されていればUE_LOGの警告が表示されるはずです。
f:id:kazuhironagai77:20181209140013p:plain

出来ているようです。

Step.2

色々考えたのですが、今回のランドスケープ(landscape)は単なる平地です。なのでサンプルコードのように、地面の高さをレイトレーシングで測ったり、パーリンノイズ(Perlin noise)で一定の高度のみに枝葉(foliage)を発生する必要もないのでもっと簡単にします。

まず、サンプルコードにあるSpawnFoliageInstance関数をコピーします。

f:id:kazuhironagai77:20181209140038p:plain

f:id:kazuhironagai77:20181209140047p:plain

以下のようにしました。

f:id:kazuhironagai77:20181209140104p:plain

f:id:kazuhironagai77:20181209140113p:plain

必要なヘッダーを足して、ビルドすると、すごいエラー(900個ぐらい)を吐きました。いくら考えてもどこを直したらいいのか分からなかったので、

f:id:kazuhironagai77:20181209140210p:plain

これで、VSをリフレッシュしたら、一発でビルドしました。

f:id:kazuhironagai77:20181209140236p:plain

f:id:kazuhironagai77:20181209140245p:plain

SpawnFoliageInstance関数をGen関数内に加え、必要なパラメーターのアギュメント(aguments)をサンプルコードを参考にして供給しました。

試しにビルドしたら、成功しました。

<結果>

f:id:kazuhironagai77:20181209140311p:plain

スケーリングの値を両方1にして、Gen関数を実行すると、

f:id:kazuhironagai77:20181209140331p:plain

見事に枝葉(foliage)が生成されました。

Step.3

もっと簡単に出来るはずです。要らないコードを抜いて最低限のコードにしましょう。

f:id:kazuhironagai77:20181209140433p:plain

ランドスケープ(landscape)は平面なのでこれを指定する必要はないですね。なくても高さは変わらないはずです。

f:id:kazuhironagai77:20181209140453p:plain

変わっていないです。

次に

f:id:kazuhironagai77:20181209140513p:plain

を見てみましょう。

この変数は、初期化した後に、

f:id:kazuhironagai77:20181209140658p:plain

f:id:kazuhironagai77:20181209140710p:plain

f:id:kazuhironagai77:20181209140718p:plain

の変数を指定していますが、前回調べた通り、それらは親クラスのFFoliageInstancePlacementInfoの変数です。ので何らかのデファルト値は入っていると考えられますので。Location以外を消してみます。

f:id:kazuhironagai77:20181209140737p:plain

枝葉(foliage)の数を100に変えて、Gen関数を実行しました。普通に100本の木が発生しました。

f:id:kazuhironagai77:20181209140802p:plain

f:id:kazuhironagai77:20181209140811p:plain

Step.4

枝葉(foliage)をUE4C++ から表示するのに絶対必要なコードは以下のようになりました。

f:id:kazuhironagai77:20181209140837p:plain

f:id:kazuhironagai77:20181209140845p:plain

f:id:kazuhironagai77:20181209140854p:plain

*よく見るとInWorldも使用していないんですが、サンプルコードにある関数ですのでここはそのままにしておきます。

<考察とまとめ>

枝葉(foliage)をUE4C++ から表示するのに絶対しなければならない事とは、

1.FFoliageMeshInfoクラスからオブジェクトを作成する。

2.FFoliageMeshInfoクラスのメンバー関数、AddInstance関数を使用して枝葉(Foliage)を作成する。

これだけです。この二つの事をするために上記のコードは存在しています。

<おまけ>

f:id:kazuhironagai77:20181209141014p:plain

f:id:kazuhironagai77:20181209141022p:plain

について調べます。

まず、DrawScale3D関数について調べます。

以下に示すコードを追加しました。

f:id:kazuhironagai77:20181209141056p:plain

f:id:kazuhironagai77:20181209141106p:plain

更に、パラメーターを以下に示したように指定します。

f:id:kazuhironagai77:20181209141129p:plain

その結果は、

f:id:kazuhironagai77:20181209141149p:plain

となりました。

f:id:kazuhironagai77:20181209141205p:plain

が、x、y、z軸のサイズを指定しているようです。

次にRotation関数について調べます。

f:id:kazuhironagai77:20181209141222p:plain

Dir変数とangle変数について、

FQuatのAPIは、

f:id:kazuhironagai77:20181209141248p:plain

与えられた軸に対して回転する新しいクォータニオンの初期化と作成

と書かれているので試してみます。

f:id:kazuhironagai77:20181209141329p:plain

これで試してみます。

f:id:kazuhironagai77:20181209141348p:plain

予想の通りにX軸に対して180°の回転をしていますね。