PDA

View Full Version : [Frage] Ausarbeitung Prüfung [25. Jänner 2002]


Unic0der
23-01-2004, 14:19
Hab mal die Aufgabe 3 der Prüfung vom 25.01.02 ausgearbeitet (das ist das Beispiel mit dem Bresenham und dem DDA).
Das komische an der Aufgabe ist, dass die Linie mit Bresenham genauso aussieht wie mit DDA.

Wie auch immer, im Anhang ist meine Lösung.

lg mac :)

oo7eventy
23-01-2004, 20:19
Das komische an der Aufgabe ist, dass die Linie mit Bresenham genauso aussieht wie mit DDA.

Die beiden Algorithmen unterscheiden sich ja auch nicht im aussehen. Der Bresenham ist einfach besser weil man ihn am Computer schneller berechnen kann. Sonst macht er nichts anders...

lg 007

Sensei
23-01-2004, 20:22
also habs jetzt nicht nopchmal durchgeschaut, aber als ichs gestern gemacht habe is mir bei y-Wert 7 beim Bresenham der Wert 6 für x-wert rausgekommen.
bresenham und dda unterscheiden sich also in dieser zeile. p ist bei mir an dieser stelle 7 ==> größer null, also x erhöhen.

denke das passt (wäre wie von dir geschrieben ein bisschen komisch genau ein bsp zu geben wo man keinen unterschied sieht).

oo7eventy
23-01-2004, 21:01
Ich glaube sie unterscheiden sich nicht. Ich habs jetzt auch mal durchgerechnet und bei mir kommt das selbe raus wie beim MacOS X.

Es ist ja außerdem der gesamte Rechengang verlangt, also macht es nix aus das die beiden Geraden gleich aussehen.

lg 007

Sensei
24-01-2004, 11:17
stimmt, ich hab mich im letzten schritt vertan. damn

ps: denkt ihr man MUSS das so mit der tabelle k, pk, x_k+1, y_k+1 aufschreiben? Die check ich näml. nicht wirklich und finde sie außerdem verwirrend wenn ich zB gerade swape (und deswegen x und y erst recht wieder vertauschen muss).
Ich schreib den Rechengang (d.h. Ansatz mit 2dy usw. und dann ür jeden schritt p,x,y) hin. sollt auch rechen, oder?

zardoz
24-01-2004, 11:31
hab mich mal an bsp 2 versucht.
bin mir aber nicht sicher was mit geschert(1,1) gemeint ist
--scherung um 1 auf x und y achse oder ist der 2te 1er der Yref point????

und stimmt das sonst was ich da fabriziert hab???
oder is das kompletter schwachsinn??

Unic0der
24-01-2004, 11:33
sollt auch reichen, oder?

Solange man nachvollziehen kann was du gemacht hast ist vollkommen egal wie du es aufschreibst. Ich hab mich halt 1:1 an das Buch gehalten. Muss man aber nicht ;) ...

Sensei
24-01-2004, 12:10
@zardoz: Habs im Prinzip wie du, bei der Scherung bin ich mir aber auch mehr als unsicher!
Nochwas: Die Reihenfolge um welchen Winkel zuerst gedreht wird ist egal, oder? Man muss nur darauf achten die translation erst durchzuführen, wenn das Objektkoordinatensystem "gerade" steht...!?

Sensei
24-01-2004, 12:24
wie macht man das zBuffering? Kann das vom Algo den wir in der LU implementiert haben nicht aufs Papier umsetzen...!

EndOfDayz
24-01-2004, 13:37
war blödsinn

Sensei
24-01-2004, 13:42
Sollte die Reihenfolge der Matrizenmultiplikationen nicht:

M3*M2*M1*Mgeschert*M6*M5*M4
nein! wenn du zuerst verschiebst und dann drehst kommst du mit deinem objektkoordinatensystem wo ganz wo anders hin als in den ursprung des weltkoordinatensystems. unser ziel ist ja, beide koordinatensysteme gleich zu bekommen, dann kann geschert (gespüiegelt,...) werden und dann wieder zurück zum urspr. platz bringen!
du musst immer:

1) lokal koordinatensystem (obj-koord-syst) drehen, damit es gleiche orientierung wie das weltkoordinatensystem hat
2) in den ursprung verschieben
3) die gesuchte transformation vornehmen
4) die schritte 1) und 2) in umgekehrter reihenfolghe rückgängig machen

