Depuis plusieurs années, je vois sur ce forum que des wrappers sont proposés pour différents moteurs 3D (Irrlicht, Ogre, TrueVision3D, etc).
Ils me paraissent complexes à mettre en oeuvre et à utiliser. Ils nécessitent en effet de bien connaître d'une part la philosophie mais aussi les commandes du moteur 3D utilisé, car ce sont en réalité des adaptations à PureBasic des commandes directes des moteurs.
Ces wrappeurs dépendent donc intimement du moteur 3D choisi et ne sont pas toujours réactualisés par leurs auteurs quand le moteur 3d a évolué.
Bref, un wrapper est une solution qui personnellement ne me convient pas.
J'ai une autre approche pour utiliser un moteur 3D à partir de PureBasic: un langage minimal, simple, efficace, facile à mémoriser et à utiliser.
J'ai commencé un "langage" minimaliste indépendant du moteur 3D utilisé. Ce "langage" a pour le moment un vocabulaire limité à quelques mots (44), mais le principe est posé.
Par exemple, pour créer un cube, la commande sera "cube". Il n'y a donc que le mot-clé "cube" à retenir pour créer un cube.
Prenons un exemple:
Je veux créer un cube de côté 2 unités.
J'utilise tout simplement en PureBasic la commande cube(1,2)
Détaillons cette commande: 1 est le numéro du cube que je veux créer, 2 est la longueur de son côté.
Le numéro du cube sera utilisé par la suite pour toute action sur ce cube.
Par exemple, si je veux le peindre en rouge, la commande est color(1,255,0,0)
color applique ici sur l'objet numéro 1 (le cube) la couleur (255,0,0) qui est du rouge. Les couleurs sont en effet définies par les composantes primaires (Rouge, Vert, Bleu), avec des valeurs comprises entre 0 (mini) et 255 (max).
Je pense que vous avez saisi le principe.
Le code pour créer un cube rouge se résume donc aux 2 lignes:
cube(1,2)
color(1,255,0,0)
Pour "voir" ce cube, on a besoin d'une caméra.
Pour voir plusieurs faces du cube, on recule et on incline cette caméra par rapport au cube. La commande est par exemple camera(2,3,-5)
En 3 lignes de code, on crée et on visualise un cube rouge:
camera(2,3,-5)
cube(1,2)
color(1,255,0,0)
Si je vous dis enfin qu'il faut démarrer le moteur 3D par Init3D() et l'arrêter par Close3D, vous savez l'utiliser.
Visualiser un cube rouge est le premier des exemples que vous trouverez dans le zip.
J'ai appelé ce langage "TOONIC" car il contient TOON, abréviation de CARTOON et aussi pour rimer avec le langage PANORAMIC dont je suis l'auteur.
LES COMMANDES DISPONIBLES ACTUELLEMENT.
Ce paragraphe tient lieu de documentation provisoire du logiciel.
Dans la version actuelle de TOONIC, vous disposez des 44 commandes suivantes:
Pour initialiser TOONIC_SLAVE:
Init3D()
Pour stopper TOONIC_SLAVE:
Stop3D()
Pour positionner la fenêtre 3D. La fenêtre 3D est une fenêtre ouverte par TOONIC_SLAVE et qui contient le monde 3D.
window_top(v) : positionne le bord haut de la fenêtre 3D à V pixels de l'écran
window_left(v) : positionne le bord gauche de la fenêtre 3D à V pixels de l'écran
Pour dimensionner la fenêtre 3D.
window_width(v) : définit la largeur de la fenêtre 3D à V pixels
window_height(v) : définit la hauteur de la fenêtre 3D à V pixels
Pour donner un titre à la fenêtre 3D.
window_caption(t) : définit le texte t comme le titre de la fenêtre 3D
Pour donner une couleur de fond à la fenêtre 3D.
window_color(r,g,b) : définit la couleur résultante des composantes (r,g,b) comme couleur de fond de la fenêtre 3D
Pour gérer la caméra. La caméra est "l'oeil" par lequel on voit le monde 3D.
camera(x,y,z) : crée la caméra en (x,y,z)
camera_FPS : crée une CAMERA "First Person Shooter" directement commandée avec la souris et les flèches
camera_MAYA : crée une caméra directement commandée avec la souris comme dans le logiciel MAYA
camera_position(x,y,z) : place la caméra à la position (x,y,z)
camera_point(x,y,z) : fait viser le point (x,y,z) par la caméra
Pour gérer les lumières. Une lumière éclaire les objets 3D.
light(n,x,y,z) : crée une lumière de numéro n en (x,y,z)
light_position(x,y,z) : place la lumière numéro n à la position (x,y,z)
Pour créer des systèmes de particules.
particle(n,x,y,z) : crée un système de particules de numéro n en (x,y,z)
Pour créer un sky_box.
Un sky_box est un cube immobile de taille infinie qui contient une texture sur chacune de ses 6 faces intérieures.
Il sert à visualiser un ciel et/ou un paysage.
sky_box_texture_top(f) : mémorise pour la face haute du SKY_BOX la texture contenue dans le fichier f
sky_box_texture_back(f) : mémorise pour la face arrière du SKY_BOX la texture contenue dans le fichier f
sky_box_texture_right(f) : mémorise pour la face droite du SKY_BOX la texture contenue dans le fichier f
sky_box_texture_left(f) : mémorise pour la face gauche du SKY_BOX la texture contenue dans le fichier f
sky_box_texture_front(f) : mémorise pour la face avant du SKY_BOX la texture contenue dans le fichier f
sky_box_texture_bottom(f) : mémorise pour la face basse du SKY_BOX la texture contenue dans le fichier f
skybox() : crée un SKY_BOX avec les 6 textures préalablement mémorisées
Pour créer des primitives (node). Une primitive est un objet prédéfini. On peut créer 3 types d'objets prédéfinis.
cube(n,t) : crée un cube de numéro n et de côté t
sphere(n,r) : crée une sphère de numéro n et de rayon r
billboard(n,w,h) : crée un billboard de numéro n, de largeur w et de hauteur h
Un billboard est un objet qui présente toujours la même face à la caméra.
Pour gérer les nodes.
node_position(n,x,y,z) : place le node numéro n à la position (x,y,z)
node_rotate(n,ax,ay,az) : tourne le node numéro n d'un angle ax sur Ox, ay sur Oy, az sur Oz
node_scale(n,cx,cy,cz) : multiplie la taille du node numéro n par cx sur Ox, par cy sur Oy, par cz sur Oz
node_texture(n,f) : applique au node numéro n la texture contenue dans le fichier f
color(n,r,g,b) : applique au node numéro n la couleur résultante des composantes (r,g,b)
node_delete(n) : détruit le node numéro n
Pour créer et gérer des actors. Un ACTOR est un objet pouvant posséder une animation.
actor(n,f) : crée un ACTOR de numéro n avec les données contenues dans le fichier f
actor_position(n,x,y,z) : place l' ACTOR numéro n à la position (x,y,z)
actor_rotate(n,ax,ay,az) : positionne l' ACTOR numéro n avec un angle ax sur Ox, ay sur Oy, az sur Oz
actor_scale(n,cx,cy,cz) : multiplie la taille de l' ACTOR numéro n par cx sur Ox, par cy sur Oy, par cz sur Oz
actor_play_MD2animation(n,t) : applique à l' ACTOR numéro n l'animation t qui est jouée une fois.
actor_loop_MD2animation(n,t) : applique à l' ACTOR numéro n l'animation t qui est jouée en boucle.
actor_delete(n) : détruit l' ACTOR numéro n
Les formats possibles pour le fichier f sont: MD2, MS3D, OBJ, BSP, 3DS, X, MY3D, LMTS, CSM, OCT, B3D.
Les valeurs possibles pour les animations t sont: STAND, RUN, ATTACK, PAIN_A, PAIN_B, PAIN_C, JUMP, FLIP, SALUTE, FALLBACK, WAVE, POINT, CROUCH_STAND, CROUCH_WALK, CROUCH_ATTACK, CROUCH_PAIN, CROUCH_DEATH, DEATH_FALLBACK, DEATH_FALLFORWARD, DEATH_FALLBACKSLOW, BOOM
Pour créer et gérer des meshs. Un MESH est un objet statique. Il n'a pas d'animation.
mesh(n,f) : crée un MESH de numéro n avec les données contenues dans le fichier f
mesh_position(n,x,y,z) : place le MESH numéro n à la position (x,y,z)
mesh_rotate(n,ax,ay,az) : positionne le MESH numéro n avec un angle ax sur Ox, ay sur Oy, az sur Oz
mesh_scale(n,cx,cy,cz) : multiplie la taille du MESH numéro n par cx sur Ox, par cy sur Oy, par cz sur Oz
mesh_delete(n) : détruit le MESH numéro n
COMMENT L'INSTALLER ?
Vous avez 2 zips.
Dans le premier TOONIC http://dl.free.fr/rNSNj21C8 vous avez les fichiers suivants qui doivent rester dans le même répertoire (vous le décompressez et vous l'utilisez tel quel, sans toucher à sa structure):
TOONIC_SLAVE.exe : gère le moteur 3D Irrlicht
irrlicht.dll : le moteur 3D Irrlicht en version 1.1 (oui je sais, la dernière version est la 1.7)
les fichiers sources des exemples
les exemples compilés avec PureBasic 5.51
un répertoire Media contenant les fichiers utilisés dans les exemples
Vous pouvez alors tester les exemples compilés.
Si vous voulez modifier les exemples ou utiliser les commandes TOONIC, vous aurez besoin du zip LIBRAIRIE http://dl.free.fr/ovzAjVuL9 qui contient la librairie LIB_TOONIC_MASTER_101103 qui doit être mise dans PureBasic / PureLibraries / UserLibraries
Amusez-vous bien.
ENCORE TROIS CHOSES A VOUS DIRE
1) J'ai créé ce logiciel dans le seul but de me divertir et je le mets gracieusement à votre disposition et en l'état. Il n'y a pas beaucoup de commandes disponibles, mais s'il intéresse du monde, j'en ajouterai d'autres. Toutes les commandes fonctionnent, mais certaines ne sont pas très utilisables comme "particle" qui certes, crée un système de particules, mais dont on a aucune action. On ne peut ni le déplacer, ni le modifier, ni même le détruire ! C'est l'exemple type de ce que je peux améliorer prochainement.
2) Je ne suis lié par aucune obligation de résultat et je ne prends aucun engagement sur la régularité des mises à jour de ce projet.
3) Je n'ai inséré aucun code malveillant (virus, vers, cheval de troie ou autres) dans les fichiers TOONIC_SLAVE.exe et LIB_TOONIC_MASTER_101103.
Je repasserai de temps en temps sur ce forum pour lire vos réactions, critiques, remarques ou suggestions.
Exemple 3:

Exemple 7:

J'ALLAIS OUBLIER: LES RESTRICTIONS
TOONIC_SLAVE n'est pas intelligent. On lui demande d'agir et d'agir le plus vite possible. Il a été programmé pour cela.
1) - Il ne gère donc pas le numéros d'objets. C'est à vous de les gérer dans TOONIC_MASTER (votre source en PureBasic).
Par exemple, si vous effectuez une action sur un objet qui n'a pas été créé, il plante...
2) - Tous les noms de fichiers sont relatifs au répertoire de TOONIC_SLAVE.
Si un nom de fichier n'est pas donné en absolu mais en relatif, le fichier doit alors se trouver dans le même répertoire que TOONIC_SLAVE.
3) - Il y a des limitations.
en nombre d'objets:
100 nodes
100 mesh
100 actors
100 lumières
1 caméra
en nombre de caractères pour les noms de fichier: 255 caractères