« AndroidのLogクラス | トップページ | AndroidのOpenGL ESでマウスピッキング 〜完結編〜 »

AndroidのOpenGL ESでマウスイベント

数日前からずっとチャレンジしていたOpenGL ESによるマウスイベントが、 ついにちょろっと動きました!

基本的なアイディアとしては、カメラの座標を通り、クリックされた方向に向かう 直線と、対象の三角形のある平面の交点の位置を取得するというもの。

具体的な手順は以下の通り

  • カメラ位置から注視点へ向かう直線の、z-x傾き、z-y傾きを得る
  • 視野角、アスペクト比から、クリックされた点とカメラ位置との相対z-x傾き、z-y傾きを計算する
  • tanの加法定理により、上記二つを合成し、絶対のz-x傾きz-y傾きを得る
  • 上で得られた傾きを持って、カメラ位置を通る直線を作る
  • カメラの位置ベクトルをxとし、その直線を通る、カメラ位置以外の任意の点の位置ベクトルをyとする
  • 当たり判定を行う三角形の三点の位置ベクトルをそれぞれp、q、rとする
  • p、q、rの三点からなる三角形内部を表すベクトルは、p+s(q-p)+u(r-p), s+u<=1, s>=0, u>=0であり、 設定したx、yを通る直線はt(y-x)+xで表されるので、これらを連立方程式として解く。

以下、x =(x1,x2,x3)とする


以上より、Aの逆行列を求めることで、sとtの値を求めることができる。

もとめたs,tの値がそれぞれ0以上であり、かつそれらの和が1以下であれば、 その三角形と直線は、共有点を持つことになる。


この方法で一応実装が8割ほど完了しました。以下動作ムービー

|

« AndroidのLogクラス | トップページ | AndroidのOpenGL ESでマウスピッキング 〜完結編〜 »

コメント

これは実現すると面単位でマウスイベントが得られるということですか!
それはすごい。。期待してます!

投稿: s_welt | 2007年11月26日 (月) 01時57分

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/486213/9111497

この記事へのトラックバック一覧です: AndroidのOpenGL ESでマウスイベント:

« AndroidのLogクラス | トップページ | AndroidのOpenGL ESでマウスピッキング 〜完結編〜 »