# Abstand des Betrachters (Auge) von der Projektionsebene



## Florianer (7. Nov 2007)

Hi ihr,

ich hab jetzt schon einiges in eurem Forum gestöbert und auch Hilfreiches entdeckt, aber mich nun doch entschlossen, mich hier zu registrieren, da ich noch viele, viele Fragen habe... 

Fangen wir gleich mal mit der Ersten an: 


```
void setViewPosition(){
		Transform3D t3da 		= new Transform3D();
		Transform3D t3db 		= new Transform3D();
		Transform3D t3dc 		= new Transform3D();
		Transform3D	ViewT3D = new Transform3D();
		TransformGroup ViewTG = house.getViewingPlatform().getViewPlatformTransform();

		ViewT3D.setTranslation( new Vector3f( 0f, 0f, 60f)); //zoom out
		t3db.rotY(Math.PI /3);	//rotate
		t3dc.rotX(-0.25);				//turnover (look from above)
		
		ViewTG.getTransform(t3da);
		t3da.mul(t3db);
		t3da.mul(t3dc);
		t3da.mul(ViewT3D);
		ViewTG.setTransform(t3da);
	}
```

Ich drehe, neige und entferne mich vom Koordinatenursprung mit dieser Methode. Wenn ich das richtig verstanden habe, verschiebe ich hiermit doch die Projektionsebene, auf der die dahinter liegende 3D Szene abgebildet wird. Somit habe ich auf 3D erst einmal 2D gemacht. Was mir aber noch fehlt ist, wie weit bin ich (also der Betrachter oder das Auge) nun von dieser Projektionsebene entfernt? Kann ich diesen Abstand verändern? Ich hab da so dunkel eine schematische Darstellung auf meiner Computer-Grafik-Vorlesung vor Augen... Bestimmt nicht auch der Abstand den Winkel des Sichtbereiches? 

OK, auf zum nächsten Thema und Frage 2 

---
Florian


----------



## Marco13 (7. Nov 2007)

Vielleicht hiermit
http://java.sun.com/products/java-media/3D/forDevelopers/J3D_1_3_API/j3dapi/javax/media/j3d/View.html#setFrontClipDistance(double)
http://java.sun.com/products/java-media/3D/forDevelopers/J3D_1_3_API/j3dapi/javax/media/j3d/View.html#setBackClipDistance(double)

EDIT: Hä, das sollte eigentlich woanders hin :wink:


----------



## Marco13 (9. Nov 2007)

Zu DIESER Frage noch: Das mit dem "Aus 3D nun 2D machen" hab ich nicht ganz verstanden. Man kann mit canvas3D.getCenterEyeInImagePlate die Position rausfinden, die das Auge in bezug auf die ImagePlate hat. (Hilft das?) Die kann man bestimmt auch irgendwie verändern, aber ich weiß nicht auswendig, wie ... kannst ja nochmal in der View, ViewPlatform und Canvas-Klasse schauen. Oder erwähnen, wozu du diesen Abstand verändern willst...
Der Winkel  des Sichtbereichs (FOV, Field Of View) wird durch den Abstand nicht direkt "beeinflusst", nur in dem Sinne, dass man bei größerem Abstand mehr von der Szene sieht, und bei größerem FOV auch (bei letzterem treten allerdings auch stärkere perspektivische Verzerrungen auf)


----------



## Florianer (9. Nov 2007)

Also, ich bräuchte den Abstand des Auges auf die Projektionsebene weil:
Ich stehe an der Straße und blicke auf das Haus gegenüber. Es ist 10m entfernt. 
Ich weiß, dass das Haus 12m hoch und 8m lang ist.
Ich bin 1.86m groß.

Ich modelliere in Java3D nun eine Box mit einer height von 12m und einer weight von 8m. (HIER habe ich nun noch ein Problem: Der Ursprung der Box liegt doch nun in ihrem Zentrum, oder?)
Ich verschiebe die Box nun so, dass die 'vordere' Seite auf z = 0 liegt. 
Meine ViewingPlatform befindet sich bei (0|0|0), also verschiebe ich sie auf (0|1.86|10).
Habe ich nun exakt die gleiche Ansicht, wie real auf der Straße, oder befindet sich nun die Projektionsebene auf den Koordinaten, aber das Auge noch weiter weg?!


................................|\
................................|.\
................................|..\
................................|...\
................................|.....\
.....A-------->P---------|>P'.\
................................\.......|
.................................\...E.|
..................................\.....|
....................................\...|
.....................................\..|
.......................................\|

Geg.:
Punkt P in R³
Augenpunkt A (Projektionszentrum)
Ebene E (in Parameterdarstellung)

Ges.:
Projektion P' des Punktes P auf die Ebene E entlang des Sehstrahles AP

OK, das hab ich jetzt mal ganz hässlich von unserem Script übernommen... und wahrscheinlich ist es noch nicht mal das, was ich brauch... nur hab ich halt das komischerweise im Kopf... 

3D auf 2D: Damit hab ich gemeint, dass eigentlich hinter der Ebene E da oben bei mir ja nun der Szenengraph mit den Objekten hängt, welche 3d sind. Sowie sie aber auf dem Monitor dargestellt werden sollen, müssen sie ja an der Ebene in ein 2D-Bild überführt werden, denn das, was wir sehen ist ja nicht wirklich 3D, sondern eine 2D-Darstellung auf der Projektionsebene E. 
Hab ich jetzt nur mich oder auch ein paar andre verwirrt?! Wahrscheinlich erübrigt sich der ganze Teil, wenn die Frage, ob das nun die gleiche Ansicht, wie auf der Straße ist, bejaht werden kann. Ich werde jetzt mal in meinen Code schaun und mich fragen, warum das Verschieben net so wurde, wie ich es wollte... womöglich, weil der lokale Koordinatenursprung der Box net da liegt, wo ich ihn vermute/haben will. (Kann man / sollte man dann eigentlich den Ursprung auf den linken, unteren, vorderen Punkt der Box legen?)


----------



## Marco13 (9. Nov 2007)

Hm - spontan würde ich sagen, dass das Auge noch ein Stück weiter weg ist, aber das View-Modell von Java3D ist ziemlich komplex, deswegen müchte ich da mal keine definitiven Aussagen machen. 

Aber man könnte sich mit
http://java.sun.com/products/java-media/3D/forDevelopers/J3D_1_3_API/j3dapi/javax/media/j3d/Canvas3D.html#getCenterEyeInImagePlate(javax.vecmath.Point3d)
die Position des Auges in ImagePlate-Koordinaten holen. Dann mit
http://java.sun.com/products/java-media/3D/forDevelopers/J3D_1_3_API/j3dapi/javax/media/j3d/Canvas3D.html#getVworldToImagePlate(javax.media.j3d.Transform3D)
die VworldToImagePlate-Transform, und diese dann Invertieren. Wenn man den Augen-Punkt dann mit dieser invertieren Transform verschiebt, bekommt man die Position des Auges in Weltkoordinaten. Da dürfte die Antwort dann drin stecken...


----------

