PDA

View Full Version : [FRAGE] - Bsp 4) Backface Culling


Flowyes
05-11-2004, 22:52
Ich will wieder sichergehen, dass ich Dinge richtig verstanden hab (bzw. falsch verstanden hab) und will verstehen, wo ich weiß, dass ichs nicht verstanden hab.

Also,

Was wir tun müssen ist, für jedes Polygon schauen, ob es "hinten" ist oder nicht. Wenn hinten, zeigen wir's nicht an.

Ein Polygon ist hinten, wenn

V_view * N > 0

gilt, wobei N der Normalvektor auf die Polygonfläche ist. Wo krieg ich diesen aber her? Ich hab ja in CG1Object.transform() nur die transNormals ermittelt und diese gibt es für jedes Vertex einzeln (oder?) Sind die N die faceNormals? Wenn ja, müssten wir dann nicht zuerst calcFaceNormals() implementieren. faceNormals probieren war natürlich sinnlos, denn diese sind bei mir noch nicht berechnet.

Und ich vermute schon zu wissen wo ich V_view herbekomme: Von CG1Camera.getViewVector() vielleicht?

ChrisChiu
05-11-2004, 23:13
Ich will wieder sichergehen, dass ich Dinge richtig verstanden hab (bzw. falsch verstanden hab) und will verstehen, wo ich weiß, dass ichs nicht verstanden hab.

Also,

Was wir tun müssen ist, für jedes Polygon schauen, ob es "hinten" ist oder nicht. Wenn hinten, zeigen wir's nicht an.

Ein Polygon ist hinten, wenn

V_view * N > 0

gilt, wobei N der Normalvektor auf die Polygonfläche ist. Wo krieg ich diesen aber her? Ich hab ja in CG1Object.transform() nur die transNormals ermittelt und diese gibt es für jedes Vertex einzeln (oder?) Sind die N die faceNormals? Wenn ja, müssten wir dann nicht zuerst calcFaceNormals() implementieren. faceNormals probieren war natürlich sinnlos, denn diese sind bei mir noch nicht berechnet.

Und ich vermute schon zu wissen wo ich V_view herbekomme: Von CG1Camera.getViewVector() vielleicht?

Das ist nicht ganz richtig. Wenn du das so machst, werden wohl einige false positives oder false negatives auftreten, sprich: eigentlich zu cullende Flächen werden nicht gecullt, und eigentllich nicht zu cullende werden gecullt.

Der Grund liegt darin: Der View Vector ist ja quasi ein Strahl, aber das Sichtfeld selbst ist kein einzelner Strahl, sondern ein Pyramidenstumpf (sogenannter Frustum). Der View Vector von der Kamera wäre dann genau mittig in diesem Frustum, aber die Flächen werden ja projeziert und gerendert nicht nur in die Mitte der Viewing Plane. Das passt also nicht zusammen - du müsstest wohl sowas tun wie den View Vector entlang der View Plane interpolieren oder so - viel zu kompliziert also, das in Weltkoordinaten durchzuführen.

Backface-Culling geschieht in Device Coordinates.

Der korrekte Prozess ist dieser: du berechnest den "Normalvektor" aus den bereits in Device Coordinates transformierten Punkten einer Fläche. Dann verwendest du einfach nur mehr die Z-Komponente dieses "Normalvektors" als Backface-Culling Kriterium.

EDIT: siehe dazu auch diesen Thread: http://www.informatik-forum.at/showthread.php?t=23130

Flowyes
05-11-2004, 23:53
Das mit der Projektion kann ich jetzt nachvollziehen glaub ich, so hab ich mir's nicht gedacht...

Hmm, das Thema eh schon diskutiert...

Ich hoff, dass jetzt alles hinhaut, danke.

Flowyes
06-11-2004, 00:15
Alles funktioniert einwandfrei. Ich hab aber außerhalb vom Block
if (doBackfaceCulling && numVertexIndex >= 3) {...}
einbisschen umgeändert (sonst krieg ich NullPointerExceptions). Das ist eh in Ordnung oder?

tivolo
06-11-2004, 19:44
solange dein code funktioniert und das macht, was er tun soll, ist alles in ordnung denke ich.

trotzdem meine frage: was hast du umbasteln müssen? wenn du im block des if-statements backface-culling implementierst, solltest du eigentlich sonst nichts mehr ändern müssen.

mfg,
tivolo

Flowyes
07-11-2004, 14:42
Nichts großartiges hab ich verändert. Im Programmgerüst wird ja gleich nach dem if-Block ein Polygon erzeugt, und ich hab dort einfach eine if-Abfrage eingebaut, damit ich das Polygon nur dann erzeuge, wenn ich eine Fläche zeigen werde. Sonst erzeug ich halt kein Polygon und rufe auch polygon.draw() nicht auf.

ChrisChiu
07-11-2004, 16:19
Nichts großartiges hab ich verändert. Im Programmgerüst wird ja gleich nach dem if-Block ein Polygon erzeugt, und ich hab dort einfach eine if-Abfrage eingebaut, damit ich das Polygon nur dann erzeuge, wenn ich eine Fläche zeigen werde. Sonst erzeug ich halt kein Polygon und rufe auch polygon.draw() nicht auf.

Da du in einer Schleife bist, reicht es, im if-Block einfach continue zu verwenden wenn das Backface-Culling-Kriterium erfüllt ist. Dann brauchst du außerhalb des Blocks nichts zu ändern.

Yawn
20-11-2004, 18:31
Noch eine kleine Frage:

Dass nach Bilden des "Normalvektors", dieser eigentlich in die verkehrte Richtung schaut (und unsere Bedingung zum Cullen also genau umgekehrt ist, nämlich z>=0), liegt daran, dass bei uns die y-Achse (in Device-Koordinaten) nach unten zeigt (und wir die y-Koordinaten deshalb beim Transformieren "umdrehen"), richtig?

tivolo
20-11-2004, 20:48
Die Bedingung fürs Cullen dreht sich durch die Koordinaten-System-Transformation nicht notwendigerweise um. Es kommt eher darauf an, wie du deine Normalvektoren bestimmst.

Aber dass sich das Koordinatensystem umdreht, stimmt.

mfg,
tivolo

Yawn
20-11-2004, 23:27
Die Bedingung fürs Cullen dreht sich durch die Koordinaten-System-Transformation nicht notwendigerweise um. Es kommt eher darauf an, wie du deine Normalvektoren bestimmst.
Naja, da die Punkte laut Angabe counterclockwise gespeichert sind (und wir uns in einem rechtshändigen Koordinatensystem befinden), habe ich mir gedacht, berechne ich mir den Normalvektor nach dem Schema (p2-p1)x(p3-p1), wie in den Vorlesungsfolien angegeben. Die Facenormals in Bsp 5 zeigen bei mir jedenfalls in die richtige Richtung.

Ich bin nur ein wenig verunsichert, dass das selbe Schema bei Backfaceculling genau verkehrte Normalvektoren erzeugt (jedenfalls bei mir), und habe versucht mir das über die Invertierung der y-Achse zu erklären.

Ich bin nur jetzt immer noch nicht ganz sicher, ob ich da einen Fehler übersehen habe, oder ob meine Berechnungen eh passen.

tivolo
21-11-2004, 02:00
Ah, ok, du hast mich da falsch interpretiert. Hab' das mehr oder weniger in dem Sinne gemeint, dass sich das (im Prinzip) je nach Berechnen der Normalvektoren "umdrehen" kann.
Den counterclockwise-Hinweis aus unserem Framework hab' ich übersehen.

Brauchst nicht verunsichert sein: Deine Erklärung stimmt, und wir führen Backface-Culling in einem Links-Hand-Koordinatensystem durch.

mfg,
tivolo

Tiniiiii
22-11-2004, 00:27
Ich hab noch eine kleine Verständnis-Frage:

Es sollen die Polygone die nicht in Richtung Kamera schauen nicht mehr angezeigt werden.

Polygone die im 'Hintergrund' des Objekts liegen sollen auch nicht mehr gezeichnet werden, oder ist das egal??? Siehe meine rotierte Teekanne: Man kann den Knopf vom Deckel noch sehen, obwohl er eigentlich 'hinter der Kanne' ist ... Passt das trotzdem oder ist das falsch???

Thanx & lg :ausheck:

tivolo
22-11-2004, 00:47
Zitat Homepage:

