- ベストアンサー
見えるポリゴンオブジェクトを選別する方法
ポリゴンのオブジェクト郡をある方向から見て、どのオブジェクトが少しでも見えて、どのオブジェクトが隠れて全く見えないか、調べたいです。Open-GLのdepthバッファーなどは深さ情報を持っていますが、さらにその情報がどのオブジェクトに関するものか知ることができれば、調べる事が可能と思います。OPEN-GLではなくてもよいので、このような事が簡単にできる環境/やりかた、または同様の事をしてくれるプログラムソースなど、あれば教えて欲しいです。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
1) ~ 6) で計算した△のスクリーンへの射影を保持してもいいけど、 視点が変わると、作り直しだから、 1) ~ 6) の準備で、分割して整列した3Dの△だけ保持して、 必要に応じて、スクリーンへの射影とエッジでの分割をしたほうがいいとおもう。 1) ~ 6) で作った△の並びは、視点が、どれか一つの△の面の裏側まで移動しないと変わらないから、使いまわしが利きそうなきがするよ?
その他の回答 (7)
- dscripty
- ベストアンサー率51% (166/325)
「1)」~「6)」が Zバッファと同義かな?
補足
三角形同士が3D干渉線を持たないときは、スクリーン投影上のエッジでお互いを分割し、もし、三角形同士が干渉するときは、3Dの三角形分割およびスクリーン上のエッジでの分割を行うことで、奥行き関係が一意に判定出来るように準備するって事ですか?
- dscripty
- ベストアンサー率51% (166/325)
6) 突き出ている△はもうないよ?
補足
Zバッファーのほうがシンプルな気がするけど?
- dscripty
- ベストアンサー率51% (166/325)
訂正 × 10) A OR B をとって C とすると、A != C なら B の一部は見えて、その部分は、C XOR B。 ○ 10) A OR B をとって C とすると、A != C なら B の一部は見えて、その部分は、C XOR A。
補足
三角形が相手の三角形を突き抜けていたら?
- dscripty
- ベストアンサー率51% (166/325)
もう少しドロくさい方法 1) 視点からの距離が近い頂点を持つ△から順に並べる。 2) 視点からの距離について、△の頂点が他の△の頂点の間にあるときは、交線が存在するか確かめる。 3) 交線があるときは、それに沿って、2つの三角形をそれぞれ2分して、4個のパーツに分ける。 4) 分けられたパーツが四角形なら、視点からの距離が2番目と3番目の頂点を結ぶ線で分断して、△にする。 5) 分断されたパーツは、△の並びへ加える。 6) 「2)」から「5)」を繰り返して、△の一部が、他の△から突き出ている状態をなくす。 7) 視線に垂直な面に、表示するスクリーンのピクセル分の領域 A、B、C を確保する。 8) 視点からの距離が近い△を A に射影して描画する。 9) 視点からの距離が次に近い△を B に射影して描画する。 10) A OR B をとって C とすると、A != C なら B の一部は見えて、その部分は、C XOR B。 11) C を A にコピーする。 12) 「8)」から「11)」を△がなくなるまで繰り返す。
- dscripty
- ベストアンサー率51% (166/325)
↓失敗。 既に投影済みの三角形からはみ出ていれば、 少なくとも、その三角形の一部は見える。 ↓ はみ出た図形を切り取って、 比較した図形より、ひとつ視点に近い三角形の投影と比較して、はみ出た部分をまた、ひとつ視点に近い三角形と比較、最終的に一番手前の三角形まで比較して、はみ出た部分が残れば、少なくとも、一部分はみえる。 これで、どう? 再帰的に計算すれば、ロジックはシンプルになると思う。
補足
切り取りの結果、ばらばらの三角形が3つと、6角形が1つ出来たりとか、ややこしくなりそうですが。
- dscripty
- ベストアンサー率51% (166/325)
訂正 × 接線があれば、少なくとも、その三角形の一部は見える。 ○ 接線があるときは、突き出た部分の三角形を新たに求めて、 接した三角形を除外して、2次元のスクリーンに投影する。 ↓ 「各三角形を 2次元のスクリーンへ投影したとき、」の処理へもどる。
補足
回答ありがとうございます。 だけどこの方法だと、たとえば10個の三角形があつまって1つの三角形を隠す、といったケースでの判定が難しそうです。
- dscripty
- ベストアンサー率51% (166/325)
視点から、三角形の各頂点の距離を出して、 もっとも距離が短い点を持つ三角形から順に、 視線から垂直方向へ広がる 2次元のスクリーンへ投影する。 各三角形を 2次元のスクリーンへ投影したとき、 既に投影済みの三角形からはみ出ていれば、 少なくとも、その三角形の一部は見える。 三角形の頂点のどれかが、 既に投影済みの三角形の 3次元上の頂点と頂点の間の距離にあるときは、 2つの三角形に接線がないか調べる。 接線があれば、少なくとも、その三角形の一部は見える。 ない場合は、2次元のスクリーンへ投影してみたとき、 既に投影済みの三角形からはみ出ていれば、 少なくとも、その三角形の一部は見える。 以上、必要なオブジェクト分繰り返す。 。。。かな?
お礼
やはりZバッファー法のソースを捜して見ます。ありがとう御座いました。