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

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

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

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

OpenGL ES

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

Android Studio

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

Q&A

1回答

2571閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

OpenGL ES

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

Android Studio

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

0グッド

0クリップ

投稿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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/11/16 01:04

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問