3 dimensies?

Status
Niet open voor verdere reacties.

loxerium

Gebruiker
Lid geworden
13 mei 2008
Berichten
28
Ik heb een vraag.

ik zou graag een applet willen maken die niet in 2d, maar in 3d kan tekenen.

Met het leuke voorbeeld een kubus te kunnen laten draaien.

Ik zou dat liefst alleen willen doen met uitsluitend graphics of graphics2D.

Maar hoe zet ik er in godsnaam een dimensie bij, of tenminste een illusie dat die dimensie er is?

m.v.g.
 
je kan de basisposities berekenen.

De 4 basishoeken van een vierkant.
Vervolgens kan je deze dan nog zo'n vierkant verschuiven naar links/rechts boven/onder
Om vervolgens dan de hoekpunten te verbinden met degene welke er voor zitten.

[edit]
Paint voorbeeldje van wat ik beschijf:

kubusmakenqt7.jpg

[/edit]
 
Laatst bewerkt:
dank je voor het antwoord :)

Maar dat heb al ns gedaan, als je dat probeert te draaien om het middelpunt, dan is het kapot :p, je vorm bedoel ik ^^



ik weet hoe je een gewoon 2d object moet laten draaien om haar eigen middelpunt.
( iets in de aard van Math.cos(teller) * 40 , ook nog sinus, enzovoort)

maar eigenlijk wil ik weten hoe je een derde dimensie , de z-as beschrijft met de x- en y-assen.

Dit moet toch mogelijk zijn? ik heb ooit een site gevonden ( nu vind ik het niet meer), en daar stond iets op van 3-3 matrices enzo.

m.v.g.
 
Laatst bewerkt:
Dat wil hij dus niet ;)

Ik denk toch dat je met hetgene wat ik aangegeven heb een eind kan komen.
Als je draait, dan draai je ook de coordinaten mee.
 
Laatst bewerkt:
Mijn eerste gedacht zou zijn om het berekenen van het draaien te laten verlopen met drie coördinaten, in theorie in 3d dus. De moment dat je tekent naar je scherm verwerk je de z-coördinaat in je x- en y-coördinaat

(x,y,z) => (X,Y)

X = x - z/2
Y = y - z/2

in de veronderstelling dat je in een rehtshandig assenstelsel werkt, dat betekent dat de z-as naar je toe uit je scherm komt.
 
Ik heb, in mijn oneinige goedheid *kuch kuch* maar eens een voorbeeld aplicatie gemaakt hoe je een 3d rechthoek kunt tekenen:

Code:
import java.applet.*;
import java.awt.*;
public class Vierhoek extends Applet{
	  int x=40;  //x coördinaat
	  int y=40;	 //y coördinaat
	  int z=80;  //diepte
	  int h=80;	 //hoogte
	  int b=80;  //brete
	public void init(){
	}
    public void paint(Graphics g){
  	  g.drawRect(x,y,b,h); //de 1ste rechthoek
  	  g.drawRect(x+z/3,y-z/3 ,b ,h ); //de verste rechthoek
  	  g.drawLine(x,y,x+z/3,y-z/3);    //de boveste lingse dieptelijn
  	  g.drawLine(x+b,y,(x+b)+z/3,y-z/3); //de bovenste rechtse lijn
  	  g.drawLine(x+b,y+h,(x+b)+z/3,(y+h)-z/3); //de onderste rechse dieptelijn
  	  g.drawLine(x,y+h,x+z/3,(y+h)-z/3);	//de onderste linkse dieptelijn
    }
}

Hoe je hem laat draaien weet ik niet.
 
Ow, ik zit net op een andere pc en zie dat ik hier een programma heb opstaan dat jij zoekt :D (heb ik ooit tegen gekomen op een site), je hebt dus een 3d vierhoek die je zelf kan ronddraaien.

De code (vrij lang)

Code:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.Math;

class Point3D {
   public int x, y, z;
   public Point3D( int X, int Y, int Z ) {
      x = X;  y = Y;  z = Z;
   }
}

class Edge {
   public int a, b;
   public Edge( int A, int B ) {
      a = A;  b = B;
   }
}

public class drieD extends Applet
   implements MouseListener, MouseMotionListener {

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

   Image backbuffer;
   Graphics backg;

   int azimuth = 35, elevation = 30;

   Point3D[] vertices;
   Edge[] edges;

   public void init() {
      width = getSize().width;
      height = getSize().height;

      vertices = new Point3D[ 8 ];
      vertices[0] = new Point3D( -1, -1, -1 );
      vertices[1] = new Point3D( -1, -1,  1 );
      vertices[2] = new Point3D( -1,  1, -1 );
      vertices[3] = new Point3D( -1,  1,  1 );
      vertices[4] = new Point3D(  1, -1, -1 );
      vertices[5] = new Point3D(  1, -1,  1 );
      vertices[6] = new Point3D(  1,  1, -1 );
      vertices[7] = new Point3D(  1,  1,  1 );

      edges = new Edge[ 12 ];
      edges[ 0] = new Edge( 0, 1 );
      edges[ 1] = new Edge( 0, 2 );
      edges[ 2] = new Edge( 0, 4 );
      edges[ 3] = new Edge( 1, 3 );
      edges[ 4] = new Edge( 1, 5 );
      edges[ 5] = new Edge( 2, 3 );
      edges[ 6] = new Edge( 2, 6 );
      edges[ 7] = new Edge( 3, 7 );
      edges[ 8] = new Edge( 4, 5 );
      edges[ 9] = new Edge( 4, 6 );
      edges[10] = new Edge( 5, 7 );
      edges[11] = new Edge( 6, 7 );

      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 vertices onto the 2D viewport
      Point[] points;
      points = new Point[ 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 < vertices.length; ++j ) {
         int x0 = vertices[j].x;
         int y0 = vertices[j].y;
         int z0 = vertices[j].z;

         // 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.white );
      for ( j = 0; j < edges.length; ++j ) {
         g.drawLine(
            points[ edges[j].a ].x, points[ edges[j].a ].y,
            points[ edges[j].b ].x, points[ edges[j].b ].y
         );
      }
   }

   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 );
   }
}
 
bedankt! daar ben ik een hoop mee!

nu daar verder op inwerken :D

iedereen bedankt voor de reacties

m.v.g.
 
Ja, inderdaad, dat was hem (ben ik ooit tegengekomen bij google maar had geen zin om weer een half uur te gaan zoeken :D)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan