<前文>
前回は、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°の回転をしていますね。