3D Projection

stulleman

Bekanntes Mitglied
Hallo zusammen!

Vielleicht kann sich der Ein oder Andere daran erinnern das ich schon einmal einen ähnlichen Post gemacht habe, dabei aber nicht wirklich zu einem Ergebnis gekommen bin.
Nach langer Zeit habe ich nun das gefunden. Wenn ich das richtig sehe ist das eine sehr detaillierte Schritt für Schritt Anleitung zum Ziel.
Jedoch habe ich selbst hierbei ein paar Schwierigkeiten.

1. Kann mir vielleicht jemand die Orientierung der Kamera erklären? Ist c (0,0,0) jetzt in Richtung der x-Achse?

2. Bin ich mir nicht sicher wie man e, also die relative Position zum "Bildschirm", berechnet. Und sollte ich dabei vielleicht doch die 2. , weiter unten beschriebene, Methode benutzen?

3. Falls ich die zweite Methode benutzen sollte, wüsste ich wieder nicht was die CCD Größen wären, oder welche man sinnvollerweise nehmen würde.

Ich hoffe jemand kann mir helfen!

Danke
 
S

Spacerat

Gast
Ich kann das jetzt nur über LMGTFY...
Der erste Treffer linkt auf ein PDF, in welchem unter anderem Vector- und Matrixberechnungen recht verständlich (für mich jedenfalls) erklärt werden. Den DirectX-Kram kann man dabei getrost überspringen, wenn man ihn nicht braucht. Wichtig sind eigentlich nur die Kapitel Tag 3 und 4. Evtl. erschliesst sich dir dadurch ja auch das Verständnis von 3D. Mir jedenfalls hat's geholfen.
 

stulleman

Bekanntes Mitglied
Ich habe mir jetzt Kapitel 3-4 durchgelesen, und wüsste gerne wie mir das bei meinem Problem helfen sollte? Ich weiß wie ich Vektoren und Matrizen benutze (Wenn auch nur grob). Doch das war ja gar nicht meine Frage.
Es kann sein das mein Vorhaben nicht ganz klar geworden ist, ich will nämlich eine mini 3D engine schreiben. Vielleicht, wenn du es kannst, könntest du mir meine konkreten Fragen beantworten?
Ist auch nicht böse gemeint oder so und ich bedanke mich trotzdem für den Link, da ein paar Sachen recht gut erklärt sind, jedoch war das nicht was ich gesucht habe.
 
S

Spacerat

Gast
Ich habe mir jetzt Kapitel 3-4 durchgelesen, und wüsste gerne wie mir das bei meinem Problem helfen sollte? Ich weiß wie ich Vektoren und Matrizen benutze (Wenn auch nur grob). Doch das war ja gar nicht meine Frage.
Es kann sein das mein Vorhaben nicht ganz klar geworden ist, ich will nämlich eine mini 3D engine schreiben. Vielleicht, wenn du es kannst, könntest du mir meine konkreten Fragen beantworten?
Ist auch nicht böse gemeint oder so und ich bedanke mich trotzdem für den Link, da ein paar Sachen recht gut erklärt sind, jedoch war das nicht was ich gesucht habe.
Das es nicht das ist, was du gesucht hast war mir schon klar. Ich nahm nur an, dass du dich mit Vektoren und Matritzen noch nicht befasst hast, weil du meine "Lösung" im anderen Thread anscheinend nicht verstanden hast, was mich nun allerdings wundert (Auch nicht böse gemeint... denke, solche Floskeln sind auch überflüssig ;)).
Die Kamera für 2D-Projektion ist eigentlich fest installiert und zwar direkt auf der Bildschirmmitte mit einer Orientierung geradewegs in den Bildschirm hinein. Deswegen genügt es auch, die Punkte eines Objektes mit dem von mir vorgestelltem Code aus dem anderen Thread zu berechnen und dabei die 3. Achse zu vernachlässigen.
Du solltest dir ernsthaft mal dieses WireFrame-Demo mal genauer ansehen, evtl. sogar mit Eclipse oder ähnlichem schrittweise (zumindest die Paint-Methode) abarbeiten. Der Groschen sollte dann eigentlich fallen (ist er bei mir zumindest).
[OT]Okay, sag mir bescheid, wenn du bei deiner Engine beim Texturieren angekommen bist... Bei dem Thema bin ich schon mal voll in die Eisen gegangen. Obwohl hier auch viele behaupten, mit Graphics2D, AffineTransform und Zeugs würde das gehen, fällt da bei mir der Groschen nur Pfennigweise. ;)[/OT]
 

stulleman

