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

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

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

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

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

OpenGL ES

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

Q&A

解決済

ピンチ操作でのズーム操作からZoomControlsでのズーム操作に変更する方法を教えてください

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

OpenGL ES

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

1回答

0グッド

0クリップ

1753閲覧

投稿2016/11/06 09:44

###前提・実現したいこと
友人からもらったアプリを修正して機能追加することを考えていて
そのうちの一つにピンチ操作でズーム制御する方法を
虫眼鏡のZoomControlsによって置き換えられたらと思っております。

そこでズーム制御を行っている部分をコメントアウトで無効化し
ピンチ操作でのズーム操作は無効にすることができたので
ZoomControlsでの実装に移りました。

とりあえずまずはズーム操作からと思ったので
setOnZoomInClickListenerの実装に挑戦しました。

今までピンチ操作で座標の差から検出した値を計算して
それをMyRendererのTrancelateZに代入することでズームをしていたので
ZoomControlsにもクリックしたら1.0をTrancerateZに代入するように実装してみました。

エラーもなくビルドできたので実機で確認してみると
ZoomControlsのズームのボタンを押しても全くズームされません。

そこで質問なのですがZoomControlsでピンチ操作代わりのズームをしたいとき
どのように実装すればよいかご教授いただけると幸いです。

###該当のソースコード
MainActivityのZoomControlsの部分

java

1zoomControls.setOnZoomInClickListener(new View.OnClickListener() { 2 @Override 3 public void onClick(View view) { 4 scale = 1.0f; 5 if (myRenderer.TrancelateZ > 10.0f){ 6 myRenderer.TrancelateZ = 10.0f; 7 }else{ 8 myRenderer.TrancelateZ += scale; 9 } 10 } 11 });

MyRenderer(TrancelateZが定義されています)

java

1import android.opengl.GLSurfaceView; 2import android.opengl.GLU; 3import android.util.Log; 4 5import java.nio.ByteBuffer; 6import java.nio.ByteOrder; 7import java.nio.FloatBuffer; 8 9import javax.microedition.khronos.egl.EGLConfig; 10import javax.microedition.khronos.opengles.GL10; 11import javax.microedition.khronos.opengles.GL11; 12 13public class MyRenderer implements GLSurfaceView.Renderer { 14 15 Myaxis axis = new Myaxis(); 16 Calculation calculation = new Calculation(); 17 18 float RotateX = 0; 19 float RotateY = 0; 20 float TrancelateZ = 0; 21 22 @Override 23 public void onDrawFrame(GL10 gl) { 24 25 long start = System.currentTimeMillis(); 26 27 gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f); 28 gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 29 30 gl.glMatrixMode(GL10.GL_MODELVIEW); 31 gl.glLoadIdentity(); 32 33 gl.glTranslatef(0.0f, 0.0f, TrancelateZ - 10.0f); 34 35 gl.glRotatef(RotateX, 0, 1, 0); 36 gl.glRotatef(RotateY, 1, 0, 0); 37 38 long end = System.currentTimeMillis(); 39 Log.v("1FrameTime", String.valueOf((end - start) + "ms")); 40 } 41 42 @Override 43 public void onSurfaceChanged(GL10 gl, int width, int height){ 44 45 gl.glViewport(0, 0, width, height); 46 47 Log.v("Wピクセル", String.valueOf((width))); 48 Log.v("Hピクセル", String.valueOf((height))); 49 50 gl.glMatrixMode(GL10.GL_PROJECTION); 51 gl.glLoadIdentity(); 52 GLU.gluPerspective(gl, 45f,(float) width / height, 1f, 50f); 53 54 } 55 56 @Override 57 public void onSurfaceCreated(GL10 gl, EGLConfig config){ 58 59 gl.glDepthFunc(GL10.GL_LESS); 60 gl.glEnable(GL10.GL_DEPTH_TEST); 61 gl.glEnable(GL10.GL_NORMALIZE); 62 gl.glEnable(GL10.GL_CULL_FACE); 63 64 gl.glEnable(GL10.GL_LIGHTING); 65 gl.glEnable(GL10.GL_LIGHT0); 66 gl.glEnable(GL10.GL_LIGHT1); 67 68 float Light0Position[] = {0.0f, 100.0f, 100.0f, 1.0f}; 69 float Light1Position[] = {0.0f, -100.0f, 100.0f, 0.0f}; 70 float LightStrong[] = {0.5f, 0.5f, 0.5f, 0.0f}; 71 float LightWeak[] = {0.2f, 0.2f, 0.2f, 0.0f}; 72 73 FloatBuffer Light0Position_buff = null; 74 FloatBuffer Light1Position_buff = null; 75 FloatBuffer LightStrong_buff = null; 76 FloatBuffer LightWeak_buff = null; 77 78 Light0Position_buff = toBuffer(Light0Position, Light0Position_buff); 79 Light1Position_buff = toBuffer(Light1Position, Light1Position_buff); 80 LightStrong_buff = toBuffer(LightStrong, LightStrong_buff); 81 LightWeak_buff = toBuffer(LightWeak, LightWeak_buff); 82 83 gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION,Light0Position_buff); 84 gl.glLightfv(GL10.GL_LIGHT1, GL10.GL_POSITION,Light1Position_buff); 85 86 gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, LightStrong_buff); 87 gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_SPECULAR, LightStrong_buff); 88 gl.glLightfv(GL10.GL_LIGHT1, GL10.GL_DIFFUSE, LightWeak_buff); 89 gl.glLightfv(GL10.GL_LIGHT1, GL10.GL_SPECULAR, LightWeak_buff); 90 91 } 92 93 private FloatBuffer toBuffer(float[] myarray, FloatBuffer mybuffer) { 94 ByteBuffer vbb = ByteBuffer.allocateDirect(myarray.length * 4); 95 vbb.order(ByteOrder.nativeOrder()); 96 mybuffer = vbb.asFloatBuffer(); 97 mybuffer.put(myarray); 98 mybuffer.position(0); 99 return mybuffer; 100 } 101 102} 103

