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

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

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

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

OpenGL

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

OpenGL ES

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

Q&A

解決済

1回答

1892閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

OpenGL

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

OpenGL ES

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

0グッド

0クリップ

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

投稿2016/11/10 19:14

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問