so sollts passen!
weiß jemand noch was zur scherung?

EndOfDayz
24-01-2004, 14:06
Hmm die Reihenfolge was ich vorher aufgeschrieben hab war blödsinn, so hat ichs mir auch eigentlich nicht gedacht ... eigentlich hab ichs so gemeint:

M4*M5*M6*Mgeschert*M1*M2*M3

ist das ebenfalls blödsinn?

Sensei
24-01-2004, 14:20
is auch nicht gut! du liest das ganze von rechts nach links - das is mal wichtig zu wissen. und dann eben

DREHEN ==> TRANSLIEREN ==> [Operation={Scherung,...}] ==>
==> ZURÜCKTRANSLIEREN ==> ZURÜCKDREHEN

hth

EndOfDayz
24-01-2004, 14:52
is auch nicht gut! du liest das ganze von rechts nach links - das is mal wichtig zu wissen. und dann eben

DREHEN ==> TRANSLIEREN ==> [Operation={Scherung,...}] ==>
==> ZURÜCKTRANSLIEREN ==> ZURÜCKDREHEN

hth

das würde dann doch heißen, dass du eine rotation, die du anfangs durchgeführt hast als das objekt im ursprung lag du dann "rückgängig" machen willst durch eine rotation um den ursprung obwohl das objekt an irgendeinem anderen punkt im weltkoordinatensystem liegt...

darum denke ich mir das man zuerst in den ursprung zurück translieren muss und dann die kugel drehen.

ich verweise da mal aufs buch 3. ausgabe , kapitel 5-8 S. 259-260

Sensei
24-01-2004, 15:23
meiner meinung nach ist es bei rotationen zioemlich wurscht wo das koordinatensystem gerade ist. das wichtige sit nur, dass die translation auf ein "gerades" koordiunatensystem angewandt wird.
ok... ich versteh aber was du meinst: du denkst, es wurde zuerst gedreht und dann verschoben, oder? wenns so ist, hast du recht. haben wir aber zB in der LU immer anders gemacht: zuerst verschieben, dann drehen. ich hoffe es kommt raus was ich sagen will.

im ernstfall kann man aber sicher einen prüfungsaufseher fragen, in welcher reihenfolge das objekt in seine jetzige position kam (und muss diese dann umdrehen).

EndOfDayz
24-01-2004, 15:33
Gut ich versteh was du meinst, ich hab mich halt auf die kleinen skizzen auf dem angabenblatt bezogen, da scheint zuerst rotiert zu werden und es ist eh klar, dass man dann genau in der umgekehrten reihenfolge die transformationen anwenden muss um es wieder in den ursprung zu kommen.

danke auf jedenfall für deine hilfe

klwe
24-01-2004, 15:57
Also bei mir sieht das Ganze so aus:

Zuerst verschieben:
1 0 0 -tx
0 1 0 -ty
0 0 1 -tz

dann rotieren (Reihenfolge ist egal):
Rotation z-Achse:
cos -a -sin -a ...
sin -a cos -a ...
...

Rotation x-Achse
cos -b sin -b ...
0 1 0
-sin -b 0 cos -b

Scherung:
1 0 0
1 1 0
1 0 1

Anmerkung: x'-Achse soll gleich bleiben, deshalb auf y' und z' anwenden. Bin mir aber nicht sicher...

doppelte Grösse:
2 0 0
0 2 0
0 0 2

danach zurückdrehen und zurückverschieben

Multiplikationsreihenfolge für composite-Matrix:
Zurückverschieben . Zurückdrehen . Skalierung. Scherung . Rotationen . Verschiebung

Welche Drehung zuerst angewandt wird, sollte egal sein - nicht egal ist jedoch die Reihenfolge - Verschiebung und Drehung!

zardoz
24-01-2004, 17:23
wie macht man das zBuffering? Kann das vom Algo den wir in der LU implementiert haben nicht aufs Papier umsetzen...!

hab mal wieder was eingescannt....

Sensei
24-01-2004, 17:36
@zardoz:
hmmm.... und wie geht das?

