Intereting Posts
Выбор текста в Android в Webview Передача дополнительных данных в шейдер фрагмента через VBO – DynamicSpriteBatch Преобразование даты времени в формате «6 апреля 2012» Почему приложение-мессенджер получает сообщения при остановке приложения? Функция YouTubePlayerSupportFragment в элементе ListView имеет значение null Строка заголовка продолжает отображаться, даже с помощью requestWindowFeature или андроида: тема Android API8 setDisplayOrientation не влияет вообще Анимация затухания в градиенте формы формы Почему в проекте build.gradle для Android есть обычная «чистая» задача? Как протестировать обновление базы данных sqlite перед загрузкой новой версии моего приложения в игровой магазин в Android Выбор даты с датой по умолчанию Как запустить и отобразить результат команды оболочки ssh с помощью JSch? Цвета Xamarin, вызывающие ошибки сборки Android ADB Logcat – показывает полный логарифм Два пункта меню Spinner в ширине ActionBar

Android pinch / zoom и glfrustum

Я рисую несколько 2D-форм, используя OpenGL, и теперь я хочу добавить щепотку / масштабирование. Мой взгляд является перспективным (вид сверху). Я предположил, что это 3D с осью z = 0.

Теперь, как мне изменить glfrustum и добавить метод касания в мою деятельность, чтобы я мог ущипнуть / увеличить?

gl.glFrustumf(-ratio, ratio, -1, 1, 1, 25); 

Я думаю, что это должно быть что-то вроде

 gl.glFrustumf(-ratio, ratio, -1, 1, 1*zoom, 25*zoom); 

Но как должен быть записан сенсорный метод для изменения этого параметра масштабирования для двухкратного увеличения пальца?

Проблема в rendrer прямо сейчас, я добавляю метод масштабирования в конце, но в методе масштабирования он дает мне ошибку с gl.glfrustum, а на onsurfacechanged это не дает мне ошибку с тем же! Как я могу это исправить?

 public class GLrenderer implements Renderer { public GLqueue tri; public GLrenderer() { tri = new GLqueue(); } public void onSurfaceCreated(GL10 gl, EGLConfig eglConfig) { // TODO Auto-generated method stub gl.glDisable(GL10.GL_DITHER); gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); gl.glClearColor(.0f, .0f, .0f, 0f); gl.glClearDepthf(1f); } public void onDrawFrame(GL10 gl) { // TODO Auto-generated method stub gl.glDisable(GL10.GL_DITHER); gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_COLOR_BUFFER_BIT); gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); GLU.gluLookAt(gl, 0, 0, -5, 0, 0, 0, 0, 2, 0); //gl.glRotatef(1, 1, 0, 0); // gl.glRotatef(10, 0, 0, 1); tri.draw(gl); } public void onSurfaceChanged(GL10 gl, int width, int height ) { // TODO Auto-generated method stub gl.glViewport(0, 0, width, height); float ratio = (float) width / height; gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); gl.glFrustumf(-ratio, ratio, -1, 1, 1, 25); } public static void zoom(float d2) { // TODO Auto-generated method stub int zoom = (int) (zoom*d2); gl.glFrustumf(-ratio, ratio, -1, 1, 1*zoom, 25*zoom); } } 

Если у вас есть какое-то плавающее значение, которое определяет ваш масштаб, вы можете использовать это:

 glFrustum(left*zoom, right*zoom, bottom*zoom, top*zoom, near, far); 

Вот пример:

Выдержка из OnTouchListener

 public boolean onTouch(View v, MotionEvent event) { switch(event.getAction()){ case MotionEvent.ACTION_DOWN: pointers = 1; return true; case MotionEvent.ACTION_POINTER_2_DOWN: pointers = 2; distance = fingerDist(event); return true; case MotionEvent.ACTION_MOVE: if( pointers == 2 ){ float newDist = fingerDist(event); float d = distance/newDist; renderer.zoom(d); distance = newDist; } return true; default: return false; } } protected final float fingerDist(MotionEvent event){ float x = event.getX(0) - event.getX(1); float y = event.getY(0) - event.getY(1); return FloatMath.sqrt(x * x + y * y); } 

Из средства renderer :

 public final void zoom(float mult){ zoom *= mult; Matrix.frustumM( pMatrix, 0, zoom*left, zoom*right, zoom*bottom, zoom*top, near, far); } 

Обратите внимание, что этот код написан для gles 2.0, а не 1.0, поэтому вместо вызова Matrix.frustumM() вы вызываете gl.glFrustumf() . Возможно, вам придется отправить эту операцию в вашу gl-нить, чтобы она работала правильно.