PDA

View Full Version : [Frage] device coordinates


Lizzy
13-11-2004, 01:10
Hallo,

also auf der Website steht, man soll das view window auf -1 oder +1 einschränken. Würde das aber nicht bewirken, dass ich egal wie weit ich mit der camera weggehe, immer nur das selbe sehe? Für mich ergibt das (noch) keinen Sinn...

oder kann man das ViewWindow als konstantes fenster betrachten, durch das wir schauen und durch die entfernung der kamera von diesem fenster wird bestimmt, was von der view plane tatsächlich auf diesem fenster landet?

So wie wenn die Kamera eine Lampe wäre und alles, auf das durch das Fenster dann Licht fällt angezeigt wird?

gut, hat sich erledigt (man sollte vorher kommentare lesen, bevor man fragt ;-)

Note that in our approch, the view window is assumed to be constant, and the 'field of view' is varied by changing the position of the view plane in the projection stage. Another approach would be to change the size of the view window, and leave the view plane constant. (This is basically what happens in OpenGL.)

white russian
13-11-2004, 01:19
Damit du alle Koordinaten im Verhältniss gleich an die Bildschirmgröße anpassen kannst musst zu sie zuerst in ein Einheiltliches Format bringen z.b. -1 bis +1 . das erreichst du indem du die Koordinaten homogenisert. d.h durch h durchdividierst (wenn v={x,y,z,h}. //für alle Punkte

dannach musst du die Koordinaten nur noch auf Bildschirmgröße aufblasen und in den Mittelpunkt der Canvas verschieben

Lizzy
13-11-2004, 01:21
wie weiß ich, welche von den übergebenen punkten ich anzeigen muss oder nicht? Muss ich da vorher das Window auf die ViewingPlane projezieren, damit ich weiß, bis wohin ich die punkte übernehmen muss und welche ich auslassen kann?

white russian
13-11-2004, 01:24
was gezeichnet wird ist derzeit nicht unser Kaffee

wir müssen nur alle in-Punkte in richte out-Punkte umwandeln

Lizzy
13-11-2004, 01:26
aso, danke ;-)

das hat mich etwas verwirrt... aber bekommen die koordinaten, die nicht sichtbar wären, nicht eh negative (oder zu große) device koordinaten? bzw. werden diese dann beim clipping nicht abgeschnitten?

Saruman
13-11-2004, 11:21
aso, danke ;-)

das hat mich etwas verwirrt... aber bekommen die koordinaten, die nicht sichtbar wären, nicht eh negative (oder zu große) device koordinaten? bzw. werden diese dann beim clipping nicht abgeschnitten?
ich hab das eigentlich auch so verstanden...
Was mich derzeit noch etwas beschäftigt ist der Aspect Ratio - kann das stimmen:

1.) homogenisieren

2.):
wenn aspectRatio > 1 dann
out[i].x = out[i].x * ((canvasWidth/2.0)/aspectRatio); // damit x&y praktisch um den gleichen Faktor aufgeblasen werden wird die breite "verkleinert"
out[i].y = out[i].y * (canvasHeight/2.0);
sonst
out[i].x = out[i].x * (canvasWidth/2.0);
out[i].y = out[i].y * ((canvasHeight/2.0)*/aspectRatio); // damit x&y praktisch um den gleichen Faktor aufgeblasen werden wird die höhe "verkleinert"

3.) ab in die Mitte des Canvas damit.

Bitte nicht schlagen wenns Blödsinn ist, aber das is das einzige was mir in den letzten 2 Stunden dazu eingefallen ist...

[EDIT: eigentlich könnte man ja absolute Zahlen nehmen und sich das ganze if - else ersparen, da unser canvas immer gleich bleibt. Aber das wäre wohl nicht sehr elegant...]

Lizzy
13-11-2004, 11:36
Hallo,

also ich hab das auch so implementiert (nur zeigts bei mir noch nix an, ich denke irgendwo liegt da der hund begraben)...

Konstante werte wuerd ich net nehmen, weil ja jemand das windowsfenster vergroessern oder verkleinern kann und der canvas mit dem mitgeht (und dann wuerds ja nimma stimmen).

