Raydium 3D Game Engine

Official forum for everything about Raydium, ManiaDrive, MeMak, ...
It is currently Tue Apr 16, 2024 8:17 pm

All times are UTC




Post new topic Reply to topic  [ 16 posts ]  Go to page 1, 2  Next
Author Message
PostPosted: Fri Nov 28, 2003 9:16 pm 
Offline
User avatar

Joined: Sun Mar 16, 2003 2:53 am
Posts: 2591
Location: gnniiiii (Scrat)
J'ai tout juste commençé une réflexion sur ODE dans Raydium: le but est de proposer un jeu de fonctions très simple, du genre:
raydium_ode_object_create("voiture");
raydium_ode_element_sphere_create("voiture1","roue1","roue.tri",2,29, ...);
raydium_ode_joint_attach("roue1",-2,3,"corps1",2,3,"suspet.tri");
[...]
Ou des trucs comme ca.
Si vous avez des idées sur le sujet, en particulier sur la facon dont vous imaginez la construction d'un objet "en C", c'est le moment ou jamais de donner votre point de vue !
Voilà à quoi je pense au niveau des structures: ftp://ftp.cqfd-corp.org/uploads/rayode.png


Top
 Profile  
 
 Post subject:
PostPosted: Sun Nov 30, 2003 7:34 pm 
Offline
User avatar

Joined: Sun Mar 16, 2003 2:53 am
Posts: 2591
Location: gnniiiii (Scrat)
Y'a qq erreurs dans le schéma donné au dessus, mais voilà ce que j'ai d'implémenté pour l'instant:
Code:
#define RAYDIUM_ODE_MAX_OBJECTS         64
#define RAYDIUM_ODE_MAX_ELEMENTS        256
#define RAYDIUM_ODE_MAX_JOINTS          256
                                                                               
                                                                               
// all this globals and structs will move to ode.h
dWorldID        raydium_ode_world;
dSpaceID        raydium_ode_space;
dJointGroupID   raydium_ode_contactgroup;
int             raydium_ode_ground_mesh;
                                                                               
typedef struct raydium_ode_Joint
{
    char name[RAYDIUM_MAX_NAME_LEN];
    char state;
    int mesh;
    dJointID joint;
} raydium_ode_Joint;
                                                                               
                                                                               
typedef struct raydium_ode_Element
{
    char name[RAYDIUM_MAX_NAME_LEN];
    char state;
    int mesh;
    dGeomID geom;
    dBodyID body;
//    raydium_ode_Joint joints[RAYDIUM_ODE_MAX_JOINTS_PO];
} raydium_ode_Element;
                                                                               
                                                                               
typedef struct raydium_ode_Object
{
    char name[RAYDIUM_MAX_NAME_LEN];
    char state;
    dGeomID group;
//    raydium_ode_Element element[RAYDIUM_ODE_MAX_ELEMENTS_PO];
} raydium_ode_Object;
                                                                               
                                                                               
raydium_ode_Object  raydium_ode_object[RAYDIUM_ODE_MAX_OBJECTS];
raydium_ode_Element raydium_ode_element[RAYDIUM_ODE_MAX_ELEMENTS];
raydium_ode_Joint   raydium_ode_joint[RAYDIUM_ODE_MAX_JOINTS];


Au niveau des fonctions, c'est le tout début, voilà le genre:
Code:
void raydium_ode_init(void);
int raydium_ode_object_find(char *name);
int raydium_ode_object_create(char *name)
char raydium_ode_object_sphere_add(char *name, int group, dReal density, dReal
radius, char type)
A suivre:
boites, liaisons entre elements (joints), ...


Je part d'un principe qui me semble simple: tout object est composé d'éléments (spheres, boites, ...) et possède un nom (ainsi que chaque élément).
Et ce que ca parait clair à qq1 qui ne connait pas ODE ?


Top
 Profile  
 
 Post subject:
PostPosted: Sun Nov 30, 2003 8:07 pm 
Offline

Joined: Sun Mar 16, 2003 2:30 pm
Posts: 114
Location: reuzé
bon, pour ceux qui comme moi avant d'en discuter avec le fennec n'auraient pas tout capté,
ici on se place bien au dessus d'ode, en fait les vraies liaisons (joints) se réaliseront au niveau d'ode lui même, pas de nos fonctions acessibles par l'api raydium, par contre, elles iront appeler les "vraies fonction qui font mal"(tm) d'ode, mais ça , l'utilisateur il s'en foutra un peu parce que justement il aura pas à se torturer l'esprit

