Page 1 of 1

[CG]Backface culling

Posted: Wed Mar 26, 2008 4:27 pm
by Fristi
Loha
Kheb isee nvraagske, het ogenschijnlijke simpele backface culling loopt mis.

Ik heb al vanalles geprobeerd maar telkens verdwijnen er te veel vlakken of net te weinig. Gezien ik het nu echt ni meer weet en men ideen een beetje zijn uitgeput gaak hier posten wak gedaan heb, hopelijk kan iemand me verderhelpen :)

Beginnen bij het begin:
- DrawBackfaceCulled:
Ik loop hier men polygonen af en geef per polygoon de eerste 3 punten mee aan procedure IsPolyFrontFace

- IsPolyFrontFace:
De manier waark het verste mee gekomen ben (1 enkele polygoon fout):
Ik bereken eerst Ez (de Ez uit de viewingmatrix - deze is correct want men viewmat klopt met die van de nils, tekenen lukt ook perfect).
Vervolgens bereken ik zoals in de cursus de vectoren u en v (enkel zijnt er bij mij van dimensie 4 ipv 2).
Kneem hier dan het vectorproduct u x w = v van.
Dan doe ik ez . v (dotproduct) = N

Aan de hadn van deze N zou men moete kunnen zien of een polygoon frontface is (zijnde > ofte < dan 0).

Dit lukt dus op 1 polygoon na..(bij de standaard kubus die bij de engine werd gegeven)

Ik heb ook al letterlijk geimplementterd wat er in de cursus stond (bij BFC bij perspectiefprojectie, ge moet delen door Ax x Ay x Az opt einde, maar das altijd delen door 0, of toch meestal dus daar zit ook eits mis..en de bijhorende kleine d die we der moeten gebruiken is ook maar vaag)

Excuses voor weeral lastigvallen en de vage uitleg, indien nodig post ik gwn letterlijk men code wel ffkes

greets
Fris


EDIT: Kheb de methode uit het niet verplichte boek gebruikt en krijg net hetzelfde probleem. Hier gaan ze wedereom u en w berekenen , het vectorproduct hiervan en dan het dotproduct tussen v en u eye vector..Krijg hier net hetzelfde resultaat mee, 1 enkele polygoon die bij de kubus verkeerd staat (de onderste wordt getekend en de bovenste niet, tzou omgekeerd moeten zijn)

Posted: Wed Mar 26, 2008 5:54 pm
by Fristi
Kej, kheb ontdekt dattek mijn hoekpunten verkeerd doorgaf, kdenk da da wel is wa kan uitmaken..het werkt nog niet maar nu kank terug beginne proberen ^_^

Posted: Wed Mar 26, 2008 7:48 pm
by Fristi
okej, whatever ik ook ook doe, der is altijd 1 polygoon fout.
2 van de 3 tekent hij juist. Altijd eentje fout, dit is de methode die in onze cursus staat bij perspectiefprojectie. (Tom heeft al een andere manier gegeven maar dan krijgk net hetzelfde resultaat).

Code: Select all


PROCEDURE (mv: MyView) IsPolyFrontFace*(a, b, c: Vector.Vector4D; proj, view, wtov: Matrix.Matrix4D): BOOLEAN;
VAR
D : REAL;
mat : Matrix.Matrix3D;

BEGIN
a := view.VectorMult( a );
a := proj.VectorMult(a);
a := wtov.VectorMult(a);

b := view.VectorMult( b );
b := proj.VectorMult(b);
b := wtov.VectorMult(b);

c := view.VectorMult( c );
c := proj.VectorMult(c);
c := wtov.VectorMult(c);

NEW(mat);
mat.Set(a.x[0],a.x[1], 1,b.x[0],b.x[1], 1,c.x[0],c.x[1], 1);
D := mat.Det();

IF D > 0 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END;
END IsPolyFrontFace;
FF ni letten op het feit dattek hier projecteer, kmoet dringend eens opkuisen enzo, op de moment ist inefficient, maar kwil het eerst werkend krijgen.

Wak dus doe is men 3 punten projecteren en dan die in een matrix steek. Hier neemk de determinant van en ik vergelijk met 0.

EDIT: Tis opgelost, tmarsjeert, kmoest in bovenstaande code nog delen ^^

Posted: Wed Mar 26, 2008 9:03 pm
by Shinta
Dit is de eerste topic die ik al gezien heb waar 1 persoon met zichzelf praat :P

Posted: Wed Mar 26, 2008 10:02 pm
by Sebastiaan
Shinta wrote:Dit is de eerste topic die ik al gezien heb waar 1 persoon met zichzelf praat :P
en waarom verbaast mij dat nix dat het van de fristi komt :D

Posted: Wed Mar 26, 2008 11:17 pm
by Robbe
ik vind het tof dat hij zelf tot een oplossing is gekomen :)

Posted: Wed Mar 26, 2008 11:33 pm
by Fristi
Ja, kdacht, telkens alsk wa verder geraak laatek da weten, als er dan mensen lezen en wille helpen dan wete ze waark sta, maar uiteindelijk is men frank dus zelf gevallen :P

Most probably it won't be the last time :P

Posted: Thu Mar 27, 2008 12:04 am
by Tom
(Ge kunt ook RETURN d > 0; doen, hetzelfde met toekennen van booleanse waarden.)

Maar verder prachtig dat ge er uit bent geraakt, hopelijk maakt ge geen grove fouten bij triangulate/hiddenline. Een typfout daar debuggen is hopeloos. :-(