Rotation von Sprite klappt nicht

Paladin

Bekanntes Mitglied
Liebe Community,

bisher habe ich eigentlich keine Erfahrung mit der Programmierung von Spielen. Ich habe mir vorgenommen mal ein kleines Spiel in Java zu Programmieren um zu sehen wie gut oder schlecht Java dafür geeignet ist / bzw. wo ich konkret auf Probleme stoße.

Für die Entwicklung des Spiels verwende ich LWJGL und das funktioniert soweit ganz gut. Also Sprites darstellen, bewegen, Kollision usw. funktioniert problemlos. Derzeit scheitere ich daran, einen einfachen Sprite auf dem Bildschirm (rotiert) darzustellen. Ich versuche einen Tacho (wie aus dem Auto) auf dem Screen darzustellen. Dazu habe ich einen Sprite für das Tachoblatt (der wird nicht gedreht angezeigt) und einen Sprite für die Tachonadel. Die Schwierigkeit ist hier, dass der Drehpunkt der Tachonadel nicht die Mitte des Sprites ist (sondern am unteren mittleren Rand des Bildes).

Ich habe bei Google schon einen Haufen Information zu dem Problem gefunden und mir daraus einen Quelltext zusammengesetzt der teilweise funktioniert. Was mir aber nicht gelingt ist die korrekte Drehung der Tachonadel um den Ursprung (der ja nicht in der Mitte des Bildes sonder am unteren mittleren Rand des Bildes ist). Der Effekt ist, dass der Sprite "umherwandert".

Hier mein aktueller Code zur Anzeige des Sprites:

1) Diese Funktion erzeugt eine rotierte Variante des Originalbildes

Java:
public BufferedImage getRotatedImage(int angle) {
  //buf ist das Originalbild (Tachonadel)
  double width = buf.getWidth();
  double height = buf.getHeight();
  double sin = Math.abs(Math.sin(Math.toRadians(angle)));
  double cos = Math.abs(Math.cos(Math.toRadians(angle)));

  //Berechne Größe für neues Bild
  int neww = (int)Math.round(((width)*cos)+(height*sin));
  int newh = (int)Math.round((height*cos)+((width)*sin));
  BufferedImage dimg = new BufferedImage(neww, newh, buf.getType());
  Graphics2D g = dimg.createGraphics();
  g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
  g.translate((neww-width)/2, (newh-height)/2);
  g.rotate(Math.toRadians(angle), width/2, newh/2);
  g.drawRenderedImage(buf, null);
  return dimg;
}

2) Diese Funktion erzeugt eine Textur aus dem rotierten Bild

Java:
public int getRotatedTexture(int angle) {
  tmpBuf = getRotatedImage(angle);
  try {
    this.setTmpTex(BufferedImageUtil.getTexture("", tmpBuf));
  } catch (IOException e) {
  // TODO Auto-generated catch block
    e.printStackTrace();
  }

  int[] pixels = new int[tmpBuf.getWidth() * tmpBuf.getHeight()];
  tmpBuf.getRGB(0, 0, tmpBuf.getWidth(), tmpBuf.getHeight(), pixels, 0, tmpBuf.getWidth());
  byteBuffer = BufferUtils.createByteBuffer(tmpBuf.getWidth() * tmpBuf.getHeight() *  
  BYTES_PER_PIXEL);
  for(int y = 0; y < tmpBuf.getHeight(); y++) {
    for(int x = 0; x < tmpBuf.getWidth(); x++) {
      int pixel = pixels[y * tmpBuf.getWidth() + x];
      byteBuffer.put((byte) ((pixel >> 16) & 0xFF));     // Red component
      byteBuffer.put((byte) ((pixel >> 8) & 0xFF));      // Green component
      byteBuffer.put((byte) (pixel & 0xFF));               // Blue component
      byteBuffer.put((byte) ((pixel >> 24) & 0xFF));    // Alpha component. Only for RGBA
    }
  }
		
  byteBuffer.flip();
	
  textureID = GL11.glGenTextures();
  GL11.glEnable(GL11.GL_TEXTURE_2D);
  GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureID);
  GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
  GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
  GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, tmpBuf.getWidth(),   tmpBuf.getHeight(), 0, GL11.GL_RGBA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, byteBuffer);
  return textureID;
}

3) Diese Funktion zeigt das Bild auf dem Screen an

Java:
public void drawPolygon1(int id, int x, int y, int rotation) {
  GL11.glPushMatrix();
  GL11.glTranslatef(x, y, 0);

  //Erzeuge eine Textur(rotiert) von dem gewünschten Sprite
  settings.getSprite(id).getSpritePolygon().getRotatedTexture(rotation);
  tmpTex = settings.getSprite(id).getSpritePolygon().getTmpTex();
	
  GL11.glBegin(GL11.GL_QUADS);
  {
    GL11.glTexCoord2f(0,0);
    GL11.glVertex2f(0,0);
    GL11.glTexCoord2f(1,0);
    GL11.glVertex2f(tmpTex.getImageWidth(),0);
    GL11.glTexCoord2f(1,1);
    GL11.glVertex2f(tmpTex.getImageWidth(),tmpTex.getImageHeight());
    GL11.glTexCoord2f(0,1);
    GL11.glVertex2f(0,tmpTex.getImageHeight());
  }
  GL11.glEnd();
  GL11.glPopMatrix();
}

Ich sitze an diesem Problem jetzt schon einige Tage und komme einfach nicht auf die Lösung. Sicherlich sind meine mangelnden Kenntnisse in Mathematik auch nicht gerade förderlich aber vielleicht könnt Ihr mir ja einen Hinweis geben wie ich weiterkomme.

