rotation eines würfels

Status
Nicht offen für weitere Antworten.
G

Gast

Gast
moin,
will in java2D einen würfel rotieren lassen.
klingt relativ einfach, allerdings will ich dabei nicht auf den rotationsbefehl von java2d zugreifen; das ganze soll 'mathematisch' geschehen!
zu dem zweck habe ich den würfel aus eckpunkten aufgebaut, die um den ursprung rotieren sollen.
die methode, in der rotiert wird, ist folgende:
Code:
public void rotation(){
   double dir = .017453293;

   for(int i=0; i!=object.length; i++){

    int object_temp[][];
    object_temp = object;

    object_temp[i][0] = (int)Math.round(object[i][0]*Math.cos(dir)-object[i][1]*Math.sin(dir));
    object_temp[i][1] = (int)Math.round(object[i][0]*Math.sin(dir)+object[i][1]*Math.cos(dir));

    object = object_temp;
  }
 }
die for-schleife kümmert sich darum, dass alle punkte nacheinander rotiert werden, 'object_temp' wurde verwendet, um berechnungsfehler zu vermeiden.
die rotationsformeln hab ich internetseiten entnommen, bezweifle nicht, dass sie richtig sind.
im programm findet die rotation auch statt, allerdings wird das objekt durch das 'rotieren' verzerrt.
danke schonmal so im vorraus
 

Illuvatar

Top Contributor
Die Rotationsmatrix sieht eigentlich richtig aus. Ich finde es gerade etwas befremdlich, dass der Winkel in der Methode fest reincodiert ist, aber das sollte nichts daran ändern, dass es rotiert.
Ich würde jetzt eher vermuten, dass der Fehler woanders liegt.

Edit: Arg, nein die Methode ist falsch. ;)

Das Problem liegt in Zeilen 6 und 7. Ich hab mich auch kurz verwirren lassen, aber so erstellst du kein neues Objekt. Nach "object_temp = object" ist das ja beides die selbe Variable ;) Also bringt dir dein temp-Objekt so gar nichts.
Bevor du da jetzt dein ganzes Array in jedem Schleifendurchlauf dublizierst, würde ich dir raten, nur eine einfache temporäre int-Variable zu machen. In die kannst du dann immer object[0] speichern.
 
G

Gast

Gast
das mit dem temp war nur, weil die x-variable durch die berechnung verändert wird und im nachhinein die berechnung der y-variablen beeinflusst hätte...
klar, sieht seltsam aus, eine variable hätte für das 'x' gereicht, hab das allerdings ziemlich fix erstellt, wollte das feintunig später machen
 
G

Gast

Gast
hm, sieht nu so aus:
Code:
public void phys_rotation(){
   double dir = .017453293;

   for(int i=0; i!=object.length; i++){

    int temp = object[i][0];

    object[i][0] = (int)Math.round(object[i][0]*Math.cos(dir)-object[i][1]*Math.sin(dir));
    object[i][1] = (int)Math.round(temp*Math.sin(dir)+object[i][1]*Math.cos(dir));

   }
  }
funktioniert aber trotzdem nicht...
 

Illuvatar

Top Contributor
Tja, ich bin erstaunt, aber es funktioniert tatsächlich nicht :autsch:
Entweder das sind sehr arge Rundungsfehler, oder ich hab ein Brett vorm Kopf - ich hoffe letzteres.
Falls sich jemand anderes noch versuchen will - kompilierbarer Code:

Code:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class TestRotation extends JFrame
{
  public static void main (String... args)
  {
    new TestRotation();
  }
  
  public TestRotation()
  {
    super("Test Rotation");
    
    final RotableObject obj = new RotableObject(
                        new double[]{100,100},
                        new double[]{200,100},
                        new double[]{200,200},
                        new double[]{100,200});
                        
    final JComponent drawing = new JComponent(){
      @Override
      public void paintComponent(Graphics g)
      {
        g.translate(getSize().width / 2, getSize().height / 2);
        g.fillPolygon (obj.getPolygon());
      }
    };
    JButton rotationButton = new JButton("Rotate");
    rotationButton.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed (ActionEvent e)
      {
        obj.phys_rotation();
        drawing.repaint();
      }
    });
    
    setLayout(new BorderLayout());
    add (drawing, BorderLayout.CENTER);
    add (rotationButton, BorderLayout.SOUTH);
    setSize (800, 600);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setVisible(true);
  }
}

class RotableObject
{
  public double[][] object;
  
  public RotableObject(double[]... object)
  {
    this.object = object;
  }
  
  public Polygon getPolygon()
  {
    Polygon ret = new Polygon();
    for (double[] point : object) {
      ret.addPoint((int)point[0], (int)point[1]);
    }
    return ret;
  }
  
