PDA

Voir la version complète : Y'a un os dans mon pied ! Je Recherche un osthéoCINEpathe !



crostif
22/08/2005, 14h35
bonjour,

j'ai un problème en coffee (version c4d 6) ; j'ai beau croiser mon code avec d'autres, je ne comprends pas d'où il vient.
Je vous l'expose :

je travaille sur un robot ( WIP : http://www.frenchcinema4d.com/forum/index.php?topic=13299.0). Je cherche à animer automatiquement le pied de la façon suivante : Le pied est constitué de 3 appuis tournant autour du même axe. Lorsque le pied atteint le sol, les 3 appuis touchent le sol et ont une rotation de 0 ; lorsque le pied décolle, les 3 appuis peuvent aller jusqu'à 55° mais jamais plus, et cela est proportionnel à la hauteur par rapport au sol.

J'ai donc établi le code suivant :



main(doc,op)
{

var pos=doc->FindObject("CubePied1")->GetPosition();* * * //CubePied1 est un des 3 appuis
if(!pos)return;
pos=pos.y;

var pos_sol=doc->FindObject("Sol")->GetPosition();
if(!pos_sol)return;
pos_sol=pos_sol.y;


var the_Relation = (pos - pos_sol) / 40;
var rot;

if (the_Relation <= -55) rot = -55;
if (the_Relation > -55) rot = the_Relation;
if (the_Relation >= 0) rot = 0;

var la_rotation = vector(0,-rot,0);

op->SetRotation(la_rotation);

op->Message(MSG_UPDATE);

}


Deux problèmes se posent alors :
1- la rotation s'effectue uniquement lorsque le sol est déplacé. Je veux l'inverse.
2- les limitations ne marchent pas, et l'appui tourne tout autour de l'axe.

voici la capture de la hiérarchie :
http://www.cyberlithique.com/docs/robot/pied1.jpg

et le fichier, car ça peut être confu :
http://www.cyberlithique.com/docs/robot/pied.c4d


Y aurait-il un osthéoCINEpathe ? :wink: merci

crostif
22/08/2005, 15h52
bon, j'ai résolu une partie du problème seulement : tout fonctionne acec le code suivant, sauf la limité max. Si le pied est trop haut, je veux que la rotation ne dépasse pas 40°. Or, si la limité inférieure fonctionne (au niveau du sol), ça ne marche pas en hauteur.



main(doc,op)
{

var pos=doc->FindObject("CubePied1")->GetMg()->GetV0();
if(!pos)return;
pos=pos.y;

var pos_sol=doc->FindObject("Sol")->GetMg()->GetV0();
if(!pos_sol)return;
pos_sol=pos_sol.y;

var the_Relation = (pos - pos_sol) / 300;
var la_rotation;
var limite = 40;
var limite_sol = 0;

if (the_Relation < limite)
la_rotation = the_Relation;
else la_rotation = limite;
if (the_Relation <= 0) la_rotation = limite_sol;

var rot = vector(0,-la_rotation,0);

op->SetRotation(rot);

op->Message(MSG_UPDATE);

}

voici une petite vidéo qui montre l'erreur :

http://www.cyberlithique.com/docs/robot/pied.mov