gutes Tutorial zu 3d->2d Projektion?

Status
Nicht offen für weitere Antworten.

hdi

Top Contributor
Hi,

ich hatte vor einiger Zeit schon mal einen Versuch gestartet, ein wenig mit 3d rumzuspielen. Ich meine nicht Java3D. Mir wurde auch geholfen mit meinem Bsp damals (wollte nur einen Würfel darstellen), aber ich möchte es mal wirklich verstehen. Ich habe jetzt gut 1 Stunde gegooglet, mit allen Begriffen die mir irgendwie eingefallen sind. Alle "Tutorials" die ich finde sind 1-2 Din-A 4 Seiten kurz und erklären gar nicht genau, wofür die Variablen in ihren Codes eigentlich stehen. Da steht dann "screen_x", was soll das nun sein? Desktop-Auflösung? Frame-Grösse? So geht das mit allem... Und wenn ichs versuch nachzumachen bleibt mein Fenster immer leer und mein Objekt liegt irgendwo wahrscheinlich bei -2349324,12334... :(

Gibt es denn dafür keine guten Erklärungen? Die etwas ausführlicher sind? Das sind doch eigentlich nur n halbes dutzend Formeln, die man stur anwenden muss, um aus 3 Punkten 2 Punkte zu machen. Kann doch nich so schwer sein, entweder ich bin total doof oder die Leute im Inet kriegen's nich hin jmd. das gut zu erklären.

Wäre sehr dankbar für gute Links :)
 

hdi

Top Contributor
Ich meine die Prozedur, einen 3d-punkt mittels mathematischer formeln in einen 2d-punkt umzuwandeln. Also quasi "per Hand". Das kann eig. nich so wild sein, es sind wie gesagt so 4-6 Formeln die man einfach auf einen 3d-punkt anwenden muss, abhängig von Screen-size und Blickwinkel usw.

Nennt sich eben einfach Projektion auf eine Ebene. Aber leider wird das nirgendwo etwas ausführlicher erklärt. Ich kriegs einfach nicht hin...
Das Ding ist, ich möchte jetzt nicht unbedingt Java3D lernen. Man muss die paar Formeln nur mal verstehen dann kriegt man damit auch recht simpel 3d-Spiele hin (im Sinne von wirklich nur 3d-Perspektive, also nix mit 3d-engine, Shader, usw.)
 

Marco13

Top Contributor
Hm. Teilweise sehe ich da Widersprüche... erstmal ein Widerspruch, der keiner ist:
Also quasi "per Hand". --> Das Ding ist, ich möchte jetzt nicht unbedingt Java3D lernen.

Die Zielsetzung bei der Verwendung von Java3D ist eben KOMPLETT unabhängig von dem ist, was ich (auch anhand deines Würfel-Threads von damals) jetzt als Intention vermute. Man verwendet Java3D ja gerade WEIL man sagen will: "Hier is 'ne Kamera - zeichne die Linien richtig". Was du im Moment vorhast klingt eher nach: "Zeichne die Linien so, dass es aussieht, als hätte man eine Kamera"... Das geht eben mehr in die Mathematischen Tiefen.

Was aber wirklich widersprüchllich klingt ist
aber ich möchte es mal wirklich verstehen.
<- vs ->
Das sind doch eigentlich nur n halbes dutzend Formeln, die man stur anwenden muss

"Wirklich verstehen" und "stur anwenden" hat halt nicht viel miteinander zu tun. Ich hatte ja schon im letzten Thread angedeutet, dass ich mich auch schon lange nichtmehr mit sowas beschäftigt habe. Vor ein paar Jahren mal "oberflächlich" in einer Vorlesung (weil es heutzutage eben nicht mehr wirklich relevant ist). DAVOR hatte ich mir das ganze schonmal in Computer Graphics: Principles and Practice in C (Addison-Wesley Systems Programming Series): James D. Foley, Andries VanDam, Steven K. Feiner: Amazon.de: Englische Bücher angesehen (die "Bibel" der Grafikprogrammierung - aber IMHO für die meisten nur sehr eingeschränkt empfehlenswert (Bibel, eben :D )). Da war ich noch weit davon weg, das überhaupt verstehen zu können (sinngemäß: "... aha...und was genau ist eine 'Matrix'?"), aber dort ist das ganze bis ins Detail mit Formeln, Herleitungen und Begründungen und kleinen mehr oder weniger anschaulichen Bildchen erklärt. In der Google-Buchsuche kann man da schonmal einen Blick reinwerfen...: Computer graphics: principles and ... - Google Buchsuche - worauf ich rauswill: Das ganze kann bei ausführlicher und allgemeiner Beschreibung auch schnell "erschlagen". Als Alternative kann man auch einfach die Matrix von Appendix F - OpenGL Programming Guide (unten) abtippen, und akzeptieren: "Jo, die macht die Projektion", und rotiert die dann Munter weiter wie eine Kamera.

Welches Tutorial hast du denn bisher verwendet?
 

0x7F800000

Top Contributor
Öhm... Also, wenn dich die etwas mathematischere Seite interessiert, und du Bleistiftskizzen akzeptierst, könnte ich das hier auch so skizzieren :autsch:
 

