How to create pos/rot tracks/seq/keys?
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 22/02/2003 at 05:07, xxxxxxxx wrote:
User Information:
Cinema 4D Version: 8.012
Platform: Windows ;
Language(s) : C++ ;---------
Hi,
i took the morphmixer sdk example as a base to create standard position and rotation tracks, but i can't figure out how to set up the right value descriptions.
I just want to record positions and rotations of an object , that my plugin moves. By using GetDescriptionID() I found out, that e.g. position tracks have the ID 903, but when I use this, I'll get only Position Tracks without the splitting to the vector components. And since the AnimValue struct that GetKeyValue() returns accepts Real values only, I really don't know how to go on.
Thanks for any help.
Klaus Heyne -
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 22/02/2003 at 06:53, xxxxxxxx wrote:
Puh! OK. I've got it.
By random, I found the description of the functionBool CheckDescID(const DescID& searchid, const AtomArray& ops, DescID* completeid)
. There war an example:
>>For example, if you pass
DescID(DescLevel(ID_BASEOBJECT_POSITION, 0, 0), DescLevel(VECTOR_X, 0, 0))
it will return
...<<
This was the missing puzzle part:static Bool Create_Key(BaseDocument *doc, BaseObject *op, const BaseTime &time, LONG index, Vector value) { DescID descID; BaseTrack *track; BaseSequence *seq; BaseKey *key; AnimValue *av; Real val[3]; val[0] = value.x; val[1] = value.y; val[2] = value.z; LONG i; for (i=0; i<3; i++) { // check if track exists descID = DescID(DescLevel(index, 0, 0), DescLevel(VECTOR_X+i, 0, 0)); track = op->FindTrack(descID); if (!track) { track = AllocValueTrack(op,descID); if (!track) return FALSE; op->InsertTrackLast(track); } // check for sequence seq = NULL; for (seq = track->GetFirstSequence(); seq; seq=seq->GetNext()) if (time>=seq->GetT1() && time<=seq->GetT2()) break; if (!seq) { seq = track->AutoAddSequence(doc,time); if (!seq) return FALSE; } key = BaseKey::Alloc(seq->GetType()); if (!key) return FALSE; av = GetKeyValue(key); if (!av) return FALSE; av->value = val[i]; key->SetTime(time); seq->InsertKey(key); } return TRUE;
Unfortunately, I can't really record the object's movement by now, because when the first sequence is created, my expression plugin can't move the object any more, although the priority is lower than animation (EXECUTION_EXPRESSION).