OpenGL ES: Zoom und pan springen immer wieder zur Ausgangsposition zurück

Tschulz

Mitglied
Hallo,
ich möchte eine Zoom- und Pan-Funktion in OpenGL implementieren. Das ganze funktioniert auch soweit. Meine SurfaceView class enthält einen TouchHandler und berechnet den Wert um den die ModelMatrix skaliert werden soll. Doch jedes Mal wenn ich erneut zoomen möchte springt das Objekt zuerst auf die Ausgangsposition zurück bevor gezoomt wird. Das gleiche gilt für die Pan-Funktion.

Kann mir jemand sagen, was ich ändern muss, damit von der aktuellen Position aus gezoomt wird?
Vielen Dank!

Hier ist mein Code-Snippet aus der Renderer-Klasse:

Code:
public class renderer implements GLSurfaceView.Renderer {

	public float scale;

	public renderer() {


		Squares = new Objects();
	}

	public void onDrawFrame(GL10 gl) {
		gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
		gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

		gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

		gl.glMatrixMode(GL10.GL_MODELVIEW);
		gl.glLoadIdentity();
		gl.glScalef(scale, scale, 1); // Zoom
		gl.glRotatef(-15.0f, 1.0f, 0.0f, 0.0f); // Rotieren im Perspektive zu erzeugen


		Squares.draw(gl);

	}
 

Tschulz

Mitglied
Die Version mit pan ist

Code:
public class renderer implements GLSurfaceView.Renderer {

	public float scale;
	public float panX;
	public float panY;
	

	public renderer() {
		Squares = new Objects();
	}

