PDA

Voir la version complète : Rotation en COFFEE



Gabriel
10/07/2004, 20h47
Bonjour
Je fais l'ésai d'articuler une épaule de manière réaliste avec plusieurs os pilotés par l'os du bras en utilisant inhérited rotation. C'est assez encourageant mais il faudrait que la rotation se fasse d'une manière indépendante sur les 3 axes pour pouvoir appliquer des coéfficients différents sur chacun des 3 axes.
J'ai écris une expression COFFEE en me basant sur le tutorial de Maxon sur l'utilisation des matrices et j'ai pondu ça :

main(doc,op)

{
var a = 1.00;
var b = 1.00;
var c = 1.00;


var tg = doc->FindObject("Os bras G"); if(!tg) return;

var mo = op->GetMg();//position globale de l'os tagué
var mt = tg->GetMg();//position globale de l'os pilote

var Roto = mt->GetHPB();//rotation globale de l'os pilote
var xo = Roto->GetRotX();
var yo = Roto->GetRotY();
var zo = Roto->GetRotZ();

var Rot1 = mt->GetHPB();//rotation globale de l'os tagué
var x1 = Rot1->GetRotX();
var y1 = Rot1->GetRotY();
var z1 = Rot1->GetRotZ();

var pos = mo->GetV0();
var scale = vector(vlen(mo->GetV1()),
vlen(mo->GetV2()),
vlen(mo->GetV3()));

mo->SetRotX(xo * a);
mo->SetRotY(yo * b);
mo->SetRotZ(zo * c);



mo->SetV0(pos);
mo->SetV1(vnorm(mo->GetV1()) * scale.x);
mo->SetV2(vnorm(mo->GetV2()) * scale.y);
mo->SetV3(vnorm(mo->GetV3()) * scale.z);


op->SetMg(mo);


return;
}

Je n'ai pas d'erreur de compilation mais ça ne fait strictement aucun effet, l'os reste inerte. Mes capacités de programmeur sont limitées. J'ai beau chercher je ne comprend pas pourquoi, où est l'erreur?

Gabriel

Tengaal
11/07/2004, 01h53
Ton code à l'air clean, même si il contient des trucs inutiles...
Le mieux serait que tu m'envois ton fichier C4D pour que je vois exactement ce qui pose problème.
Vérifie notamment si tu n'a pas de piste d'animation sur les os qui doivent être contrôlés par COFFEE, ça pourrait expliquer que le script n'agisse pas...

Gabriel
22/07/2004, 11h40
Bonjour

Je n'ai pas répondu car je ne peux pas envoyer de fichier n'ayant pas d'espace sur un serveur.
De toute façon le fichier n'est pas en cause, j'ai fait des tas d'éssais, créé un nouveau fichier, mis des os "neufs" etc.
C'est un problème de programmation. Dans la documentation SDK, dans la classe MATRIX, il n'est jamais fait mention d'un commande GetRotX() ou Y ou Z on a seulement GetHPB, on ne peut pas aller chercher les rotations indépendemment les unes des autres (si j'ai bien compris, ce qui n'est pas sûr du tout), par contre on peut exécuter chacune des rotations.
Donc j'ai réécrit l'expression :

main(doc,op)

{
var a = 1.00;
var b = 1.00;
var c = 1.00;


var tg = doc->FindObject("Os bras G"); if(!tg) return;

var mo = op->GetMg();//position globale de l'os tagué
var mt = tg->GetMg();//position globale de l'os pilote

var Roto = mt->GetHPB();//rotation globale de l'os pilote
var xo = Roto.x;
var yo = Roto.y;
var zo = Roto.z;

var pos = mo->GetV0();
var scale = vector(vlen(mo->GetV1()),
vlen(mo->GetV2()),
vlen(mo->GetV3()));

mo->SetRotX(xo*a);
mo->SetRotY(yo*b);
mo->SetRotZ(zo*c);


mo->SetV0(pos);
mo->SetV1(vnorm(mo->GetV1()) * scale.x);
mo->SetV2(vnorm(mo->GetV2()) * scale.y);
mo->SetV3(vnorm(mo->GetV3()) * scale.z);


op->SetMg(mo);

return;
}

Je n'ai pas d'erreur et l'expression marche. Seulement quand je tourne l'os maître autour de X, l'os piloté suit mais autour de Z, la même chose pour Y, l'os piloté suit mais autour de Z. J'ai éssayé, dans les préférences, de me mettre en rotation HPB, ça n'y fait rien.
Je crois qu'il faut s'y prendre autrement mais comment?
Il y a bien un code, sur le tutorial des matrices de SDK, mais je ne sais pas comment l'utiliser. Il doit falloir attribuer une nouvelle matrice à l'os piloté, mais là, pour l'instant, ça dépasse mes capacités.

Gabriel