on note juste la présence du int mesh dans un element et dans une jointure, c'est un index du tableau des mesh (objets 3d) que raydium tient à notre disposition

ça servira donc à pouvoir matérialiser (en plus de l'élément lui-même) la jointure (suspet, barre de fer, corde, blob étiré ou tout autre truc délirant qui ferait office de liaison :) )

voilà ct mes 2cents d'euro du dimanche soir :)

_________________
Pentium IV 3c / 1Go / Gf-FX / WinXpSP2
AMD64_3000+ / 1Go / Gf 2mx /Mandriva amd64


Top
 Profile  
 
 Post subject:
PostPosted: Sun Nov 30, 2003 8:16 pm 
Offline
User avatar

Joined: Sun Mar 16, 2003 2:53 am
Posts: 2591
Location: gnniiiii (Scrat)
Comme quoi, c'est important de poser la question quand c'est pas clair, ca aide tout le monde :)
Quelques petites précisions: RyLe parle bien d'un entier qui correspond à l'objet dans les meshes de Raydium, et je me permet de rappeller l'existence d'une fonction nommé raydium_object_find("truc.tri") qui permet de retrouver une mesh par son nom.

Quand à cette histoire d'objets et d'éléments, voilà un exemple:
objet: "voiture"
élements: "corps_voiture" (boite), "roue1" (sphere), "roue2", ...
et des joints pour attacher les roues au corp, par exemple.
Note: un objet peut être composé d'un seul élément (une "caisse" est composée d'une boite seule).


Top
 Profile  
 
 Post subject:
PostPosted: Mon Dec 01, 2003 10:26 pm 
Offline
User avatar

Joined: Sun Mar 16, 2003 2:53 am
Posts: 2591
Location: gnniiiii (Scrat)
Pour ceux que ca intéresse, j'ai commençé à m'occuper des couches "basses" d'ODE, et j'annonce la naissance du petit test5 pour tester tout ca :)
Plus sérieusement, je ne sais toujours pas quoi choisir entre OPCODE et dxTriangle (avec les avantages et inconvénients déjà énnoncés y'a qq mois pour chacune des différentes solutions)... j'en reparlerais, en particulier dans le forum graphisme.


Top
 Profile  
 
 Post subject:
PostPosted: Thu Dec 04, 2003 11:05 pm 
Offline
User avatar

Joined: Sun Mar 16, 2003 2:53 am
Posts: 2591
Location: gnniiiii (Scrat)
Pas mal de modifs sur cette intégration, et test5 arrive maintenant à faire tomber une boule qui rebondit sur le sol avant de rouler, le tout avec SEULEMENT ca:
Code:
    int a;
    a=raydium_ode_object_create("SPHERE");
    raydium_ode_object_sphere_add("sphere",a,1,(0.565688/2),0,"boule.tri");

Lire:
Creer un objet "SPHERE" (c'est une coquille vide, pour l'instant)
Ajouter à l'objet en question une sphere, donc (nommée "sphere"), de densitée 1, avec un rayon de (0.5/2) affichée avec le modele "boule.tri".

Comparée aux centaines de lignes de test4, ca me semble plutot simple, et je pense être sur la bonne voie :)
Il reste encore énormément de choses à gérer (paramètres divers, autres formes, jointures, callbacks utilisateur, jointures cassable, moteurs, énergie, ...) mais je suis plutot satisfait de la tournure que ca prend.
Si qq1 a des remarques à faire sur ces fonctions (raydium_ode_*) citées juste au dessus, j'écoute avec plaisir !


Top
 Profile  
 
 Post subject:
PostPosted: Sun Dec 07, 2003 4:26 pm 
Offline

Joined: Sun Mar 16, 2003 10:27 am
Posts: 404
Aucune remarque si ce n'est félicitation, ça a l'air très prometteur :lol:


Top
 Profile  
 
 Post subject:
PostPosted: Mon Dec 08, 2003 1:00 pm 
Offline
User avatar

Joined: Sun Mar 16, 2003 2:53 am
Posts: 2591
Location: gnniiiii (Scrat)
Hop ! L'intégration avance plutot bien !
Les joints type "suspets" fonctionnent, et j'ai rajouté un début de gestion des moteurs !
En gros, il est possible de modéliser en grande partie la voiture du test4, avec cette séquence de fonctions, par exemple:
Code:
int a;
a=raydium_ode_object_create("WATURE");

raydium_ode_object_box_add("corps",a,1,RAYDIUM_ODE_AUTODETECT,0,0,0,"clio.tri");

