Beaucoup de lecture:
Voici le nouveau proto de la fonction de picking:
Code:
typedef dContact raydium_pick_info;
int raydium_mouse_pick(float dist,raydium_pick_info * pick_pt)
Le pciking renvoie l'id de l'object et la structure du contact avec toutes les infos (pos, depth, normal, ...) dedans. Je rajouterai des fonctions:
raydium_pick_get_pos(raydium_pick_info pick_pt);
raydium_pick_et_depth(...
Je passe sur les details du code.
J'ai ajouté les callback d'espace et de collision.
Par contre le rayon n'a pas d'existance en tant qu'element raydium.
Les callback sont appelés avec 2 fois le meme objet (celui qui est touché par le rayon).
Sinon plutot qu'un callback on pourrai faire du picking avec distance min et max, moins souple.
L'utilisation devient:
Code:
if(raydium_key[GLUT_KEY_F3])
{
raydium_pick_info pt;
raydium_osd_printf((raydium_mouse_x*100.0)/raydium_window_tx,100-(raydium_mouse_y*100.0)/raydium_window_ty,16,0.5,"font2.tga","+ %d %f" ,raydium_mouse_pick(1000,&pt),pt.geom.depth);
raydium_osd_printf((raydium_mouse_x*100.0)/raydium_window_tx,100-(raydium_mouse_y*100.0)/raydium_window_ty-2,16,0.5,"font2.tga","%f %f %f",pt.geom.pos[0],pt.geom.pos[1],pt.geom.pos[2]);
}
Concernant les rayon sur geom
dans ode.c 3927 ( a peu pres)
Code:
else //element don't have body
{
dReal * pos;
dReal * dir;
dReal ndir[3],npos[3];
raydium_ode_Ray *r;
r=&raydium_ode_element[i].ray[j];
// Get pos vector and rot matrix of element.
pos = dGeomGetPosition(raydium_ode_element[i].geom);
dir = dGeomGetRotation(raydium_ode_element[i].geom);
// Compute relative dir to element orientation
ndir[0]=dir[0]*r->rel_dir[0] + dir[1]*r->rel_dir[1] + dir[2]*r->rel_dir[2];
ndir[1]=dir[4]*r->rel_dir[0] + dir[5]*r->rel_dir[1] + dir[6]*r->rel_dir[2];
ndir[2]=dir[8]*r->rel_dir[0] + dir[9]*r->rel_dir[1] + dir[10]*r->rel_dir[2];
// Compute relative start point based on element orientation
npos[0]=dir[0]*r->rel_pos[0] + dir[1]*r->rel_pos[1] + dir[2]*r->rel_pos[2];
npos[1]=dir[4]*r->rel_pos[0] + dir[5]*r->rel_pos[1] + dir[6]*r->rel_pos[2];
npos[2]=dir[8]*r->rel_pos[0] + dir[9]*r->rel_pos[1] + dir[10]*r->rel_pos[2];
// Update ray parameter
dGeomRaySet(r->geom,pos[0]+npos[0],pos[1]+npos[1],pos[2]+npos[2],ndir[0],ndir[1],ndir[2]);
r->max_dist=0;
r->min_dist=0;
r->max_elem=r->min_elem=-1;
}
je vais remplacer la multiplication de matrice par le dMultiply133 d'ode qui semble largement plus optimale.
Normalement ce code ne doit rien "casser".
Enfin dans quel fichier le picking finira ???
ode.c me semble un peu gros non ?
picking.c un peu petit.
A toi de voir.
A+
Jacques