Papervision3DでLevel of Detail(LOD)のテスト。
LODとは視点からの距離に応じて描画する3Dオブジェクトの頂点数(ポリゴン数)を増減させるテクニックのこと。
—-> Simple Level of Detail Demo <—-
カーソルキーの上下で操作してみてください。
ドキュメントクラスのソースコードも上げておきます。
pv3d 2.0 GreatWhiteには、
org.papervision3d.objects.special.SimpleLevelOfDetail
というクラスがあるので今回はこれを使います。
Papervision LOD – SimpleLevelOfDetailのサンプルソースはSimpleとは言いづらいものだったので、
これをSimpleに書き直し。機能だけを見るための最低限のテストです。
LevelOfDetailクラスの使い方はとても簡単で、コンストラクタは
1 |
SimpleLevelOfDetail(objects:Array, minDepth:Number = 1000, maxDepth:Number = 10000, distances:Array = null) |
objectsにディテールの違うマテリアルを入れておきます。
1 2 3 |
for(var i:int=8;i<16;i++){ objects.unshift(new Sphere(materials, 100, i, i-2)); } |
materialsはWireframeMaterialでもBitmapFileMaterialでもなんでも。
unshiftなので、配列の先頭に近いほど高精度のモデルが入ってます。
このfor文だと8段階のLODになります。
minDepth、maxDepthはそのまま。それぞれ最小深度、最大深度を表します。
この範囲でモデルのディテールが変わっていきます。
最後のdistancesはどの深度でディテールを切り替えるかを指定します。例えば、
1 |
distances = [1000, 1500, 1600, 3000]; |
この場合、深度1000未満ならobjects[0]、1000以上1500未満ならobjects[1]、、、という具合です。
あとはこのSimpleLevelOfDetailインスタンスをsceneにaddChild。
ひさびさにpv3d触りました。
BasicViewを使えば短くシンプルに書けますね。
今回は地味なデモだったけど、エフェクト系のやつも今度作ってみよう。
One thought