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

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

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

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

OpenGL ES

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

1回答

2517閲覧

androidのプログラムです

Miran18

総合スコア10

Java

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

OpenGL ES

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

1クリップ

投稿2015/02/01 05:05

下のコードの3Dオブジェクト一つ一つにタッチイベントをつけたいのですがどうしたらいいですか?

lang

1package example.android.taiyoukei; 2import javax.microedition.khronos.egl.EGLConfig; 3import javax.microedition.khronos.opengles.GL10; 4 5import net.npaka.gles.GLES; 6import net.npaka.gles.ObjLoader; 7import net.npaka.gles.Object3D; 8import android.annotation.SuppressLint; 9import android.content.Context; 10import android.opengl.GLES20; 11import android.opengl.GLSurfaceView; 12import android.opengl.Matrix; 13import android.view.MotionEvent; 14import android.view.View; 15import android.view.View.OnTouchListener; 16 17//レンダラー 18@SuppressLint("ClickableViewAccessibility") 19public class GLRenderer implements 20 GLSurfaceView.Renderer, OnTouchListener { 21 //システム 22 private float aspect;//アスペクト比 23 private int angle; //回転角度 24 //システム 25 26 //モデル 27 private Object3D background=new Object3D();//背景用 28 private Object3D model=new Object3D();//(3)-[1] 29 private Object3D model01=new Object3D(); 30 private Object3D model02=new Object3D(); 31 private Object3D model03=new Object3D(); 32 private Object3D model04=new Object3D(); 33 private Object3D model05=new Object3D(); 34 private Object3D model06=new Object3D(); 35 private Object3D model07=new Object3D(); 36 private Object3D model08=new Object3D(); 37 38 39 //コンストラクタ 40 public GLRenderer(Context context) { 41 GLES.context=context;//(A) 42 43 } 44 //サーフェイス生成時に呼ばれる 45 @Override 46 public void onSurfaceCreated(GL10 gl10,EGLConfig eglConfig) { 47 //プログラムの生成 48 GLES.makeProgram();//(A) 49 50 //デプステストと光源の有効化 51 GLES20.glEnable(GLES20.GL_DEPTH_TEST); 52 GLES20.glUniform1i(GLES.useLightHandle,1); 53 54 //光源色の指定 55 GLES20.glUniform4f(GLES.lightAmbientHandle,0.2f,0.2f,0.2f,1.0f); 56 GLES20.glUniform4f(GLES.lightDiffuseHandle,0.7f,0.7f,0.7f,1.0f); 57 GLES20.glUniform4f(GLES.lightSpecularHandle,0.9f,0.9f,0.9f,1.0f); 58 59 //モデルデータの読み込み(2) 60 try { 61 background.figure=ObjLoader.load("back.obj"); 62 model.position.set(0.0f,0.0f,0.0f); 63 model.figure=ObjLoader.load("taiyou.obj");//(3)-[2] 64 model.position.set(0.0f,0.0f,0.0f); 65 model01.figure=ObjLoader.load("suisei.obj"); 66 model01.position.set(0.0f,0.0f,0.0f); 67 model02.figure=ObjLoader.load("kinsei.obj"); 68 model02.position.set(0.0f,0.0f,0.0f); 69 model03.figure=ObjLoader.load("tikyu.obj"); 70 model03.position.set(0.0f,0.0f,0.0f); 71 model04.figure=ObjLoader.load("kasei.obj"); 72 model04.position.set(0.0f,0.0f,0.0f); 73 model05.figure=ObjLoader.load("mokusei.obj"); 74 model05.position.set(0.0f,0.0f,0.0f); 75 model06.figure=ObjLoader.load("dosei.obj"); 76 model06.position.set(0.0f,0.0f,0.0f); 77 model07.figure=ObjLoader.load("tenousei.obj"); 78 model07.position.set(0.0f,0.0f,0.0f); 79 model08.figure=ObjLoader.load("kaiousei.obj"); 80 model08.position.set(0.0f,0.0f,0.0f); 81 } catch (Exception e) { 82 android.util.Log.e("debug",e.toString()); 83 for (StackTraceElement ste:e.getStackTrace()) { 84 android.util.Log.e("debug"," "+ste); 85 } 86 } 87 } 88 89 //画面サイズ変更時に呼ばれる 90 @Override 91 public void onSurfaceChanged(GL10 gl10,int w,int h) { 92 //ビューポート変換 93 GLES20.glViewport(0,0,w,h); 94 aspect=(float)w/(float)h; 95 } 96 97 //毎フレーム描画時に呼ばれる 98 @Override 99 public void onDrawFrame(GL10 gl10) { 100 //画面のクリア 101 GLES20.glClearColor(1.0f,1.0f,1.0f,1.0f); 102 GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT| 103 GLES20.GL_DEPTH_BUFFER_BIT); 104 105 //射影変換 106 Matrix.setIdentityM(GLES.pMatrix,0); 107 GLES.gluPerspective(GLES.pMatrix, 108 45.0f, //Y方向の画角 109 aspect, //アスペクト比 110 0.01f, //ニアクリップ 111 10000.0f);//ファークリップ 112 113 //光源位置の指定 114 GLES20.glUniform4f(GLES.lightPosHandle,5.0f,5.0f,5.0f,1.0f); 115 116 //ビュー変換 117 Matrix.setIdentityM(GLES.mMatrix,0); 118 GLES.gluLookAt(GLES.mMatrix, 119 0.0f,0.0f,55.0f, //カメラの視点 120 0.0f,0.8f,0.0f, //カメラの焦点 121 0.0f,1.0f,0.0f);//カメラの上方向 122 123 //モデル変換 124 background.rotate.set(0,100,0); 125 model.rotate.set(0,0,(angle++)/2);//(3)-[3] 126 model01.rotate.set(0,100,(angle++)/6); 127 model02.rotate.set(0,100,(angle++)/8); 128 model03.rotate.set(0,100,(angle++)/11); 129 model04.rotate.set(0,100,(angle++)/13); 130 model05.rotate.set(0,100,(angle++)/16); 131 model06.rotate.set(0,100,(angle++)/19); 132 model07.rotate.set(0,100,(angle++)/22); 133 model08.rotate.set(0,100,(angle++)/27); 134 135 //モデルの描画 136 background.draw(); 137 model.draw();//(3)-[4] 138 model01.draw(); 139 model02.draw(); 140 model03.draw(); 141 model04.draw(); 142 model05.draw(); 143 model06.draw(); 144 model07.draw(); 145 model08.draw(); 146 147 } 148 149 @Override 150public boolean onTouch(View v, MotionEvent event) { 151 152 switch ( event.getAction() ) { 153 //タッチ 154 case MotionEvent.ACTION_DOWN: 155 156 157 if(0 <= (float)event.getX() && 158 0 <= (float)event.getY()){ 159 160 161 162 } 163 164 break; 165 166 case MotionEvent.ACTION_UP: 167 break; 168 default: 169 break; 170 } 171 // TODO Auto-generated method stub 172 return true; 173 } 174 175}

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

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

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

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

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