Bekanntes Mitglied
Okay gehe ich denn jetzt richtig in der Annahme das, der von mir gepostete Link deiner Meinung nach nicht zu meinem Ziel führt? Denn dort ist doch eigentlich so gut wie alles was ich brauche beschrieben oder nicht? Nur fehlt mir jetzt noch zu bestimmen was e oder evtl. r ist.

Ach so, und ich bezweifle das ich je Texturen implementieren werde, da es mir eigentlich nur um die Projektion geht ;) Aber danke erst mal für das Angebot :p
 
S

Spacerat

Gast
Wenn du irgendwann diese mathematische "Kryptologie" verstehst, könnte dich dieser Link auch zum Ziel führen. Aber so wie ich das sehe, ist Verständnis das Problem. Soll aber nicht heissen, dass du Dumm bist, sondern dass die Zusammenhänge zwischen meinem gepostetem Code im anderen Thread und deinem Link erst mal klar werden müssen.
Was bei diesem Link nun e bzw. r sein soll, wird mir auf Anhieb auch nicht ganz Klar und eigentlich ist's auch unwichtig. Mein Code war 'ne "Abkürzung".
Evtl. hilft ja ein kleines KSKB weiter
Java:
import java.awt.Point;
import java.util.ArrayList;

public class VectorToPointDemo {
	public static void main(String[] args) {
		ArrayList<Vector> object = new ArrayList<Vector>();
		//
		// beliebige Vektoren zum testen hinzufügen.
		//
		Matrix trans = new Matrix(); // Objekttransformationsmatrix
		Vector cam = new Vector(); // Kameravektor
		cam.x =  0; // Center.X
		cam.y =  0; // Center.Y
		cam.z = -1; // zoom; je grösser der Wert, desto weiter weg das Objekt
		ArrayList<Point> pointsToPaint = new ArrayList<Point>(); // 2D Punkte
		for(Vector v : object) { // Objektvektoren lesen
			v = v.add(cam); // Kameravektor addieren
			Point toAdd = trans.transform(v); // zu 2D transformieren
			pointsToPaint.add(toAdd); // und der PaintList hinzufügen
		}
	}
}

class Vector {
	float x, y, z;

	/**
	 * Addiert zwei 3D Vektoren
	 * @param v
	 * @return
	 */
	Vector add(Vector v) {
		Vector rc = new Vector();
		rc.x = x + v.x;
		rc.y = y + v.y;
		rc.z = z + v.z;
		return rc;
	}
}

class Matrix {
	float
		xx, xy, xz, xw,
		yx, yy, yz, yw,
		zx, zy, zz, zw,
		wx, wy, wz, ww;

	/**
	 * 3D zu 2D Transformierung
	 * @param v
	 * @return
	 */
	Point transform(Vector v) {
		Point rc = new Point();
		rc.x = (int) (v.x * xx + v.y * xy + v.z * xz + xw);
		rc.y = (int) (v.x * yx + v.y * yy + v.z * yz + yw);
//		rc.z = (int) (v.x * zx + v.y * zy + v.z * zz + zw); // vernachlässigt
		return rc;
	}
}
Das könnte nun aber sehr unperformant sein, weil ständig neue Objekte erstellt, nur einmal verwendet und anschliessend dem GC überlassen werden. Das aber nur nebenbei.
[EDIT]Was du auch nicht verstanden hast; Ich sträube mich auch davor, Objekte in einer Mini-3D-Engine texturieren zu wollen... Versteh' ich nämlich auch nicht. Oder anders gesagt: Da kann ich dir auch nicht helfen.:lol:[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:

stulleman

Bekanntes Mitglied
Wenn ich das Beispiel richtig verstehe kann ich hiermit die Kamera aber nicht drehen oder das FOV verändern oder? Das würde ja alles mit dem von mir geposteten Link gehen. Es ist zwar richtig das ich vielleicht ganz klein anfangen sollte, aber irgendwie reizt es mich dann doch es direkt richtig zu machen. Zumal mir ja nur ein kleiner Teil vom ganzen fehlt um es zu verstehen ;)
 
S

Spacerat

Gast
Richtig. Ein kleiner! Teil fehlt dir. Die Szene-, bzw. View-Matrix. Der Teil ist deswegen so klein, weil man dafür die Root-Matrix des Render-Trees (Objektliste in Baumstruktur, Root-Objekt = Leerobjekt) verwenden kann. Der Render-Tree wäre aber erst der nächste Schritt gewesen.
Erinnert alles ein wenig an Prof. Hubert J. Farnsworth's Dunkle-Materie-Antrieb. Das bedeutet, du bewegst nicht die Kamera, sondern den Raum um sie herum.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N lwjgl Projection Matrix löscht Dreieck Allgemeine Java-Themen 1

Ähnliche Java Themen


Oben