hdi

Top Contributor
Danke Spacerat, da wird schon mal mehr gesagt als in den anderen die ich mir gestern angesehen hab.

Allerdings stimmt irgendwas noch nicht. Ich habe die Formeln, wie sie dort stehen, angewandt, aber bekomme komische Werte.
Ich glaube es liegt daran dass ich das mit dem Winkel nicht ganz verstanden habe, bzw f und g.

Hier mal meine Werte:

Java:
	public static int pwidth = 500;
	public static int pheight = 500;
	public static int degrees = 45;
	public static double f = pwidth / Math.tan(Math.toDegrees(degrees));
	public static double g = pheight / Math.tan(Math.toDegrees(degrees));

Auf einem 500x500 Panel also erstelle ich einen Würfel (Kantelänge 50), in 100px Tiefe, in der Mitte des Panels, dessen 3d-Punkte wie folgt gemappt werden:

Java:
	public Point to2d() {
		double x2d, y2d;
		x2d = (x * f) / z + 0.5 * pwidth;
		y2d = (y * g) / z + 0.5 * pheight;
		return new Point((int) x2d, (int) y2d);
	}

Als Ergebnis bekomme ich allerdings folgendes:

Code:
Mapping [225,225,100] -> [-575,-575]
Mapping [275,225,100] -> [-759,-575]
Mapping [225,275,100] -> [-575,-759]
Mapping [275,275,100] -> [-759,-759]
Mapping [225,225,150] -> [-300,-300]
Mapping [275,225,150] -> [-423,-300]
Mapping [225,275,150] -> [-300,-423]
Mapping [275,275,150] -> [-423,-423]
Mapping [225,225,100] -> [-575,-575]
Mapping [225,275,100] -> [-575,-759]
Mapping [275,225,100] -> [-759,-575]
Mapping [275,275,100] -> [-759,-759]
Mapping [225,225,150] -> [-300,-300]
Mapping [225,275,150] -> [-300,-423]
Mapping [275,225,150] -> [-423,-300]
Mapping [275,275,150] -> [-423,-423]
Mapping [225,225,100] -> [-575,-575]
Mapping [225,225,150] -> [-300,-300]
Mapping [225,275,100] -> [-575,-759]
Mapping [225,275,150] -> [-300,-423]
Mapping [275,225,100] -> [-759,-575]
Mapping [275,225,150] -> [-423,-300]
Mapping [275,275,100] -> [-759,-759]
Mapping [275,275,150] -> [-423,-423]

Anscheinend stelle ich mich mit diesem Thema sehr dumm an?! Auch in diesem Tutorial scheine ich ja nicht zu begreifen was dieses f und g genau sein soll, bzw das 'a', also das mit dem Winkel. Ich war mir jetzt auch nicht so sicher, da wird was von Screen Resolutio geredet. Aber damit meinen die ja eben die Grösse vom Panel, in dem ich male oder? (Und nicht etwa die Desktop-Auflösung??)

Dank dir
 

hdi

Top Contributor
Ich verstehe dich leider nicht. :oops:
Wenn ich das toDegrees() weglasse kommen auch seltsame Werte heraus. Ich gebe ja zu, ich habe auf dem Gymnasium in Mathe nicht aufgepasst. Bin hier echt aufgeschmissen...
 

Illuvatar

Top Contributor
Schau dir nochmal
Java:
toDegrees(degrees)
ganz genau an, und überleg mal, was da vielleicht unsinnig dran sein könnte. Mal ganz abgesehen von jeglicher Mathematik (die btw bei 3d-Sachen durchaus ziemlich weiterhilft...)
 

0x7F800000

Top Contributor
Ja, eben deswegen... Wenn du den Halben FOV-Winkel auf PI/4 setzen willst, dann schreib da doch eben direkt hin:
Code:
double halfFOV=Math.PI/4;
double tan=Math.tan(halfFOV);
oder noch besser direkt:
Code:
double tan=1;
oder sowas... Mit diesen komishcen gradmaß-winkeln schießen sich die Leute dauernd in den Fuß, aber können's trotzdem nicht lassen...

Was du mit deg=45 Math.toDeg(deg) ausgerechnet hast entspricht... 45*180/PI=2578.310078~820.70158 PI
Das entspricht also mehr als 400 umdrehungen, um am ende stoppt das glücksrad bei 0.7 PI , was für den halben FOV totaler blödsinn ist, weil es größer als PI/2 ist.

Ich würde sogar vorschlagen, du lässt alle winkeln weg, und drehst direkt an diesem tangens herum.

Dieser tangens gibt das verhältnis zwischen der breite des sichbaren bereiches und der sichtweite, also
tan=FarClippingPlaneWidth/FarClippingPlaneDistance
wenn dieses Verhältnis sehr klein wird (0.01, 0.001 usw...) Dann siehst du nur einen extrem schmalen Strahl (Etwa für Scharfschützengewehre in egoshootern gut)
Wenn du da werte um 1 einsetzt, kriegst du sichtfeld von insgesammt PI/2=90° (das was du wohl vorhattest). Wenn du da größere werte einsetzst, wird das sichtfeld breiter. Ich würde mit werten zwischen 1 und 2 experimentieren, und höhere werte für riesen-geschwindigkeiten bei rennspielen und warp-effekte nutzen...
 