  public void phys_rotation(){
    double dir = .017453293;
    for(int i=0; i!=object.length; i++){
      double temp = object[i][0];
      object[i][0] = (double)Math.round(object[i][0]*Math.cos(dir)-object[i][1]*Math.sin(dir));
      object[i][1] = (double)Math.round(temp*Math.sin(dir)+object[i][1]*Math.cos(dir));
    }
  }
}
 

Developer_X

Top Contributor
Code:
import java.awt.*;
import java.applet.*;

public class Wuerfel extends Applet {

    // 8 Eckpunkte 1-8
    // mit je 3 Koordinaten 1,2,3
    double p[][] = new double[9][4];

    int x=1, y=2, z=3;

    public void init() {
        setBackground(new Color(255,255,255));

        // 8 Eckpunkte im lokalen Würfel-Koordinatensystem
        // Nullpunkt = Mittelpunkt
        p[1][x] = -100; p[1][y] = -100; p[1][z] = -100;
        p[2][x] = +100; p[2][y] = -100; p[2][z] = -100;
        p[3][x] = +100; p[3][y] = -100; p[3][z] = +100;
        p[4][x] = -100; p[4][y] = -100; p[4][z] = +100;
        p[5][x] = -100; p[5][y] = +100; p[5][z] = -100;
        p[6][x] = +100; p[6][y] = +100; p[6][z] = -100;
        p[7][x] = +100; p[7][y] = +100; p[7][z] = +100;
        p[8][x] = -100; p[8][y] = +100; p[8][z] = +100;

        //       8 - - - - - 7
        //     / |         / |
        //    5 - - - - - 6  |
        //    |  |        |  |
        //    |  4 - - - -|- 3
        //    | /         | /
        //    1 - - - - - 2
    }

    // Rotationswinkel in rad
    double angle_x = 0.01;
    double angle_y = 0.0075;
    double angle_z = 0.005;

    Image buffer;
    Graphics2D gBuffer;

    public void paint(Graphics g) {

        // Double-Buffering
        if (buffer==null) {
            buffer=createImage(this.getSize().width, this.getSize().height);
            gBuffer=(Graphics2D)buffer.getGraphics();
        }
        gBuffer.clearRect(0,0,this.getSize().width, this.getSize().height);

        // Antialiasing
        gBuffer.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);

        // Lokale Würfel-Koordinaten
        // in Welt-Koordinaten: +200
        gBuffer.drawLine((int)(p[1][x])+200,(int)(p[1][y])+200,
                         (int)(p[2][x])+200,(int)(p[2][y])+200);
        gBuffer.drawLine((int)(p[2][x])+200,(int)(p[2][y])+200,
                         (int)(p[3][x])+200,(int)(p[3][y])+200);
        gBuffer.drawLine((int)(p[3][x])+200,(int)(p[3][y])+200,
                         (int)(p[4][x])+200,(int)(p[4][y])+200);
        gBuffer.drawLine((int)(p[4][x])+200,(int)(p[4][y])+200,
                         (int)(p[1][x])+200,(int)(p[1][y])+200);
        gBuffer.drawLine((int)(p[5][x])+200,(int)(p[5][y])+200,
                         (int)(p[6][x])+200,(int)(p[6][y])+200);
        gBuffer.drawLine((int)(p[6][x])+200,(int)(p[6][y])+200,
                         (int)(p[7][x])+200,(int)(p[7][y])+200);
        gBuffer.drawLine((int)(p[7][x])+200,(int)(p[7][y])+200,
                         (int)(p[8][x])+200,(int)(p[8][y])+200);
        gBuffer.drawLine((int)(p[8][x])+200,(int)(p[8][y])+200,
                         (int)(p[5][x])+200,(int)(p[5][y])+200);
        gBuffer.drawLine((int)(p[1][x])+200,(int)(p[1][y])+200,
                         (int)(p[5][x])+200,(int)(p[5][y])+200);
        gBuffer.drawLine((int)(p[2][x])+200,(int)(p[2][y])+200,
                         (int)(p[6][x])+200,(int)(p[6][y])+200);
        gBuffer.drawLine((int)(p[3][x])+200,(int)(p[3][y])+200,
                         (int)(p[7][x])+200,(int)(p[7][y])+200);
        gBuffer.drawLine((int)(p[4][x])+200,(int)(p[4][y])+200,
                         (int)(p[8][x])+200,(int)(p[8][y])+200);

        g.drawImage (buffer, 0, 0, this);

        // Verzögerung
        try {Thread.sleep(10);}
        catch (InterruptedException e) {}

        double px, py, pz;

