Raydium 3D Game Engine

Official forum for everything about Raydium, ManiaDrive, MeMak, ...
It is currently Thu Mar 28, 2024 11:56 pm

All times are UTC




Post new topic Reply to topic  [ 26 posts ]  Go to page 1, 2  Next
Author Message
 Post subject: Ode Ray
PostPosted: Sun Oct 09, 2005 10:52 pm 
Offline

Joined: Sun Oct 09, 2005 10:46 pm
Posts: 759
Bonjour,
Je suis en train de tester raydium.
Il est très commode de pouvoir recompiler les exemple avec le dev c++ fournis dans le sdk !!!!

Par contre, j'ai une appli qui tourne sous ode / drawstuff. Je voudrais bien la porter sous raydium. Cependant j'utilise des ray pour faire des mesure de distance. Comment puis-je utiliser des ray dans raydium, il me semble que les deux seuls objet suportés sont box et sphère.
Puis je creer directement un objet ode ? comment y acceder ?

Petite remarque complementaire, je n'arrive pas a debugger. J'ai essayé d'installer la dernière version de dev c++. Du coup ce sont les programmes qui ne se compilent plus.

Dans tout les cas toute aide sera la bien venue.

Merci et bonne journée
Jacques


Top
 Profile  
 
 Post subject:
PostPosted: Mon Oct 10, 2005 3:20 pm 
Offline
User avatar

Joined: Sun Mar 16, 2003 2:53 am
Posts: 2591
Location: gnniiiii (Scrat)
Salut,

- Pour ton problème de Ray, il y'a deux solutions possibles : La première consiste tout simplement à continuer à utiliser les rayons au travers de l'API d'ODE, puisque Raydium place une surcouche à ODE sans empêcher un accès direct à ce dernier. Il faut juste arriver à concilier ODE et RayODE, ce qui ne devrait pas être un problème majeur, en particulier grace aux callbacks offert par RayODE. L'autre solution consiste à ajouter toi même la gestion des rayons à RayODE ;) (j'ai un projet du genre dans ma TODO, sur le wiki, preuve que c'est quelque chose de tout à fait réalisable).

- Le debugger de la version de Dev-CPP ne fonctionne pas, c'est tout à fait exact. Je ne sais même pas si les versions récentes ont résolu ce problème. Là encore, deux solutions : utiliser le debugger en ligne de commande (gdb) qui est livré, un peu rustique mais efficace, ou modifier le SDK pour qu'il utilise une version plus récente de Dev-Cpp. Je veux bien me charger de réaliser cette dernière solution, mais je ne sais pas dans quels délais. Tu utilises l'IDE de Dev-Cpp ou le compiler.exe qui est livré dans le SDK ?


Top
 Profile  
 
 Post subject: ray et debug
PostPosted: Mon Oct 10, 2005 3:35 pm 
Offline

Joined: Sun Oct 09, 2005 10:46 pm
Posts: 759
Bonjour,

J'ai commencé a rajouter la gestion des ray. Par contre il faut que j'arrive a comprendre votre code, vu mon niveau j'ai du boulot.
Le plus genant c'est d'eviter les collisions. Je vais surement devoir refaire le call back de collision pour eviter les collisions avec les rayons.
Enfin pour les tracer j'ai trouvé quelque chose qui ressemble.

Pour le debug c'est resolu. J'ai installé la dernière version de dev c++
rajouter
Code:
#define GLUT_DISABLE_ATEXIT_HACK

avant l'inculde de index.c
et rajouter les librairies de gcc dans le linker.
Du coup j'ai reussi a debugger mes rayon ;o)

Bonne journée
Jacques


Top
 Profile  
 
 Post subject:
PostPosted: Mon Oct 10, 2005 4:06 pm 
Offline
User avatar

Joined: Sun Mar 16, 2003 2:53 am
Posts: 2591
Location: gnniiiii (Scrat)
N'hésite pas à demander de l'info ici, mais tente autant que possible de modifier le "core" de RayODE pour t'éviter d'avoir à maintenir tout ça à chaque nouvelle version de Raydium. Je pense que les callbacks que propose Raydium doivent être quasi-suffisants. Regarde du coté de "raydium_ode_CollideCallback" par exemple.


Top
 Profile  
 
 Post subject: collision des ray
PostPosted: Mon Oct 10, 2005 4:32 pm 
Offline

Joined: Sun Oct 09, 2005 10:46 pm
Posts: 759
Bonjour,
j'essaie de travailler dans un fichier odex.h comme cela vous pourrez l'ajouter si cela vous semble utile. Une sorte d'extension de votre wrapper d'ode.

Pour
Code:
raydium_ode_CollideCallback
n'est ce pas un peu tard pour faire quelque chose puisque la collision a deja eu lieu et les contacts sont crées.
J'avoue que je m'y perds un peu.

