PDA

Voir la version complète : Programmer la TimeLine



Steph3D ::.
11/03/2005, 23h05
Hello :-) bon voilà un domaine que je n'ai pas encor essayé, la programmation de la TimeLine qui pourrait par la suite permettre des perspectives très intéressantes :-)

Je me suis dit qu'essayer de reproduire le bouton "Record Position" de C4D sera un bon exercice pour comprendre le fonctionnement du système d'animation :poucehaut:

Par contre en cherchant longuement sur le WEB, je n'ai retrouvé absolument aucun exemple de code se rapportant à la TimeLine :cry2: :cry2: :cry2:

Quelqu'un a déjà essayé*? :?
Je suppose qu'il faut d'abord créé un track de type "PositionTrack", ensuite de créé dessus une séquence, puis de récuperé la frame de temps pour faire un InsertKey et y inscrire les Positions(locales) X puis Y et pour finir Z ( faut donc faire 3 tracks/sequences et clés)

Voila un début d'idée de code, mais qui ne marche pas vraiment :oops:
ça créé deja un Track (C'est mieu que rien :mrgreen: ) qui à mon avis n'a du track Position . X que le non :roll:
Ma définitions de séquence de 0 à 90 ne marche pas du tout, et pour les Keys, je ne sais pas encor :?


ScanTest(Tmp,Type) {

var exist=FALSE;

while (Tmp)
{
if (instanceof(Tmp,Type)) return exist=TRUE;
if (!exist) Tmp=Tmp->GetNext(); else Tmp=NULL;
}

}

main(doc,op)
{

var t = doc->GetTime();
var sec = t->GetSecond();
var frame = t->GetFrame(doc->GetFps());

///////////////////////////////////////
var test=FALSE;
var Track = op->GetFirstTrack();
test=ScanTest(Track,PositionTrack);
//////////////////////////////////////

if (!test)
{
Track = new(PositionTrack);
op->InsertTrack(Track,NULL);
Track->SetName("Position . X");

///////////////////////////////////////
var seqence = Track->GetFirstSequence();
test=FALSE;
test=ScanTest(seqence,PositionSequence);
///////////////////////////////////////

if(!test) {
seqence = new(PositionSequence);
var seqence_c=seqence->GetContainer();
seqence_c ->SetData(ID_BASESEQ_T1,0);
seqence_c ->SetData(ID_BASESEQ_T2,90);
seqence->SetContainer(seqence_c);
Track->InsertSequence(seqence);

}}

}

Tengaal
11/03/2005, 23h12
Ton code est bon, mais uniquement pour C4D 6 et 7 :roll: , car à partir de la 8 les accès aux pistes/sequences/clefs d'animations sont complètement différents.
Pour porter un plugin sur la version 8, j'ai dû le reprogrammer avec le SDK C++ qui est à jour à chaque version de C4D, et cela pour pouvoir gérer les pistes d'animation justement.

Je ne sais pas si le Coffee mis à jour avec C4D 9.1 prend en charge ses nouveaux accès...

Steph3D ::.
12/03/2005, 00h07
Argh ! :cry2: j'aurai pu y passé la semaine à chercher le truc, merci pour l'info
C'est le SDK 9.1 que j'ai, mais c'est pas super clair, surtout qu'il n'y à pas de p'tit exemple pour avoir une idée.

Quelle merde, encor un truc que j'ai dans l'os à cause que j'ai pas C++ :cry2: :cry2: :cry2:

Sans pouvoir programmer la timeline, il me sera impossible de refaire corectement des outils d'anime, comme la gestion des pas sur le sol ou autres gestionnaires de pose, même pas la peine d'essayer :cry:

heu... bon 2, 3 p'tites questions.

Faut vraiment se payé visual C++ pour se tapé le C++ compatible C4D ? Par ce qu'il y a aussi des compilateurs freeware qui traîne ;-)

Faut juste faire #include "c4d.h" pour avoir toutes les fonctions C++ de C4D et compilé un code compatible*? à par ça, on prog comme n'importe quel code C++, non ?

On peu peut être dans un 1er temps, créé des petites briques Xpresso en C++ et les relier à des briques COFFEE, non ? juste histoire d'ajouter les fonctions qui manquent.

Enfin, je dis ça comme ça... j'évalue juste la part et la possibilité des choses :|

Tengaal
12/03/2005, 00h20
En effet dans le SDK Coffee 9.1 apparemment ils n'ont pas vraiment parlé de ce soucis important...

Pour le SDK C++, tu peux bien sûr passer par des compilateurs free avec le risque de poser des problèmes de compatibilité, mais les fichiers projets et bibliothèques du SDK sont optimisées pour Visual C++ (PC) et Codewarrior (Mac)... :?

En C++ pour créer une piste il faut utiliser le "DescID" qui a comme équivalent en Coffee 9.1 "#operator" je crois...

Voici une fonction qui créé une piste de position sur l'objet "o1"

Bool create_track(BaseDocument *doc, BaseObject *o1, double &time_length)
{
DescID descID;
BaseTrack *track1;
BaseSequence *seq1;
int i;

//Piste et sequence position pour l'objet o1
for (i=0; i<3; i++)
{
// check if track exists
descID = DescID(DescLevel(ID_BASEOBJECT_POSITION, 0, 0), DescLevel(VECTOR_X+i, 0, 0));

track1 = AllocValueTrack(o1,descID); if (!track1) return FALSE;
o1->InsertTrackLast(track1);
seq1 = track1->AutoAddSequence(doc,BaseTime(0));if (!seq1) return FALSE;
seq1->SetT2(BaseTime(time_length));
}
return TRUE;
}

tu noteras que pour avoir les 3 pistes Position.x / Position.y / Position.z il faut répéter 3 fois la création de piste mais en changeant le DescLevel()...

il faut voir, mais peut-être que cette nouvelle référence #operator est la réponse en Coffee sur C4D 9.1, je n'ai pas testé car je n'ai pas la 9

Steph3D ::.
12/03/2005, 02h25
Oki, merci pour le code C++, cela dit, suis pas sur que cela sera de mon niveau :oops:
Il y a des jours ou je me dis que je ferai mieux de me trouver un associé C++ pour remettre toutes mes idées aux propres, pff ! :roll: Enfin bon, je vais essayé quand même un peu, un de ces quatres, car qui ne tente rien, n'à rien ;-)

Bon, alors j'ai regardé cette histoire d'operators

Donc un truc comme ça, ça marche pour nomer le Track


var Track = op->GetFirstTrack&#40;&#41;;
Track = new&#40;PositionTrack&#41;;
op->InsertTrack&#40;Track,NULL&#41;;
Track#ID_BASELIST_NAME="Position . X";

En gros, ça permet d'avoir un accès direct aux containers, donc, code plus rapide, et plus simple à suivre. Mais si c'est pas compatible avec la V8, pour dev un plug-in ce n'est pas bon, mais pour nos scènes persos, c'est toujours ça de pris.
Cela dit, si ça m'évite le C++ dans un 1er temps, je dis pas non*!!! mais pour l'instant je ne vois que leurs utilisations pour communiquer aux containers, pas de #CREATE_SEQ de trouvé malheureusement, alors j'en suis au même point.

C'est con, j'avais préparé toute la lise des containers pour Key & Sequence, il y a tout ce qu'il faut, a par le prob de création des sequences en COFFEE :|


/* //////////////////////////////// Sequence
ID_BASESEQ_NAME // Name
ID_BASESEQ_T1 // Left Border
ID_BASESEQ_T2 // Right Border
ID_BASESEQ_T3 // Loop Border
ID_BASESEQ_LOOPS // Loops
ID_BASESEQ_SOFT // Soft
ID_BASESEQ_LEFTI // Left Influence
ID_BASESEQ_RIGHTI // Right Influence
ID_BASESEQ_TIME // Time TRack
ID_BASESEQ_TIME_EXLOOP // Unlooped Area
ID_COMPENSATE // Constant XYZ Velocity

//////////////////////////////// Key

ID_BASEKEY_NAME // Name
ID_BASEKEY_TIME // Time
KE_VALUE // Value
KE_LINK_LEFTRIGHT // Link Tangents
KE_INTER_LEFT // Interpolation L
KE_INTER_RIGHT // Interpolation R
KE_TIME_LEFT // Time L
KE_VALUE_LEFT // Value L
KE_TIME_RIGHT // Time R
KE_VALUE_RIGHT // Value R
KE_STR_LEFT // Strenght L
KE_STR_RIGHT // Strength R
KE_CLAMP_LEFT // Clamp L
KE_CLAMP_RIGHT // Clamp R

/*//////////////////////////////