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.

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 )

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:

.. 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:
Waar test een struct is bestaande uit één van de hoekpunten van het plane en de berekende normal.
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.

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 )

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:

.. 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 ]