guest

回答1

0

タッチした時の座標を取得して、3Dオブジェクトの領域内であれば、通知したいクラス(Activityですか?)に通知するようにするしかないですね。Observerの実装です。

レンダークラスしか添付されていないので、ざっくりコードで説明します。

余談ですが、添付されたコードで、OnTouchListenerをGLRenderクラスにimplementしていますが、OnTouchListenerは、抽象メソッドなので、GLSurfaceViewを拡張してsetOnTouchListener(GLRenderインスタンス)しないとonTouchは呼ばれないです。以下のコードでは、GLRenderインスタンスがすべての3Dオブジェクトの座標を保持している前提で実装しています。

public class YourActivity extends Activity implements YourSurfaceView.OnSpaceObjectTouchListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); YourSurfaceView yourSurfaceView = new YourSurfaceView(this); setContentView(mGLSurfaceView); //yourSurfaceView.requestFocus(); //yourSurfaceView.setFocusableInTouchMode(true); yourSurfaceView.setOnSpaceObjectTouchListener(this); } @Override public void onMokuseiTouch() { // YourCode } @Override public void onKinseiTouch() { // YourCode } @Override public void onTikyuuTouch() { // YourCode }   }
class YourSurfaceView extends GLSurfaceView { public YourSurfaceView(Context context) { super(context); mRenderer = new YourRenderer(); setRenderer(mRenderer); ‥//YourCode } public interface OnSpaceObjectTouchListener { void onMokuseiTouch(); void onKinseiTouch(); void onTikyuuTouch(); } private OnSpaceObjectTouchListener mOnSpaceObjectTouchListener; public void setOnSpaceObjectTouchListener(OnSpaceObjectTouchListener listener) { mOnSpaceObjectTouchListener = listener; } @Override public boolean onTouchEvent(MotionEvent e) { float x = e.getX(); float y = e.getY(); switch (e.getAction()) { case MotionEvent.ACTION_UP: if(mRendererを使って領域内判定。例えば地球を触ったら) { mOnSpaceObjectTouchListener.onTikyuuTouch(); } elseif (金星触ったら) { mOnSpaceObjectTouchListener.onKinseiTouch(); } ‥//YourCode } } ‥//YourCode }

投稿2015/02/02 22:50

usop

総合スコア64

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問