oFで樹木のモデリング (2)

前回の記事で樹木の骨格ができました。
次は骨格に厚みを持たせる為にメッシュを貼ります。
メッシュには、頂点、法線、テクスチャ座標、色、インデックスの情報が必要なので、今回はこの計算がメインになりそうです。

法線というのはポリゴンに垂直なベクトルの事で、面がどっちを向いているかを判断するのに用います。

前回の樹木を作ったプロジェクトにいきなりメッシュのコードを書くと難しいので別プロジェクトでメッシュクラスを組みます。メッシュクラスが完成したら樹木に移植という流れにしましょう。

oFにはたくさんのサンプルが含まれていますが、そのなかにcameraRibbonExampleというサンプルがあります。

スクリーンショット 2014-04-04 12.42.21

このサンプルではマウス座標を vector<ofVec3f> に次々にpush_backしたデータを使ってメッシュを作っています。

非常にシンプルな構成なので、このサンプルを改造して樹木のようなメッシュを貼れるようにします。

ただし、樹木のデータは各節々の位置であるofVec3fの他に枝の太さもまちまちなので、次のような構造体を使います。

 

 

まずはメッシュクラスのheaderです。

 

defineでDIV_CYLINDERを定義していますが、これは円柱の分割数です。数字が大きいほど滑らかな円柱を書く事ができますが処理は重いです。

メッシュの計算を行うaddSmoothBranch関数とobjファイルとしてメッシュを書き出すsave関数がキモになります。

さて、addSmoothMeshから見ていきましょう。

 

この関数では枝の位置と太さのデータの他に、テクスチャのどの位置を使うかを示す_beginTexと_endTex、さらに全体的な太さを調整するための_sizeを引数にとります。

UV座標は0.0~1.0の座標ですが、ofMeshでテクスチャ座標を指定する時はテクスチャの原寸を渡す事になっているので、このような引数となりました。objとして書き出すときに要注意ですね。

もっとも面倒なのは頂点の位置計算ですが、次の図のように計算されています。

ここではcurrentとnextの座標を手がかりとしてAとBの座標が求まれば良いのです。

tree3

 

forループがネストしていますが、二階層目で長い板状の頂点を計算し、一階層目でそれを360°にぐるっと回転させています。tmp

 

残りのコードも書いてしまいます。

 

 

これをoFのサンプルに組み込むと,ちょっと長いですが次のようになります。

 

スクリーンショット 2014-04-04 11.58.57

ちゃんとテクスチャも貼れたようです。

樹木だけじゃなくて色んなプロジェクトで使えそうなクラスですね。

せっかく作ったsave関数はまだ未実装ですが、次回以降で解説したいと思います。

なお、テクスチャは縦に長い木目の画像を使いました。