raydium_ode_object_sphere_add("pneu_ag",a,1,RAYDIUM_ODE_AUTODETECT,0,"roue5.tri");
raydium_ode_element_move_name_3f("pneu_ag",0.42,0.253,-0.180);
raydium_ode_joint_attach_hinge2_name("suspet_ag","corps","pneu_ag",RAYDIUM_ODE_JOINT_SUSP_DEFAULT_AXES);
raydium_ode_joint_hinge2_block_name("suspet_ag",1);

raydium_ode_object_sphere_add("pneu_ad",a,1,RAYDIUM_ODE_AUTODETECT,0,"roue5.tri");
raydium_ode_element_move_name_3f("pneu_ad",0.42,-0.253,-0.180);
raydium_ode_joint_attach_hinge2_name("suspet_ad","corps","pneu_ad",RAYDIUM_ODE_JOINT_SUSP_DEFAULT_AXES);
raydium_ode_joint_hinge2_block_name("suspet_ad",1);

raydium_ode_object_sphere_add("pneu_rg",a,1,RAYDIUM_ODE_AUTODETECT,0,"roue5.tri");
raydium_ode_element_move_name_3f("pneu_rg",-0.444,0.253,-0.180);
raydium_ode_joint_attach_hinge2_name("suspet_rg","corps","pneu_rg",RAYDIUM_ODE_JOINT_SUSP_DEFAULT_AXES);
raydium_ode_joint_hinge2_block_name("suspet_rg",1);

raydium_ode_object_sphere_add("pneu_rd",a,1,RAYDIUM_ODE_AUTODETECT,0,"roue5.tri");
raydium_ode_element_move_name_3f("pneu_rd",-0.444,-0.253,-0.180);
raydium_ode_joint_attach_hinge2_name("suspet_rd","corps","pneu_rd",RAYDIUM_ODE_JOINT_SUSP_DEFAULT_AXES);
raydium_ode_joint_hinge2_block_name("suspet_rd",1);
   
raydium_ode_motor_create("moteur");
raydium_ode_motor_attach_name("moteur","suspet_ag",1);
raydium_ode_motor_attach_name("moteur","suspet_ad",1);
raydium_ode_motor_power_max_name("moteur",0.01);


Ceux qui prennent le temps de lire ce code y trouveront la création de l'objet en lui même, puis l'ajout (à cet objet) du corps de la voitures, des 4 roues et leurs suspensions, et pour terminer, la création d'un moteur attaché aux suspensions avant de la voiture.
Pour faire avancer le tout, il suffit de faire un truc du genre:
Code:
raydium_ode_motor_speed_name("moteur",speed);

Et la voiture avance ! :)
Et comment on tourne ? bonne question, pour l'instant... :) (surtout que le role de raydium_ode_joint_hinge2_block*() est justement de bloquer les roues dans l'axe )

PS: Nos membres ont posté un total de 1000 messages
Champagne ;) (perso, jvé prendre un coca)


Top
 Profile  
 
 Post subject:
PostPosted: Tue Dec 09, 2003 12:38 pm 
Offline

Joined: Sun Mar 16, 2003 10:27 am
Posts: 404
Pour moi aussi ce sera un coca merci. En tout cas ça à l'air super pratique. Je vois que tu as defini des valeurs pour déplacer les roues. Quelle taille doit faire un voiture dans memak ??

Merci pour toutes ces avancées j'ai hate de les tester :D


Top
 Profile  
 
 Post subject:
PostPosted: Tue Dec 09, 2003 1:11 pm 
Offline
User avatar

Joined: Sun Mar 16, 2003 2:53 am
Posts: 2591
Location: gnniiiii (Scrat)
Je vais lacher les modifs sur WVS d'ici peu de temps. Je ne l'ai pas fait avant, parce que test4 ne se compile plus correctement avec cette nouvelle version de Raydium (passqueu ODE est utilisé en interne par test4).
Quand à la taille des éléments, eh bien.. aucune échelle n'est définie :) ODE ne fonctionne pas avec des unités de mesures fixées, mais de manière relative.
Donc les valeurs que j'utilise dans test5 sont du même ordre que dans test4, et pour la position des roues, je me suis basé sur la taille de clio.tri (sachant que cette taille est elle même basée sur... rien, c'est arbitraire :))


Top
 Profile  
 
 Post subject:
PostPosted: Tue Dec 09, 2003 1:55 pm 
Offline

Joined: Sun Mar 16, 2003 10:27 am
Posts: 404
ok merci :)


Top
 Profile  
 
 Post subject:
PostPosted: Tue Dec 09, 2003 10:12 pm 
Offline
User avatar

Joined: Sun Mar 16, 2003 2:53 am
Posts: 2591
Location: gnniiiii (Scrat)
Le truc avance toujours :). Au menu:
- Code plus "propre"
- Support des moteurs angulaires (utilisé pour la direction de la voiture, par exemple.. au lieu de donner une force au moteur, on lui donne un angle à atteindre et il cherche à se déplacer vers cet angle)
- Gestion des suppressions (des objets, elements, joints et moteurs) [pas tout à fait terminé.. la gestion des dépendances est particulièrement chiante :)]

Et pour le fun, voilà la TODO list interne du fichier ode.c:
// IN PROGRESS:
// motor_attach must check if element is from the correct object
// delete methods (objets, elements, joints, motors)
// TODO:
// load object from file
// statics geoms
// joints params (suspensions params, for example)
// collide user callbacks
// parametrics frictions
// default "global" object
// move_element_to_object
// move_object_to_object
// breakable joints

Gniiii ca va être cool tout ca ;)


Top
 Profile  
 
 Post subject:
PostPosted: Thu Dec 11, 2003 8:45 pm 
Offline
User avatar

Joined: Sun Mar 16, 2003 2:53 am
Posts: 2591
Location: gnniiiii (Scrat)
Ca avance, ca avance :)
Les fonctions d'effacement fonctionnent à merveille, le code est pas mal protégé (ODE plante pour pas grand chose sur ce point, c'est donc important d'empecher l'utilisateur de faire n'importe quoi), les géométries statiques fonctionnent aussi (elements non soumis à la physique, mais juste capables de déclencher des collisions avec les objets non statiques [c'est utilisé par test4 pour représenter les autres joueurs en réseau, par exemple]), il existe maintenant un objet par défaut nommé "GLOBAL", utilisé pour tout ce qui est "par terre" dans le monde, par exemple (on ne peux l'effacer), et enfin la fonction qui permet de déplacer un élement dans un autre objet est codée (pour déplacer une roue de "VOITURE" vers "GLOBAL" par exemple, pour montrer que la voiture perd sa roue).
Il y'a encore un probleme avec cette fonction, car deux élements qui n'appartiennent pas au même objet peuvent rentrer en collision, et c'est ce qui arrive dans le cas de la roue de voiture donné plus haut: les roues sont a l'intérieur du cube qui représente la voiture ! .. et donc quand je détache la roue de la voiture, elle "explose" car elle est expulsée de cette boite. Bref, faut trouver une solution à ça ;)

Voilà la nouvelle TODO: (les lignes qui ne sont plus là sont donc terminés)
// load object from file
// joints params (suspensions params, for example)
// collide callbacks
// parametrics frictions
// move_element_to_object
// move_object_to_object (is it really needed ?)
// breakable joints
// allow RayODE reset (deleting Trimesh, for example)
// other joints

PS: Vu que c'est pas très visuel cette partie du projet, heu.. voilà ce que ca donne en capture d'écran ;) : http://raydium.cqfd-corp.org/captures/?image=103.jpg


Top
 Profile  
 
 Post subject:
PostPosted: Fri Dec 12, 2003 11:49 pm 
Offline
User avatar

Joined: Sun Mar 16, 2003 2:53 am
Posts: 2591
Location: gnniiiii (Scrat)
Le problème cité dans le message juste au dessus est réglé:
Voilà une capture commentée qui résume la résolution de ce "bug" : http://raydium.cqfd-corp.org/captures/?image=104.jpg .
Ca avance ;)


Top
 Profile  
 
 Post subject:
PostPosted: Sat Dec 13, 2003 6:38 pm 
Offline
User avatar

Joined: Sun Mar 16, 2003 2:53 am
Posts: 2591
Location: gnniiiii (Scrat)
Et hop ! les "joints cassables" sont implémentés:
Code:
raydium_ode_joint_break_force(joint,maxforce);

Tout simplement :) (ca marche très bien avec la voiture de test5 quand elle tombe d'un peu haut).

Les modifs sont maintenant postées sur WVS (même si ode.c est loin d'être terminé).
ATTENTION: test4.c ne fonctionne plus avec cette version !
N'oubliez pas non plus qu'il faut la libphp ;)


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 16 posts ]  Go to page 1, 2  Next

All times are UTC


Who is online

Users browsing this forum: No registered users and 25 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Group