View Full Version : [FRAGE] - setDistance!!!
worstCaseFinder
12-11-2004, 23:37
Hi Everybody
direkt zur Sache: Wie setze ich die CameraDistance???
Zu meiner Information:
viewMatrixPoint = R*T (Rotation*Translation) richtig???
=> T = R' *viewMatrixPoint wobei R' steht fuer inverse von R
und jetzt update T mit dem Wert von CameraDistance und dann berechne
Ich viewMatrixPoint erneut.
Is das richtig oder denke Ich wie immer kompliziert!!!!
any idea????
Noch eine Frage: wie berechnet man inverse von einem matrix, ich meinte gibt es irgend eine Matrix package in java oder so?
thx ^_^
Hallo,
also mir hat die Antwort auf meine Frage des tutors (bzgl transform funktion) auch in diesem aspekt einsicht erbracht.
Weiters hab ich auch die hinweise auf der website oftmals gelesen und jetzt versteh ich das so:
Man muss den abstand der Camera zum Weltkoordinaten fixpunkt folgendermaßen umsetzen:
Irgendwo auf der Website steht, dass man die Kamerabewegungen irgendwie als weltkoordinatensystembewegungen auffassen soll. Wenn man das so sieht, dann kann man darunter auch verstehen, dass das hin- und wegbewegen der camera einer translation des gesamten weltkoordinatensystems gleichkommt (da jeder einzelne objektpunkt relativ zur camera verschoben werden muss).
Also ich habs zwar noch nicht gelöst, aber ich werds so implementieren, dass ich die kamerabewegungen in den matrixen einbaue. Also jedesmal bei einem setdistance setz ich die translation in der viewMatrixPoint (für die viewMatrixVector entfällt das ja, da man vektoren ja net verschieben braucht, weils ja keine fixpunkte sondern nur richtung haben..).
Gleiches gilt ja natürlich auch dann für die Rotation.
Den ViewVektor versteh ich als den Vektor, der in die Richtung zeigt, in die die camera gerade aus "schaut". Am Anfang schaut dieser vektor entlang der negativen z achse (steht irgendwo auf der website unter 2. Viewing ganz am Ende).
Mit einem Rotate verändert sich somit der vektor (die camera schaut in eine andere richtung). Mit einem setDistance verändert sich aber am Vektor nix, weil die camera ja trotzdem in die gleiche richtung schaut...
ich hoffe, das ganze etwas klarer gemacht zu haben (soferns überhaupt stimmt was ich da schreibe ;-)
white russian
13-11-2004, 00:57
Camera.SetDistance ist nur eine Translation in z Richtung :thumb:
ChrisChiu
13-11-2004, 01:19
Camera.SetDistance ist nur eine Translation in z Richtung :thumb:
Richtig.
Zur näheren Erklärung (ich hoff ich kann das jetzt einigermaßen verständlich machen :) ):
Erinnert euch an die Viewing-Pipeline (jetzt nur der Teil bis zu den Viewing-Koordinaten, also die Projektion lass ich mal aus, weil die mit dem Kamera-Modell an sich eh nichts zu tun hat):
V * M * P
P... Punktmenge
M... Modelmatrix (in CG1Object)
V... Viewmatrix (in CG1Camera)
D.h. nachdem alle Objekte (hier vertreten durch P) mit M multipliziert worden sind, liegen die Koordinaten ja im Weltkoordinatensystem vor.
Jetzt muß noch die gesamte Welt so transformiert werden, dass sie so orientiert und positioniert ist, dass sie so aussieht, als wäre sie genau die "Ansicht" von der Kamera aus. Also die Transformation in die Viewing Koordinaten, die durch V geschieht.
Das Kameramodell hier in CG1 LU ist recht einfach: man kann nur um den (Weltkoordinaten-)Ursprung rotieren, und nur eine Distanz vom (Weltkoordinaten-)Ursprung setzen.
Wie geht man vor? Man muß relativ denken! Also, wenn die Kamera sich von den Objekten wegbewegt, ist das genauso wie wenn man alle Objekte (in Weltkoordinaten) von der Kamera wegbewegt. Es ist wie wenn man im Zug sitzt: man kann sagen, man bewegt sich relativ zur Welt - oder man kann sagen die ganze Welt bewegt sich relativ zu sich selbst (also tatsächlich Relativität).
Das gleiche bei der Kamerarotation: dreht man die Kamera um den Weltkoordinatenursprung, ist das als ob man die gesamte Welt in die entgegengesetzte Richtung rotiert. Man muß daher hier auch wieder dasselbe machen wie bei CG1Object im LEFT_TRANSLATE Modus: zuerst in den Ursprung translieren (um cameraDistance), rotieren, und wieder zurücktranslieren (um cameraDistance).
Um die Kameradistanz zu setzen - und dabei die eventuell vorhandene Rotation nicht zu zerstören, muß man daher angehen, indem man zuerst die Translationskomponente (wobei hier ja nur Z zum tragen kommt, da die Z-Achse genau jene ist, die in Blickrichtung liegt) in der View Matrix löscht (also auf 0 setzt), und dann eine neue Translation (wobei wieder nur Z relevant ist) zur View Matrix links-multipliziert.
danke für die erklärungen! ich denke langsam wirds mit dem verständnis ;-)
Auf die translation bei der rotation der kamera hätte ich vergessen. Danke für den tipp ;-)
Matthias
13-11-2004, 12:41
Den ViewVektor versteh ich als den Vektor, der in die Richtung zeigt, in die die camera gerade aus "schaut". Am Anfang schaut dieser vektor entlang der negativen z achse (steht irgendwo auf der website unter 2. Viewing ganz am Ende).
Ja, genau. Bei der getViewVector Methode wird allerdings folgendes verlangt:
Return a normalized vector pointing from the world origin to the viewing coordinate origin. (in viewing coordinates!)
D.h. also nicht von der Kamera zu 0/0/0, sondern von 0/0/0 zur Kamera. Einfach umdrehen. Wurde gestern bei der Fragestunde leider falsch beantwortet, sorry.
eine blöde frage - aber ich steh grad ziemlich auf der leitung
bei getDistance() will ich mir doch einen double wert holen. also das -z wo die kamera gerade ist? wie bekomme ich diesen wert am besten?
white russian
13-11-2004, 13:02
du musst das MatrixElement zurückgeben das du in Set distance verändert hast
also tz; = Matrix.[2][3] und das mit -1 Multiplizieren weil die Kamera in der negativen z-Richtung steht
danke für die promte antwort :)
NightHaG
13-11-2004, 15:51
Kann mir wer sagen woran es liegen könnte wenn sich das Objekt immer weiter von der Kamera wegbewegt egal wohin ich den Distanceregler schiebe? Ich komm da einfach nicht drauf.
white russian
13-11-2004, 15:57
evtl. bei get Distance nicht mit * (-1) multipliziert
oder sonst beim setDistance einen Fehler gemacht
Neue Distanz ist getDistance() - cameraDistance)
NightHaG
13-11-2004, 16:23
Ich merk schon der Hund is ganz woanders drin. Komischerweise zeigt er geladene objekte nur an wenn ich den distanceregler um 0.01 in eine Richtung bewege. Sobald ichs weiterbewege ist das objekt wieder weg. :(
Um die Kameradistanz zu setzen - und dabei die eventuell vorhandene Rotation nicht zu zerstören, muß man daher angehen, indem man zuerst die Translationskomponente (wobei hier ja nur Z zum tragen kommt, da die Z-Achse genau jene ist, die in Blickrichtung liegt) in der View Matrix löscht (also auf 0 setzt), und dann eine neue Translation (wobei wieder nur Z relevant ist) zur View Matrix links-multipliziert.
da war beim chris ein kleiner denkfehler drin (ja, auch wir sind hin und wieder müde :-)) - die translation zerstört die rotation an sich nicht.
Diese zwei Operationen (setzen der matrix auf den wert bzw. setzen auf 0 und translation ausführen) wären an sich auch identisch - wenn wir davon ausgehen könnten, dass die matrix gerade homogen ist. was passiert, wenn die gerade inhomogen ist, kann man sich recht einfach überlegen, wenn man das ganze mal auf einem blatt papier ausmultipliziert :-)
beim derzeitigen user-interface ist das allerdings nicht so wahnsinnig relevant, daher eher von theoretischem interesse. wenn jemand beim abgabegespräch erklären kann, wann und warum es nicht funktioniert, bin ich schon eher beeindruckt :-)
Ich merk schon der Hund is ganz woanders drin. Komischerweise zeigt er geladene objekte nur an wenn ich den distanceregler um 0.01 in eine Richtung bewege. Sobald ichs weiterbewege ist das objekt wieder weg. :(
bitte gib bescheid wenn du draufkommst, ich hab dasselbe problem...
danke! lg r-no
ille_pille
14-11-2004, 01:21
Ja, genau. Bei der getViewVector Methode wird allerdings folgendes verlangt:
Return a normalized vector pointing from the world origin to the viewing coordinate origin. (in viewing coordinates!)
D.h. also nicht von der Kamera zu 0/0/0, sondern von 0/0/0 zur Kamera. Einfach umdrehen. Wurde gestern bei der Fragestunde leider falsch beantwortet, sorry.
Wo wird eigentlich die Methode getViewVector() verwendet!?
Wäre dankbar für eine Antwort ;)
Matthias
14-11-2004, 01:59
Wo wird eigentlich die Methode getViewVector() verwendet!?
Wäre dankbar für eine Antwort ;)
später bei der Beleuchtung.
ille_pille
14-11-2004, 12:21
später bei der Beleuchtung.
Hätte ich es mir denken können :)
danke:thumb:
- TeMET_noSCE -
14-11-2004, 15:44
bitte gib bescheid wenn du draufkommst, ich hab dasselbe problem...
danke! lg r-nome too!!!
:confused:
wenn ich bei z.B. setDistance() die translation anwende - wird die nicht erkannt weil die translationsfunktion ja in cg1object steht - wie löse ich diese problem??
ChrisChiu
14-11-2004, 21:38
wenn ich bei z.B. setDistance() die translation anwende - wird die nicht erkannt weil die translationsfunktion ja in cg1object steht - wie löse ich diese problem??
Du setzt die Translation in der CG1Camera, indem du die richtigen Elemente (oder besser gesagt, das eine richtige Element) in der View Matrix setzt.
Die Translation im CG1Object bewegt nur die Objekte, und hat mit dem Kameramodell nichts zu tun.
danke - der verständnisnebel lichtet sich langsam :)
bei mir tut sich nur was wenn ich den "view Plane Z"-Regler verändere, bei CameraDistance und Far Plane Z tut sichgar nix - ist das normal?
und ist es normal dass die objekte am anfang fuziklein im linken oberen eck sind? ich glaub das ist weil ich CG1Canvas noch nicht gemacht hab...
Matthias
15-11-2004, 14:01
bei mir tut sich nur was wenn ich den "view Plane Z"-Regler verändere, bei CameraDistance und Far Plane Z tut sichgar nix - ist das normal?
und ist es normal dass die objekte am anfang fuziklein im linken oberen eck sind? ich glaub das ist weil ich CG1Canvas noch nicht gemacht hab...
Bei der Farplane ändert sich optisch nichts, bei der Camera Distance sollte sich auf jeden Fall etwas verändern. Und dass die Objekte klein im oberen Eck sind, ist auch nicht korrekt, aber das liegt definitiv am nicht implementierten Canvas.
thx - aber was kanns bei camera distance haben?
setDistance und getDistance hab ich programmiert - ist da vielleicht der hund drin?
Matthias
15-11-2004, 14:12
thx - aber was kanns bei camera distance haben?
setDistance und getDistance hab ich programmiert - ist da vielleicht der hund drin?
Möglich :) Führst du in CG1Object.transform die View Transformation aus? Ich würde aber auf alle Fälle jetzt erstmal den Canvas fertig programmieren.
view und projection wird eh gemacht. beim canvas hab ich noch ein paar probleme
Also ich hab dasselbe problem... die Objekte erscheinen ganz links oben ganz klein.... die Modell Transformationen funktionieren zwar alle, aber bei setCameradistance tut sich gar nichts... ebenso wie sich Translationen in Richtung Kamera nicht auswirken...
Hab aber den Canvas glaub ich schon mehr oder weniger implementiert...
- TeMET_noSCE -
15-11-2004, 21:36
du musst im canvas nach dem homogenisieren der punkte das objekt noch aufblasen! (siehe thread vom vorjahr: bsp 3B starthilfe)
muss ich in transform() erst canvas.getDeviceCoordinates machen, oder zuerst matrix.transformPoints()?
- TeMET_noSCE -
15-11-2004, 22:11
muss ich in transform() erst canvas.getDeviceCoordinates machen, oder zuerst matrix.transformPoints()?zuerst transformPoints,dann get deviceCoords!
also den canvas check ich nicht ganz...
mit w (in dem starthilfeposting) ist da die canvas höhe gemeint? die wird aber im code als width bezeichnet, also schätz ich mal das w ist was anderes?
- TeMET_noSCE -
15-11-2004, 22:39
also den canvas check ich nicht ganz...
mit w (in dem starthilfeposting) ist da die canvas höhe gemeint? die wird aber im code als width bezeichnet, also schätz ich mal das w ist was anderes?ja es sind anscheinend ein paar bezeichnungen im vergleich zum vorjahr geändert worden.
zitat cypher aus starthilfe zu diesem thema
- Der Vektor muss homogenisiert werden. In unserem Fall heisst das, dass wir durch w durchdividieren. Die z-Koordinate können wir so übernehmen, da sie ja für die Anzeige keine Rolle mehr spielt, x wird zu x/w, y zu y/w und w wird dementsprechend zu 1.
- Die x- und y- Koordinaten müssen auf Bildschirmgrösse "aufgeblasen" werden, z kann wieder so übernommen werden. Also müssen wir z.B. die x-Koordinate vom Bereich (-1, 1) auf (-xmax/2, xmax/2) skalieren, xmax und ymax bekommt man mit getWidth bzw. getHeight.
- um die aspect ratio korrigieren (bekommt man mit getAspectRatio)
- das ganze in die Mitte des Bildschirms verschieben und die y-achse invertieren (weil y=0 im Koordinatensystem ja unten ist, am Bildschirm aber oben)
fragen? ;-)
ok, das klappt jetzt, danke....
zitat cypher aus starthilfe zu diesem thema ...
was man hier schreibt, ist ja anscheinend wirklich für die ewigkeit :-) ... finde es aber gut, wenn ihr euch diese sachen anschaut, denn die meisten fragen sind natürlich im vorjahr schon gestellt worden.
das w in diesem posting von mir bezog sich natürlich auf die elemente eines vektors, die in der CG allgemein mit (x,y,z,w) bezeichnet werden.
Ein solcher Vektor wird dann als homogen bezeichnet, wenn w == 1 ist. Nach gewissen transformationen (wie z.B. einer Projektion) ist w != 1, wodurch man diesen Vektor erst wieder homogenisieren muss. dies geschieht durch division des vektors durch w - wir bekommen also einen vektor (x/w, y/w, z/w, 1) der nun wieder homogen ist.
(z/w müssen wir hier nicht mehr wirklich berechnen, weil die z-koordinate zu diesem zeitpunkt nicht mehr relevant für uns ist.)
dieses w hat natürlich NICHTS mit allfälligen w's und h's für höhe und breite zu tun, die irgendwo im code herumschwirren mögen!
dieses w hat natürlich NICHTS mit allfälligen w's und h's für höhe und breite zu tun, die irgendwo im code herumschwirren mögen!
ja, das hab ich dann eh gemerkt, war etwas lame von mir...
vBulletin® v3.7.1, Copyright ©2000-2009, Jelsoft Enterprises Ltd.