[JAVA] 3D WireModel aus einzelnen Teilen zusammensetzen

Wincenty

PCGHX-HWbot-Member (m/w)
Hallo,
ich habe als Hausaufgabe ein Wire 3D Model zu erstellen und habe ein Schwert zusammengeschustert.
Nun da ich die Dimensionen für das WireFrameViewer etwas groß genommen hat und somit bei bestimmten Blickwinkel absolute Desorientiertheit und Chaos herrschen wollte ich das Object in einzelne Segmente zerlegen und dann mittels My3DObject zusammensetzen lassen im Viewer.

Hier der WireFrameViewer dann ich vom Prof. bekommen hab:

Code:
import java.applet.Applet;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class WireFrameViewer extends Applet implements MouseListener, MouseMotionListener {

   int width, height;
   int mx, my;  // the most recently recorded mouse coordinates

   Image backbuffer;
   Graphics backg;

   int azimuth = 180, elevation = 30;
My3DObject e = new My3DObject(2);  //Hier muss My3DObject geändert werden, wenn man eines des Teile sehen will

   public void init() {
       this.setSize(new Dimension(1000,1000));
      width = getSize().width;
      height = getSize().height;
      backbuffer = createImage( width, height );
      backg = backbuffer.getGraphics();
      drawWireframe( backg );

      addMouseListener( this );
      addMouseMotionListener( this );
   }

   void drawWireframe( Graphics g ) {

      // compute coefficients for the projection
      double theta = Math.PI * azimuth / 180.0;
      double phi = Math.PI * elevation / 180.0;
      float cosT = (float)Math.cos( theta ), sinT = (float)Math.sin( theta );
      float cosP = (float)Math.cos( phi ), sinP = (float)Math.sin( phi );
      float cosTcosP = cosT*cosP, cosTsinP = cosT*sinP,
             sinTcosP = sinT*cosP, sinTsinP = sinT*sinP;

      // project e.vertices onto the 2D viewport
      Point[] points;
      points = new Point[ e.vertices.length ];
      int j;
      int scaleFactor = width/4;
      float near = 3;  // distance from eye to near plane
      float nearToObj = 1.5f;  // distance from near plane to center of object
      for ( j = 0; j < e.vertices.length; ++j ) {
          g.setColor(new Color(j));
          //System.out.println(j+" "+e.vertices[j]);
         float x0 = e.vertices[j].x;
         float y0 = e.vertices[j].y;
         float z0 = e.vertices[j].z;
         System.out.println("Coord"+j+" "+x0+" "+y0+" "+z0);
         // compute an orthographic projection
         float x1 = cosT*x0 + sinT*z0;
         float y1 = -sinTsinP*x0 + cosP*y0 + cosTsinP*z0;

         // now adjust things to get a perspective projection
         float z1 = cosTcosP*z0 - sinTcosP*x0 - sinP*y0;
         x1 = x1*near/(z1+near+nearToObj);
         y1 = y1*near/(z1+near+nearToObj);

         // the 0.5 is to round off when converting to int
         points[j] = new Point(
            (int)(width/2 + scaleFactor*x1 + 0.5),
            (int)(height/2 - scaleFactor*y1 + 0.5)
         );
      }

      // draw the wireframe
       
       g.setColor(Color.BLACK);
      g.fillRect( 0, 0, width, height );
      g.setColor(Color.RED);
       g.fillRect(0,0,30,20);
       g.setFont(new Font("Courier", 10,10));
       g.setColor(Color.BLACK);
       g.drawString("Save", 0, 10);
       g.setColor(Color.GREEN);
       g.fillRect(width-30,0,30,20);
       g.setFont(new Font("Courier", 10,10));
       g.setColor(Color.BLACK);
       g.drawString("Load", width-30, 10);
      g.setColor( Color.white );
      for ( j = 0; j < e.edges.length; ++j ) {
         // g.setColor(new Color(j*1000));
        try{
          System.out.println("WF"+j+" "+e.edges[j].a +" "+e.edges[j].b);
         g.drawLine(
            points[ e.edges[j].a ].x, points[ e.edges[j].a ].y,
            points[ e.edges[j].b ].x, points[ e.edges[j].b ].y
         );}
        catch (NullPointerException e ){}
        catch (ArrayIndexOutOfBoundsException e){}
      }
   }

   public void mouseEntered( MouseEvent e ) { }
   public void mouseExited( MouseEvent e ) { }
   public void mouseClicked( MouseEvent e ) {
       }
   public void mousePressed( MouseEvent e ) {
      mx = e.getX();
      my = e.getY();
      e.consume();
   }
   public void mouseReleased( MouseEvent e ) { }
   public void mouseMoved( MouseEvent e ) { }
   public void mouseDragged( MouseEvent e ) {
      // get the latest mouse position
      int new_mx = e.getX();
      int new_my = e.getY();

      // adjust angles according to the distance travelled by the mouse
      // since the last event
      azimuth -= new_mx - mx;
      elevation += new_my - my;

      // update the backbuffer
      drawWireframe( backg );

      // update our data
      mx = new_mx;
      my = new_my;

      repaint();
      e.consume();
   }

   public void update( Graphics g ) {
      g.drawImage( backbuffer, 0, 0, this );
      showStatus("Elev: "+elevation+" deg, Azim: "+azimuth+" deg");
   }

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

Hier ist mein Komplettes Model:

Code:
public class My3DObject {
    P3D [] vertices;
    Edge[] edges;
    
    /*
    Die extremen Größen des Schwertes verusachen bei bestimmten Blickwinkeln linien die nicht sein sollten,
    wenn man also die Länge der Klingte von 3*e verkleinert zu e passiert es kaum noch
    */
    
    public My3DObject(float seite) {
    
        vertices = new P3D[58];
        edges = new Edge[111];
        float c = seite/8;
        float d = seite/16;
        float e = seite;
        float f = seite/32;
        float g = seite/64;
        float h = seite/4;
        
        vertices[0] = new P3D (0,d,-e); //Klinge
        vertices[1] = new P3D (0,-d,-e);
        vertices[2] = new P3D (c,0,-e);
        vertices[3] = new P3D (-c,0,-e);
        vertices[4] = new P3D (0,d,3*e-c); //Falls das Schwert zu lang sein sollte einfach bei Vertices 4, 5, 6, 7, 8 die Länge 3*e durch e ersetzen
        vertices[5] = new P3D (0,-d,3*e-c);
        vertices[6] = new P3D (c,0,3*e);
        vertices[7] = new P3D (-c,0,3*e);
        vertices[8] = new P3D (0,0,(3*e+2*c)); //Spitze der Klinge
        vertices[9] = new P3D (-(c*3),d-f,-e); //Handschutz links front
        vertices[10] = new P3D (-(c*3),-(d-f),-e);
        vertices[11] = new P3D (0,d+f,-e);//Handschutz mitte front
        vertices[12] = new P3D (0,-(d+f),-e);
        vertices[13] = new P3D (c*3,d-f,-e);//Handschutz rechts front
        vertices[14] = new P3D (c*3,-(d-f),-e);
        vertices[15] = new P3D (-(c*3+g),d-f,-(e+g)); //Handschutz links mitte
        vertices[16] = new P3D (-(c*3+g),-(d-f),-(e+g));
        vertices[17] = new P3D (0,d+f+f,-(e+g));//Handschutz mitte mitte
        vertices[18] = new P3D (0,-(d+f+f),-(e+g));
        vertices[19] = new P3D (c*3+g,d-f,-(e+g));//Handschutz rechts mitte
        vertices[20] = new P3D (c*3+g,-(d-f),-(e+g));
        vertices[21] = new P3D (-(c*3),d-f,-(e+f)); //Handschutz links hinten
        vertices[22] = new P3D (-(c*3),-(d-f),-(e+f));
        vertices[23] = new P3D (0,d+f,-(e+f));//Handschutz mitte hinten
        vertices[24] = new P3D (0,-(d+f),-(e+f));
        vertices[25] = new P3D (c*3,d-f,-(e+f));//Handschutz rechts hinten
        vertices[26] = new P3D (c*3,-(d-f),-(e+f));
        vertices[27] = new P3D ((-(c-f))/3,(2*c)/3,-(e+f)); // Griffachteck vorne
        vertices[28] = new P3D ((c-f)/3,(2*c)/3,-(e+f));
        vertices[29] = new P3D ((2*c)/3,(c-f)/3,-(e+f));
        vertices[30] = new P3D ((2*c)/3,(-(c-f))/3,-(e+f));
        vertices[31] = new P3D ((c-f)/3,(-(2*c))/3,-(e+f));
        vertices[32] = new P3D ((-(c-f))/3,(-(2*c))/3,-(e+f));
        vertices[33] = new P3D ((-(2*c))/3,(-(c-f))/3,-(e+f));
        vertices[34] = new P3D ((-(2*c))/3,(c-f)/3,-(e+f));
        vertices[35] = new P3D ((-(c-f))/3,(2*c)/3,-(2*e+f)); // Griffachteck hinten
        vertices[36] = new P3D ((c-f)/3,(2*c)/3,-(2*e+f));
        vertices[37] = new P3D ((2*c)/3,(c-f)/3,-(2*e+f));
        vertices[38] = new P3D ((2*c)/3,(-(c-f))/3,-(2*e+f));
        vertices[39] = new P3D ((c-f)/3,(-(2*c))/3,-(2*e+f));
        vertices[40] = new P3D ((-(c-f))/3,(-(2*c))/3,-(2*e+f));
        vertices[41] = new P3D ((-(2*c))/3,(-(c-f))/3,-(2*e+f));
        vertices[42] = new P3D ((-(2*c))/3,(c-f)/3,-(2*e+f));
        vertices[43] = new P3D ((-(c-f))/2,c,-(2*e+d)); // Gegengewichtachteck
        vertices[44] = new P3D ((c-f)/2,c,-(2*e+d));
        vertices[45] = new P3D (c,(c-f)/2,-(2*e+d));
        vertices[46] = new P3D (c,(-(c-f))/2,-(2*e+d));
        vertices[47] = new P3D ((c-f)/2,-c,-(2*e+d));
        vertices[48] = new P3D ((-(c-f))/2,-c,-(2*e+d));
        vertices[49] = new P3D (-c,(-(c-f))/2,-(2*e+d));
        vertices[50] = new P3D (-c,(c-f)/2,-(2*e+d));
        vertices[51] = new P3D (h,0,-(2*e+d+f)); // Gegengewichtsechseck
        vertices[52] = new P3D (c,h-d,-(2*e+d+f));
        vertices[53] = new P3D (-c,h-d,-(2*e+d+f));
        vertices[54] = new P3D (-h,0,-(2*e+d+f));
        vertices[55] = new P3D (-c,-(h-d),-(2*e+d+f));
        vertices[56] = new P3D (c,-(h-d),-(2*e+d+f));
        vertices[57] = new P3D (0,0,-(3*e)); //Gegengewichts
        
        edges [0] = new Edge (0,2); //Klinge
        edges [1] = new Edge (0,3);
        edges [2] = new Edge (1,2);
        edges [3] = new Edge (1,3);
        edges [4] = new Edge (4,6);
        edges [5] = new Edge (4,7);
        edges [6] = new Edge (5,6);
        edges [7] = new Edge (5,7);
        edges [8] = new Edge (0,4);
        edges [9] = new Edge (1,5);
        edges [10] = new Edge (2,6);
        edges [11] = new Edge (3,7);
        edges [12] = new Edge (4,8); //Spitze der Klinge
        edges [13] = new Edge (5,8);
        edges [14] = new Edge (6,8);
        edges [15] = new Edge (7,8);
        edges [16] = new Edge (9,11); //Handschutzfront
        edges [17] = new Edge (11,13);
        edges [18] = new Edge (13,14);
        edges [19] = new Edge (14,12);
        edges [20] = new Edge (12,10);
        edges [21] = new Edge (10,9);
        edges [22] = new Edge (15,17); //Handschutz mitte
        edges [23] = new Edge (17,19);
        edges [24] = new Edge (19,20);
        edges [25] = new Edge (20,18);
        edges [26] = new Edge (18,16);
        edges [27] = new Edge (16,15);
        edges [28] = new Edge (9,15); //Handschutz front-mitte verbindung
        edges [29] = new Edge (10,16); 
        edges [30] = new Edge (11,17);
        edges [31] = new Edge (12,18);
        edges [32] = new Edge (13,19);
        edges [33] = new Edge (14,20);
        edges [34] = new Edge (21,15); //Handschutz mitte-hinten verbindung
        edges [35] = new Edge (22,16); 
        edges [36] = new Edge (23,17);
        edges [37] = new Edge (24,18);
        edges [38] = new Edge (25,19);
        edges [39] = new Edge (26,20);
        edges [40] = new Edge (21,23); // Handschutz hinten
        edges [41] = new Edge (23,25);
        edges [42] = new Edge (25,26);
        edges [43] = new Edge (26,24);
        edges [44] = new Edge (24,22);
        edges [45] = new Edge (22,21);
        edges [46] = new Edge (27,28); //Griffachteckvorne
        edges [47] = new Edge (28,29);
        edges [48] = new Edge (29,30);
        edges [49] = new Edge (30,31);
        edges [50] = new Edge (31,32);
        edges [51] = new Edge (32,33);
        edges [52] = new Edge (33,34);
        edges [53] = new Edge (34,27);
        edges [54] = new Edge (35,36); //Griffachteckhinten
        edges [55] = new Edge (36,37);
        edges [56] = new Edge (37,38);
        edges [57] = new Edge (38,39);
        edges [58] = new Edge (39,40);
        edges [59] = new Edge (40,41);
        edges [60] = new Edge (41,42);
        edges [61] = new Edge (42,35);
        edges [63] = new Edge (27,42); //Griffachteck verbindung vorne hinten, die verdrehung der Verstrebungen der Achtecken im Griff ist gewollt
        edges [64] = new Edge (28,35); 
        edges [65] = new Edge (29,36);
        edges [66] = new Edge (30,37);
        edges [67] = new Edge (31,38);
        edges [68] = new Edge (32,39);
        edges [69] = new Edge (33,40);
        edges [70] = new Edge (34,41);
        edges [71] = new Edge (43,44); //Gegengewichtachteck
        edges [72] = new Edge (44,45);
        edges [73] = new Edge (45,46);
        edges [74] = new Edge (46,47);
        edges [75] = new Edge (47,48);
        edges [76] = new Edge (48,49);
        edges [77] = new Edge (49,50);
        edges [78] = new Edge (50,43);
        edges [79] = new Edge (35,43); //Verbindung Griffende mit Gegengewicht
        edges [80] = new Edge (36,44);
        edges [81] = new Edge (37,45);
        edges [82] = new Edge (38,46);
        edges [83] = new Edge (39,47);
        edges [84] = new Edge (40,48);
        edges [85] = new Edge (41,49);
        edges [86] = new Edge (42,50);
        edges [87] = new Edge (51,52); // Gegengewichtssechseck
        edges [88] = new Edge (52,53);
        edges [89] = new Edge (53,54);
        edges [90] = new Edge (54,55);
        edges [91] = new Edge (55,56);
        edges [92] = new Edge (56,51);
        edges [93] = new Edge (44,52); //Gegengewichtsverbindung von Acht- zu Sechseck
        edges [94] = new Edge (45,52);
        edges [95] = new Edge (45,51);
        edges [96] = new Edge (46,51);
        edges [97] = new Edge (46,56);
        edges [98] = new Edge (47,56);
        edges [99] = new Edge (48,55);
        edges [100] = new Edge (49,55);
        edges [101] = new Edge (49,54);
        edges [102] = new Edge (50,54);
        edges [103] = new Edge (50,53);
        edges [104] = new Edge (43,53);
        edges [105] = new Edge (51,57); //Gegengewicht-Spitze
        edges [106] = new Edge (52,57);
        edges [107] = new Edge (53,57);
        edges [108] = new Edge (54,57);
        edges [109] = new Edge (55,57);
        edges [110] = new Edge (56,57);
  
    }
}

Hier sind die einzelnen Segmente:

1. Die Klinge: -Koordinate 0,0,0 befindet sich in der "Mitte" der Klinge
Code:
public class My3DObjectKlinge {
    P3D [] vertices;
    Edge[] edges;
    
    public My3DObjectKlinge(float seite) {
    
        vertices = new P3D[9];
        edges = new Edge[16];
        float c = seite/8;
        float d = seite/16;
        float e = seite;
        
        vertices[0] = new P3D (0,d,-(2*e)); //Klinge
        vertices[1] = new P3D (0,-d,-(2*e));
        vertices[2] = new P3D (c,0,-(2*e));
        vertices[3] = new P3D (-c,0,-(2*e));
        vertices[4] = new P3D (0,d,2*e-c);
        vertices[5] = new P3D (0,-d,2*e-c);
        vertices[6] = new P3D (c,0,2*e);
        vertices[7] = new P3D (-c,0,2*e);
        vertices[8] = new P3D (0,0,(2*e+2*c)); //Spitze der Klinge
        
        edges [0] = new Edge (0,2); //Klinge
        edges [1] = new Edge (0,3);
        edges [2] = new Edge (1,2);
        edges [3] = new Edge (1,3);
        edges [4] = new Edge (4,6);
        edges [5] = new Edge (4,7);
        edges [6] = new Edge (5,6);
        edges [7] = new Edge (5,7);
        edges [8] = new Edge (0,4);
        edges [9] = new Edge (1,5);
        edges [10] = new Edge (2,6);
        edges [11] = new Edge (3,7);
        edges [12] = new Edge (4,8); //Spitze der Klinge
        edges [13] = new Edge (5,8);
        edges [14] = new Edge (6,8);
        edges [15] = new Edge (7,8);
        
    }
}

2. Der Griff: -Koordinate 0,0,0 befindet sich am Ansatz der Klinge beim Handschutz
Code:
public class My3DObjectGriff {
    P3D [] vertices;
    Edge[] edges;
    
    public My3DObjectGriff(float seite) {
    
        vertices = new P3D[34];
        edges = new Edge[54];
        float c = seite/8;
        float d = seite/16;
        float e = seite;
        float f = seite/32;
        float g = seite/64;
    
        vertices[0] = new P3D (-(c*3),d-f,0); //Handschutz links front
        vertices[1] = new P3D (-(c*3),-(d-f),0);
        vertices[2] = new P3D (0,d+f,0);//Handschutz mitte front
        vertices[3] = new P3D (0,-(d+f),0);
        vertices[4] = new P3D (c*3,d-f,0);//Handschutz rechts front
        vertices[5] = new P3D (c*3,-(d-f),0);
        vertices[6] = new P3D (-(c*3+g),d-f,g); //Handschutz links mitte
        vertices[7] = new P3D (-(c*3+g),-(d-f),g);
        vertices[8] = new P3D (0,d+f+f,g);//Handschutz mitte mitte
        vertices[9] = new P3D (0,-(d+f+f),g);
        vertices[10] = new P3D (c*3+g,d-f,g);//Handschutz rechts mitte
        vertices[11] = new P3D (c*3+g,-(d-f),g);
        vertices[12] = new P3D (-(c*3),d-f,f); //Handschutz links hinten
        vertices[13] = new P3D (-(c*3),-(d-f),f);
        vertices[14] = new P3D (0,d+f,f);//Handschutz mitte hinten
        vertices[15] = new P3D (0,-(d+f),f);
        vertices[16] = new P3D (c*3,d-f,f);//Handschutz rechts hinten
        vertices[17] = new P3D (c*3,-(d-f),f);
        vertices[18] = new P3D ((-(c-f))/3,(2*c)/3,f); // Griffachteck vorne
        vertices[19] = new P3D ((c-f)/3,(2*c)/3,f);
        vertices[20] = new P3D ((2*c)/3,(c-f)/3,f);
        vertices[21] = new P3D ((2*c)/3,(-(c-f))/3,f);
        vertices[22] = new P3D ((c-f)/3,(-(2*c))/3,f);
        vertices[23] = new P3D ((-(c-f))/3,(-(2*c))/3,f);
        vertices[24] = new P3D ((-(2*c))/3,(-(c-f))/3,f);
        vertices[25] = new P3D ((-(2*c))/3,(c-f)/3,f);
        vertices[26] = new P3D ((-(c-f))/3,(2*c)/3,(e+f)); // Griffachteck hinten
        vertices[27] = new P3D ((c-f)/3,(2*c)/3,(e+f));
        vertices[28] = new P3D ((2*c)/3,(c-f)/3,(e+f));
        vertices[29] = new P3D ((2*c)/3,(-(c-f))/3,(e+f));
        vertices[30] = new P3D ((c-f)/3,(-(2*c))/3,(e+f));
        vertices[31] = new P3D ((-(c-f))/3,(-(2*c))/3,(e+f));
        vertices[32] = new P3D ((-(2*c))/3,(-(c-f))/3,(e+f));
        vertices[33] = new P3D ((-(2*c))/3,(c-f)/3,(e+f));
        
        edges [0] = new Edge (0,2); //Handschutzfront
        edges [1] = new Edge (2,4);
        edges [2] = new Edge (4,5);
        edges [3] = new Edge (5,3);
        edges [4] = new Edge (3,1);
        edges [5] = new Edge (1,0);
        edges [6] = new Edge (6,8); //Handschutz mitte
        edges [7] = new Edge (8,10);
        edges [8] = new Edge (10,11);
        edges [9] = new Edge (11,9);
        edges [10] = new Edge (9,7);
        edges [11] = new Edge (7,6);
        edges [12] = new Edge (0,6); //Handschutz front-mitte verbindung
        edges [13] = new Edge (1,7); 
        edges [14] = new Edge (2,8);
        edges [15] = new Edge (3,9);
        edges [16] = new Edge (4,10);
        edges [17] = new Edge (5,11);
        edges [18] = new Edge (12,6); //Handschutz mitte-hinten verbindung
        edges [19] = new Edge (13,7); 
        edges [20] = new Edge (14,8);
        edges [21] = new Edge (15,9);
        edges [22] = new Edge (16,10);
        edges [23] = new Edge (17,11);
        edges [24] = new Edge (12,14); // Handschutz hinten
        edges [25] = new Edge (14,16);
        edges [26] = new Edge (16,17);
        edges [27] = new Edge (17,15);
        edges [28] = new Edge (15,13);
        edges [29] = new Edge (13,12);
        edges [30] = new Edge (18,19); //Griffachteckvorne
        edges [31] = new Edge (19,20);
        edges [32] = new Edge (20,21);
        edges [33] = new Edge (21,22);
        edges [34] = new Edge (22,23);
        edges [35] = new Edge (23,24);
        edges [36] = new Edge (24,25);
        edges [37] = new Edge (25,18);
        edges [38] = new Edge (26,27); //Griffachteckhinten
        edges [39] = new Edge (27,28);
        edges [40] = new Edge (28,29);
        edges [41] = new Edge (29,30);
        edges [42] = new Edge (30,31);
        edges [43] = new Edge (31,32);
        edges [44] = new Edge (32,33);
        edges [45] = new Edge (33,26);
        edges [46] = new Edge (18,33); //Griffachteck verbindung vorne hinten, die verdrehung der Verstrebungen der Achtecken im Griff ist gewollt
        edges [47] = new Edge (19,26); 
        edges [48] = new Edge (20,27);
        edges [49] = new Edge (21,28);
        edges [50] = new Edge (22,29);
        edges [51] = new Edge (23,30);
        edges [52] = new Edge (24,31);
        edges [53] = new Edge (25,32);
    }
}

und last but not least das 3.

Das Gegengewicht: -Koordianete 0,0,0 ist im kleinen Achteckt am vorderen Teil des Gewichts
Code:
public class My3DObjectGegengewicht {
        P3D [] vertices;
        Edge[] edges;
        
        public My3DObjectGegengewicht(float seite) {
        
            vertices = new P3D[23];
            edges = new Edge[48];
            float c = seite/8;
            float d = seite/16;
            float e = seite;
            float f = seite/32;
            float h = seite/4;
            
            vertices[0] = new P3D ((-(c-f))/3,(2*c)/3,-f); // Griffachteck hinten
            vertices[1] = new P3D ((c-f)/3,(2*c)/3,-f);
            vertices[2] = new P3D ((2*c)/3,(c-f)/3,-f);
            vertices[3] = new P3D ((2*c)/3,(-(c-f))/3,-f);
            vertices[4] = new P3D ((c-f)/3,(-(2*c))/3,-f);
            vertices[5] = new P3D ((-(c-f))/3,(-(2*c))/3,-f);
            vertices[6] = new P3D ((-(2*c))/3,(-(c-f))/3,-f);
            vertices[7] = new P3D ((-(2*c))/3,(c-f)/3,-f);
            vertices[8] = new P3D ((-(c-f))/2,c,-d); // Gegengewichtachteck
            vertices[9] = new P3D ((c-f)/2,c,-d);
            vertices[10] = new P3D (c,(c-f)/2,-d);
            vertices[11] = new P3D (c,(-(c-f))/2,-d);
            vertices[12] = new P3D ((c-f)/2,-c,-d);
            vertices[13] = new P3D ((-(c-f))/2,-c,-d);
            vertices[14] = new P3D (-c,(-(c-f))/2,-d);
            vertices[15] = new P3D (-c,(c-f)/2,-d);
            vertices[16] = new P3D (h,0,-(2*d)); // Gegengewichtsechseck
            vertices[17] = new P3D (c,h-d,-(2*d));
            vertices[18] = new P3D (-c,h-d,-(2*d));
            vertices[19] = new P3D (-h,0,-(2*d));
            vertices[20] = new P3D (-c,-(h-d),-(2*d));
            vertices[21] = new P3D (c,-(h-d),-(2*d));
            vertices[22] = new P3D (0,0,-(e)); //Gegengewichtsendpunkt
            
            edges [0] = new Edge (0,1); //Griffachteckhinten
            edges [1] = new Edge (1,2);
            edges [2] = new Edge (2,3);
            edges [3] = new Edge (3,4);
            edges [4] = new Edge (4,5);
            edges [5] = new Edge (5,6);
            edges [6] = new Edge (6,7);
            edges [7] = new Edge (7,0);
            edges [8] = new Edge (8,9); //Gegengewichtachteck
            edges [9] = new Edge (9,10);
            edges [10] = new Edge (10,11);
            edges [11] = new Edge (11,12);
            edges [12] = new Edge (12,13);
            edges [13] = new Edge (13,14);
            edges [14] = new Edge (14,15);
            edges [15] = new Edge (15,8);
            edges [16] = new Edge (0,8); //Verbindung Griffende mit Gegengewicht
            edges [17] = new Edge (1,9);
            edges [18] = new Edge (2,10);
            edges [19] = new Edge (3,11);
            edges [20] = new Edge (4,12);
            edges [21] = new Edge (5,13);
            edges [22] = new Edge (6,14);
            edges [23] = new Edge (7,15);
            edges [24] = new Edge (16,17); // Gegengewichtssechseck
            edges [25] = new Edge (17,18);
            edges [26] = new Edge (18,19);
            edges [27] = new Edge (19,20);
            edges [28] = new Edge (20,21);
            edges [29] = new Edge (21,16);
            edges [30] = new Edge (9,17); //Gegengewichtsverbindung von Acht- zu Sechseck
            edges [31] = new Edge (10,17);
            edges [32] = new Edge (10,16);
            edges [33] = new Edge (11,16);
            edges [34] = new Edge (11,21);
            edges [35] = new Edge (12,21);
            edges [36] = new Edge (13,20);
            edges [37] = new Edge (14,20);
            edges [38] = new Edge (14,19);
            edges [39] = new Edge (15,19);
            edges [40] = new Edge (15,18);
            edges [41] = new Edge (8,18);
            edges [42] = new Edge (16,22); //Gegengewicht-Spitze
            edges [43] = new Edge (17,22);
            edges [44] = new Edge (18,22);
            edges [45] = new Edge (19,22);
            edges [46] = new Edge (20,22);
            edges [47] = new Edge (21,22);
                    
        }
    }

Die Frage lautet:
Wie muss My3DObject geschrieben werden, damit es die einzelnen Teile an den richtigen Stellen zusammensetzt?
Es ist kein muss, da ich meine Aufgabe ein 3D WireModel bereits gemacht hab, nur will ich aus eigenem Interesse daraus zusammensetzbare Komponenten machen.
 
:wow:
Darf ich fragen, ob das jetzt im Prinzip ein (sehr vereinfachter) Softwarerasterizer sein soll? Schaut nämlich so aus, nur mit Java3D hab ich weniger Ahnung...

Deine Frage ist mir leider nicht ganz klar. "Zusammesetzen" :huh:
Meinst du jetzt, dass die Klinge an Punkt ** und ** und ** mit dem Griff o.ä. nativ verbunden ist?
Da könntest du doch einfach im My3DObject Instanzen von My3DObjectKlinge, My3DObjectGriff, My3DObjectGegengewicht instanzieren und deren Vertices zusammenfügen (doppelte natürlich auslassen). Die "ausgelassenen" Vertices haben natürlich Auswirkungen auf die komplette nachfolgende Reihenfolge der Vertices (Indexposition um 1 verringern).
Jedenfalls wäre das so ein (einfacher) Ansatz um das mit Indexed Geometry zu machen.

Ansonsten hast du in der Draw-Methode ja direkten Zugriff auf dein 3D-Objekt. Dort könntest du dann eine GetEdge(int index); Methode einführen, die eine bestimmte Edge liefert. Innerhalb des My3DObjects gibt es aber keine Edges, sondern der Aufruf schaut direkt in den Unterobjekten Klinge,Griff,Gewicht nach. Dort musst du dann nur etwas aufpassen.
Angenommen Griff hat 3, Klinge hat 4 und Gewicht hat 2 (also insg. = 9 Edges). Dann würde die Anfrage 3dobjekt.GetEdge(6); eine Edge der Klinge liefern und 3dobjekt.GetEdge(7); hingegen die erste Edge von Gewicht.

Wenn es nicht so umständlich sein soll, dann man dir in deiner Draw-methode einfach ein Array für Edges und initialisiere es mit 3dobjekt.GetAllEdges();
Die Methode liefert dann ein zusammengefügtes Edge-Array von Klinge/Griff/Gewicht zurück.

.............. oder wie meinst du zusammenfügen? ^^
 
Also das mit Zusammenfügen hast du Richtig verstanden, das Programm sollte die Klinge bei Griff an 2 bestimmten Punkten zusammensetzen und so weiter, weil ich auch schon bald eine Katanaklinge mache. Ich habe bereits bei Griff mehrere Modelle erstellt die durch Math.random*(anzahl cases-1) switch: case... bis default: , sollte nicht passieren aber das Applet startet nicht falls doch, zufällig ausgewählt ein Griffmodel wobei einige Modelle andere Gesamtlängen haben als andere.

Also soll ich mit bei jedem Modell noch 2 Punkte erstellen quasi A und B, die dann später im My3DObjekt genau sagen wie rum und wo was zusammengesetzt wird.

Ich wollte wie du schon gemerkt hast das My3DObject auf My3DObjectKlinge, My3DObjectGriff und My3DObjectGegengewicht zugreifft und ein Modell nimmt und es dann zusammensetzt und dann im WireFrameViewer zeigen.

P.S. Der WireFrameviewer ist ja was ganz simples, nur will ich mich etwas vertrauter machen mit solchen Verknüpfungsmethoden. Ein Freund meinte ich könnte ja ein RPG erstellen bei dem jede Waffe in den Bestandteilen Zufallsgeneriert zusammengesetzt wird, aber ich habe keine Idee für n RPG, aber dafür für ein Action-Shooter.
 
Joa, also wenn das so "flexibel" gestaltet werden soll, musst du im Prinzip Referenzpunkte definieren, bei denen sichergestellt ist, dass dort immer der Griff und die Klinge (bspw.) ansetzen, sodass das Ganze möglichst nahtlos übergeht.
Die Variante, dass das 3DObjekt aus 3 Unterobjekten besteht, ist m.M.n. auch die empfehlenswerteste, da die eben unabhängig voneinander angezeigt werden.
Falls möglich kannst du dann noch (immer) den 17-ten und 18-ten (BEISPIEL!) Vertex der Klinge jeweils mit dem 3-ten und 5-ten (wieder BEISPIEL!) Vertex des Griffs als Edge verknüpfen, sodass du dann dennoch deinen nahtlosen Übergang hast.

_______
Nebeneinfo:
In 2D-RPGs ist das ja eh alles über Sprites, also 2D-Flächen die entsprechend "bemalt" wurden, gelöst. Da hast du deinen Griff, der bei (x,y) anfängt und die Klinge fängt eben bei den Pixeln (x-2,y+25) oder so an; wenn das die Koordinaten für die Mitten der 2D-Flächen sind bist du folglich recht frei, was die Gestaltung und Flexibilität angeht.
Im 3D-Raum ist das wohl so gelöst, dass du eine Klasse "Weapon" hast und die Aufsätze/Veränderungen sich dann immer relativ zu der aktuellen Waffenposition befinden.
Diese werden allerdings NICHT miteinander verbunden, sondern einfach möglichst nah beieinander gerendert, sodass man nur "ein zusammenhängendes Objekt" sieht ;)

Also:
Code:
class Weapon
{
     objekt Schaft;
     objekt Zielvorrichtung;
     objekt .....
}


// Rendern:
// Addiere auf alle Vertexpositionen der Unterobjekte die Position der Waffe und eine relative Verschiebung hinzu --> Ergebnis = "renderbare" Vertexdaten
So würde ichs jedenfalls machen, und so habe ich das auch bei meinem Planetenrenderer gemacht :daumen: (Naja so ähnlich jedenfalls)
 
Zurück