Achtung: Wir kümmern uns erst im nächsten Beispiel um die Sichtbarkeit der Polygone mittels Z-Buffer, diese werden inzwischen einfach in irgendeiner Reihenfolge gezeichnet, was auch an einem der folgenden Screenshots etwas merkwürdig aussieht.

Fazit: Dein Screenshot ist richtig.


Backface-Culling verschmeisst ja nur Polygone, die nicht in Richtung Kamera schauen. Wenn du aber (wie in deinem Fall) ein Objekt so drehst, dass Polygone HINTER anderen Polygonen liegen und trotzdem in Richtung Kamera schauen, dann siehst du diese natürlich.

Und genau um diesen Sichtbarkeits-Fehler kümmerst du dich im nächsten Beispiel mit Hilfe des z-Buffers.

mfg,
tivolo

C++Redeemer
26-11-2004, 00:40
ja ich hab mich mit dem ganzen jetzt auch herumgespielt und bin zum glück auch ohne dem buch ausgekommen...

sieht irgendwie ganz vernünftig aus.
http://www.unet.univie.ac.at/~a0307389/echt.jpg (http://www.unet.univie.ac.at/%7Ea0307389/echt.jpg)

---------

was ich mich allerdings noch immer frage ist, wie ein Face sozusagen seine Vertices findet aus denen es aufgebaut wird.

im object ist das ganze ja schon vorprogrammiert und sieht so aus:
// vertex array for this face
for (int j=0; j<numVertexIndex; j++) {
vertices[j] = transVertices[faceTable[i][j+2]]; }

ich interpretiere es so: scheinbar steht im facetable[nummer des faces][i] die nummer des iten punktes drinnen, aus dem face besteht.

was steht hier zb im faceTable[i][0] und faceTable[i][1] drin, dass im programm nicht darauf zugegriffen wird?
das hab ich noch nicht ganz durchschaut, wär nett wenn das kurz wer schildern könnte...

Flowyes
26-11-2004, 01:16
Das hab ich mir auch überlegt. Dann hab ich mir folgendes notiert (ich bin froh, dass ich das wieder finde)

faceTable[][] schaut ungefähr so aus: (ich hoff, dass ich genau bin)

faceTable.length = 2*numVertexIndex + 2

faceTable[i][0] := number of vertices of face at index i.
faceTable[i][1] := color index of face at index i.
faceTable[i][2], [faceTable[i][3], ... , faceTable[i][numVertexIndex+1] := the indices of vertices
optional: faceTable[i][numVertexIndex+2], ... faceTable[i][2*numVertexIndex+1] := normalTable indices of the vertices of this face at index i.

So müsste das ungefähr funktionieren...

ChrisChiu
26-11-2004, 03:49
Wär doch noch viel einfacher gegangen einfach den Kommentar dazu zu lesen:


/// object faces (for each face, we have an int array containing (in this order): vertex count, color index, vertex table indices, normal table indices)
private int[][] faceTable;

NightHaG
26-11-2004, 13:59
Wenn man sich den Code genauer anschaut gibt es weiter oben (in der Schleife) noch mehr Stellen die auch faceTable[0] und [1] auslesen. Und zwar in die variablen numVertexIndex und colorIndex.

C++Redeemer
26-11-2004, 15:03
cool, danke!
das bringt endlich licht in die sache wie die "objektdinge" verknüpft sind.

wenn endlich der 1.dezember vorbei ist (hunderte abgabedeadlines und prüfungen) werd ich mir mal das ganze nochmal genauer anschaun. langsam fügt sich ja alles zusammen. es dauert nur ne weile bis man das ganze programmgerüst kennengelernt hat (wenn man noch nie mit so nem (für mein maß) grossen und komplexen programm gearbeitet hat)

ines
26-11-2004, 20:02
[QUOTE=Yawn]Naja, da die Punkte laut Angabe counterclockwise gespeichert sind (und wir uns in einem rechtshändigen Koordinatensystem befinden), habe ich mir gedacht, berechne ich mir den Normalvektor nach dem Schema (p2-p1)x(p3-p1), wie in den Vorlesungsfolien angegeben. Die Facenormals in Bsp 5 zeigen bei mir jedenfalls in die richtige Richtung.
QUOTE]

