タップした場所のブロックを消せるようになりました。タップした座標(スクリーン座標)と3D空間上の座標を比較するのに結構手こずった。いろいろ調べたところ、以下のような変換が必要でした。
モデル自身の座標 → モデルビュー座標系 → プロジェクション座標系 → ビューポート座標系 → スクリーン座標系
ここで見落としがちなのが「プロジェクション座標系」から「ビューポート座標系」への変換ですね。てっきり、プロジェクション行列をかけた時点で奥行き情報がつぶれてスクリーン上の座標になるのかと思ってたので、得られた数値に定数を掛けたり割ったりで調整しようとして失敗してました。というわけで、プロジェクション変換後に奥行きに従って縦横に座標をつぶすような処理が必要だったわけですね。
詳細は、以下のページを参考にしたので、メモおいておきます。
capa's blog on JUGEM ワールド座標→スクリーン座標変換MWsite オブジェクト座標系からウインドウ座標系までの変換(JOGL)さて、先日の隠面消去問題ですが、手抜き対処で対応しました。要は表面よりも側面が弱くなればよいので、側面と表面の接続をあきらめて、隙間があいてしまっても表面を前に出しておけばチラつかないわけです。添付画面の前面と側面の際を見ると細い線が出てますが、これは隙間です。いや、そこを埋める処理もしてみたけど、描画がかなり重かったのでね。ポリゴン数も増えちゃうし。なので、これでいいことにします。
0 件のコメント:
コメントを投稿