	public void onDrawFrame(GL10 gl) {
		gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
		gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

		gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

		gl.glMatrixMode(GL10.GL_MODELVIEW);
		gl.glLoadIdentity();
		gl.glScalef(scale, scale, 1); // Zoom
		gl.glRotatef(-15.0f, 1.0f, 0.0f, 0.0f); // Rotieren im Perspektive zu erzeugen

		gl.glTranslatef(panX, 0, panY); // pan

		Squares.draw(gl);


scale und pan werden hier verändert:

Code:
package Jules.pack.age;

import android.content.Context;
import android.graphics.PointF;
import android.opengl.GLSurfaceView;
import android.util.AttributeSet;
import android.util.FloatMath;
import android.util.Log;
import android.view.MotionEvent;

public class SurfaceView extends GLSurfaceView {
	private renderer mRenderer;

	// Remember some things for zooming

	float oldDist;
	float oldX;
	float oldY;
	float newX;
	float newY ;

	static final int NONE = 0;
	static final int DRAG = 1;
	static final int ZOOM = 2;
	int mode = NONE;

	public SurfaceView(Context context) {
		super(context);
	}

	public void showRenderer(renderer renderer) {
		this.mRenderer = renderer;
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {

		switch (event.getAction() & MotionEvent.ACTION_MASK) {
		case MotionEvent.ACTION_DOWN:
			oldX = event.getX();
			oldY = event.getY();
			mode = DRAG;
			break;
		case MotionEvent.ACTION_POINTER_DOWN:
			oldDist = spacing(event);
			if (oldDist > 10f) {
				mode = ZOOM;
			}
			break;
		case MotionEvent.ACTION_UP:

		case MotionEvent.ACTION_POINTER_UP:
			mode = NONE;

			break;
		case MotionEvent.ACTION_MOVE:
			if (mode == DRAG) {
				newX = event.getX();
				newY = event.getY();

				float dx = (newX - oldX);
				float dy = (newY - oldY);

				mRenderer.panX = dx;
				mRenderer.panY = -dy;

			} else if (mode == ZOOM) {
				float newDist = spacing(event);

				 if (newDist > 10f) {
				float scale = newDist / oldDist;

				mRenderer.scale = scale;
				 }
			}
			break;
		}
		return true;
	}

	// Abstand zwischen zwei Fingern
	private float spacing(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);
	}


}
 

Marco13

Top Contributor
Ja, die Werte werden ja jedes mal neu gesetzt... GANZ grob sowas wie
Java:
// Weg
//				mRenderer.panX =dx;
//				mRenderer.panY = -dy;
// Hin
				mRenderer.panX +=dx;
				mRenderer.panY += -dy;

//Weg
//				mRenderer.scale = scale;
				mRenderer.scale *= scale;

Über Details und Faktoren muss man sich dann noch genauer Gedanken machen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Zu bestimmte Stellen im code springen? Frameworks - Spring, Play, Blade, Vaadin & Co 8
Xentox501 Jump & Run: Beim springen bewegen(rechts,links) Frameworks - Spring, Play, Blade, Vaadin & Co 1
R Player springen lassen mit Gravity Frameworks - Spring, Play, Blade, Vaadin & Co 2
B Springen mit Collision Detection? Frameworks - Spring, Play, Blade, Vaadin & Co 15
it_is_all Springen zw. JPanels mit setVisible() Frameworks - Spring, Play, Blade, Vaadin & Co 4
C Suche Tutorial für - Spielfiguren springen lassen Frameworks - Spring, Play, Blade, Vaadin & Co 4
A Springen an Seitenanfang verhindern Frameworks - Spring, Play, Blade, Vaadin & Co 5
G Springen mithilfe von Trigonometrie Frameworks - Spring, Play, Blade, Vaadin & Co 4
J Spieler springen lassen Frameworks - Spring, Play, Blade, Vaadin & Co 24
Paul15 Nach vorne springen Frameworks - Spring, Play, Blade, Vaadin & Co 4
A RadioButtons springen nicht automatisch auf false Frameworks - Spring, Play, Blade, Vaadin & Co 3
S Von A nach B springen Frameworks - Spring, Play, Blade, Vaadin & Co 7
D Zum Code springen Frameworks - Spring, Play, Blade, Vaadin & Co 5
T DesktopPane mit GridLayout ohne, dass Fenster springen Frameworks - Spring, Play, Blade, Vaadin & Co 14
K von Button zu Zelle in Tabelle- zu anderer Zelle springen Frameworks - Spring, Play, Blade, Vaadin & Co 2
F.S.WhiTeY JSF: h:dataTable / p:DataGrid : Pagination und alphabetisch springen Frameworks - Spring, Play, Blade, Vaadin & Co 2
? In GZIPInputStream "springen" Frameworks - Spring, Play, Blade, Vaadin & Co 1
L \n , in die nächste Zeile springen Frameworks - Spring, Play, Blade, Vaadin & Co 11
M Zum Anfang eines Programmes springen Frameworks - Spring, Play, Blade, Vaadin & Co 2
S ...aus while schleife springen Frameworks - Spring, Play, Blade, Vaadin & Co 3
C Vom Case zur Case-Auswahl springen? Frameworks - Spring, Play, Blade, Vaadin & Co 9
R Txt Datei mit Notepad öffnen und zu bestimmter Zeile springen Frameworks - Spring, Play, Blade, Vaadin & Co 12
F GUI Seiten springen + Timer mit Eingabe Frameworks - Spring, Play, Blade, Vaadin & Co 8
G Cursor Positionieren/mit Tabulator springen? Frameworks - Spring, Play, Blade, Vaadin & Co 8
F In NetBeans zum nächsten Fehler springen Frameworks - Spring, Play, Blade, Vaadin & Co 7
K Zu Fehler im Projekt springen Frameworks - Spring, Play, Blade, Vaadin & Co 2
K Per Tastaturbefehl zu nächstem Lesezeichen springen Frameworks - Spring, Play, Blade, Vaadin & Co 2
J Zur Auffälligkeit springen - Shortcut Frameworks - Spring, Play, Blade, Vaadin & Co 7
E JTable neue Zeile springen?! Frameworks - Spring, Play, Blade, Vaadin & Co 1
L Wenn Aufgaben erledigt sind, auf Programmanfang springen? Frameworks - Spring, Play, Blade, Vaadin & Co 12
J zu einer Zeile zürück springen Frameworks - Spring, Play, Blade, Vaadin & Co 9
R JEditorPane an bestimmte Stelle springen Frameworks - Spring, Play, Blade, Vaadin & Co 2
S Direkt zur Methode springen die in der Klasse und nicht im Interface implementiert? Frameworks - Spring, Play, Blade, Vaadin & Co 4

Ähnliche Java Themen

Neue Themen


Oben