3D Terrain from scratch

Neue Frage »

Auf diesen Beitrag antworten »
Tommy1234 3D Terrain from scratch

Hallo,

ich versuche gerade ein 3-dimensionales Terrain aus Punkten und Linien zu erstellen. Dazu habe ich mir ein zunächst 2-dimensionales quadratisches Gitter erstellt mit den beiden diagonalen darin. Das ganze wird dann um die x-Achse gedreht und dann verschoben in die Mitte meines Fensters. So, nun beginnt der Spass. Jetzt habe ich mir den abstand vom Betrachter zum Gitter berechnet und die x-bzw y-Koordinten durch diesen Abstand geteilt. Allerdings ist das Ergebnis alles andere als zufriedenstellend.

Hier mal der Code. (Die Punkt3D Klasse beinhaltet nur die Koordinaten sonst nix):


code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
public class Terrain {

	private int scale = 20;
	private int breite = 600;
	private int hoehe = 600;
	
	private double x;
	private double y;
	private double z;
	
	private double winkel = Math.toRadians(60);
	
	private double[][] rotationsmatrix = new double[4][4];
	private double[] spaltenvektor = new double[4];
	
	private Point3D p1,p2,p3,p4;
	
	public Terrain() {
		
	}
	
	public double abstand(double x,double y,double z){
		double abstand = 1000/(Math.sqrt((x*x)+(y*y)+(z*z)));
		return abstand;
	}
	
	public Point3D translate(double xt,double yt,double zt){
		Point3D p = new Point3D(xt+breite/2,yt + hoehe/2,zt);
		return p;
	}
	
	public Point3D rotateX(double winkel,double x,double y,double z){
		Point3D p = new Point3D(x,(y*Math.cos(winkel)-z*Math.sin(winkel)),y*Math.sin(winkel)+z*Math.cos(winkel));
		return p;
	}
	
	public void rotateY(double angle,double x,double y,double z){
		
	}
	
	public void rotateZ(double angle,double x,double y,double z){
		
	}
	
	public void render(Graphics g){
		g.translate(breite/2,hoehe/2);
		
		for(int y = 0;y<hoehe-scale;y+=scale){
			for(int x = 0;x<breite-scale;x+=scale){
				p1 = new Point3D(rotateX(winkel,x/abstand(x,y,z),(y+scale)/abstand(x,y+scale,z),z).getX(),rotateX(winkel,x/abstand(x,y,z),(y+scale)/abstand(x,y+scale,z),z).getY(),z);
				p2 = new Point3D(rotateX(winkel,(x+scale)/abstand(x+scale,y,z),(y+scale)/abstand(x,y+scale,z),z).getX(),rotateX(winkel,(x+scale)/abstand(x+scale,y,z),(y+scale)/abstand(x,y+scale,z),z).getY(),z);
				p3 = new Point3D(rotateX(winkel,x/abstand(x,y,z),y/abstand(x,y,z),z).getX(),rotateX(winkel,x/abstand(x,y,z),y/abstand(x,y,z),z).getY(),z);
				p4 = new Point3D(rotateX(winkel,(x+scale)/abstand(x+scale,y,z),y/abstand(x,y,z),z).getX(),rotateX(winkel,(x+scale)/abstand(x+scale,y+scale,z),y,z).getY(),z);
				g.drawLine((int)p1.getX(),(int)p1.getY(),(int)p2.getX(),(int)p2.getY());
				g.drawLine((int)p2.getX(),(int)p2.getY(),(int)p4.getX(),(int)p4.getY());
				g.drawLine((int)p4.getX(),(int)p4.getY(),(int)p3.getX(),(int)p3.getY());
				g.drawLine((int)p3.getX(),(int)p3.getY(),(int)p1.getX(),(int)p1.getY());
				g.drawLine((int)p1.getX(),(int)p1.getY(),(int)p4.getX(),(int)p4.getY());
				g.drawLine((int)p3.getX(),(int)p3.getY(),(int)p2.getX(),(int)p2.getY());
			}
		}
	} 


Was fehlt noch in meiner Berechnung?

Das ganze soll praktisch ein in den Raum ragendes Feld werden.

MfG
Tommy
 
Auf diesen Beitrag antworten »
as_string

Ich verstehe nicht so wirklich alles...
Mir sind einige Sachen aufgefallen, aber zwei Sachen wundern mich ziemlich:
Die Methode abstand() berechnet den Abstand vom Ursprung (und zwar immer nur vom Ursprung, nicht sicher, ob Du das willst). Allerdings eigentlich berechnet sie den Kehrwert mal Tausend und dann auf int abgeschnitten, weil Du im Zähler eine Ganzzahl stehen hast.
Aber der Abstand ist doch Wurzel aus der Quadratsumme und nicht der Kehrwert, das verstehe ich nicht so ganz...
Dann gehen Deine for-Schleifen für x und y immer bis zu breite/hoehe minus scale. Das kann ja schon einheitenmäßig nicht stimmen. Das eine ist ne Länge, das andere eine reine Zahl. Du musst entweder multiplizieren oder teilen, aber plus/minus kann nicht stimmen.

Ansonsten ist mir vieles weitere auch unklar. Z. B. definierst Du viele Methoden, die nie verwendet werden. z. B. auch translate, wo Du dann aber Graphics::translate() vernwedest.

Gruß
Marco
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »