Utilisation du LOD dans un jeu
Méthode pour l'utilisation du LOD dans un jeu
Introduction
Nous allons dans ce tutoriel apprendre à utiliser le LOD sur un objet.
Pourquoi ce tutoriel ?
LOD étant une abréviation de "Level Of Detail" signifie "Niveau de détail en français". Le LOD est donc une technique qui définit le niveau de détail d'un objet en fonction de la distance entre lui et l'utilisateur. Ainsi, les objets loin de l'utilisateur baissent en nombre de polygones et améliore la fluidité.
Étape 1 : Préparation de l'objet et de ses "mesh"
Si vous avez bien suivi, vous devez avoir trois objets comme l'image ci-dessus. Maintenant, créez un plan assez large et positionnez les objets les plus pauvres en polygones en dessous de ce plan.
Étape 2 : Création du script
Une fois la scène préparée, on peut s'attaquer au script python ! Mettez-vous dans la zone "Text Editor" et sélectionnez le texte "Text" qui est déjà créé par défaut et renommez-le "lodscript" (ou autre chose).
Pour commencer il faut importer les modules :
import GameLogic
import math
Le module "math" ? Et oui on va faire un peu de calcul !
Maintenant on charge le "controller" qui exécute le script :
cont = GameLogic.getCurrentController()
On récupère l'objet qui possède ce "controller" et on récupère la caméra :
owner = cont.getOwner()
objList = GameLogic.getCurrentScene().getObjectList()
camera = objList["OBCamera"]
On récupère les positions de ces deux objets :
ownerposition = owner.getPosition()
cameraposition = camera.getPosition()
Et maintenant on fait remuer ses meninges ! Ici il s'agit du calcul de la distance de deux objets à l'aide de leur deux positions. Voici la formule littérale :
(Source : Wikipédia)
Et voici la formule "python" :
result = math.sqrt(((ownerposition[0]-cameraposition[0])*(ownerposition[0]-cameraposition[0]))+((ownerposition[1]-cameraposition[1])*(ownerposition[1]-cameraposition[1])))
"sqrt" étant l'abréviation de "Square root" signifie Racine carrée.
Maintenant on prépare le "Replace Mesh" en le récupérant :
act = cont.getActuator("lod")
Enfin on se sert du calcul effectué pour l'appliquer sur l'objet.
Ainsi :
-Si la distance est supérieure à 20, on remplace le mesh par Spherelod1 (très peu de polygones)
-Si la distance est supérieure à 15 ET inférieure à 20, on remplace le mesh par Spherelod2 (pas mal de polygones)
-Si la distance est supérieure à 0 ET inférieure à 15, on remplace le mesh par Spherelod3 (beaucoup de polygones)
Ce qui donne en python ceci :
if (int(result) > 20):
act.setMesh("Spherelod1")
act.instantReplaceMesh()
elif (int(result) > 15):
if (int(result) < 20):
act.setMesh("Spherelod2")
act.instantReplaceMesh()
elif (int(result) > 0):
if (int(result) < 15):
act.setMesh("Spherelod3")
act.instantReplaceMesh()
Attention aux indentations syntaxiques ! Sinon le script aura une erreur !
Étape 3 : Application du script
Le script est prêt ! Ajustez maintenant la Logique de la Camera pour que le LOD soit appliqué lors du lancement du jeu :
-Sélectionnez la caméra
-Allez dans le panneau "Logic" (F4)
-Ajoutez un sensor "Always"
-Ajoutez un controller "Python" en mettant dans script : "lodscript" (ou le nom que vous avez donné précédemment à votre script)
-Ajoutez un actuator EditObject> Replace mesh et renommez l'actuator "lod"
Aperçu de ce que vous devez obtenir :
Voilà appuyez sur P pour lancer le jeu (même si pour l'instant cela n'en ait pas vraiment un :-) )
Conclusion
Le tutoriel est terminé, vous savez maintenant utiliser le LOD dans vos jeux !
Voici un exemple de l'utilisation du LOD, vous pouvez avancer et reculer avec la caméra. Vous constaterez que le niveau de détail de chaque sphère change en fonction de la position de la caméra !
Télécharger le fichier d'exemple
tutoriel rédigé pour le Blender Clan par Monster_kill, 28 juillet 2008
Les commentaires appartiennent à leurs auteurs. Nous ne sommes pas responsables de leur contenu.
Auteur | Conversation | ||
Bobibou
![]() ![]() Inscrit le: 24/7/2008 De: Paris Envois: 3447 |
Citation : Et voici la formule "python" : Il y a plus simple :
Tu peux même d'épargner tous ces calculs très simplement :
Dans les deux cas, pas besoin du module math. ![]() |
||
Anarchy62
![]() ![]() Inscrit le: 26/12/2012 De: Envois: 395 |
Salut, faudrait remettre au goût du jour parce-qu'à première vue cela ne fonctionne plus ;) |
||