# 3D-Koordinaten in 2D-Koordinaten umrechnen



## mamarulez (13. Mai 2005)

Hallo,

ich hoffe ich habe hier im richtigen Bereich geposted...

ich schreibe im Moment eine eigene, einfache 3D-Engine, die soweit auch wunderbar funktioniert. Doch habe ich ein kleines Problem: Um Polygone mit meiner Engine auf den Bildschirm zeichnen zu können, benutze ich eine einfache Funktion, die eine Linie zwischen zwei Koordinaten ( nämlich X und Y ) zeichnet. Diese Funktion zeichnet also zweidimensional, ich habe allerdings in meiner Engine eine weitere ( Tiefen- ) Koordinate Z. Jetzt geht es darum, in einer beziehungsweise zwei Funktionen dreidimensionale Koordinaten, die ich sonst überall in der Engine selbstverständlich verwende, unmittelbar vor dem Zeichnen der Polygone in zweidimensionale umzuwandeln. Ich habe ungefähr einen Tag nach dem richtigen Algoritmus gesucht, aber nichts gefunden und mittlerweile raucht mir der Kopf so von diesen beiden Funktionen, dass ich gar nichts mehr verstehe...

Hier sind die Funktionen:


```
function TranslateCoordinatesX ( int pointx, int pointz )
// translates three-dimensional points with x, y and z coordinates to two dimensional
// ones with only x and y coordinates
{
	// define the new x-coordinate
	int pointnewx;
	
	// translate the coordinates
	if ( pointx < 160 )
		pointnewx = pointx + pointz;
	else if ( pointx > 160 )
		pointnewx = pointx - pointz;
	else if ( pointx == 160 )
		pointnewx = pointx;
	
	// return the new x-coordinate
	return pointnewx;
}
```
Das ist die Funktion, die die im Parameter überlieferten dreidimensionalen X und Z Koordinaten in eine zweidimensionale X-Koordinate umwandelt oder besser gesagt umwandeln sollte. Sie gibt den neuen X-Wert wieder zurück.


```
function TranslateCoordinatesY ( int pointy, int pointz )
// translates three-dimensional points with x, y and z coordinates to two dimensional
// ones with only x and y coordinates
{
	// define the new y-coordinate
	int pointnewy;
	
	// translate the coordinates
	if ( pointy < 100 )
		pointnewy = pointy + pointz;
	else if ( pointy > 100 )
		pointnewy = pointy - pointz;
	else if ( pointy == 160 )
		pointnewy = pointy;
	
	// return the new y-coordinate
	return pointnewy;
}
```
Diese Funktion sollte das gleiche für Y-Koordinaten tun.

ZUR ERKLÄRUNG: Ich bin mir bewusst, dass der Algoritmus im Moment falsch ist. Was er tut ist, er addiert den Z-Wert zu dem X- oder Y-Wert wenn der Punkt links oder oberhalb vom Zentrum des Bildschirms ist. Wenn nicht, dann subtrahiert er den Wert und wenn das Objekt genau im Zentrum des Screens liegt, dann ändert die Tiefen-Koordinate gar nichts.

Kann mir irgendjemand helfen? Mache ich einen Denkfehler oder bin ich einfach nur zu blöde den richtigen Weg zu finden?

Danke,

Jan.


----------



## chmee (23. Mai 2005)

Soll es Isometrisches 3d sein oder mit Zentralpunkt ?
Bei isometrischem 3d bleibt alles linear, also zB x=x+0.1*z und y=y+0.5*z

Hier Links zu 3d-Linien etc.
Bresenham3d 2.Beispiel 3.Beispiel

Ah hier noch ein 3D-FAQ für Engines:
http://olli.informatik.uni-oldenburg.de/Grafiti3/grafiti/flow4/page1.html
mfg chmee


----------



## mamarulez (23. Mai 2005)

Danke für die Hilfe, aber ich habe schon einiges an Antworten in anderen Foren erhalten, in denen ich einen ähnlichen Thread erstellte, nachdem hierauf *mehrere Wochen* keine Antwort kam.

Zur Vollständigkeit: Man muss die Koordinaten ganz einfach durch Z teilen...

Danke für die Antwort, aber es würde helfen, wenn demnächst etwas schneller geantwortet wird...


----------



## chmee (23. Mai 2005)

Sorry, tümmele mich in anderen Teilen dieser Seite rum..

Weiterhin viel Erfolg und Glück 

mfg chmee


----------

