HeightFieldとROAM

引き続きROAMをがんばっちみる。
その前に簡単な説明からのがいいなー

普通はHeightFieldのような規則正しくならんだグリッドを用意して
QuadTreeなりにぶら下げてカリングしてレンダリング〜ってなノリなんだけど
ROAMってのはそこを一歩つっこんで動的にLOD(LevelOfDetail)しつつ
レンダリングしたときにポリゴンの連続性を確保できるようにデータを持とう!
見たいな感じなのかな。

たとえばMMO-RPGとかの大きなMAPとかに使うといいかもしんない。

考え方の基本はx,yで


( 0, 0) ( 0,10) (10, 0)
という三角をLv0としたらLv1はLv0をぶった切って

( 5, 5) ( 0,10) ( 0, 0)
( 5, 5) ( 0, 0) (10, 0)
という風に二つに分けてLv0の子としてぶら下げる(Lv2,Lv3なども同じで以下略)
ちなみに角度が45度になる頂点をBase
そこから左にあるのをLeft、右にあるのをRightとすると
上に書いた頂点はBase,Left,Rightって順に並んでるのが分かります。

で、ちょっとややこしいんだけど
Base,Leftの辺を共有するお隣の三角形をLeftNeighbour
Base,Rightの辺を共有するお隣の三角形をRightNeighbour
Left,Rightの辺を共有するお隣の三角形をBaseNeighbour
とすると
LeftNeighbourとRightNeighbourのLvは必ず自分と同じLvかLv-1である必要があり
BaseNeighbourは必ず自分と同じLvかLv+1じゃないといけない。
これを守らないとLvが違う隣同士のポリゴンとポリゴンの間に
隙間ができてしまってうまくLodが機能しません。

図があれば分かりやすいけど、ないのでちょっとややこしいかも;
ちなみに実装は再帰でやるところですね。
アルゴリズム自体Paperに乗ってるので割と簡単です。

上記を守ればすぐにポリゴン同士を統合して頂点数を減らしちゃおうってなるのですが
テクスチャが絡んでくると、ちょっと考えないとうまく行きません。
基本的にLODは二つの三角ポリゴンを一つのポリゴンにまとめていく作業ですので
テクスチャが違うと統合不可能になったりするわけです。
場合によっては頂点カラーとかも考慮しないと見た目がえらい変わっちゃいます。

・・というのが前回の話。
今回はテクスチャが違ったりなどの理由で統合できない場合以外は
カメラのx,z座標から遠いポリゴンほど統合して頂点数を減らしいくということをしてみました
つまりMMOで例えると自キャラ近辺だけ詳細に描こうってことですね。

http://mulberryl001.ddo.jp/cpp/roam1.jpg
http://mulberryl001.ddo.jp/cpp/roam1w.jpg

テクスチャを地面の一部だけ変えてみて統合できるならするし
できないところは分割されたままにしておきます。
ちょうどL字っぽくなってる部分が分割できない部分ですね。

http://mulberryl001.ddo.jp/cpp/roam2.jpg
http://mulberryl001.ddo.jp/cpp/roam2w.jpg