        for (int i=1;i<9;i++) {

            px = p[i][x];
            py = p[i][y];
            pz = p[i][z];

            // Rotation um x-Achse
            p[i][y] = py*Math.cos(angle_x)-pz*Math.sin(angle_x);
            p[i][z] = py*Math.sin(angle_x)+pz*Math.cos(angle_x);

            py = p[i][y];
            pz = p[i][z];

            // Rotation um y-Achse
            p[i][x] = px*Math.cos(angle_y)+pz*Math.sin(angle_y);
            p[i][z] =-px*Math.sin(angle_y)+pz*Math.cos(angle_y);

            px = p[i][x];

            // Rotation um z-Achse
            p[i][x] = px*Math.cos(angle_z)-py*Math.sin(angle_z);
            p[i][y] = py*Math.cos(angle_z)+px*Math.sin(angle_z);
        }

        repaint();
    }

    public void update(Graphics g) {paint(g);}
}
 

Fancy

Aktives Mitglied
Moin,

@Illuvatar und Gast:

warum macht ihr das (double)Math.round() darein? Ohne geht euer Beispiel problemlos...

Code:
object[i][0] = object[i][0]*Math.cos(dir)-object[i][1]*Math.sin(dir);
object[i][1] = temp*Math.sin(dir)+object[i][1]*Math.cos(dir);

Gruß,
Michael
 

Illuvatar

Top Contributor
Gnarf. Ich dachte mir doch, dass es an der Rundung in Integer liegt, deshalb hab ich die ints in doubles geändert.

Die round-Methode jetzt noch rauszunehmen, wäre natürlich irgendwie clever gewesen *kopf->tisch*
 
G

Gast

Gast
autsch, round()-methode!
jetze gehts bei mir auch
vielen dank leute, ihr habt mir sehr geholfen :D
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A 2-Achsen Rotation eines Würfels Spiele- und Multimedia-Programmierung 4
W Rotation eines Objektes Spiele- und Multimedia-Programmierung 2
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
P Rotation von Sprite klappt nicht Spiele- und Multimedia-Programmierung 4
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
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 3d-rotation Spiele- und Multimedia-Programmierung 4
N Seltsame Exception bei Code eines Spiele-Tutorials Spiele- und Multimedia-Programmierung 6
R Ideen für die Backend-Entwicklung eines Games gesucht Spiele- und Multimedia-Programmierung 8
A Programmieren eines Memorys mit Java (in Eclipse) Spiele- und Multimedia-Programmierung 5
T Position eines Image verändern mithilfe eines Timers Spiele- und Multimedia-Programmierung 6
E Programmierung eines 2.5D Point&Click Adventures ohne Spieleengine machbar? Spiele- und Multimedia-Programmierung 14
K Click innerhalb eines 45° gekippten Rechtecks Spiele- und Multimedia-Programmierung 9
J LibGdx_3D: Klamotten eines Charakters modifizieren Spiele- und Multimedia-Programmierung 2
K Erstellen eines Fotoalbums mit Java Spiele- und Multimedia-Programmierung 8
R Fehler beim Laden eines 2D-Bildes Spiele- und Multimedia-Programmierung 3
L OpenGL TransformationMatrix eines Flugzeugs Spiele- und Multimedia-Programmierung 2
M Programmierung eines "Fantasy Rollenspiels" Spiele- und Multimedia-Programmierung 5
E Laufanimation eines Sprites Spiele- und Multimedia-Programmierung 6
Finalspace Entwicklung eines Jump & Run Spiels Video-Tutorial Spiele- und Multimedia-Programmierung 12
T Hintergrundmusik eines Spiels mit Hilfe von JLayer Spiele- und Multimedia-Programmierung 12
M Cylinder anhand eines Vektors ausrichten (Java3d) Spiele- und Multimedia-Programmierung 0
M bewegen eines Objektes Spiele- und Multimedia-Programmierung 2
U Hilfe bei Implementierung eines PointSounds in Java3D Spiele- und Multimedia-Programmierung 1
gamebreiti Index eines Elements einer ArrayList abfragen Spiele- und Multimedia-Programmierung 1
X "Rebuffen" - Messen der Zeit eines Timers Spiele- und Multimedia-Programmierung 3
S Design eines Schachspiels Spiele- und Multimedia-Programmierung 3
S Mausklicks innerhalb eines JFrames/SWTBrowser ohne richtige Maus simulieren Spiele- und Multimedia-Programmierung 6
F Programmierung eines Bots Spiele- und Multimedia-Programmierung 23
A Wann ist ein Punkt inerhalb eines Polygons? Spiele- und Multimedia-Programmierung 2
F LWJGL Problem mit Erstellen eines Objekts und der Kamera Spiele- und Multimedia-Programmierung 5
R Drehen eines Bildes relativ zur Mauszeigerposition Spiele- und Multimedia-Programmierung 2
M Pattern zur Auswahl eines Objektes anhand vieler Kriterien Spiele- und Multimedia-Programmierung 2
H Skalierung eines Polygons ohne das es verschoben wird Spiele- und Multimedia-Programmierung 3
R Triangulation eines komplexen Polygons Spiele- und Multimedia-Programmierung 4
L Lwjgl Darstellung eines Kreises im Raum Spiele- und Multimedia-Programmierung 3
M Pixel eines BufferedImage bearbeiten (Performance) Spiele- und Multimedia-Programmierung 23
G Rotieren eines Objekts (2D) Spiele- und Multimedia-Programmierung 8
F nur Ausschnitt eines Image zeichnen Spiele- und Multimedia-Programmierung 9
S Umfang eines Polygons erzeugen Spiele- und Multimedia-Programmierung 1
D Highscoreliste eines Applets funktioniert online nicht Spiele- und Multimedia-Programmierung 4
W CannotRealizeException (jmf) beim abspielen eines liedes Spiele- und Multimedia-Programmierung 3
F Meine Aufgabe: Client-Server am Beispiel einer Implementation eines Tic-Tac-Toe Netzwerkspieles Spiele- und Multimedia-Programmierung 7
D Koordinaten eines 2D Sprites Spiele- und Multimedia-Programmierung 2
B Teile eines Bildes laden - BitBlk und drawImage Spiele- und Multimedia-Programmierung 3
S Interpolation eines Bildes Spiele- und Multimedia-Programmierung 6
S Problem beim laden eines Bildes in einer Methode Spiele- und Multimedia-Programmierung 14
N Bildposition innerhalb eines anderen Bildes ermitteln Spiele- und Multimedia-Programmierung 2
G Bewegung eines Grafikobjektes Spiele- und Multimedia-Programmierung 7
A Programmieren eines Bruchrechners Spiele- und Multimedia-Programmierung 3
H Decke zeichnen mit Hilfe eines Polygons Spiele- und Multimedia-Programmierung 2
J Rotieren eines 2D Images endet in Java heap space Error Spiele- und Multimedia-Programmierung 15
W Affine Transformation, Rotieren eines Objekts Spiele- und Multimedia-Programmierung 2
S fließende/bewegende Striche eines Auswahlrechtecks Spiele- und Multimedia-Programmierung 9
A Bounds eines gedrehten Objekts berechnen Spiele- und Multimedia-Programmierung 30
T Erstellen eines ausdruckbaren Formulars Spiele- und Multimedia-Programmierung 5
T Umsetzung eines 2D Jump and Runs Spiele- und Multimedia-Programmierung 7
T Brightness eines Bildes [DRINGEND] Spiele- und Multimedia-Programmierung 2
S Java3D - mehrere Instanzen eines Geometrieobjektes erzeugen Spiele- und Multimedia-Programmierung 3
ARadauer Grauwerte eines jpg ermitteln Spiele- und Multimedia-Programmierung 4
A Anzeigen eines Grapfen Spiele- und Multimedia-Programmierung 13
R Die korrekte Breite/Höhe eines Bildes wird nicht erkannt. Spiele- und Multimedia-Programmierung 2
S Problem bzgl. Umsetzung eines Rollenspiel Spiele- und Multimedia-Programmierung 6
M Ausschneiden eines Bereichs / Avatar Spiele- und Multimedia-Programmierung 2
G Ermitteln eines Punktes in einer anderen TransformGroup Spiele- und Multimedia-Programmierung 2
M Frage eines Anfängers Spiele- und Multimedia-Programmierung 3
DEvent [2D] Farbe bestimmten Pixels eines Bildes ändern Spiele- und Multimedia-Programmierung 3
V Wie berechnet man das Bild eines Schwarzen Loches in Java? Spiele- und Multimedia-Programmierung 10
G Breite eines Strings Spiele- und Multimedia-Programmierung 2
S Text an einer Seite eines Cubes Spiele- und Multimedia-Programmierung 7
F Image eines bestimmten Bereichs eines JPanels erstellen Spiele- und Multimedia-Programmierung 4
N Grafik als Hintergrund eines Rechtecks verwenden? Spiele- und Multimedia-Programmierung 4
N Rundenstrategiespiel - Problem beim Drehen eines Bildes Spiele- und Multimedia-Programmierung 18
F Brauche Hilfe bei Bewegung eines Rechtecks [Applet] Spiele- und Multimedia-Programmierung 5
T Java2D Spiel, beim Hinzufügen eines Bildes ruckelt das ganze Spiele- und Multimedia-Programmierung 3
F Position eines Objektes auslesen. Spiele- und Multimedia-Programmierung 7

Ähnliche Java Themen

Neue Themen


Oben