wo in den vorlesungsfolien steht das?,...und nachdem ja ein face auch mehr als 3 vertices haben kann, versteh ich nicht ganz wie des funktioniert soll.??
lg, ines

thebigMuh
26-11-2004, 21:15
Wenn man davon ausgeht, daß ein Polygon immer eben ist, kannst du drei beliebige Vertices nehmen.

Ciao, ¡muh!

Yawn
26-11-2004, 23:38
wo in den vorlesungsfolien steht das?,...und nachdem ja ein face auch mehr als 3 vertices haben kann, versteh ich nicht ganz wie des funktioniert soll.??
lg, ines
Falls es dich noch interessiert, die "Formel" findet man bei den Folien für Kapitel 3: Output Primitives (eher gegen Ende).

SeeS
27-11-2004, 12:39
ich steh noch auf der leitung wie ich die 3 vertices bekomme, mit denen ich dann den normalvektor ausrechne.

weil bei faceTable habe ich ja vertices von faceTable[i][numVertexIndex+2]... faceTable[i][2*numVertexIndex+1] (normalTable indices) - mit denen soll man doch rechnen?

ich blick da nicht ganz durch - kann mir wer einen tipp geben?

C++Redeemer
27-11-2004, 14:53
alles was du brauchst wurde in derselben for schleife schon zusammengesammelt, in der dieses backface culling if ist. schau dir mal die sachen in der schleife an =)

ChrisChiu
27-11-2004, 16:10
ich steh noch auf der leitung wie ich die 3 vertices bekomme, mit denen ich dann den normalvektor ausrechne.

weil bei faceTable habe ich ja vertices von faceTable[i][numVertexIndex+2]... faceTable[i][2*numVertexIndex+1] (normalTable indices) - mit denen soll man doch rechnen?

ich blick da nicht ganz durch - kann mir wer einen tipp geben?

Für's Backface-Culling nimmst du wieder die ersten drei Vertizes her.

Also die werden indiziert über faceTable[i][2] bis faceTable[i][4] (das sind Indizes ins transVertices Array).

Du nimmst _nicht_ die Normalen-Indizes. Warum nicht, steht hier: http://www.informatik-forum.at/showpost.php?p=163278&postcount=2

Und wie gesagt, in faceTable stehen die _Indizes_, nicht die eigentlichen Vertizes/Punkte, sprich, die Integers in faceTable sagen dir, welches Element aus dem Vertex bzw. Normals Array gemeint ist. Indizierte Geometrie hat dadurch den Vorteil, dass man Vertizes "sharen" kann.

ChrisK
27-11-2004, 20:25
Also die werden indiziert über faceTable[i][2] bis faceTable[i][4] (das sind Indizes ins transVertices Array).


Müssen die Indizes nicht ins vertexTable Array gehen?
Wenn ich auf transVertices indiziere passiert überhaupt nichts, da dann alle z-Werte bei mir dann 0 sind

Lizzy
27-11-2004, 20:34
Wenn ich auf transVertices indiziere passiert überhaupt nichts, da dann alle z-Werte bei mir dann 0 sind

also den normalvektor musst du dir ja auch erst berechnen. Dazu nimmst du die ersten 3 Vertices des aktuellen faces her und erstellst aus diesen 2 vektoren. (1 - 2), (3 - 2) würde sich zB eigenen. Dann berechnest du von diesen beiden Vektoren das Kreuzprodukt und wie allgemein bekannt ist, steht dieses normal auf die beiden Vektoren. Damit berechent ich meinen Normalvektor... Ich hoffe das passt so halbwegs...

ChrisChiu
27-11-2004, 20:55
Müssen die Indizes nicht ins vertexTable Array gehen?
Wenn ich auf transVertices indiziere passiert überhaupt nichts, da dann alle z-Werte bei mir dann 0 sind

Ja, je nachdem, was du gerade machst. Wir sind grad im Backface-Culling Thread, daher nahm ich an du bist schon beim Backface-Culling.

Dort hast du schon transformierte Vertizes in Device Coordinates (transVertices), und die mußt du auch für's Backface-Culling verwenden.

ille_pille
28-11-2004, 13:55
Für's Backface-Culling nimmst du wieder die ersten drei Vertizes her.

