måndag 10 november 2008

Quad-tree culling

Efter mycket slit och mycket fel har jag skapat en fungerande quad-tree till min terräng. den fungerar enligt följande:

1: Terrängen skapar sig själv utifrån en höjdmap skapar jag ett rutnät av vertices med med textur-coordinater. Sen med hjälp av mina vertices skapar jag ett "temporärt index" för hela terrängen. det används sedan för att beräkna mina normaler.

2: Terrängen delar upp sina vertices i fyra noder
Varje nod är en egen instans av klassen quad-node och innehåller specifik data
såsom en egen vertex och index-buffert, bredd, höjd och en boolean som är true om noden är en "leaf-node"

3: Varje nod kommer i sin tur dela upp sig i fyra nya noder och vidare i fyra noder osv, tills varje nod har fått en lämlig storlek. Man kan se detta som ett släktträd att varje nod har fyra barn som i sin tur får fyra barn.
En definierad variabel "2Dvektor max_size" bestämmer hur stor en nod får vara, om noden är mindre eller lika med max_size så är det en leaf-node och kommer skapa en egen index-buffert och vertex-buffert.

4: Varje nod kommer även ha en funktion för att "känna av" om den befinner sig innanför kamerans synvinkel dvs om den är synlig.

Jag har byggd lite hjälpfunktioner bla skapat en funktion för att skapa en bounding-box som precis innesluter alla vertices i en nod.

5: Ca 60 ggri sekunden kommer varje nod att "känna" om den fortfarande befinner sig innanför kamerans vy.

Gör den det kommer att "fråga" sina barn om de befinner sig innanför kamerans vy.

Låt oss säga att två av barnen finns i kamerans vy och två inte gör det. De två som befinner sig i kamerans vy kommer i sin tur fråga sina barn om de befinner sig i kamerans vy osv.
Om inte noden har några barn så kommer noden att beräkna sig själv och måla sig vacker med bergsformationer och gräs och ljus-sättning!

Som sagt allt detta sker ca 60 ggr i sekunden och kan verkas vara väldigt omständigt men tvärt-om spar man många beräkningar

Resultatet:



Som ni ser har jag beräknat lite fel. Men koden fungerar i alla fall. Resultatet av detta skulle bli att de noder dvs terrängpartier som inte finns i kameran vy inte skulle beräkna sig själva.
Nu verkar mina noder vara beräkna fel eftersom vissa av dem "tror" att de inte befinner sig i kamerans vy fast de igentligen gör det. Hur som helst fungerar grund-principen i koden och jag återkommer med en lösning för mina noder...

För debug-synpunkt har jag en funktion som renderar linjer utifrån de fyra hörnen på en bounding-box. Det verkar som om terrängen åtminståne partitionerar upp sig korrekt så problemet inte i skapandet av terrängen utan i renderingen där den visst kalkulerar fel nånstans.