Aber ansonsten schaut meine Fkt. wahrscheinlich gleich aus wie deine, weil ich die selben schritte mach.. :-)

white russian
13-11-2004, 11:58
ich bin der Meinung, dass x/aspectRatio reicht.

im fall aspectRatio > 1 wird x verkleinert
im fall aspectRatio < 1 wird x eben vergrößert.

Das Verhältniss stimmt in beiden Fällen

Yawn
13-11-2004, 12:37
Eine Frage zur Normalisation:

Warum bekomme ich eigentlich die Koordinaten in den Bereich [-1,1] indem ich sie homogenisiere?

Ich habe mir nach der letzten Vorlesung eigentlich gedacht, dass die Re-Homogenisierung grundsätzlich damit zusammenhängt, dass unsere homogene Koordinate nach der Projektion != 1 ist, und man deshalb die Punkte wieder auf die Form (x,y,z,1) bringen muss. Dass die Punkte dabei automatisch in einen normalisierten Bereich kommen kann ich aber nicht ganz nachvollziehen.

Vielleicht kann mir da jemand helfen?

P.S.: Ich hab's übringens eh auch so wie white russian und saruman es erklärt haben, implementiert. Ich verstehe nur nicht ganz warum das funktioniert.

Matthias
13-11-2004, 12:51
ich bin der Meinung, dass x/aspectRatio reicht.

im fall aspectRatio > 1 wird x verkleinert
im fall aspectRatio < 1 wird x eben vergrößert.

Das Verhältniss stimmt in beiden Fällen

ja, das sollte stimmen. allerdings ist es noch schöner, wenn du nicht immer die selbe achse festhältst (in deinem fall y), sondern das ebenfalls vom aspectratio abhängig machst. siehe saruman zB, das sieht auf den ersten blick gut aus.

Lizzy
13-11-2004, 12:57
Kann ich die Koordinaten nicht auch mit einer Matrix umrechnen? Also zuerst homogeniesieren und dann mit der Matrix 7-42 multiplizieren?

Ich kann meine ideen leider noch nicht testen, weil ich einfach gar nix sehe (schwarzer canvas).

Matthias
13-11-2004, 13:09
Eine Frage zur Normalisation:
Warum bekomme ich eigentlich die Koordinaten in den Bereich [-1,1] indem ich sie homogenisiere?

Das verdanken wir der Projektion, nähere Infos dazu findest du im Buch im Kapitel 7 (3. Ausgabe). Allerdings ist zu beachten, dass nicht alle (!) Koordinaten in den Bereich [-1,1] kommen! Das ist lediglich der Bereich, den wir dann später am Bildschirm darstellen. Verschiebst du dein Objekt zB auf der x-Achse aus dem Bildschirm, dann wird kein einziger x-Wert einen Wert zwischen -1 und 1 annehmen.

Yawn
13-11-2004, 14:47
Ah, danke.

MrAngel
13-11-2004, 15:22
Ich hab eine Frage zum Homogenisieren!

Muss ich beide in[i] und out[i] homogenisieren?
Und woher weis ich, wie große i ist?

MFG Angel

white russian
13-11-2004, 15:26
ad1: meinermeinung nach sollten die in sachen nicht verändert werden. d.h: alle umwandlungen müssen in out gespeichert werden.


ad2: in.length gibt die anzahl der Einträge

Matthias
13-11-2004, 15:27
Muss ich beide in[i] und out[i] homogenisieren?


natürlich nicht, in weiterer folge benötigst du ja nur noch out. und i sollte die laufvariable einer schleife sein.

morgan
14-11-2004, 15:54
Kann ich die Koordinaten nicht auch mit einer Matrix umrechnen? Also zuerst homogeniesieren und dann mit der Matrix 7-42 multiplizieren?

Ich kann meine ideen leider noch nicht testen, weil ich einfach gar nix sehe (schwarzer canvas).

ja das würd ich auch gerne wissen. bei der anderen hernagehensweise blicke ich nämlich nicht ganz durch…

tgfkaf
15-11-2004, 15:02
so ok: versteh ja warum wann homogenisiert und danach das ganze auf den canvas mappt, aber das was saruman in schritt 3 geschrieben hat versteh ich nicht so ganz:


ich hab das eigentlich auch so verstanden...
Was mich derzeit noch etwas beschäftigt ist der Aspect Ratio - kann das stimmen:

1.) homogenisieren

2.):
.....

3.) ab in die Mitte des Canvas damit.




was ist hier mit der mitte des canvas gemeint?

danke schon mal.

mfg tgfkaf

Matthias
15-11-2004, 15:28
was ist hier mit der mitte des canvas gemeint?


nach dem homogenisieren, willst du ja alle punkte, die sich im bereich -1 bis +1 (x,y) befinden, darstellen. d.h. 0/0 soll in die mitte der zeichenfläche (canvas). das ist also zu beachten, wenn du die punkte aufskalierst. zu beachten ist da noch, dass y umgedreht werden muss (in unseren weltkoordinaten zeigt y nach oben, im canvas dagegen nach unten).

Matthias
15-11-2004, 15:32
ja das würd ich auch gerne wissen. bei der anderen hernagehensweise blicke ich nämlich nicht ganz durch…

dabei ist die andere herangehensweise die einfachere, das mit der matrix brauchen wir hier einfach nicht. du gehst einfach alle punkte durch und homgenisierst sie. alle punkte, die danach im bereich -1 bis +1 sind (x, y) sollen auf deinem canvas dargestellt werden. d.h. du "skalierst" sie so, dass -1 ganz links ist und +1 rechts (bzw. unten/oben, y muss umgedreht werden).
achtung: um clipping oder so musst du dich hier nicht kümmern, d.h. du berechnest auch punkte die außerhalb von [-1, +1] liegen.

SeeS
15-11-2004, 19:25
Ich hab' ein kleines Problem und zwar bekomme ich eine
ArrayIndexOutofBoundsException bei der getDeviceCoordinates - Funktion

Ich habe alle Schritte so implementiert, wie sie auch hier besprochen wurden, also 1. homogenisieren 2. Koordinaten aufblasen 3. in die mitte bringen

Kann mir da vielleicht jemand helfen?

hat sich erledigt

Cheez
16-11-2004, 00:56
könnte mir jemand das aufskalieren erklären??

Danke!!

Domokun
16-11-2004, 01:13
2.):
wenn aspectRatio > 1 dann
out[i].x = out[i].x * ((canvasWidth/2.0)/aspectRatio); // damit x&y praktisch um den gleichen Faktor aufgeblasen werden wird die breite "verkleinert"
out[i].y = out[i].y * (canvasHeight/2.0);


wenn ich mich nicht irre ist ((canvasWidth/2.0)/aspectRatio) = (canvasHeight/2.0) oder?

((canvasWidth/2.0)/aspectRatio)
= ((canvasWidth/2.0)/(canvasWidth/canvasHeight))
= ((canvasWidth*canvasHeight)/(2.0*canvasWidth))
= (canvasHeight/2.0)

hat es einen speziellen grund warum du das so angeschrieben hast?

Domokun
16-11-2004, 02:01
Ich hab von den Umwandlungsschritten mal eine graphische Darstellung gemacht...

ich hoffe die stimmt so...

[W4]hoLogramm
16-11-2004, 08:22
wenn ich mich nicht irre ist ((canvasWidth/2.0)/aspectRatio) = (canvasHeight/2.0) oder?
100% agree.

Die Bilder scheinen in Ordnung nur im 2. Punkt hast du geschrieben ... -1 bis +1 auf der x- und y-Achse ... das sollte x- oder y-Achse heissen sonst bekommst du Verzerrungen, da das View-Window nicht immer quadratisch ist.
( also: 800 x 600 ... +/-1.3333 x +/-1 )

Sonst sind die Bilder ziemlich n1. :thumb:

MrAngel
16-11-2004, 10:21
Kann viell noch jemand den dritten Punkt noch erklären, wie ich (0,0) in die Mitte des Canvas schiebe, weil da Blicke ich noch nicht durch. Das andere ist alles kein Problem, aber das schon! Danke!

MFG ANgel

8-Bit
16-11-2004, 10:25
einfach zu den x Koordinaten getWidth()/2 und zu den y Koordinaten getHeight()/2 addieren.