— boreal-kiss.com

[FlashPlayer10]drawTrianglesで球面にテクスチャリング

zソート等で非常に参考になったのは/as3/Astro/Torus3D_01/src/Document.as – Spark project。上記Spark projectの例の場合、プリミティブを構成する頂点座標は重複して登録させず、かわりに三角形パッチを構成する頂点座標の組み合わせをインデックスすることで多面体を作成している(詳細はdrawRectanglesの仕様参照)。この場合、各三角形を構成する頂点座標の組み合わせ情報に関してzソートを行うだけで済むので経済的なんだけど(i.e., drawRectanglesの第二引数indicesに関してのみソーティングが行われている)、それ以前にプリミティブ作成時に頂点情報の組み合わせをどうインデックス化するか思考するのが面倒くさい。

そこで今回は頂点情報が重複するのを一切気にせず各三角形パッチごとに頂点座標を計算させた(つまりdrawRectanglesの第二引数indicesを全く設定していない)。グリッド化は簡単になったのだけど、計算量が増えた(三角形パッチ数は頂点数の約二倍)こととzソートする成分がdrawRectanglesに渡す第一引数verticesと第三引数uvtDataの二つになる点が面倒くさい点か。あと幾何学的問題で、矩形画像の球面上へのテクスチャリングはどうしても極近傍に空白ができる。グリッドサイズを細かくしていけば無視できるレベルにはなるけど。ソースはswfリンク先にあります。


(要Flash Player 10)

[追記:2008/06/05]

Spark projectソースに関して補足。renderScene関数内の

vector.w = projection.focalLength / (projection.focalLength + vector.z);
vector.project();

は不要の模様。直前のworld(Matrix3Dクラス)に投影情報が含まれているので

var vector:Vector3D = world.transformVector(vertex);

この時点ですでにvectorは投影用に座標値が変換されている。あと関係ないのだけど、Vector3D.project()はVector3Dの第4引数wで第1~3引数の値を”割る”メソッドなので注意が必要。こんなかんじ。

var v:Vector3D = new Vector3D(100,100,100,2);
v.project();
trace(v);//(50,50,50)

[追記:2008/08/06]

Spark projectのソースについて作者の方よりご指摘を受けています。僕が現在Flash Player 10を使えない状況なのでまだ確認ができていません。上記情報を鵜呑みにせず、コメントも合わせて参照ください。

5 comments
  1. muta says: 2008年6月23日1:31 AM

    補足ありがとうございます。
    おっしゃる通りでした。

  2. muta says: 2008年6月23日2:02 AM

    何度も書き込みすいません。

    やはり、w 要素の計算と project() は必要です、多分。
    プロジェクションの視野角を広角気味に設定しても
    ゆがみが発生せず、平行投影になってしまいます。
    ですので、transformVector() 内では投影用には
    変換されていないと思います、多分。

    多分ばかりで申し訳ないです。

  3. admin says: 2008年6月23日2:49 PM

    mutaさん>
    ゆがみが生じない?少なくとも

    w = f / (f + z)

    でproject()すると

    x’ = x / w (<- x * w ではない) y' = y / w となるのでそこの部分は間違っていませんか?今Flash Player 10が使えない環境なのですぐに確認できないのですが、チェックはしてみたいと内容です。

  4. muta says: 2008年6月24日12:03 PM

    ご指摘の通り、そこの計算部分は間違ってます。
    勝手に x’ = x * w のつもりでした、すいません。

    ちなみにそこの間違いのせいで、
    sortOn のところも Array.NUMERIC | Array.DESCENDING としなければいけないところが Array.NUMERIC になってますし、
    drawTriangles のところも TriangleCulling.POSITIVE としなければいけないところが TriangleCulling.NEGATIVE になっています。

    これは、時間があるときに修正したものを上げようと思います。

    ただ、透視投影にしたい場合は PerspectiveProjection の使用と w 要素の計算、
    また uvt の t 要素の計算も必須のようです。

  5. admin says: 2008年6月24日2:12 PM

    詳細ありがとうございます。記事にはその旨を追記しておきます。

Submit comment