Bitmap um gewählten Pixel drehen


#1

Hey Leute!

Ich habe vor einer Weile mit Android angefangen und arbeite zur Zeit an ein paar kleinen Apps (Als Übungen).
Nach ein paar weiteren Tests möchte mit einem 2d Rollenspiel für Android starten.

Um bestimmte Animationen zu generieren nehme ich die einzelnen Bestandteile davon, setze sie an die richtigen Koordinaten und drehe sie teilweise. Daraus werden dann Sprites generiert.

Als ich noch nicht mit Android gearbeitet hatte habe ich immer folgende Funktion zum Rotieren von Bildern verwendet:

  private BufferedImage rotateImage(BufferedImage src, double degrees, int x, int y){
    AffineTransform affineTransform = AffineTransform.getRotateInstance(Math.toRadians(degrees), x, y);

//Vergrösserung des Bildes damit jeder gedrehte Pixel auf das Bild passt
    BufferedImage rotatedImage = new BufferedImage(
      src.getWidth() + (int)(src.getWidth() * 1.2D), 
      src.getHeight() + (int)(src.getHeight() * 1.2D), 
      src.getType());

    Graphics2D g = (Graphics2D)rotatedImage.getGraphics();
    g.setTransform(affineTransform);
    g.drawImage(src, 0, 0, null);
    return rotatedImage;
  }

Die Funktion dreht das Bild um den Punkt XY um B Grad.

Damit kann ich zum Beispiel eine schöne Armbewegung generieren, wenn ich den Arm einfach immer um den selben Punkt an der Schulter drehe.

Leider wird die Klasse BufferedImage von Android nicht mehr unterstützt :confused:

Also habe ich versucht mit Bitmaps zu arbeiten:

	private Bitmap rotateImage(Bitmap src, float degrees, int x, int y, double expansion){
		if(degrees==0){
			return src;
		}
		
						
		if ((x == 0) && (y == 0)) {
			x = src.getWidth() / 2;
			y = src.getHeight() / 2;
		}
		
		Matrix m = new Matrix();
		m.postRotate(degrees, x, y);

		Bitmap rotatedBitmap = Bitmap.createBitmap(src , 0, 0, (int)(src.getWidth()), (int)(src.getHeight()), m, true);

		return rotatedBitmap;		
	}

Aber irgendwie wird das Bild nicht um den ausgewählten Punkt gedreht?
Ich versuche jetzt schon seit ein paar Tagen die Animationen in den Griff zu kriegen, aber irgendwie dreht sich der Arm immer falsch.

Ich habe auch schon versucht zuerst das Bild um das Zentrum zu drehen, und dann um XY zu verschieben aber das hat auch nicht geklappt.

Der Animationen-Generator ist für das Spiel lebensnotwendig (Spieler können zum Teil ihre eigenen Charaktere erstellen) deshalb komme ich auch nicht drumherum…

Habt ihr vielleicht irgendwelchen Ideen wie man das Problem lösen könnte?
Ich wäre wirklich sehr froh über ein paar Antworten…


#2

Sorry, keine konkrete Hilfe, aber: Erkennt man, um WELCHEN Punkt das Bild tatsächlich gedreht wird? (Ich tippe mal auf “oben links”…!?)


#3

Zuerst mal danke für die Antwort :slight_smile:

Ich bin mir ehrlich gesagt nicht ganz sicher wie sich das Bild dreht…
Testweise habe ich mal einen Quader mit einem markierten Punkt gezeichnet und dann versucht das Bild um diesen Punkt zu drehen:

Das Bild vergrössert sich automatisch wenn es gedreht wird und dadurch verschieben sich die ganzen Pixel.

Allerdings habe ich jetzt eine Lösung gefunden :slight_smile:
Anstatt das Teil-Bild erst zu drehen und dann einzufügen lasse ich es jetzt einfach direkt mit der Matrix auf das Haupt-Bild zeichnen:

//CGSPLocation ist eine eigene Klasse welche die genauen Daten der einzelnen Bild-Teile wie zum Beispiel Position und Rotation verwaltet.
	public void drawPartNew(Canvas c, CGSPLocation loc, Bitmap i){
		if(loc.getRotation()==0){
			c.drawBitmap(i, loc.getX(), loc.getY(), null);
			return;
		}

		Matrix m = new Matrix();
		m.postRotate(-loc.getRotation(),loc.getRotationX(),loc.getRotationY());
		m.postTranslate(+loc.getX(), +loc.getY());
		c.drawBitmap(i, m, null);	

	}```

Scheint soweit eigentlich zu funktionieren :)