PDA

View Full Version : [Frage] backface culling


fscan
22-10-2004, 01:28
kann ich nicht einfach den tranformierten normalvektor verwenden um zu entscheiden welche seite der fläche ich sehe ? dieser muss eh in der nächsten abgabe berechnet werden.

Rovo
22-10-2004, 01:44
naja ... das problem das ich bisher damit feststellen musste ist, dass die normalenvektoren entweder aus dem atoff-file eingelesen wird oder das gesamte Array null ist. Mir schmeisst es beim versuch normalTable in transNormals regelmäßig eine nullPointerException die ich natürlich abfange. grund ist wie gesagt, dass die normalenvektoren noch null sind und erst berechnet werden müssen.

lg,
roman

ChrisChiu
22-10-2004, 01:59
kann ich nicht einfach den tranformierten normalvektor verwenden um zu entscheiden welche seite der fläche ich sehe ? dieser muss eh in der nächsten abgabe berechnet werden.

Folgende zwei Operationen ergeben nicht denselben Screenspace-Facenormal-Vektor und damit nicht dasselbe Culling-Verhalten:

A (falsch):
- Facenormal berechnen aus den untransformierten Vertizes eines Faces des Objekts
- Facenormal transformieren
- Facenormal.z für Culling verwenden

B (richtig):
- Vertizes des Objektes
- Quasi-"Facenormal" aus den transformierten Vertizes (in Device Coordinates) eines Faces berechnen
- Quasi-"Facenormal".z für Culling verwenden

Der Effekt ist, dass man bei Variante A dann einige Faces, die eigentlich gecullt werden sollten, trotzdem sieht und umgekehrt.

Das Backfaceculling muß also mit dem Facenormal aus den Vertizes in Screenspace-Koordinaten durchgeführt werden.

ChrisChiu
22-10-2004, 02:04
PS: den Effekt wenn man es wie A implementiert, sieht man hier:

http://www.cg.tuwien.ac.at/~chiu/backface.jpg

fscan
22-10-2004, 02:24
hmm ... ich hab bei mir zwar keine die fehlen aber es werden noch ein paar faces zu viel gezeichnet ... komisch eigentlich ... soll dass heissen die normalvektoren stimmen nicht ?

fscan
22-10-2004, 02:27
ok .. fehlt doch was ... könnte das mit der perspektivischen projektion zusammenhängen, die ja auf die normalvektoren nicht angewandt wird ?

ChrisChiu
22-10-2004, 02:33
hmm ... ich hab bei mir zwar keine die fehlen aber es werden noch ein paar faces zu viel gezeichnet ... komisch eigentlich ... soll dass heissen die normalvektoren stimmen nicht ?

Nein, das soll heißen du mußt es nach Methode B berechnen; also einen Quasi-"Normalvektor" bilden aus den transformierten Vertizes (in Device Coordinates) mittels Kreuzprodukt, und den zum Culling verwenden. Also nicht die eigentlichen Normalvektoren.

Und ja, das hängt soweit ich weiß mit der perspektivischen Transformation zusammen (ist ja irgendwie klar, wenn Vektoren nicht die perspektivische Transformation durchmachen, Culling aber im Device Koordinatensystem durchgeführt werden muß).

fscan
22-10-2004, 03:15
wenn man genauer darüber nachdenkt, existiert im devie coordinate space gar kein normalvektor mehr, da die faces ja keine ebenen mehr bilden müssen ( von der perspektive verzerrt ) ... somit kann es ja auch mit der "quasi normalvektor methode" zu fehlern kommen?!

naja ... ist jetzt egal ... hab so (B) gemacht und es funktioniert ...

ChrisChiu
22-10-2004, 03:23
wenn man genauer darüber nachdenkt, existiert im devie coordinate space gar kein normalvektor mehr, da die faces ja keine ebenen mehr bilden müssen ( von der perspektive verzerrt ) ... somit kann es ja auch mit der "quasi normalvektor methode" zu fehlern kommen?!

naja ... ist jetzt egal ... hab so (B) gemacht und es funktioniert ...