A+
Jacques[/code]


Top
 Profile  
 
 Post subject: Ca avance mais ...
PostPosted: Mon Oct 10, 2005 10:22 pm 
Offline

Joined: Sun Oct 09, 2005 10:46 pm
Posts: 759
J'ai un vrai probleme
J'ai cree un element ray (copié collé de box)
jusque la tout se passe bien
dans le callback de collision
Code:
raydium_ode_near_callback(void *data, dGeomID o1, dGeomID o2)
...
  n = dCollide (o1,o2,N,&contact[0].geom,sizeof(dContact));
 
  if (dGeomGetClass(o1)==dRayClass) {                         
       return;}


Si je place le test avant le dCollide, l'appli (test6.c) marche comme avant
si je le place comme si dessus, l'appli plante.

J'essaye de porter une appli basé sur buggy_test qui fait strictement la meme chose dans le callback d'ode.
Je ne vois pas du tout pourquoi ca ne marche pas !!!
Bonne journée Quand meme ;o)


Top
 Profile  
 
 Post subject:
PostPosted: Tue Oct 11, 2005 10:54 am 
Offline
User avatar

Joined: Sun Mar 16, 2003 2:53 am
Posts: 2591
Location: gnniiiii (Scrat)
Le "collider" de RayODE (la fonction que tu modifies) est déjà prévu pour évacuer les géométries qui ne le concerne pas (lire : qui ne possèdent pas de "Data" associée).
Code:
        ...
        e1=dGeomGetData(contact[i].geom.g1);
        e2=dGeomGetData(contact[i].geom.g2);
                                                                               
        if(e1==NULL || e2==NULL)
            continue; // Deleted, or not one of our elements
        ...


Reste que le plantage me semble assez étrange. Quelle est la raison du plantage et la pile d'appel à ce moment là ?


Top
 Profile  
 
 Post subject: Désolé ...
PostPosted: Tue Oct 11, 2005 6:55 pm 
Offline

Joined: Sun Oct 09, 2005 10:46 pm
Posts: 759
Pour le plantage j'ai trouvé.
Comme l'objet ne me servait pas pour l'affichage je ne lui avait pas affecté de mesh donc chaine "".
C'est cela qui plantait, pourquoi après le dcollide et pas avant je ne sais pas.
Une question: le profondeur de contact de ray est bien mise a jour lors de la collision ... Il ne faut donc pas eviter les collisions mais ne pas generer les contacts correspondants.
Me trompes-je ?

Bonne journée
Jacques


Top
 Profile  
 
 Post subject:
PostPosted: Tue Oct 11, 2005 7:19 pm 
Offline
User avatar

Joined: Sun Mar 16, 2003 2:53 am
Posts: 2591
Location: gnniiiii (Scrat)
Il n'y a aucun problème avec des meshes ayant pour valeur "" dans RayODE, la signification étant exactement celle que tu cherches : pas d'affichage. Divers programmes utilisent cette valeur.

Autre point (je n'avais pas vu l'un de tes posts précédents), raydium_ode_CollideCallback est justement un callback chargé de valider ou d'invalider le contact qu'il prend en argument (retourner 1 pour le valider, 0 sinon). Accessoirement, cela répond à ton autre question à propos des Rayons, puisque "valider" un contact ne fait que (par définition) créer un point de contact à partir des infos de contact (dContact) qui dans ton cas contiennent toutes les infos souhaitées (...geom.depth).


Top
 Profile  
 
 Post subject: Quand ca veux pas ...
PostPosted: Tue Oct 11, 2005 10:22 pm 
Offline

Joined: Sun Oct 09, 2005 10:46 pm
Posts: 759
Pour les meshes avec un nom "" je verifierai mais il me semble bien que c'est de la que venait le plantage. Je vous confirme ca rapidement.
Pour raydium ode_CollideCallback je verifie le code, je ne l'avais pas compris comme cela.
Mais, voici d'autres questions ...
Code:
     if(type==RAYDIUM_ODE_STANDARD)
     {
        raydium_ode_element[i].body=dBodyCreate(raydium_ode_world);
        dMassSetBox(&m,1e-9,tx,ty,tz);
   dMassAdjust(&m,mass);
        dBodySetMass(raydium_ode_element[i].body,&m);
        dBodySetData(raydium_ode_element[i].body,&raydium_ode_element[i]);
//   dBodySetAutoDisableSF1(raydium_ode_element[i].body,1);
     }
     else raydium_ode_element[i].body=0;

     raydium_ode_element[i].geom=dCreateRay(0,100);
     raydium_ode_element[i].state=type;
     dGeomSetBody(raydium_ode_element[i].geom,raydium_ode_element[i].body);
     dGeomSetData(raydium_ode_element[i].geom,&raydium_ode_element[i]);
     dSpaceAdd(raydium_ode_object[group].group,raydium_ode_element[i].geom);
     raydium_ode_element_material(i,RAYDIUM_ODE_MATERIAL_DEFAULT);
     raydium_ode_element_slip(i,RAYDIUM_ODE_SLIP_DEFAULT);
     raydium_ode_element[i].distant=raydium_ode_network_distant_create;
     raydium_ode_network_distant_create=0;
     if(!raydium_ode_network_next_local_only)
        raydium_ode_network_element_new(i);
     raydium_ode_network_next_local_only=0;
     return i;

C'est le code utilisé dans la fonction de creation de ray
Je n'ai pas fais grand chose si ce n'est creer un ray a la place d'une box

Maitenant pour placer mon ray senser representer un capteur de distance
Code:
    a=raydium_ode_object_find("BUGGY");
//    raydium_ode_name_auto("tel_us",name);
    raydium_ode_object_ray_add("tel_us",a,0.001,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"crate.tri");
    raydium_ode_element_move_name_3f("tel_us",pos[0],pos[1],pos[2]+0.5);

    raydium_ode_element_rotate_name_3f("tel_us",0,-3.1415f/2.0,0);
    raydium_ode_joint_attach_hinge_name("pivoter","tel_us","buggy_corps",pos[0],pos[1],pos[2],RAYDIUM_ODE_JOINT_AXE_Z); 
    raydium_ode_joint_hinge_limits_name("pivoter",-2,2);

mon capteur je voudrais l'orienter suivant un axe x ou y mais pas z
Surtout pas Z !!!

Pour afficher mon capteur
Code:
     glLineWidth(1.f);
     glBegin(GL_LINES);
     dReal pos[3],ang[3];
     
   dVector3 origin,dir;
   dGeomRayGet (raydium_ode_element[a].geom,origin,dir);

       glVertex3f(0,0,0); 
       glVertex3f(dir[0]*3,dir[1]*3,dir[2]*3);

     glEnd();

Bon j'avoue j'y comprends pas grand chose en opengl.

Malheureusement mon ray est toujours mais allors toujours affiché suivant Z, sauf si je met une roquette dans la voiture
de plus
Code:
dGeomRayGetLength (raydium_ode_element[a].geom)

me renvoie toujours la meme valeur de distance.

Je commence a etre un peu perdu.
Est ce mon affichage opengl qui n'est pas bon ?
Quelle est la version Ode sous jascente, en effet j'ai l'appli qui tourne sous ode / drawstuff

meme en appelant les fonction ode directement comme dans mon autre appli le vecteur directeur du ray reste sur 0,0,1 ...
et la je seche.

Dernier point:
Existe t'il un moyen simple de comiler l'appli sous vc++, en effet je suis principalement limité par les possbilités de debug de gdb, je voulais verifier que l'appel des fonction ode se faisait avec les meme arguments dans les deux applis mais je n'y arrive.

Merci pour ton attention.
Si le ray marche, je fais une demonstration à la fete de la science, sinon ce sera l'ancien rendu, dommage :o(

A+
Jacques


Top
 Profile  
 
 Post subject: creation sans meshes
PostPosted: Tue Oct 11, 2005 10:29 pm 
Offline

Joined: Sun Oct 09, 2005 10:46 pm
Posts: 759
Je confirme
Dans mon appli:
Code:
    raydium_ode_object_ray_add("tel_us",a,0.001,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"bullet.tri");

Objet cree dymaniquement a partir de test6 quand on appuye sur espace (je cree le ray a la place d'une box)
La ca marche sans pb

si je remplace par "" : ca ne marche plus.
si j'appelle radiyum_ode_object_box_add j'ai strictement le meme fonctionnement.
par contre si j'enlève RAYDIUM_ODE_AUTODETECT ca marche avec et sans mesh ce qui semble logique. Désolé :(
Mon appli est très fortement basé sur test6.c

Petite info
si je definie pas les limites du joint crée le moteur physique explose rapidement, en les definissant le tout est spectaculairement stable.

A+


Top
 Profile  
 
 Post subject:
PostPosted: Wed Oct 12, 2005 10:27 am 
Offline
User avatar

Joined: Sun Mar 16, 2003 2:53 am
Posts: 2591
Location: gnniiiii (Scrat)
Wow, ça fait beaucoup de choses là. Voilà les différents points qui me viennent à l'esprit :

- Je ne comprend pas le problème des RAYDIUM_ODE_AUTODETECT et de la mesh="". Je pense que le problème est du coté de ton code de création du rayon (j'ai testé sur une sphère et sur une boite sans que test6 ne plante... étrange).

- Pourquoi créer un body pour les rayons ? (par exemple, je ne vois pas d'intérêt à donner un poids à un rayon) Cela complique beaucoup ton code. Idem pour les infos de taille, etc.

- Pour ton rayon en Z, la rotation autour de Y que tu effectues avant la liaison hinge ne suffit pas ?

- dGeomRayGetLength n'est pas utilisé pour trouver le point de contact le plus proche, mais bien pour avoir la "longueur" du rayon (valeur que tu détermines toi même !). Ce sont les informations de contact du "collider" qui vont te donner cette info ! (attention, les retours ne sont pas "rangés", il faut chercher soit même la valeur la plus éloignée ou la plus proche).

- L'affichage de ton rayon ne me semble pas très "OpenGL compliant", effectivement :)
Essaye en faisant:
Code:
raydium_camera_replace();
glBegin(GL_LINES);
dGeomRayGet (raydium_ode_element[a].geom,origin,dir);
glVertex3fv(origin);
glVertex3fv(dir);
glEnd();

... ou truc dans le genre.

Vu l'importance que semblent avoir les rayons (j'ai déjà eu une demande en ce sens), je vais peut être tout simplement les implémenter dans Raydium dès ce soir.

PS : Cherche du coté de "WinRaydium" (wiki ou google) pour utiliser VC++ avec Raydium, benicourt avait créé le nécessaire.


Top
 Profile  
 
 Post subject: ca avance.
PostPosted: Wed Oct 12, 2005 12:27 pm 
Offline

Joined: Sun Oct 09, 2005 10:46 pm
Posts: 759
Bonjour,
Effectivement ca fait beaucoup de choses.
Pour etre un peu plus clair:
On peu creer des objets sans mesh avec "" a condition de ne pas demander que la taille soit calculée automatiquement. Donc dont acte raydium marche très bien et moi un peu moins.
L'affichage du rayon n'est pas opengl compliant et me pose beaucoup de problème, je pense que c'est une grosse source d'erreur. Je vais essayer ton code.

J'ai effectivement trouvé le probleme du dGeomRayGetLength, je suis en train de bosser dessus.
D'ici ce week end je te proposerai surement le code pour les rayons, a condition de me depanner si tu en as le temps.

Apropos
le code
Code:
     raydium_camera_replace();
     glLineWidth(1.f);
     glBegin(GL_LINES);
     dGeomRayGet (raydium_ode_element[a].geom,origin,dir);
     glVertex3fv(origin);
     glVertex3f(origin[0]+dir[0]*5,origin[1]+dir[1]*5,origin[2]+dir[2]*5);     
     glEnd();     


ne serait-il pas encore plus opengl compliant ? :wink:


Merci pour tout.
A+
jacques


Top
 Profile  
 
PostPosted: Wed Oct 12, 2005 1:48 pm 
Offline

Joined: Sun Oct 09, 2005 10:46 pm
Posts: 759
Encore un petit probleme.

J'ai des defauts de collisions de rayons,
je ne garde que la premiere collision (le min des collisions) , cependant le rayons traverse le sol pas tout le temps mais assez regulièrement.
Su une position fixe il peu alterner entre un mur et celui d'en face.

Une idée ?

Comment le filtrer et ou le detecter ?

A+
Jacques


Top
 Profile  
 
 Post subject:
PostPosted: Wed Oct 12, 2005 2:49 pm 
Offline
User avatar

Joined: Sun Mar 16, 2003 2:53 am
Posts: 2591
Location: gnniiiii (Scrat)
Quote:
On peu creer des objets sans mesh avec "" a condition de ne pas demander que la taille soit calculée automatiquement. Donc dont acte raydium marche très bien et moi un peu moins.


On tourne un peu en rond là, mais c'est bien ce que j'affirmais dans le post précédent : ça doit marcher :) , en clair "" + taille-auto ne doit pas planter. Certe le résultat n'est pas très intéressant, mais ça doit marcher. Je vais fouiller le code pour voir s'il n'y a pas un problème pour ce cas très précis (et pas très important, avouons le), mais c'est pour moi un pré-requis : Raydium doit planter le moins possible (formule polie pour dire "jamais") même en cas de "mauvaises entrées".

Sinon, en effet,
Quote:
raydium_camera_replace();
glLineWidth(1.f);
glBegin(GL_LINES);
dGeomRayGet (raydium_ode_element[a].geom,origin,dir);
glVertex3fv(origin);
glVertex3f(origin[0]+dir[0]*5,origin[1]+dir[1]*5,origin[2]+dir[2]*5);
glEnd();

... c'est ce que je voulais dire ;)

Bon, tu m'a donné plein d'idées, je pense que je vais me lancer ce soir dans une nouvelle primitive pour Raydium : le rayon :)

PS : je viens de voir ton autre post. Je ne vois pas de raison à cette instabilité. Tu es certain de ton code de "tri" ?


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

All times are UTC


Who is online

Users browsing this forum: No registered users and 10 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