Infoforall

BLENDER 09 - Réaliser un premier jeu interactif en 3D avec Blender Game

Blender permet de dessiner des formes 3D pour les exporter ou les imprimer avec une imprimante 3D.

Il permet également de réaliser des animations 3D.

Mais il permet également de réaliser des jeux en 3D, jeu tournant autour d'un moteur de jeu nommé BULLET. Nous allons réaliser un premier petit jeu ici.

Bien entendu, plus le travail sera minutieux, plus le résultat sera de qualité.

1 - Interface Blender Game

Le moteur de jeu a besoin de réaliser 60 images par seconde pour rendre le jeu fluide. Blender Game possède donc moins d'options que Blender tout court. Les options gourmandes en calculs ne sont pas proposées car cela aurait tendance à créer trop de saccades. Mais l'essentiel y est.

Le tout va être de réflechir avant de positionner trop de vertex par exemple car chaque vertex va engendrer un calcul et donc potentiellement un lag dans votre jeu s'il y en a trop ...

Commencons par voir comment passer au Blender Game et comment prendre encore un peu plus en main l'interface de Blender :

01° Passer de Blender tout court à Blender Game en utilisant le bouton adapté :

Blender ou Blender Game

On notera la présence d'un troisième choix : Cycles Render. C'est un moteur de rendu plus direct que le moteur de rendu interne à Blender. Par contre, autant il permet d'obtenir rapidement de chouettes images réalistes, autant il tourne encore un peu trop lentement pour réaliser des animations complètes en peu de temps (du moins, à la date à laquelle j'ai écrit ces phrases).

On fonction de ce que nous allons réaliser, nous allons souvent vouloir changer la façon dont les fenêtres sont agencées.

Agencement

02° Modifier l'agencement de votre interface avec le bouton Layout de façon à voir au moins :

Interface Blender Game

2 - Première utilisation du LOGIC EDITOR

Passons aux choses sérieuses.

Si vous regardez la zone LOGIC EDITOR, vous pourrez voir qu'elle comporte trois parties.

Logic Editor

Il faut commencer par choisir un sensor, une sorte de déclencheur d'événements qui va agit comme une entrée.

Ensuite, on doit placer cette entrée dans un controller qui va pouvoir le gérer (au début, le controler ne fera que laisser passer l'information) pour activer la sortie, notre troisième élément.

Dans Blender Game, ce troisième élément se nommme actuator. Il s'agit de la sortie, d'une action qui va modifier votre scène 3D.

Sans originalité, commençons par faire bouger un cube à l'aide des touches du clavier.

03° Sélectionner votre cube (ou un autre objet 3D de votre choix).

Les axes

Comme vous pouvez le constater, mon axe X est orienté ici vers la "droite" et mon axe Y vers le "haut".

04° Définir comme sensor : KEYBOARD. Cliquer ensuite sur KEY et taper sur la touche FLECHE HAUT (UP ARROW dans Blender): Choix du type de sensor

On tape sur la case de la touche :

Choix de la touche

Et on obtient :

Sensor : Fleche du haut

Pour y voir un peu plus clair, vous pouvez agrandir la zone LOGIC EDITOR à l'aide de la combinaison de touche CTRL+FLECHE HAUT pour maximiser la zone, CTRL+FLECHE BAS pour revenir à l'affichage normal.

Pour l'instant, il ne se passe rien : il reste à déclarer l'action qu'on veut voir se réaliser lorsqu'on appuie sur cette touche.

04° Avec Add Actuator, définir comme actuator : MOTION (mouvement en français) : Actuator : Motion

On obtient le menu suivant :

Menu : Motion

On voit qu'on peut faire varier la position XYZ de l'objet (Loc :)ou faire varier son angle (Rot :). Attention, varier veut bien dire qu'on rajoute ou qu'on enlève une valeur. On ne la fixe pas.

05° Régler une variation de 0.1 sur l'axe Y.

Motion en Y

Attention à la notation anglosaxone : notez bien 0.1 avec un point et pas 0,1 avec une virgule.

Si on regarde la vue de dessus, on voit donc qu'il faut qu'un appui sur ARROW UP provoque un déplacement sur l'axe Y du cube :

Les axes

Il reste encore à relier l'entrée/sensor Touche FLECHE HAUTE activée avec la sortie DEPLACEMENT DE 0,1 sur l'axe Y. Pour cela, il suffit de relier notre SENSOR et notre ACTUATOR dans le LOGIC EDITOR :

Création de la liaison

Blender Game va alors choisir le controlleur qui permet de faire la liaison simple entre la détection de l'événement d'entrée (sensor) et l'activation de l'action de sortie (actuator) : une simple liaison ET avec une seule entrée : si l'entrée du controlleur est VRAI alors la sortie du controlleur est VRAI.

résultat global

Comment lancer le jeu ? Simplement en activant le moteur :

Le démarrage

06° Démarrer le jeu et rajouter ensuite la gestion des autres flèches. Vous pouvez agrandir l'écran de jeu avec CTRL + Flèche.

Pour sortir, il suffit d'appuyer sur ECHAP.

Comme vous pouvez le voir, la gestion logique peut rapidement devenir compliqué à visualiser. Nous passerons rapidement par une gestion Pythonnée, cela nous simplifiera bien les choses.

Les 4 actions

En attendant, on peut réduire les différentes fenêtres en appuyant sur la petite flèche de gauche.

Attention, la croix de droite permet de détruire la case !

Les actions repliées

3 - Le moteur de jeu BULLET

Bon. Bouger un cube (même 3D) avec 4 pauvres touches clavier, ce n'est pas non plus un vrai jeu.

Heureusement, Blender Game intègre un moteur de jeu, c'est à dire un ensemble de scripts préétablis qui gèrent les collisions, la gravité ...

Nous allons apprendre à le découvrir en réaliser un jeu de pong en 3D.

La plupart des choses que nous allons définir existent sous une forme ou une autre dans le moteur Render que nous avons utilisé jusqu'ici pour la réalisation des animations 3D.

07° Se remettre en visualisation par défaut. Rajouter un plan (Plane) quelques distances sous le cube et modifier ses dimensions avec Scale ou le menu Properties (touche N) de la vue 3D. Rajouter ensuite 3 cubes, les agrandir et les placer pour créer les parois de votre terrain de jeu.

Pensez à utiliser le CTRL-V CTRL-C pour les trois parois.

Le terrain de jeu

Si vous allez dans l'onglet SCENE de properties, vous devriez constater que l'intensité de la pesanteur est intégrée dans le moteur de jeu. On peut y lire g = 9.80. Il ne note pas les unités mais passons. On voit également que le moteur (engine) utilisé est bien le moteur BULLET.

Le menu SCENE

Pourtant, si on active le jeu, notre cube ne tombe au sol ... Pourquoi ?

Pour le savoir, il faut aller dans le menu PHYSICS de notre CUBE :

Le menu PHYSICS

Ici, mon CUBE est de type "static" : c'est un objet qui n'est pas censé être soumis au moteur BULLET qui gère les lois physiques : notre objet n'est censé tomber à cause de son poids par exemple.

Remarque : si ce n'est pas fait, activer l'option GHOST comme sur mon exemple. Cela vous permettra de voir à quoi elle sert lors des questions suivantes.

08° Passer de Physics Types : Static à Physics Types : Dynamic. Un objet dynamique est en effet censé être soumis à son poids et tomber selon l'axe z vertical. Pour voir la différence, relancer le jeu :

On progresse : le cube est tombé. Mais, il n'a pas été bloqué par le plan.

Pensez à utiliser le CTRL-V CTRL-C pour les trois parois.

Pour que le cube ne traverse pas les obstacles, il suffit de ne pas activer GHOST (fantome). Enlever cette option et relancer. Cette fois, le cube va être stoppé par le plan SI le plan est lui aussi défini en STATIC et que GHOST n'est pas activé.

09° Rajouter un objet UV-SPHERE dynamic, modifier le type de votre CUBE pour qu'il soit dynamique aussi et observer le résultat.

On progresse : les deux objects interagissent (mal, mais ils interagissent) et mon cube est bloqué par les parois qui sont définies en static.

Pour aller plus loin, nous allons avoir besoin de rajouter des matériaux sur nos objets. C'est eux qui nous dirons en partie comment réagir aux chocs.

4 - Le menu Material du Blender Game

Le menu est un peu différent de celui de Blender classique.

10° Rajouter un matériau à votre balle. Changer son nom en "mat_balle" pour qu'on sache qu'il s'agit du matériau de votre balle.

Vous devriez obtenir ceci :

Le menu MATERIAL

11° Rajouter une couleur DIFFUSE bleue à ce matériau.

Jusqu'ici rien de nouveau. Non, la nouveauté se trouve en dessous : il y a un onglet PHYSICS.

Le menu MATERIAL  sous menu PHYSICS

Je vais vous présenter aujourd'hui deux des paramètres à gérer pour obtenir une chouette animation réaliste :

12° Placer FRICTION à 0 et ELASTICITY à 1 pour observer une belle balle rebondissante bleue. Lancer et ... Raté. Ca marche pas.

Pourquoi ? Simplement car nous n'avons défini qu'un seul matériau : le plan ne possède pas de matériau et donc ne possède pas non plus de paramètres FRICTION et ELASTICITY.

13° Créer par exemple un plan jaune avec FRICTION à 0 et ELASTICITY à 1. Relancer. Observer.

C'est pas mal, mais il reste à gérer les matériaux des parois et mon curseur de jeu, qui a été repoussé par ma balle ! Ca peut être volontaire mais pour faire un pong, c'est pas totalement voulu...

14° Compléter la partie "matériaux" en affectant aux trois parois le même matériau, de couleur jaune-orangé (un peu plus foncé que le sol donc) et toujouts avec FRICTION à 0 et ELASTICITY à 1. Affecter ce même matériau au curseur.

15° Descendre le cube et la balle pour que les deux objects soient bien juste au dessus du sol.

Lancer le jeu. Vous devriez voir que c'est un peu mieux. Mais c'est toujours pas top. Par exemple, quand on frappe la balle avec le curseur, la balle ne bouge pas énormément énormément.

5 - Introduction aux chocs

Je dis introduction car nous ne pourrons clairement pas tout voir. Je veux juste parvenir à vous montrer comment obtenir un curseur qui provoque un réel effet sur la balle.

Bullet engine est un moteur de jeu et donc un simulateur des lois physiques. Or, pour l'instant, les deux objets (le curseur et la balle) ont la même masse. Lorsque le curseur percute la balle, l'effet n'est donc pas monstrueux puisque le curseur ne bouge pas non plus très vite.

Pour gérer cela, nous allons retourner dans le menu PHYSICS de nos objets :

Le menu MATERIAL  sous menu PHYSICS le retour

Je ne vais pas tout détailler aujourd'hui mais simplement mettre le doigt sur quatre points.

Premier point d'intérêt pour nous : la masse simulée des objets. C'est l'onglet 1. Plus un objet aura de masse m, plus il aura d'impact sur les autres et moins il bougera lui même suite aux collisions.

16° Régler une masse de 20 pour votre cube-curseur et 0.1 pour votre balle. Tester le résultat.

C'est toujours pas ça. Et le cube semble même glisser un peu sur le sol.

C'est normal, nous avons limiter tous les frottements et, donc, aucun frottement n'existe.

Pour supprimer le rebond, il suffit de commencer par gérer la zone 3 Lock Translation.

17° Activer l'option Lock Translation sur l'axe z pour la balle et pour le cube.

On pourrait se dire que c'est un problème de zone de détection des collisions : on peut la règler dans la zone 4 : en activant l'option, vous pouvez choisir la forme de la zone qui sera considérée comme zone de collision et même obtenir une distance plus grande que la forme (pour simuler un champ de force par exemple) ou plus petite que la forme (il peut alors y avoir interpénétration des deux solides).

18° Régler ces paramètres pour bien les faire correspondre aux formes physiques de vos objets.

Bon, si vous testez, vous pourrez voir que cela ne change rien. Le problème vient en réalité du déplacement de votre cube : on le déplace en le déplacer comme une sorte de téléportation. L'objet n'a donc pas vraiment de vitesse et ne peut donc pas vraiment en donner non plus !

On peut néanmoins un peu tricher : on peut règler les vitesses max et min que doit avoir un objet qui doit se déplacer.

19° Régler la vitesse min de la balle sur 8 et la vitesse max sur 16.

Et voilà, c'est un peu mieux tout de suite.

Par contre, vous pouvez voir que les frottements sont un peu léger et qu'on constate encore que le curseur semble parfois un peu glisser. C'est dû aux frottements (on pourrait également en rajouter ou augmenter la perte de vitesse interne avec damping (zone 2). Mais c'est surtout dû à la nature de votre curseur : un objet dynamic.

En réalité, pour un curseur, le mieux c'est de garder notre objet static du début. Mais dans ce cas, je n'aurais pas pu vous montrer toutes les zolis options des objets dynamic. Et les formes static peuvent s'interpénétrer. Bref, il y a du pour et du contre dans les deux cas pour le curseur. C'est à vous de gérer.

De toutes manières, ce n'est qu'une introduction.

20° Dernière modification : pour le cube, passer de Physics Types : Dynamic à Physics Types : Rigid Body. Que constatez-vous ?

Et oui : l'objet réagit comme en dynamic mais on gère la rotation en plus. Ca complique les choses, notament pour la gestion des touches. C'est la différence fondamentale entre rigid body et dynamic : la rotation. D'ailleurs, si vous laissez la souris sur ce choix, vous pourrez voir apparaitre :

Si vous voulez garder le controle des touches en coordonnées globales, il faut aller dans le LOGIC EDITOR. Et cliquer sur le petit L : vous pourrez alors choisir si les coordonnées X,Y,Z sont en coordonnées locales de l'objet (qui bougent lorsque l'objet subit une rotation) ou en coordonnées globales du monde (qui ne bougent pas).

Local ou global ?

Et voici un exemple de différence entre les axes de coordonnées globales et les axes des coordonnées locales :

Local ou global ?

6 - Mini-projet

Bon, vous avez plein de nouvelles connaissances à mettre en oeuvre. Par exemple, en réalisation un jeu de Pong mais si vous avez un autre idée, laissez courir votre imagination !

Bientôt, vous parviendrez aussi à gérer les points et autres petites choses n'ayant rien à voir avec la 3D !

Bon courage.