<前文>

前回は、C++から枝葉(Foliage)を自動作成する方法を勉強しました。今回は、実際に実装してみます。
<本文>
<目的>
C++から枝葉(Foliage)を自動作成する方法を、実際に実装してみます。
<方法>
Step.0
前回、途中まで作成したプロジェクトをそのまま使用します。



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

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


Boxはランドスケープ(landscape)から境界を得ているようです。
次にサンプルコードにあるようにUFoliageTypeクラスからTArrayを使用してFoliageType変数を作成します。


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

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

少なくとも1つのFoliageTypeが初期化されていればUE_LOGの警告が表示されるはずです。
出来ているようです。
Step.2
色々考えたのですが、今回のランドスケープ(landscape)は単なる平地です。なのでサンプルコードのように、地面の高さをレイトレーシングで測ったり、パーリンノイズ(Perlin noise)で一定の高度のみに枝葉(foliage)を発生する必要もないのでもっと簡単にします。
まず、サンプルコードにあるSpawnFoliageInstance関数をコピーします。


以下のようにしました。


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

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


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

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

見事に枝葉(foliage)が生成されました。
Step.3
もっと簡単に出来るはずです。要らないコードを抜いて最低限のコードにしましょう。

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

変わっていないです。
次に

を見てみましょう。
この変数は、初期化した後に、



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

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


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



*よく見るとInWorldも使用していないんですが、サンプルコードにある関数ですのでここはそのままにしておきます。
<考察とまとめ>
枝葉(foliage)をUE4C++ から表示するのに絶対しなければならない事とは、
1.FFoliageMeshInfoクラスからオブジェクトを作成する。
2.FFoliageMeshInfoクラスのメンバー関数、AddInstance関数を使用して枝葉(Foliage)を作成する。
これだけです。この二つの事をするために上記のコードは存在しています。
<おまけ>


について調べます。
まず、DrawScale3D関数について調べます。
以下に示すコードを追加しました。


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

その結果は、

となりました。

が、x、y、z軸のサイズを指定しているようです。
次にRotation関数について調べます。

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

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

これで試してみます。

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