Also die werden indiziert über faceTable[i][2] bis faceTable[i][4] (das sind Indizes ins transVertices Array).

Du nimmst _nicht_ die Normalen-Indizes. Warum nicht, steht hier: http://www.informatik-forum.at/showpost.php?p=163278&postcount=2

Und wie gesagt, in faceTable stehen die _Indizes_, nicht die eigentlichen Vertizes/Punkte, sprich, die Integers in faceTable sagen dir, welches Element aus dem Vertex bzw. Normals Array gemeint ist. Indizierte Geometrie hat dadurch den Vorteil, dass man Vertizes "sharen" kann.
Ist das nicht schon in der Methode implementiert und befinden sich die Vertices für die aktuelle Fläche nicht in Array vertices!? Dann kann man schon direkt die Punkte von dort nehmen.

ille_pille
28-11-2004, 14:00
Ich habe nämlich ein anderes Problem. Beim Backface Culling wird nach der Berechnung von Normalvektor die Z-Komponente immer null. Folglich wird nichts am Bildschirm gezeigt. Ich habe keine Ahnung wieso. Mache ich was falsches in der BackfaceCulling Methode oder ist vielleicht der Fehler irgenwo anders verborgen....Berechnen von z-Koordinate, Kreuzprodukt...(obwohl beim Testen es ok ist)
Backface habe ich wie im Forum beschrieben implementiert...oder zumindest denke ich mir so....:confused:

NightHaG
28-11-2004, 14:11
Ist das nicht schon in der Methode implementiert und befinden sich die Vertices für die aktuelle Fläche nicht in Array vertices!? Dann kann man schon direkt die Punkte von dort nehmen.

[edit]
Im Array Vertices die Punkte aus transVertices. Die werden ja aus faceTable rausgeschrieben.

ChrisK
28-11-2004, 14:17
also den normalvektor musst du dir ja auch erst berechnen. Dazu nimmst du die ersten 3 Vertices des aktuellen faces her und erstellst aus diesen 2 vektoren. (1 - 2), (3 - 2) würde sich zB eigenen. Dann berechnest du von diesen beiden Vektoren das Kreuzprodukt und wie allgemein bekannt ist, steht dieses normal auf die beiden Vektoren. Damit berechent ich meinen Normalvektor... Ich hoffe das passt so halbwegs...

Ja, je nachdem, was du gerade machst. Wir sind grad im Backface-Culling Thread, daher nahm ich an du bist schon beim Backface-Culling.

Dort hast du schon transformierte Vertizes in Device Coordinates (transVertices), und die mußt du auch für's Backface-Culling verwenden.
Entschuldigung, hab mich blöd ausgedrückt... wenn ich faceTable[i][2] bis faceTable[i][4] als Indizes ins transVertices verwende passiert überhaupt nichts, also es wird nicht gecullt, weil der z-Wert meines Normalvektors aus irgend einem Grund immer 0 ist; wenn ich sie als Indizes ins vertexTable verwende funktioniert es einwandfrei...

ille_pille
28-11-2004, 14:24
Im Array Vertices stehen nur die Indizes der Punkte wie sie in transVertices stehen. Die werden ja aus faceTable rausgeschrieben.

Stehe ich total auf der Leitung oder...Ich denke das in verices-Array ja die transformierte Punkte für die Fläche schon stehen...schau die letzte Zeile....Ich bekomme ja Punkte, aber ich habe auch das Problem das z-Komponente vom Normalvektor immer =0 wird...

// vertex array for this face
CG1Point vertices[];
vertices = new CG1Point[numVertexIndex];
for (int j=0; j<numVertexIndex; j++)

{vertices[j] = transVertices[faceTable[i][j+2]];}

ille_pille
28-11-2004, 14:25
Entschuldigung, hab mich blöd ausgedrückt... wenn ich faceTable[i][2] bis faceTable[i][4] als Indizes ins transVertices verwende passiert überhaupt nichts, also es wird nicht gecullt, weil der z-Wert meines Normalvektors aus irgend einem Grund immer 0 ist; wenn ich sie als Indizes ins
vertexTable verwende funktioniert es einwandfrei...
Ich habe dasselble Problem...Also d.h du nimmt Punktenkoordinaten die nocht transformiert sind oder!?