zardoz
24-01-2004, 18:12
@zardoz:
hmmm.... und wie geht das?
tja wenns so stimmt wie ich das gemacht hab, is es sehr simpl.
also ich schau von der positiven z-achse auf die rechtecke.d.h. je > der z wert desto näher. dann hab ich einfach die z-werte der einzelnen rechtecke verglichen und für jedes pixel den z- wert genommen der am größten is.
das wars- kommt mir eigentlich fast zu einfach vor- deshalb hätt ich auch gern ein bißchen feedback.

Matthias
24-01-2004, 18:31
tja wenns so stimmt wie ich das gemacht hab, is es sehr simpl.
also ich schau von der positiven z-achse auf die rechtecke.d.h. je > der z wert desto näher. dann hab ich einfach die z-werte der einzelnen rechtecke verglichen und für jedes pixel den z- wert genommen der am größten is.
das wars- kommt mir eigentlich fast zu einfach vor- deshalb hätt ich auch gern ein bißchen feedback.

exakt so hab ichs ebenfalls.

Sensei
25-01-2004, 12:53
Tut leid, ich check das überhaupt nicht. der zWert ist ja nicht bei allen Figuren konstant. Muss man da was berechnen auch noch?
Und ich check immer noch nicht wie man etwas in den zBuffer einträgt und wie man etwas im Bild einträgt. Manche Punkte kommen außerdem bei mehreren Figuren vor ==> welchen nehmen? (den vom1. wie ich annehme).
Aber soweit komm ich ja nicht mal.
Kann mir nochmal jemand eine Schritt-für-Schritt anleitung posten?

Matthias
25-01-2004, 13:02
Tut leid, ich check das überhaupt nicht. der zWert ist ja nicht bei allen Figuren konstant. Muss man da was berechnen auch noch?
Und ich check immer noch nicht wie man etwas in den zBuffer einträgt und wie man etwas im Bild einträgt. Manche Punkte kommen außerdem bei mehreren Figuren vor ==> welchen nehmen? (den vom1. wie ich annehme).
Aber soweit komm ich ja nicht mal.
Kann mir nochmal jemand eine Schritt-für-Schritt anleitung posten?

z-Buffering läuft eigentlich genauso wie in der LU programmiert, nur, dass wir halt das Interpolieren auch übernehmen müssen.

Der z Wert ist ja nur an den Eckpunkten gegeben. Wenn du nun ein Rechteck hast, welches an 2 Ecken z = 5 hat und an den anderen 2 Ecken z = 10, dann müssen die z Werte für die dazwischen liegenden Pixel berechnet werden. In allen Beispielen ist es aber so, dass das sehr schön geht, da die Abstände immer so gewählt sind, dass man das gleich im Kopf ausrechnen kann.
Z.B. sind die 2 Seiten 5 Pixel auseinander, die Differenz zwischen z=10 und z=5 ist ebenfalls 5. Hier könntest du in 1er Schritten den z Wert erhöhen (5,6,7...10).
So kommst du auf alle z Werte eines Polygons.

Zeichne dir das einfach mal auf dem Raster auf, dann sollte leicht erkennbar sein, wie das gemeint ist.

Das machst du für alle Polygone. Wenn jetzt 2 Polygone das selbe Pixel beanspruchen, dann wird dort das Polygon mit dem größten z Wert gezeichnet. Sind 2 z Werte gleich, dann wird das erste Polygon mit diesem z Wert gezeichnet.

Das ganze ist eigentlich ziemlich einfach.

edit: Auf Seite 2 der Folien von Kapitel 13 ist das auf der 4. Folie ganz gut zu sehen.

Sensei
25-01-2004, 13:28
Danke für die Erklärung. Has jetzt mal prinzipiell gecheckt; finds aber nicht grad leicht. arggg mein gehorn hat knoten!!!
wurscht...

zur ausarbeitung von zardoz:
komme auf selbe, allerdings hab ich bei Pixel (8,7) eine abweichung.
Meiner Meinung nach gehört das zur R3.
R3 belegt es mit zWert 1
R4 belegt es mit zWert 1
R3 vor R4 ==> R3 mahlt es an.
Müsste also mMn bei zardoz ganz schwarz sein.

Oder hab ich einen Denkfehler? thx...

Usher
25-01-2004, 19:56
ich hab Pixel (8,7) auch als R3.
Und Pixel (9,5) auch als R3.
(Aber keine Garantie)

Sieht aus wie ein Sauhaufen wenn ich das ausmale...man muss ja dauernd drübermalen.
Und...das ist zwar nett, dass sich das so schön ausgeht, mit dem Anstieg/Abfall vom z....aber was, wenn nicht? Dann müsste ich für jedes Polygon eine Ebenengleichung erstellen und das z für jeden Punkt berechnen? Puh...
Und kommt mir das nur so vor, oder ist das R3 ein Rechteck (in 2D), das wie ein Karton gefaltet ist in 3D (zickzack-förmig)? - bei dem Ding müsste ich ja sogar mehrere Ebenengleichungen erstellen? Hoffentlich irre ich mich.

Matthias
25-01-2004, 22:55
ich hab Pixel (8,7) auch als R3.
Und Pixel (9,5) auch als R3.
(Aber keine Garantie)


ja, bei 8/7 gehört R3, habs auch so, hab mich oben verschaut.
bei 9/5 bleibt allerdings R1. R1 hat bei mir z=0, R3 hat -1.


Sieht aus wie ein Sauhaufen wenn ich das ausmale...man muss ja dauernd drübermalen.
Und...das ist zwar nett, dass sich das so schön ausgeht, mit dem Anstieg/Abfall vom z....aber was, wenn nicht? Dann müsste ich für jedes Polygon eine Ebenengleichung erstellen und das z für jeden Punkt berechnen? Puh...
Und kommt mir das nur so vor, oder ist das R3 ein Rechteck (in 2D), das wie ein Karton gefaltet ist in 3D (zickzack-förmig)? - bei dem Ding müsste ich ja sogar mehrere Ebenengleichungen erstellen? Hoffentlich irre ich mich.

es wird sicher so sein, dass man die werte einfach ausrechnen kann. und ja, es ist wirklich viel schreiberei. wäre besser, wenn sie für jedes polygon einen raster machen würden und man dann am ende schön zusammenfügen kann. wenn man langsam und sorgfältig vorgeht, wirds mit der zeit nämlich ganz schön knapp (die prüfung dauert ja nur 60 min).

Xandolph
26-01-2004, 21:47
Die richtigen 3D-Scherungs Matrizen gibt unter http://www.rz.fh-ulm.de/~lunde/cg/cgTransform.pdf auf Seite 7.
lg Xandi

lEn00x
27-01-2004, 21:06
bez dem z-buffer:

meine steps sehen so aus:
2
0
2
2
2

Ich bin gestern auf das gleiche ergebnis wie oben gepostet gekommen, aber mich würde trotzdem interessieren, ob ihr auf die gleichen steps gekommen seit.

Sensei
27-01-2004, 21:09
was meinst du mit steps?!?! wo kommt das beim zBuffer vor?

lEn00x
27-01-2004, 21:12
ich meine damit die schritte die du bei den z-koordinaten machst wenn du entlang der y bzw. x achse gehst...

Sensei
27-01-2004, 21:15
und welche schritte kopnkret?
in meiner ersten reihe (x=1) steht zB (von y=6 bis y=1)
-2
0
2
4
6
8
was du mit den ganzen zweiern meinst is mir nicht klar...

lEn00x
27-01-2004, 21:19
ok. vielleicht habe ich es umständlich gemacht - also wenn du einen bessern vorschlag hast, dann wäre ich darüber sehr erfreut ;)

Mein lösungsweg:
ich rechne mit für jedes polygon diesen wert aus um den sich die z-koordinate pro schritt ändert (z.b. beim ersten rechteck um 2 einheiten pro schritt entlang der y-achse).
Dann schaue ich je pixel, welches polygon den höchsten z-wert hat und trage ihn ins gitter ein.

Sensei
27-01-2004, 21:38
naja es geht sich eh immer so aus, dass sich der z-wert um 1-2 ändert. und prinzipiell mach ichs auch so wie du. aber halt jedes polynom ganz für sich und am schluss streich ich wenn in einem kasterl 3 werte drin stehen die 2 kleineren weg!

aber bei zardoz stehen eh die stepos drin. habs genauso wie er!

lEn00x
27-01-2004, 22:06
stimmt, bei seinem post sind die schritte eh so wie bei mir.
bei den vielen sachen kommt man halt mal schnell durcheinander (hoffentlich nicht bei der prüfung!)...