Zuletzt bearbeitet:
S

Spacerat

Gast
Schau dir nochmal
Java:
toDegrees(degrees)
ganz genau an, und überleg mal, was da vielleicht unsinnig dran sein könnte. Mal ganz abgesehen von jeglicher Mathematik (die btw bei 3d-Sachen durchaus ziemlich weiterhilft...)
... oder versuchs mal mit [highlight=java]Math.toRadians(degrees);[/highlight]
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
X Gutes 2D Spiele Tutorial? Spiele- und Multimedia-Programmierung 9
N gutes Tutorial Spiele- und Multimedia-Programmierung 6
N suche ein gutes Media Framework Spiele- und Multimedia-Programmierung 15
Noar Suche gutes Buch Spiele- und Multimedia-Programmierung 5
Finalspace Entwicklung eines Jump & Run Spiels Video-Tutorial Spiele- und Multimedia-Programmierung 12
Ruvok Java3D Tutorial gesucht Spiele- und Multimedia-Programmierung 5
K FBO Framebuffer object [LWJGL] 2D tutorial gesucht Spiele- und Multimedia-Programmierung 2
M Spiele Tutorial.. Findet Bilddateien nicht Spiele- und Multimedia-Programmierung 6
F quaxlis tile map programming tutorial prob Spiele- und Multimedia-Programmierung 4
codestück shader tutorial Spiele- und Multimedia-Programmierung 4
A Drawable und Moveable in Quaxli 2D Spiele Tutorial Spiele- und Multimedia-Programmierung 7
Helgon OpenGL vernünftige Tutorial? Spiele- und Multimedia-Programmierung 22
H Jump&Run Tutorial Spiele- und Multimedia-Programmierung 3
Gossi Quaxlis 2D Tutorial....Probleme nach hinzufügen der Kollisionsabfrage Spiele- und Multimedia-Programmierung 16
Gossi Probleme beim Laden der Images aus dem "Tutorial für Java-Spiele" Spiele- und Multimedia-Programmierung 4
E Quaxli Tutorial Problemchen Spiele- und Multimedia-Programmierung 3
F Suche Tutorial zu "purem" OpenGL mit Java Spiele- und Multimedia-Programmierung 10
S Probleme mit Tutorial Spiele- und Multimedia-Programmierung 3
H Repaint-Problem mit Quaxlis Tutorial Spiele- und Multimedia-Programmierung 2
O Suche Tutorial zum Aufbau von großen Spielen(mit Multiplayer über Netzwerk...) Spiele- und Multimedia-Programmierung 3
M Problem mit 2D-Spieleprogrammierung Tutorial von Quaxli Spiele- und Multimedia-Programmierung 7
A Java3D tutorial? Spiele- und Multimedia-Programmierung 3
prakdi Probleme mit Quaxlis tutorial Spiele- und Multimedia-Programmierung 5
I Bilder aus Quaxli's Tutorial Spiele- und Multimedia-Programmierung 3
radiac Sprit ist leer bei Quaxli´s Heli Tutorial Spiele- und Multimedia-Programmierung 28
H Tutorial von Quaxli (Problem) Spiele- und Multimedia-Programmierung 16
hdi Das java-forum.org 2D-Game Projekt/Tutorial Spiele- und Multimedia-Programmierung 6
A Tutorial für die Entwicklung einer Fussball-KI gesucht Spiele- und Multimedia-Programmierung 7
K Game-Tutorial von Quaxli Fragen Spiele- und Multimedia-Programmierung 18
M Flugbahnberechnung (Quaxlis Tutorial) Spiele- und Multimedia-Programmierung 5
G frage zu tutorial Spiele- und Multimedia-Programmierung 3
S Problem mit Physik-Tutorial Spiele- und Multimedia-Programmierung 5
G suche das tutorial für den space invaders Spiele- und Multimedia-Programmierung 2
Z Suche Tutorial zum Einstieg in OpenGl mit Java (JOGL) Spiele- und Multimedia-Programmierung 2
X JPCT 3d-Spiele Programmierung Tutorial Spiele- und Multimedia-Programmierung 40
X 3D Spiele Tutorial gewünscht? Spiele- und Multimedia-Programmierung 14
M Suche Games tutorial mit JOGL Spiele- und Multimedia-Programmierung 8
conan2 Partikelsystem(-tutorial)? Spiele- und Multimedia-Programmierung 3
P Suche Tutorial für Multiplayer Spiele- und Multimedia-Programmierung 2
R Tutorial falsch?! Spiele- und Multimedia-Programmierung 22
H Bemerkungen zu 2. Tutorial Spiele- und Multimedia-Programmierung 3
I Java 3d tutorial Spiele- und Multimedia-Programmierung 2
I Java3D-Tutorial, die zweite. Spiele- und Multimedia-Programmierung 9

Ähnliche Java Themen

Neue Themen


Oben