NightHaG
28-11-2004, 14:35
Sorry ich werd das in meinem edit gleich ändern: in Vertices stehen schon die Punkte drin und keine Indizes.... vertices wird gefüllt indem die Punkte aus dem transVertices array mit den indizes aus faceTable reingeschrieben werden....

Ich verwende diesmal die Musterlösung von 3b kann sein dass bei euch die Punkte woanders drinstehen ich weiss es nicht...

ChrisK
28-11-2004, 14:47
Ich habe dasselble Problem...Also d.h du nimmt Punktenkoordinaten die nocht transformiert sind oder!?
Ja, genau. Das ist zwar eigentlich nicht ganz im Sinne der Aufgabenstellung, funktioniert bei mir aber einwandfrei.

ille_pille
28-11-2004, 15:07
Ja, genau. Das ist zwar eigentlich nicht ganz im Sinne der Aufgabenstellung, funktioniert bei mir aber einwandfrei.
es soll eigentlich nicht korrekt sein....Bei mir funktionierts aber nicht habe gerade versucht und z bleibt immer wieder gleich null....also der fehler liegt wo anders:hewa: :hewa: :hewa:

Tiniiiii
28-11-2004, 15:39
Ich hab hier noch ein kleines Problem ...

Ein Polygon ist hinten, wenn

V_view * N > 0

gilt, wobei N der Normalvektor auf die Polygonfläche ist.
"Hinten" stimmt hier nicht ganz. Flowyes meint ja eigentlich dass das Polygon nach hinten "schaut" und nicht dass es hinter etwas ist ...

Bei den 3D-Objekten sieht man ja keinen Unterschied ob ich nun "<" oder ">" nehme (nachdem diese ja symmetrisch sind). Meine 2d-atoff Files werden bei mir allerdings nur angezeigt wenn ich mit ">" arbeite ...
Woran liegt das? (Ich denk ich sollt beim nächsten Abgabegespräch checken warum das so ist ...)

Thanx & lg :ausheck:

ChrisChiu
28-11-2004, 16:18
Ich hab hier noch ein kleines Problem ...


"Hinten" stimmt hier nicht ganz. Flowyes meint ja eigentlich dass das Polygon nach hinten "schaut" und nicht dass es hinter etwas ist ...

Bei den 3D-Objekten sieht man ja keinen Unterschied ob ich nun "<" oder ">" nehme (nachdem diese ja symmetrisch sind). Meine 2d-atoff Files werden bei mir allerdings nur angezeigt wenn ich mit ">" arbeite ...
Woran liegt das? (Ich denk ich sollt beim nächsten Abgabegespräch checken warum das so ist ...)

Thanx & lg :ausheck:

Nochmals. Backface-Culling ist rein für die 3D-Atoffs interessant. Vergesst es, es mit den 2D-Atoffs zu testen.

Würde nicht besonders viel Sinn machen, Backface-Culling bei 2D-Objekten zu benutzen.

ille_pille
28-11-2004, 16:26
Ich habe nämlich ein anderes Problem. Beim Backface Culling wird nach der Berechnung von Normalvektor die Z-Komponente immer null. Folglich wird nichts am Bildschirm gezeigt. Ich habe keine Ahnung wieso. Mache ich was falsches in der BackfaceCulling Methode oder ist vielleicht der Fehler irgenwo anders verborgen....Berechnen von z-Koordinate, Kreuzprodukt...(obwohl beim Testen es ok ist)
Backface habe ich wie im Forum beschrieben implementiert...oder zumindest denke ich mir so....:confused:
Bei mir ist das Problem bei der Punktendifferenz. Wenn z.B. p1.z=-10.0 und p2.z=-10.3882 ist dann ist p1.z-p2.z=0.0?!?! obwohl das double-werte sind.:confused:

Wie funktionierts bei euch?

SeeS
29-11-2004, 23:04
z bleibt immer wieder gleich null...
vielleicht liegt das problem bei der zuweisung
statt faceNormal.crossproduct(..)
faceNormal = CG1Vector.crossproduct(..)

ille_pille
29-11-2004, 23:49
vielleicht liegt das problem bei der zuweisung
statt faceNormal.crossproduct(..)
faceNormal = CG1Vector.crossproduct(..)
Ich habe inzwischen das Problem gelöst.....Danke euch :thumb:

Und ja es war wegen der Zuweisungen...z.b.
mit CG1Vector v=new CG1Vector();
v.diff(....) geht es nicht

mit CG1Vector v=new CG1Vector.diff(...) klappt alles :)

MrAngel
30-11-2004, 10:20
Hab ne Frage:

Wenn ich jetzt zum Schluß bei BackfaceCulling die
if Abfrage habe in der ich schau ob

faceNormal.z < 0

ist, wie ruf ich dann das drawClipped auf oder bzw. was muss ich aufrufen das es dann geht?

Danke!

MFG Angel

ChrisChiu
30-11-2004, 12:14
Hab ne Frage:

Wenn ich jetzt zum Schluß bei BackfaceCulling die
if Abfrage habe in der ich schau ob

faceNormal.z < 0

ist, wie ruf ich dann das drawClipped auf oder bzw. was muss ich aufrufen das es dann geht?


Gar nichts :)

Du bist ja in der "for (int i=0; i<numFace; i++)" Schleife. Falls das Backface-Culling Kriterium erfüllt ist, machst zu dann einfach weiter mit dem nächsten Face ohne irgendwas zu zeichnen.

MrAngel
30-11-2004, 13:58
Super!

Danke!

ines
30-11-2004, 16:21
also bei mir schaut des backface culling circa so aus.
prinzipiell glaub ich schon, das des so stimmt,....aber sollte nicht auch zb. der henkel der kanne verschwinden, wenn er im hintergrund ist?
und bei der biene fehlt was bei den flügeln, wenn sie so steht,......is das bei euch auch so?
lg, ines

vertigo
30-11-2004, 16:46
das passt schon so... aber darauf wird ja auch auf der cg-hp hingewiesen. der grund warum du zB den henkel der teekanne siehst, ist das wir mit backface-culling nur die flächen weglassen, die von der kamera wegschauen. die sachen die eigentlich verdeckt wären (wie der henkel) werden erst beim nächsten beispiel ausgeblendet.
:coolsmile

grassi3000
30-11-2004, 19:03
also bei mir schaut des backface culling circa so aus.
prinzipiell glaub ich schon, das des so stimmt,....aber sollte nicht auch zb. der henkel der kanne verschwinden, wenn er im hintergrund ist?
und bei der biene fehlt was bei den flügeln, wenn sie so steht,......is das bei euch auch so?
lg, ines
Selbiges auch bei mir, aber ich vermute auch, dass das erst mit implementierung des Z-Buffers verschwindet.

volatile_void
30-11-2004, 22:21
Wenn man davon ausgeht, daß ein Polygon immer eben ist, kannst du drei beliebige Vertices nehmen.
Das glaub ich dir irgendwie nicht ganz, denn:
(1) Auf die Reihenfolge der Vertices kommt es auf jeden Fall an. (eh klar :p)
(2) Auch wenn du die Reihenfolge der Vertices festlegst, funktioniert diese Implementierung des backface-culling nur mit Polygonen deren Innenwinkel <180° sind (diese Eigenschaft erfüllen nicht mal alle konvexen Polygone!) richtig.

Was für ein Glück, dass der Teapot nur Dreiecke besitzt! :D

Genaugenommen müsstest du bei konkaven Polygonen also um das ganze Polygon herumspazieren und dabei die normierten(!) Normalenvektoren, die du für jedes Paar aufeinanderfolgender Kanten mittels crossProdukt bekommst, aufsummieren. Was dabei herauskommt, kannst du dann mit dem View Vector vergleichen (mittels dotProduct). Im Grunde genommen wäre das Ganze dann nicht viel was anderes als das aufsummieren der Innenwinkel des Polygons.

Ich weiß aber nicht, ob unser backface-culling auch für konkave Polygone funktionieren soll.
Ich habs selber nur mit den ersten drei Vertices programmiert und bin mir jetzt nicht sicher, ob ichs noch ändern soll.

