Retour
CREATION DU BRAS SOUS RAYDIUM
Pour créer le bras, nous avons écrit une fonction nommée "simul_createBras()". Dans celle-ci, certaines fonctions de ODE ont été utilisées.
Récapitulatif des fonctions à utiliser :
- raydium_ode_object_box_add est utilisé pour créer une boîte. Les paramètres sont : - nom de la boite
- nom de l'objet à laquelle la boite appartient (Dans notre cas, ce sera toujours 'a' pour le bras)
- poids de la boîte
- dimensions de la boite en x, y et z
- type d'ojet : standard ou statique
- numéro du type d'objet pour collision
- nom du fichier pour le rendu
- raydium_ode_element_move_name_3f est utilisé pour déplacer un élément sur x, y et z. Paramètres :
- nom de l'élément à déplacer
- valeurs en x, y et z
- raydium_ode_element_rotate_name_3f sert à faire subir une rotation à l'élément. Paramètres :
- nom de l'élément à faire tourner
- valeurs en x, y et z
- raydium_ode_joint_attach_fixed sert à fixer 2 objets. Celle-ci est seulement utilisée pour fixer la base au sol. Paramètres :
- nom de la liaison
- ID des 2 éléments à fixer (RAYDIUM_ODE_JOINT_FIXED pour le sol)
- raydium_ode_joint_attach_hinge_name sert à créer une liaison entre 2 éléments avec un degré de liberté. Paramètres :
- nom de la liaison
- nom des 2 élément à lier
- position de la liaison en x, y et z
- degré de liberté en x, y ou z (ex : RAYDIUM_ODE_JOINT_AXE_X = 1,0,0)
- raydium_ode_motor_create sert à créer un moteur. Paramètres :
- nom du moteur
- nom de l'objet dans lequel le moteur sera placé
- type de moteur (moteur angulaire dans notre cas)
- raydium_ode_motor_attach_name sert à lier le moteur à une liaison
- nom du moteur
- nom de la liaison
- numéro de l'axe (0 pour x, 1 pour y et 2 pour z)
- raydium_ode_motor_power_max_name sert à définir la puissance du moteur. Paramètres :
- nom du moteur à paramètrer
- force du moteur
Pour la plupart de ces fonctions, nous pouvons utiliser les noms ou bien les ID pour référencer les éléments. Pour celà, il suffit soit d'enlever soit de mettre "name" à chaque nom de fonction.
exemple :
- raydium_ode_element_move_3f : déplacement de l'objet référencé par son ID
- raydium_ode_element_move_name_3f : déplacement de l'objet référencé par son nom
L'ID d'un objet peut être stocké dans une variable de type entier. Lorsque l'on créé une boîte par exemple, la fonction utilisée retourne l'identifiant de la boîte créée : raydium_ode_object_box_add retourne un entier.
CREATION DES 5 AXES
Passons à la création du bras. Nous n'allons pas détailler toute sa création ici. Nous créerons seulement la base, les axes 2 et 3 et la pince.
Tout d'abord, créons la base. Pour la créer, nous allons tout d'abord ajouter une boite à la position (0,0,0) du monde avec les dimensions de la base.
Pour celà, il faut déplacer la boite de la moitier de sa hauteur. Car à la création, raydium place le centre du repère où l'objet a été créé (blender) au centre du monde de Raydium, c'est à dire à la position (0,0,0) du monde. Nous verrons que sous blender, nous avons placé le centre de l'objet créé au centre du repère. Donc pour que la boîte soit sur le sol, il faut la déplacer de la moitié de sa hauteur sur l'axe z.
//*********************************************************************************************
//creation de la base
//*********************************************************************************************
//création d'une boite avec les dimensions et l'aspect de "base.tri" dans l'objet a
raydium_ode_object_box_add("test_bras_base",a,10,L_BASE,L_BASE,H_BASE,RAYDIUM_ODE_STANDARD,0,"base.tri");
//Déplacement de la base de la moitié de la hauteur de la base sur l'axe des z pour créer l'objet en 0,0,0
raydium_ode_element_move_name_3f("test_bras_base",0,0,H_BASE/2);
//Création d'un joint pour attacher la base du bras au sol
raydium_ode_joint_attach_fixed("fixe",raydium_ode_element_find("test_bras_base"),RAYDIUM_ODE_JOINT_FIXED);
//*********************************************************************************************
//*********************************************************************************************
Voici ce que ce code donne :
Ensuite, il faut créer l'axe 1 juste au dessus de la base. Mais nous ne montrerons pas le code de celui-ci. Voyons comment créer l'axe 2. Il se situe juste au dessus de l'axe 1 et il a une liaison en x avec cet axe. Voici comment celà se présente :
//*********************************************************************************************
//creation de l'axe 2
//*********************************************************************************************
//création d'une boite avec les dimensions et l'aspect de "axe2.tri" dans l'objet a
raydium_ode_object_box_add("test_bras_axe2",a,POID_AXES,H_AXE2,L_AXE2,La_AXE2,RAYDIUM_ODE_STANDARD,0,"axe2.tri");
//*********************************************************************************************
//creation de la liaison entre l'axe1 et l'axe2
//*********************************************************************************************
//Déplacement de l'axe2 juste au dessus de l'axe1
raydium_ode_element_move_name_3f("test_bras_axe2",0,0,H_BASE_AXE1+H_AXE2/2);
//rotation de l'axe 2 pour qu'il soit dans le bon sens
raydium_ode_element_rotate_name_3f("test_bras_axe2",0,PI/2,0);
//création de la liaison entre l'axe1 et l'axe2, libre en X
raydium_ode_joint_attach_hinge_name("test_bras_axe2_liai","test_bras_axe1","test_bras_axe2",0,0,
H_BASE_AXE1+L_AXE2/2,RAYDIUM_ODE_JOINT_AXE_X);
//*********************************************************************************************
//creation du moteur pour faire bouger l'axe2 par rapport à l'axe1
//*********************************************************************************************
raydium_ode_motor_create("test_bras_mot_axe2",a,RAYDIUM_ODE_MOTOR_ANGULAR);
raydium_ode_motor_attach_name("test_bras_mot_axe2","test_bras_axe2_liai",0);
raydium_ode_motor_power_max_name("test_bras_mot_axe2",FORCE_MOT);
//*************************************************************************************************
//*************************************************************************************************
Résultat :
Résultat après un mouvement du moteur de l'axe 2 :
Après avoir créé l'axe 2, passons à l'axe 3. On doit les positionner et les lier au niveau de leur entre-axes. Ils ont un degré de liberté en x.
Voici comment se présente l'axe 3 :
//*********************************************************************************************
//creation de l'axe 3
//*********************************************************************************************
//création d'une boite avec les dimensions et l'aspect de "axe3.tri" dans l'objet a
raydium_ode_object_box_add("test_bras_axe3",a,POID_AXES,H_AXE3,L_AXE3,La_AXE3,RAYDIUM_ODE_STANDARD,0,"axe3.tri");
//*********************************************************************************************
//creation de la liaison entre l'axe 2 et l'axe3
//*********************************************************************************************
//Déplacement de l'axe3 par rapport à l'axe2
raydium_ode_element_move_name_3f("test_bras_axe3",0,-H_AXE3/2+ENTRAXE_AXE_2,H_BASE_AXE1+H_AXE2-L_AXE2/2);
//rotation de l'axe3 pour qu'il soit dans le bon sens
raydium_ode_element_rotate_name_3f("test_bras_axe3",-PI/2,PI/2,PI);
//création de la liaison entre l'axe2 et l'axe3, libre en X
raydium_ode_joint_attach_hinge_name("test_bras_axe3_liai","test_bras_axe2","test_bras_axe3",0,0,
H_BASE_AXE1+H_AXE2-L_AXE2/2,RAYDIUM_ODE_JOINT_AXE_X);
//*********************************************************************************************
//creation du moteur pour faire bouger l'axe 3 par rapport à l'axe4
//*********************************************************************************************
raydium_ode_motor_create("test_bras_mot_axe3",a,RAYDIUM_ODE_MOTOR_ANGULAR);
raydium_ode_motor_attach_name("test_bras_mot_axe3","test_bras_axe3_liai",0);
raydium_ode_motor_power_max_name("test_bras_mot_axe3",FORCE_MOT);
//*************************************************************************************************
//*************************************************************************************************
Résultat :
Résultat après mouvement du moteur de l'axe 3 :
La création des autres axes se font de la même façon. Nous ne détaillerons donc pas tout le code ici. Si le code vous intéresse, vous pouvez télécharger le code source sur la page précédente.
CREATION DE LA PINCE
Détaillons tout de même la création de la pince. Celle-ci a posé quelques soucis car elle ne fonctionne pas comme tous les autres axes. En effet, en réalité il est assez simple de créer une pince, mais pour la modéliser ça l'est beaucoup moins.
De plus, il y a aussi un soucis de contact avec cette pince. Car à terme, elle sert à tenir un objet, il fallait donc réfléchir pour créer un contact aussi stable que possible. Nous avons alors créer un objet pour la base de la pince, puis 3 sphère pour le bout de la pince pour permettre un contact ponctuel avec un autre objet. Car avec une boite, le contact aurait été plane.
Ici, nous créerons donc aussi des sphères. Voyons la fonction pour en créer une :
- raydium_ode_object_sphere_add Paramètres :
- nom de la sphère
- nom de l'objet dans laquelle est créée la sphère
- poids de la sphère
- diamètre de la sphère
- type d'objet
- numéro du type d'objet pour collision
- nom du fichier pour le rendu -> dans le cas de la pince, aucun rendu ne sera fait de ces sphère. Car elle ne servent qu'à obtenir une liaison ponctuelle avec un autre objet. Elle ne sera donc pas visible à l'oeil.
Voici comment est composée la pince :
La pince est donc composée de 10 éléments. Les 4 premiers permettent de faire le squelette de la pince, avec sont rendu. Et les 6 derniers sont les 6 sphères qui servent à la liaison ponctuelle.
Nous avons été obligé de créer un moteur pour chacune des sphères pour qu'elle puisse suivre le mouvement de la pince. Les centres de rotation des ces sphères sont donc au même endroit que les centres des axes 6_3 et 6_4. Ca fait qu'il y a 4 moteurs au même endroit.
A la création des sphères, il faut définir un paramètre "slip". Car dans notre cas, il faut que la pince puisse tenir un objet. Et le paramètre slip définit le type de contact qu'aura un élément. Pour celà, il faut faire appel à cette fonction :
- raydium_ode_element_slip_name Paramètres :
- nom de l'élément à paramètrer
- valeur du slip. Pour avoir un contact qui adhère au maximum, il faut mettre cette variable à 0. Nous avons donc définit une variable pour celà.
//variable pour type de contact de la pince
#define slip 0
En ce qui concerne le code, nous n'allons détailler seulement la création d'une seule sphère car le reste est redondant avec la créations des autres axes vu ci dessus.
//*********************************************************************************************
//creation de la pince
//*********************************************************************************************
//*********************************************************************************************
//creation des axes 6_1 et 6_2
//*********************************************************************************************
...
//*********************************************************************************************
//creation des axes 6_3 et 6_4
//*********************************************************************************************
...
//*********************************************************************************************
//creation des axes 6_5 et 6_6
//*********************************************************************************************
//création d'une sphere
raydium_ode_object_sphere_add("test_bras_axe6_5",a,0.01,TAILLE_PINCE,RAYDIUM_ODE_STANDARD,0,"");
raydium_ode_element_slip_name("test_bras_axe6_5",slip);
//création d'une sphere
raydium_ode_object_sphere_add("test_bras_axe6_6",a,0.01,TAILLE_PINCE,RAYDIUM_ODE_STANDARD,0,"");
raydium_ode_element_slip_name("test_bras_axe6_6",slip);
//*********************************************************************************************
//creation de la liaison entre l'axe 5 et les axes 6_5 et 6_6
//*********************************************************************************************
//Déplacement des axes 6_5 et 6_6 par rapport aux axes 6_1 et 6_2
raydium_ode_element_move_name_3f("test_bras_axe6_5",-DIST_AXE6_3_X+0.2,
-2.2-H_AXE3+ENTRAXE_AXE_2+ENTRAXE_AXE_3-ESP_AXE4_Y-H_AXE4-H_AXE_6_12,
H_BASE_AXE1+H_AXE2-L_AXE2/2+ESP_AXE4_Z+DIST_AXE45+DIST_AXE6_Z);
raydium_ode_element_move_name_3f("test_bras_axe6_6",DIST_AXE6_4_X-0.2,
-2.2-H_AXE3+ENTRAXE_AXE_2+ENTRAXE_AXE_3-ESP_AXE4_Y-H_AXE4-H_AXE_6_12,
H_BASE_AXE1+H_AXE2-L_AXE2/2+ESP_AXE4_Z+DIST_AXE45+DIST_AXE6_Z);
//création des liaisons entre les axes 6_5 et 6_6 par rapport aux axes 6_1 et 6_2, libre en Z
raydium_ode_joint_attach_hinge_name("test_bras_axe6_5_liai","test_bras_axe6_1","test_bras_axe6_5",
-DIST_AXE6_3_X,
2-H_AXE3+ENTRAXE_AXE_2+ENTRAXE_AXE_3-ESP_AXE4_Y-H_AXE4-H_AXE_6_12,
H_BASE_AXE1+H_AXE2-L_AXE2/2+ESP_AXE4_Z+DIST_AXE45+DIST_AXE6_Z,
RAYDIUM_ODE_JOINT_AXE_Z);
raydium_ode_joint_attach_hinge_name("test_bras_axe6_6_liai","test_bras_axe6_2","test_bras_axe6_6",
DIST_AXE6_4_X,
2-H_AXE3+ENTRAXE_AXE_2+ENTRAXE_AXE_3-ESP_AXE4_Y-H_AXE4-H_AXE_6_12,
H_BASE_AXE1+H_AXE2-L_AXE2/2+ESP_AXE4_Z+DIST_AXE45+DIST_AXE6_Z,
RAYDIUM_ODE_JOINT_AXE_Z);
//*********************************************************************************************
//creation du moteur pour faire bouger la pince par rapport à l'axe 5
//*********************************************************************************************
raydium_ode_motor_create("test_bras_mot_axe6_5",a,RAYDIUM_ODE_MOTOR_ANGULAR);
raydium_ode_motor_attach_name("test_bras_mot_axe6_5","test_bras_axe6_5_liai",0);
raydium_ode_motor_power_max_name("test_bras_mot_axe6_5",FORCE_PINCE);
raydium_ode_motor_create("test_bras_mot_axe6_6",a,RAYDIUM_ODE_MOTOR_ANGULAR);
raydium_ode_motor_attach_name("test_bras_mot_axe6_6","test_bras_axe6_6_liai",0);
raydium_ode_motor_power_max_name("test_bras_mot_axe6_6",FORCE_PINCE);
//*********************************************************************************************
//creation des axes 6_7 et 6_8
//*********************************************************************************************
...
//*********************************************************************************************
//creation des axes 6_9 et 6_10
//*********************************************************************************************
...
Résultat :
Résultat après un mouvement de la pince :
Nous voyons bien que le bout de la pince est modélisé avec 6 sphères identiques pour permettre un contact ponctuel. Cependant, ces sphères n'ont aucun rendu car ils ne doivent pas être visible à l'utilisateur en tant que sphère. C'est pour celà que nous avons tout d'abord créé une boite avec le rendu réel de la pince. Et ensuite nous avons positionné les sphères pour qu'elles dépassent de peu entre les 2 extrémités de la pince.
Dans toutes les illustrations au dessus, on peut voir des formes en rouge autour du bras. Ceux-ci sont les formes que le moteur physique prend en compte. C'est à dire que si un élément vient à percuter un endroit quelconque du bras, cet élément entrera en contact avec la forme en rouge et non pas avec le rendu du bras. On peut aussi voir certains nom en blanc et en vert. Ce sont les noms des éléments du bras (blanc) et le nom des liaisons du bras (vert).
Ils sont de la forme :
- "test_bras_axe3 (TEST_BRAS)" Celà veut dire que le nom de l'élément est "test_bras_axe3" et qu'il fait partie de l'objet "TEST_BRAS"
- "<test_bras_axe3_liai>" Qui est le nom de la liaison
On peut voir tout celà car le mode "Debug" est activé grâce à une de ces commandes :
//dessine les objets normalement
raydium_ode_draw_all(0);
raydium_ode_draw_all(RAYDIUM_ODE_DRAW_NORMAL);
//ajout du mode Debug
raydium_ode_draw_all(RAYDIUM_ODE_DRAW_DEBUG);
On enlève alors le mode Debug pour voir le bras dans sa vraie apparence. Même si l'on ne voit plus les formes pour les collisions, celles-ci sont tout de même encore gérées.
Voici donc le résultat lorsque l'on enlève le mode Debug :
TESTE DE LA PINCE
Après avoir modélisé ce bras, il nous fallait tester si la pince pouvait prendre des objets. Alors nous avons intégré une boîte à notre environnement. Au début il y eut un problème car cette boîte glissait de la pince et tombait par terre. La solution a alors été de configurer la surface de la boîte et de la pince grâce à une commande de ODE :
//fonction qui configure la surface de l'élément name
raydium_ode_element_slip_name(name,ContactName);
ContactName? définit le type de contact qu'aura l'élément.
Pour la pince, nous avons choisit de mettre 0, ce qui veut dire que le contact est infinie. Ce qui fait qu'il accrochera à l'objet tenu. Quant à la boîte, nous avons mis un contact appelé dContactMu2 (qui vaut 1). Ce type de contact se caractèrise par une force exercée à l'inverse de l'objet en contact. C'est ce qu'il nous fallait pour la pince pour qu'elle joue le rôle d'un étau sur la caisse.
Voici donc le code pour ajouter une caisse dans la scène :
int a;
char name[255];
//recherche de l'ensemble où se trouve le bras
a=raydium_ode_object_find("GLOBAL");
//On donne le nom "box" à name dans ODE
raydium_ode_name_auto("box",name);
//on configure la surface de la boîte avec le contact dContactMu2
raydium_ode_element_slip_name(name,dContactMu2);
//ajout d'une boîte de 5cm/5cm/5cm avec le rendu "crate.tri"
raydium_ode_object_box_add(name,a,0.1,5,5,5,RAYDIUM_ODE_STANDARD,0,"crate.tri");
//on bouge la caisse pour qu'elle soit devant le bras
raydium_ode_element_move_name_3f(name,0,-22,2.5);
Pour commander les moteurs du bras, nous avons créé une fonction qui est détaillée dans la partie suivante :
voir ici
Voici les essais en image pour prendre la caisse :
PROBLEMES RENCONTRES
Le premier problème rencontré a été à la création des éléments. Car le repère de raydium a été différent du repère de blender. Ce qui fait que les éléments n'étais pas bien positionnés à leur création. C'est pour celà que nous avons dû effectuer certaines rotation sur ces éléments.
Pour corriger ce problème, nous aurions pû construire entièrement le bras avec les différents éléments sous blender. Cependant nous avons créé un fichier blender pour chaque axe.
Ensuite, nous avons eu un problème de taille lorsque le bras était terminé. Car au début, nous avions créé la pince avec seulement des boites. Ce qui faisait qu'elle n'arrivait pas à tenir un objet.
Nous avons donc créer des sphères comme on l'a vu au dessus. Mais il y eut encore un problème car la boîte que l'on voulait tenir glissait trop et donc tombait très rapidement. Après réflexion, nous avons vu qu'il fallait définir certains paramètres pour que la boite ne glisse pas, à savoir le "slip" qui défini le type de contact.
Après avoir paramètré tout celà, la pince arrivait à mieux tenir la boîte. Cependant, elle glisse toujours un peu, certe moins rapidement, mais au botu d'un certain temps, la boîte retombe au sol. Nous nous sommes arrêté ici pour les réglages de la pince car il y avait des problèmes plus important à résoudre.
Retour