Ich hab es "Quasi-Normalvektor" genannt, eben deshalb weil es keine wirkliche komplette Berechnung aus allen Vertizes des Faces ist. Eine Ebene sollte allerdings trotzdem eine Ebene bleiben (es verzerrt sich ja relativ gesehen mit den Z Koordinaten alles trotzdem in derselben Weise, soweit ich weiß wird die Planarität dadurch nicht zerstört), aber das ist in diesem Fall ziemlich unwichtig. Berechne den Quasi-Normalvektor einfach dadurch, dass du drei Vertizes des Faces im Device Koordinatensystem hernimmst, daraus zwei Vektoren bildest und das Cross Product nimmst.

fscan
22-10-2004, 03:25
ja hab ich eh gemacht ... hab einfach die ersten 3 genommen ... hab micht zuerst gewundert, warum das cross product in die falsche richtung schaut, aber ist klar weil y im device coordinate system in die andere richtung geht.

Rovo
22-10-2004, 04:10
hallo,

hab das backface-culling jetzt auch implementiert, war im prinzip nur eine zusammengesetzte if-abfrage aus der errechnung eines kreuzproduktes und der division zweier CG1Points und dem überspringen des restes falls es ein backface ist oder senkrecht zu uns steht.

während es bei der sphere eigentlich recht gut aussieht, macht mir die teapot.atoff sowohl low wie auch hight-res und ein paar andere 3d-objekte etwas kopfzerbrechen, da trotzdem einige polygone die eigentlich nicht mehr vorhanden sein sollten sichtbar (durchs wireframe) sind.

hab ich irgendetwas vergessen? *kopfalkratz*

lg,
roman

edit: ups ... hab gesehen die screenshots bei abgabe 5 sehen genauso aus *erleichtert aufatmen kann* :) ... der grund für die darstellung ist mir glaub ich auch schon eingefallen ... depth-buffer, es wird ja grad mal überprüft, ob die faces in richtung kamera schauen, aber nicht, ob bereits schon ein objekt davor steht oder nicht.

fscan
22-10-2004, 04:16
das passt schon ... die faces zeigen ja in die kamera, sind nur hinter anderen faces (die ja beim wireframe durchsichtig sind)

morgan
28-11-2004, 22:29
…macht mir die teapot.atoff sowohl low wie auch hight-res und ein paar andere 3d-objekte etwas kopfzerbrechen, …

mir machen diese dinge auch kopfzerbrechen, allerdings weil man bei mir dinge nicht mehr sieht. beim beigelegten screenshot sieht man "durch den Deckelspalt die Unterseite des Teapots nicht" wovon ich mich am anfang auch nicht verwirren lassen hab, allerdings ist auf den screenshots von "richtigen Ergebnisse" bei der angabe kein deckelspalt (sprich die unterseite des teapots) zu sehen.
auch der würfel schaut bei mir anders aus (schalte ich backface-culling allerdings aus bekomm ich dasselbe bild, hmmm…)

soll ich jetzt verwirrt sein oder nicht?

vertigo
28-11-2004, 22:41
also beim würfel schaut das schwer danach aus dass die falsche seite gecullt wird - man sieht nur mehr die innenseite. genauso scheints bei der sphere zu sein... bist dir sicher dass du bei der abfrage beim backface-culling das > richtig herum gesetzt hast? probiers mal mit einer abfrage nach >= 0

:coolsmile

morgan
29-11-2004, 00:02
also beim würfel schaut das schwer danach aus dass die falsche seite gecullt wird - man sieht nur mehr die innenseite. genauso scheints bei der sphere zu sein... bist dir sicher dass du bei der abfrage beim backface-culling das > richtig herum gesetzt hast? probiers mal mit einer abfrage nach >= 0

:coolsmile

du hast recht das war falsch, aber so wie auf dem websitescreenshot (3d-objekte)schaut der würfel bei mir immer noch nur so aus wenn ich backface-culling ausschalt. ist das bei euch auch so oder besser: ist bei diesem screenshot backface-culling implementiert (ausgewäht ist es ja) oder nicht?

vertigo
29-11-2004, 00:08
bei mir ist es auch so. deshalb stelle ich auch eine frage diesbezüglich an die tutoren in diesem thread (http://www.informatik-forum.at/showthread.php?t=24939)

morgan
29-11-2004, 14:54
bei mir ist es auch so. deshalb stelle ich auch eine frage diesbezüglich an die tutoren in diesem thread (http://www.informatik-forum.at/showthread.php?t=24939)

sorry, den thread hab ich wohl übersehen.
und da das ja jetzt geklärt ist kann ich beruhigt abgeben…