ChrisChiu
01-12-2004, 00:06
Das glaub ich dir irgendwie nicht ganz, denn:
(1) Auf die Reihenfolge der Vertices kommt es auf jeden Fall an. (eh klar :p)
(2) Auch wenn du die Reihenfolge der Vertices festlegst, funktioniert diese Implementierung des backface-culling nur mit Polygonen deren Innenwinkel <180° sind (diese Eigenschaft erfüllen nicht mal alle konvexen Polygone!) richtig.

Was für ein Glück, dass der Teapot nur Dreiecke besitzt! :D

Genaugenommen müsstest du bei konkaven Polygonen also um das ganze Polygon herumspazieren und dabei die normierten(!) Normalenvektoren, die du für jedes Paar aufeinanderfolgender Kanten mittels crossProdukt bekommst, aufsummieren. Was dabei herauskommt, kannst du dann mit dem View Vector vergleichen (mittels dotProduct). Im Grunde genommen wäre das Ganze dann nicht viel was anderes als das aufsummieren der Innenwinkel des Polygons.

Ich weiß aber nicht, ob unser backface-culling auch für konkave Polygone funktionieren soll.
Ich habs selber nur mit den ersten drei Vertices programmiert und bin mir jetzt nicht sicher, ob ichs noch ändern soll.

Mit den ersten drei Vertizes passt es schon.

EDIT: vielleicht eine Erklärung dazu. Die Polygonvertizes sind ja in counterclockwise order (also gegen den Uhrzeigersinn) gespeichert. Das sowie die Vorraussetzung dass das Polygon planar ist, sollte ausreichen dafür, dass man einfach (v3-v1) und (v2-v1) als Vertizes nimmt, damit es klappt. Denn > 180° (IMO auch == 180°) "Innenwinkel" würdest du unter diesen Vorraussetzung nur kriegen, wenn sich Kanten des Polygons mit anderen schneiden, was ein ziemlich kaputtes Polygon wäre. Bei allgemeinen (nichtplanaren usw) Polygonen wäre natürlich ein allgemeinerer Normal-Generation-Algorithmus nötig, aber das würde den Rahmen der Übung sprengen.

PredatorTX
01-12-2004, 00:22
Hey, chris! bist du noch online?
Mir fehlt nur noch Backface Culling vom 4.Bsp und hab noch 20 minuten und bin noch an der Uni, weil ich zu Hause keinen Internetanschluss hab.
Kannst du mir auf scnelle grob erklären, was ich beim Backface Culling machen soll?

volatile_void
01-12-2004, 00:42
Mit den ersten drei Vertizes passt es schon. Danke. Hatte schon Angst, ich müssts vielleicht nochmal ändern.

ChrisChiu
01-12-2004, 00:45
Hey, chris! bist du noch online?
Mir fehlt nur noch Backface Culling vom 4.Bsp und hab noch 20 minuten und bin noch an der Uni, weil ich zu Hause keinen Internetanschluss hab.
Kannst du mir auf scnelle grob erklären, was ich beim Backface Culling machen soll?

Ui, wird knapp.

Kurz: Bei Backface Culling nimmst du die ersten drei Vertizes (v1, v2, v3) jedes Faces in Device Coordinates, also aus dem transVertices Array, berechnest daraus zwei Vektoren (v1 zu v3, v1 zu v2), ermittelst den Normalvektor mittels cross Product aus den zwei Vektoren und nimmst die z Koordinate als Culling-Kriterium, ob das Face gezeichnet wird oder nicht. Soll es nicht gezeichnet werden, mußt du die Schleife fortsetzen lassen ohne das Face zu zeichnen.

PredatorTX
01-12-2004, 12:21
Ui, wird knapp.

Kurz: Bei Backface Culling nimmst du die ersten drei Vertizes (v1, v2, v3) jedes Faces in Device Coordinates, also aus dem transVertices Array, berechnest daraus zwei Vektoren (v1 zu v3, v1 zu v2), ermittelst den Normalvektor mittels cross Product aus den zwei Vektoren und nimmst die z Koordinate als Culling-Kriterium, ob das Face gezeichnet wird oder nicht. Soll es nicht gezeichnet werden, mußt du die Schleife fortsetzen lassen ohne das Face zu zeichnen.

Danke!
Hab gestern noch rechtzeitig abgeben können!
Aber ich hab gestern meine Lektion gelernt! Ich fange nie nie wider 3 Stunden vor der Deadline an. :shinner: