質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

OpenGL ES

携帯電話のような組込み機器のためにデザインされたOpenGLのサブセットです。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

受付中

3次元空間に描画された点をタッチすると「点がタッチされました」と表示するようにしたい

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

OpenGL ES

携帯電話のような組込み機器のためにデザインされたOpenGLのサブセットです。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

1回答

0グッド

0クリップ

2341閲覧

投稿2016/11/10 21:03

###前提・実現したいこと
3次元空間に点が複数個表示されるプログラムがあります。

その中のどれか一点をタッチすると
「点がタッチされました」というトーストを出すようにしたいです。

おそらくタッチした座標を読み取ってそれが点だったら
メッセージを出すようにすればいいのかなと思って参考書籍として
「OpenGL ES 2.0 Androidグラフィックスプログラミング」という本を借りました。

その9章に「物体を選択する」という項目があるのでそれを参考にしたのですが
OpenGL ES 2.0と1.0では勝手が違い過ぎて何を使えばいいのかがわかりませんでした。

お力を貸していただけると幸いです。

ソースコードは点を描画するメソッドとタッチ操作に関するクラスを記載しています。
###該当のソースコード
「Calculation.java」点を描画するプログラム

java

1public class Calculation { 2//省略 3public static int[] ncpt = new int[3]; 4//省略 5 6void DrawPOINT(GL10 gl) { 7 8 float[] pt = new float [3*ncpt[0]*ncpt[1]*ncpt[2]]; 9 int i,j,k,idx; 10 11 FloatBuffer CubeControlPointVertex_buff = null; 12 FloatBuffer CubeControlPointDiffuse_buff = null; 13 FloatBuffer CubeControlPointSpecular_buff = null; 14 FloatBuffer CubeControlPointShininess_buff = null; 15 FloatBuffer CubeControlPointEmission_buff = null; 16 final float CubeControlPointDiffuse[] = {0.0f, 0.5f, 1.0f, 1.0f}; 17 final float CubeControlPointSpecular[] = {0.0f, 0.5f, 1.0f, 1.0f}; 18 final float CubeControlPointShininess[] = {100.0f}; 19 final float CubeControlPointEmission[] = {0.0f, 0.5f, 1.0f, 1.0f}; 20 21 for(i=0;i<ncpt[0];i++){ 22 for(j=0;j<ncpt[1];j++){ 23 for(k=0;k<ncpt[2];k++){ 24 idx = 3*ncpt[1]*ncpt[2]*i+3*ncpt[2]*j+3*k; 25 pt[idx+0] =CP[i][j][k][0]; 26 pt[idx+1] =CP[i][j][k][1]; 27 pt[idx+2] =CP[i][j][k][2]; 28 } 29 } 30 } 31 32 CubeControlPointVertex_buff = toBuffer(pt, CubeControlPointVertex_buff); 33 CubeControlPointDiffuse_buff = toBuffer(CubeControlPointDiffuse, CubeControlPointDiffuse_buff); 34 CubeControlPointSpecular_buff = toBuffer(CubeControlPointSpecular, CubeControlPointSpecular_buff); 35 CubeControlPointShininess_buff = toBuffer(CubeControlPointShininess, CubeControlPointShininess_buff); 36 CubeControlPointEmission_buff = toBuffer(CubeControlPointEmission, CubeControlPointEmission_buff); 37 38 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 39 gl.glVertexPointer(3, GL10.GL_FLOAT, 0, CubeControlPointVertex_buff); 40 41 gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, CubeControlPointDiffuse_buff); 42 gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, CubeControlPointSpecular_buff); 43 gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, CubeControlPointShininess_buff); 44 gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_EMISSION, CubeControlPointEmission_buff); 45 46 gl.glPointSize(10.0f); 47 gl.glDrawArrays(GL10.GL_POINTS,0,ncpt[0]*ncpt[1]*ncpt[2]); 48 49 gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 50 }

「MyGLView」タッチ操作等が書かれたプログラム(この中にタッチしたら「点がタッチされました」と表示されるようにプログラムを組みたい)

java

1public class MyGLView extends GLSurfaceView { 2 MyRenderer myRenderer; 3 4 public MyGLView(Context context) { 5 super (context); 6 myRenderer = new MyRenderer(); 7 setRenderer(myRenderer); 8 9 } 10 11 final float TOUCH_SCALE_FACTOR = 0.2f; 12 private float mPreviousX0; 13 private float mPreviousY0; 14 private float mPreviousX1; 15 private float mPreviousY1; 16 17 18 @Override 19 public boolean onTouchEvent(MotionEvent event) { 20 int Action = event.getAction(); 21 int Count = event.getPointerCount(); 22 float X0 = event.getX(0); 23 float Y0 = event.getY(0); 24 float X1 = (Count >= 2) ? ((float)event.getX(1)) : X0; 25 float Y1 = (Count >= 2) ? ((float)event.getY(1)) : Y0; 26 switch (Action & MotionEvent.ACTION_MASK) { 27 case MotionEvent.ACTION_DOWN: 28 29 //ここにタッチすると「点がタッチされました」と出るようにプログラムを組み込みたい 30 31 case MotionEvent.ACTION_UP: 32 break; 33 case MotionEvent.ACTION_POINTER_UP: 34 break; 35 case MotionEvent.ACTION_MOVE: 36 if(Count == 1) { 37 float DX0 = X0 - mPreviousX0; 38 float DY0 = Y0 - mPreviousY0; 39 myRenderer.RotateX += DX0 * TOUCH_SCALE_FACTOR; 40 myRenderer.RotateY += DY0 * TOUCH_SCALE_FACTOR; 41 42 }else{ 43 break; 44 } 45 } 46 mPreviousX0 = X0; 47 mPreviousY0 = Y0; 48 mPreviousX1 = X1; 49 mPreviousY1 = Y1; 50 return true; 51 } 52 53} 54

###補足情報(言語/FW/ツール等のバージョンなど)
Android Studio 2.1.3
OpenGL ES 1.0

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

0

OpenGL知らないのでweb検索した結果での曖昧なコメントなのですが・・・

OpenGL ES 2.0と1.0では勝手が違い過ぎて何を使えばいいのかがわかりませんでした。

OpenGL ES 1.0と2.0ではかなりの仕様変更があったようですが特に2.0でプログラマブルシェーダーが導入されたことで透視射影用の変換行列の指定はシェーダーで指定(?)するように方法が変わったように見えます。

つまり2.0のサンプルから1.0の実装への単純な焼き直しは難しいかもしれません。かえって1.0の機能のリファレンスからやりかたを考えた方が早い気がします。

スクリーン上の点から3D空間上のオブジェクトを特定する方法についてOpenGLのHowToサイトをみると描画バッファ(深度情報つきのピクセル情報だと思います)から特定の点の深度(カメラからその点までの距離)を調べそれをxxUnProject(名前は正確にわかりません)で逆透視射影を施して3D座標へ変換し、その座標に近いオブジェクトを(一定誤差の範囲内で)探すというような方法を見かけました。この方法が採れるならその方針を1.0で実現するためのAPIをさぐることで実現できそうな気がします。

もしそういう方法が1.0で採れない場合は、深度情報なしに透視射影の変換行列から自前で計算という方法があると思います。考え方としてはカメラからスクリーン上の点を通過する直線を考え、その直線とオブジェクトの距離がカメラとオブジェクトの距離によって決まる誤差の範囲内かどうかで決めるといったようなものです。こうすると「スクリーン上でXピクセルの誤差範囲内にあるオブジェクト」がどれかを選び出せます。

投稿2016/11/13 03:42

KSwordOfHaste

総合スコア18378

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

退会済みユーザー

退会済みユーザー

2016/11/16 01:04

返答遅れてしまい申し訳ありません。 ご返信並びに貴重なお時間を割いて調べていただきありがとうございます。 KSwordOfHaste様の仰った方法を調べてみたいと思います。

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

OpenGL ES

携帯電話のような組込み機器のためにデザインされたOpenGLのサブセットです。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。