Sinds enkele dagen ben ik van plan m'n scene manager uit te breiden. Het is de bedoeling dat hij standaard alle objecten in een octree plaatst en dat objecten aan elkaar gekoppeld kunnen worden dmv relatieve coordinaten (1 matrix per object dus).
Ik heb hier onderaan m'n werkwijze genoteerd, maar wil graag weten of dit de juiste is. (en of ik het dus goed begrepen heb).
Stel je hebt de wereld coordinaten. In die wereld staat:
- een terrein
- een auto (die kan bewegen)
- een wapen (op de auto gemonteerd)
Voor zover ik het weet wordt elk bewegend object als een root node in de octree geplaatst. Dus het terrein en de auto zijn een rout node, die recursief kan worden afgelopen met behulp van frustum culling. Op de auto is dan een wapen gemonteerd en dit heeft dan relatieve coordinaten tov de auto. Dit sla je dan op in een matrix.
Idem met bone animaties, elk object (arm, been, romp, hoofd) is gekoppeld aan een ander object. Bvb: de armen, benen en hoofd zijn gekoppeld aan de romp. Je gaat dan bvb de romp renderen en recursief alle bones afgaan met de nodige matrix-transformaties (naargelang bvb de arm beweegt verandert de matrix van deze bone).
Dit in totaal geeft dan een "speler" object en is dan ook weer een root node van de octree. Animeer ik de speler, dan animeer ik enkel de bones en manipuleer ik de object space matrix.
Maar hoe moet ik dit opslaan?
Ik veronderstel dat een mesh:
- 1 of meerdere polygonen kan bevatten
- een id nummer heeft voor de octree
- (optioneel) een id nummer heeft voor een bone
Ik verondertel dat een scene object:
- 1 of meerdere meshes kan bevatten
- 0, 1 of meerder bones kan bevatten
- een plaats heeft in de octree (in een node op hoger niveau dan de meshes die het bezit).
Maar hoe zit het dan met een mesh dat net op de scheidingslijn zit van twee octree nodes? Stel dat je door je octre wandelt en je zou eigenlijk beide nodes tegenkomen:
Ga je dan gewoon een boolean opslaan die onthoudt of de mesh reeds gerenderd is of ga je dit gewoon negeren en render je desnoods het object 2x?
En als de speler - die een root node is in de octree - zich verplaatst, dan moet je toch opnieuw die root node en zijn child nodes updaten?
Plus: hoe combineer ik dit met bsp? Ik zou een bsp map ook als object beschouwen en dit aan een root node toewijzen? Het probleem is dan echter: als die bsp map in je frustum zit, maar de speler zit niet in de map zelf, dan moet je in principe heel de map renderen... of maak ik dan een low poly versie van deze bsp map?
Nog suggesties? Zit ik fout? Kan het ergens beter?
Ik heb hier onderaan m'n werkwijze genoteerd, maar wil graag weten of dit de juiste is. (en of ik het dus goed begrepen heb).
Stel je hebt de wereld coordinaten. In die wereld staat:
- een terrein
- een auto (die kan bewegen)
- een wapen (op de auto gemonteerd)
Voor zover ik het weet wordt elk bewegend object als een root node in de octree geplaatst. Dus het terrein en de auto zijn een rout node, die recursief kan worden afgelopen met behulp van frustum culling. Op de auto is dan een wapen gemonteerd en dit heeft dan relatieve coordinaten tov de auto. Dit sla je dan op in een matrix.
Idem met bone animaties, elk object (arm, been, romp, hoofd) is gekoppeld aan een ander object. Bvb: de armen, benen en hoofd zijn gekoppeld aan de romp. Je gaat dan bvb de romp renderen en recursief alle bones afgaan met de nodige matrix-transformaties (naargelang bvb de arm beweegt verandert de matrix van deze bone).
Dit in totaal geeft dan een "speler" object en is dan ook weer een root node van de octree. Animeer ik de speler, dan animeer ik enkel de bones en manipuleer ik de object space matrix.
Maar hoe moet ik dit opslaan?
Ik veronderstel dat een mesh:
- 1 of meerdere polygonen kan bevatten
- een id nummer heeft voor de octree
- (optioneel) een id nummer heeft voor een bone
Ik verondertel dat een scene object:
- 1 of meerdere meshes kan bevatten
- 0, 1 of meerder bones kan bevatten
- een plaats heeft in de octree (in een node op hoger niveau dan de meshes die het bezit).
Maar hoe zit het dan met een mesh dat net op de scheidingslijn zit van twee octree nodes? Stel dat je door je octre wandelt en je zou eigenlijk beide nodes tegenkomen:
Ga je dan gewoon een boolean opslaan die onthoudt of de mesh reeds gerenderd is of ga je dit gewoon negeren en render je desnoods het object 2x?
En als de speler - die een root node is in de octree - zich verplaatst, dan moet je toch opnieuw die root node en zijn child nodes updaten?
Plus: hoe combineer ik dit met bsp? Ik zou een bsp map ook als object beschouwen en dit aan een root node toewijzen? Het probleem is dan echter: als die bsp map in je frustum zit, maar de speler zit niet in de map zelf, dan moet je in principe heel de map renderen... of maak ik dan een low poly versie van deze bsp map?
Nog suggesties? Zit ik fout? Kan het ergens beter?
[ Voor 4% gewijzigd door Verwijderd op 12-12-2004 16:02 ]