MyGLView(ズーム操作が書かれたクラスです)

java

1import android.content.Context; 2import android.opengl.GLSurfaceView; 3import android.view.MotionEvent; 4 5 6public class MyGLView extends GLSurfaceView { 7 MyRenderer myRenderer; 8 9 public MyGLView(Context context) { 10 super (context); 11 myRenderer = new MyRenderer(); 12 setRenderer(myRenderer); 13 14 } 15 16 final float TOUCH_SCALE_FACTOR = 0.2f;//スクロール回転の重み 17 final float MULTI_TOUCH_SCALE_FACTOR = 0.01f;//スクロールズームの重み 18 private float mPreviousX0; 19 private float mPreviousY0; 20 private float mPreviousX1; 21 private float mPreviousY1; 22 23 @Override 24 public boolean onTouchEvent(MotionEvent event) { 25 int Action = event.getAction(); 26 int Count = event.getPointerCount(); 27 float X0 = event.getX(0); 28 float Y0 = event.getY(0); 29 float X1 = (Count >= 2) ? ((float)event.getX(1)) : X0; 30 float Y1 = (Count >= 2) ? ((float)event.getY(1)) : Y0; 31 switch (Action & MotionEvent.ACTION_MASK) { 32 case MotionEvent.ACTION_UP: 33 break; 34 case MotionEvent.ACTION_POINTER_UP: 35 break; 36 case MotionEvent.ACTION_MOVE: 37 if(Count == 1) { 38 //回転制御 39 float DX0 = X0 - mPreviousX0; 40 float DY0 = Y0 - mPreviousY0; 41 myRenderer.RotateX += DX0 * TOUCH_SCALE_FACTOR; 42 myRenderer.RotateY += DY0 * TOUCH_SCALE_FACTOR; 43 44 }else{ 45 break; 46 /* 47 //ズーム制御無効化 48 float DX = X0 - X1; 49 float DY = Y0 - Y1; 50 float PreviousDX = mPreviousX0 - mPreviousX1; 51 float PreviousDY = mPreviousY0 - mPreviousY1; 52 float SquareDX = DX * DX; 53 float SquareDY = DY * DY; 54 float SquarePreviousDX = PreviousDX * PreviousDX; 55 float SquarePreviousDY = PreviousDY * PreviousDY; 56 float RootSquareDXY = (float) Math.sqrt(SquareDX + SquareDY); 57 float RootSquarePreviousDXY = (float) Math.sqrt(SquarePreviousDX + SquarePreviousDY); 58 if (myRenderer.TrancelateZ > 10.0f) { 59 myRenderer.TrancelateZ = 10.0f; 60 }else{ 61 myRenderer.TrancelateZ += (RootSquareDXY - RootSquarePreviousDXY) * MULTI_TOUCH_SCALE_FACTOR; 62 } 63 */} 64 } 65 mPreviousX0 = X0; 66 mPreviousY0 = Y0; 67 mPreviousX1 = X1; 68 mPreviousY1 = Y1; 69 return true; 70 } 71 72} 73

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

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

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

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

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

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

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

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

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

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

回答1

1

ベストアンサー

「MyRenderer.TrancelateZ」の部分を「MyGLView.MyRenderer.TrancelateZ」とすれば解決しました。

投稿2016/11/10 19:14

退会済みユーザー

退会済みユーザー

総合スコア0

gin👍を押しています

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

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

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

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

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

Java

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

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

OpenGL ES

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