C'était un peu confus dans ma tête, mais il me semblait bien que mon design séparant la description mathématique de mon île et la génération de la grille d'une résolution donnée allait beaucoup m'aider dans ma gestion du niveau de détails. Voilà le code: je génère une fois la description mathématique de mon île, créée à partir de la racine 37 (et placée à l'origine). Ensuite, j'utilise un osg::LOD auquel j'ajoute des osg::Drawable créés à partir de ma description de l'île et d'une résolution: 200, puis 100, puis 50, puis 20. Une fois toutes les grilles calculées, l'on peut se promener dans un monde qui va ajuster tout seul (à travers la magie d'OpenSceneGraph) le niveau de détail des îles.
IslandGenerator islandGenerator;
boost::shared_ptrt = islandGenerator.generateIsland(0, 0, 37);
osg::LOD * islandLod = new osg::LOD;
osg::Drawable * grid1 = createGrid(*t, 200, 1, 0.05, 20);
osg::Geode * geode1 = new osg::Geode;
geode1->addDrawable(grid1);
islandLod->addChild(geode1, 0, 500);
osg::Drawable * grid2 = createGrid(*t, 100, 1, 0.05, 20);
osg::Geode * geode2 = new osg::Geode;
geode2->addDrawable(grid2);
islandLod->addChild(geode2, 500, 1000);
osg::Drawable * grid3 = createGrid(*t, 50, 1, 0.05, 20);
osg::Geode * geode3 = new osg::Geode;
geode3->addDrawable(grid3);
islandLod->addChild(geode3, 1000, 2000);
osg::Drawable * grid4 = createGrid(*t, 20, 1, 0.05, 20);
osg::Geode * geode4 = new osg::Geode;
geode4->addDrawable(grid4);
islandLod->addChild(geode4, 2000, 10000);
lightsource->addChild(islandLod);
Voilà le résultat:
Bien sûr, j'ai fortement exagéré les niveaux de détail pour apercevoir la transition, mais en étant moins agressif, l'on peut obtenir une bonne réduction du niveau de détail sans que le passage d'un niveau à l'autre soit trop visible. Ainsi, il devient possible d'afficher des centaines d'îles simultanément!
Aucun commentaire:
Enregistrer un commentaire