Viele Grüße

Paladin
 

Paladin

Bekanntes Mitglied
Ich habe folgendes versucht:

1) Erst den Ursprung zum Rotationspunkt verschieben.
GL11.glTranslatef((x+(tmpTex.getWidth()/2)), (y+(tmpTex.getHeight()-5)), 0);

2) Dann die Rotation
GL11.glRotatef((float)Float.valueOf(rotation),0.0f,0.0f,1.0f);

Das klappt zwar so (die Textur dreht sich) aber die Drehung erfolgt nicht über den von mir gewünschten Punkt. Konkret im Falle der Tachonadel: Der Drehpunkt der Grafik ist die Spitze der Tachonadel.
 
Zuletzt bearbeitet:

Marco13

Top Contributor
3. ... und wieder zurück - quasi so wie es in der Methode von AffineTransform (Java Platform SE 6) beschrieben ist, die auch interessant sein könnte, FALLS du das wirklich manuell rotieren wolltest - was aber vermutlich nicht der Fall ist (das könnte zwar auch davon abhängen, ob die Rotation nur einmal am Anfang gemacht wird, oder sie sich ständig ändert, aber in keinem Fall würde ich spontan einen konkreten Anlass sehen, ein rotiertes BufferedImage-Textur zu erstellen...)
 

Paladin

Bekanntes Mitglied
Ok, das klappt. Ich habe das zweite Translate vergessen (und nebenbei noch gelernt, dass man sich den manuellen Aufwand sparen kann).

Danke Marco

Paladin
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
BraunBerry Rotation mit Radiusänderung Spiele- und Multimedia-Programmierung 0
BraunBerry Rotation von Objekten um ein Raumschiff Spiele- und Multimedia-Programmierung 6
E Rotation um Bildmittelpunkt ohne Affine Transform!!!!! Spiele- und Multimedia-Programmierung 13
RalleYTN LWJGL Rotation Spiele- und Multimedia-Programmierung 1
J Java 3d Rotation Spiele- und Multimedia-Programmierung 6
B j3d Rotation um mehr als eine Achse Spiele- und Multimedia-Programmierung 9
B j3d Kamera Rotation durch Tastendruck Spiele- und Multimedia-Programmierung 12
H Rotation auf Knopfdruck Spiele- und Multimedia-Programmierung 20
T [gelöst] Java3D: Unerwünschte Rotation um die 3.Achse vermeiden? Spiele- und Multimedia-Programmierung 3
W Rotation aller Objekte einer 3D-Szene Spiele- und Multimedia-Programmierung 8
V Jogl: Objekt trotz Rotation immer in gleiche Richtung bewegen Spiele- und Multimedia-Programmierung 5
E Tetris: Rotation der Tetrominos Spiele- und Multimedia-Programmierung 4
C Java3D Rotation um einen Punkt (y-achse) Spiele- und Multimedia-Programmierung 2
aze Transform3D - dauerhafte Rotation Spiele- und Multimedia-Programmierung 3
J Hilfe: Rotation X und Y Achse (Java3d) Spiele- und Multimedia-Programmierung 12
C JAVA3D Rotation um einen bestimmten Punkt Spiele- und Multimedia-Programmierung 20
"Er" Kamera rotation in Java3D Spiele- und Multimedia-Programmierung 2
R Tetris Rotation? Spiele- und Multimedia-Programmierung 7
P Figur Rotation Spiele- und Multimedia-Programmierung 14
G rotation eines würfels Spiele- und Multimedia-Programmierung 9
T Java3D: Rotation und Translation Spiele- und Multimedia-Programmierung 2
S Rotation relativ zur Rotation einer anderen Transform Group Spiele- und Multimedia-Programmierung 3
S Rotation um verschobene Achse Spiele- und Multimedia-Programmierung 7
Quaxli Java 3D - Rotation mit Alpha Spiele- und Multimedia-Programmierung 2
H Probleme bei Rotation Spiele- und Multimedia-Programmierung 9
P Rotation von BufferedImage (Affine Transformation) Spiele- und Multimedia-Programmierung 7
J Problem mit Rotation (Sprite3D) Spiele- und Multimedia-Programmierung 4
S Punkt berechnen, nach Rotation Spiele- und Multimedia-Programmierung 2
W Rotation eines Objektes Spiele- und Multimedia-Programmierung 2
W 3d-rotation Spiele- und Multimedia-Programmierung 4
A 2-Achsen Rotation eines Würfels Spiele- und Multimedia-Programmierung 4
Creylon [LWJGL] 2D Sprite Rotieren/Drehen Spiele- und Multimedia-Programmierung 6
S 2D Sprite Level Editor Konzeptfrage Spiele- und Multimedia-Programmierung 17
M Sprite Library (in Anlehnung an Quaxli) Spiele- und Multimedia-Programmierung 14
X JOGL - 2D Sprite richtig platzieren Spiele- und Multimedia-Programmierung 4
F LWJGL Sprite Overlay Problem (halbtransparent) Spiele- und Multimedia-Programmierung 2
D Sprite zur Maus bewegen Spiele- und Multimedia-Programmierung 9
P RPG Sprite-Player Anim Problem Spiele- und Multimedia-Programmierung 11
ThoraxLaneus Minecraft MCP-Client mit Optifine fertig machen in IntelliJ klappt nicht ganz Spiele- und Multimedia-Programmierung 6
N Bild zu zeichnen (drawImage) klappt nur manchmal?? Spiele- und Multimedia-Programmierung 8

Ähnliche Java Themen

Neue Themen


Oben