[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Java3Djp:00004] DepthComponentFloat クラスについて



はじめまして。鈴村@広島市立大と申します。

研究でjava3dを使用しているのですが
どうにもこうにも詰まってしまったので質問させて下さい。

私は今以下のような処理をするプログラムの作成を試みています。

1、java3dで構築された3次元仮想空間を仮想カメラで写したシーンを
    ウィンドウに表示(canvasオブジェクトに描画後、JFlameに関連付け)。

2、ウィンドウに表示されたシーンからピクセル毎にデプスバッファ(デプス値)を取得。

3、カメラに最も近いオブジェクトと遠いオブジェクトを見つけ、
    そのオブジェクトのカメラからの距離(オブジェクトの世界座標)
    をデプス値を元に復元。

そんなの仮想空間を構築した時に分かっているのではないか?
と言われそうなんですが、
今のプログラムではカメラの視点位置・方向が逐次変化するような仕様なので、
表示されたシーンからデプス値を取ってくるのが良いだろうということで
こういった試みをしています。
(というか、その方法しか思いつかなかったのです(汗))

ピクセル毎のデプス値を取得するためのメソッドとしては
DepthComponentFloatクラスの void getDepthData(float[] depthData)を使用しています。
各ピクセルのデプス値は、ビューボリューム(frustam()メソッドで作成)の
nearクリップを0、farクリップを1として正規化されています。
で、問題なのはこの正規化のされ方なんですが、
正規化自体はDepthComponentFloatクラス(getDepthDataメソッド自体?)でされているようで、
その正規化のされ方が分からないのです。
要するに、ある距離にある物体のデプス値がどのような値になるのかを定式化できないのです。

そのため、デプス値を取ってきても世界座標に変換できなくて困っています。
カメラに近いほど距離の分解能が高く,離れるほど分解能が下がるという実装になっている
というのは分かるんですが・・・。
参考書(The Java 3D API仕様)やSunのJava3Dのドキュメントを見ても
「浮動小数点形式で[0,1]の範囲を持つ奥行き値の2D配列を定義する」
としか書いてなく、webを検索しても有効な情報を得られず完璧に詰まってしまいました。
(普通デプスバッファは今回のような使い方をしないので当然といば当然かもしれませんが)

最悪、対象物体の位置を微小移動させながらその都度デプス値を取得して、
取得した値を元にフィッティングを行うなどして定式化するという強引な手もあるんですが、
すごく手間と時間がかかりそうなので(汗)。

どなたか正規化のされ方の仕様、もしくは
デプス値から世界座標への変換方法を知っている方はいらっしゃらないでしょうか?

長いメールかつ分かりにくい文章ですいません。
よろしくお願いします。

+------------------------------------------
 広島市立大学大学院  情報科学研究科
 知能情報システム工学専攻  情報認識学講座

 鈴村 真治 
 E-mail : suzu@xxxxxxxxxxxxxxxxxxxxxxxxx
+------------------------------------------