Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

Efficient frustum cullen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Nieuw, nu zonder coffee corner vervuiling.

Edit: ik zie dat ik 'in' en 'out' heb omgewisseld, maar dat doet er verder niet toe voor het idee.

Wat frustum culling betreft, je hebt een plane en een object: Je object snijd de plane of is aan een van beide kanten van het plane. Je object is dan niet zichtbaar (plaatje), gedeeltelijk zichtbaar, of geheel zichtbaar.

Afbeeldingslocatie: http://tweakers.net/ext/f/3HZrRo7ZoJEExIaVQdgZbMH7/full.png

Ik gebruik een bounding box approach. Geen idee of dat de meest efficiënte manier is, maar ik hem hem zelf uitgedacht. De vraag is dus of het object zichtbaar is. Hiertoe berekenen we eerst een normal die loodrecht op het plane staat ( voor diegenen die geen chinees spereken, Wikipedia: Cross product )

Afbeeldingslocatie: http://tweakers.net/ext/f/IfqjD2hFBjOjiSeVKfdZ880J/full.png

De normal heeft altijd lengte 1 (behalve bij dit algoritme, meer hierover later). De wiskunde is heel simpel: we berekenen een vector van één van de hoekpunten van het plane naar het middelpunt van de bounding box. Vervolgens doen we het dot product op de normal. Dan hebben we de afstand van het middelpunt de bounding box tot het plane.

afstand > helft van de groote van de box --> niet zichtbaar.
afstand < -helft van de groote van de box --> geheel zichtbaar
anders: gedeeltelijk zichtbaar.

Ja maar darkstone, je bent nu een sphere test aan het uitvoeren op een bounding box. Dat gaat toch stuk als het plane draait? Ja dat klopt. Daarom berekenen we:
Afbeeldingslocatie: http://tweakers.net/ext/f/VykO5Gs7rZk9KpPsgoWpiSID/full.png
.. van de middelpunt van de box naar de hoek die het dichtst bij de plane zit op een box met groote 1, en vermenigvuldigen we daar de normal mee. Dan werkt de wiskunde nog steeds, ongeacht de rotatie van de AABB. Tenminste zolang alle AABB's dezelfde rotatie hebben, maar dat is de definitie van een AABB, dus dat is geen probleem.

De afstand die je daar ziet is altijd tussen de 1 en de sqrt( 2 ).

Code snippet:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
        Vector3D vec = midPoint - test.pos;

        float distance =    // dot product.
                vec.x() * test.normal.x() +
                vec.y() * test.normal.y() +
                vec.z() * test.normal.z();


        // distance >= candidate.halfsize --> not visible
        // distance <= -candidate.halfsize --> fully visible
        // else: partialy visible
        // eventueel >= en <= tests vervangen door > en <

Waar test een struct is bestaande uit één van de hoekpunten van het plane en de berekende normal.

[ Voor 4% gewijzigd door Verwijderd op 03-10-2013 13:09 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat is niet waar ik en PrisonerOfPain het over hadden. Jij adjust nu gewoon de planes om een snellere AABB test te kunnen doen. Waar wij het over hadden is dat je met het doen van meerdere plane tests false positives krijgt van objecten die wel 2 planes snijden maar toch niet in het frustum vallen.

Hier het plaatje van PoP nogmaals:
Afbeeldingslocatie: http://zach.in.tu-clausthal.de/teaching/cg_literatur/lighthouse3d_view_frustum_culling/images/vfbox2.gif

De oranje box snijdt 2 frustum planes, maar valt toch niet binnen het frustum zelf.

[ Voor 3% gewijzigd door .oisyn op 03-10-2013 13:55 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Soort van. Dit topic is een reactie op de vraag van PoP hoe mijn culling werkte. Dat ik false positives krijgt ben ik van op de hoogte.

Ik kan met mijn AVX code 2 plane tests helemaal gratis toevoegen, ik denk dat plane tests paralell aan de x/y as aan de onder of bovenkant van het frustum het meeste toevoegen.

Ik kan ook nog 2 subtracts wegwerken door niet de positie van een van de hoekpunten op te slaan, maar de afstand dat hoekpunt over de normaal.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

Oftewel Darkstone op z'n best, veel lullen maar weinig luisteren ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
.oisyn schreef op donderdag 03 oktober 2013 @ 14:39:
Oftewel Darkstone op z'n best, veel lullen maar weinig luisteren ;)
Volgens mij heb jij wat gemist hoor :> http://gathering.tweakers.net/forum/view_message/40981456

Verwijderd

Topicstarter
.oisyn schreef op donderdag 03 oktober 2013 @ 14:39:
Oftewel Darkstone op z'n best, veel lullen maar weinig luisteren ;)
Ik heb de post gemist waar ik niet luisterde...




Ik heb extra planes top/bottom gemonteerd. Of dat zin heeft hangt een beetje af van de test case. In triviale test case werden 3 blocks ( van de ~200 die uiteindelijk als visible werden gemarkeerd ) extra weg geculld. In een wat zwaardere testcase kwam het aantal op nul. Het is leuk omdat het niets kost (de AVX versie word er zelfs sneller door), maar echt effectief is het in mijn case niet.

Er zijn nog steeds false positives links/rechts mogelijk. Maar de constructie van de benodigde planes is iets minder triviaal.

[ Voor 9% gewijzigd door Verwijderd op 03-10-2013 15:33 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op donderdag 03 oktober 2013 @ 15:32:
[...]

Ik heb de post gemist waar ik niet luisterde...
Het is meer het niet heel diep ingaan op een opmerking van iemand maar vervolgens wel weer een heel verhaal houden over wat je wel doet zonder dat iemand daarom vroeg ;). Het wordt nogal een one man show zonder ruimte voor discussie.

Anyway, je kan een volledige SAT doen. Omdat je AABB's axis aligned zijn (duh) kun je van tevoren alle benodigde assen uitrekenen alsmede de projectie van je frustum op die assen.

(en ik snap niet wat de quote van PoP ermee te maken heeft)

[ Voor 31% gewijzigd door .oisyn op 03-10-2013 21:47 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
.oisyn schreef op donderdag 03 oktober 2013 @ 21:42:
[...]

Het is meer het niet heel diep ingaan op een opmerking van iemand maar vervolgens wel weer een heel verhaal houden over wat je wel doet zonder dat iemand daarom vroeg ;). Het wordt nogal een one man show zonder ruimte voor discussie.
offtopic:
Ik merk de laatste tijd dat je nogal persoonlijk bepaalde mensen aanspreekt op hun gedrag, dat is natuurlijk ook een prima manier om een discussie af te kappen.
Pagina: 1