Л.

class Animator : public Object {
public:
Animator ( const char * theName ) : Object ( theName ) {
metaClass = &classlnstance;
}
virtual void animate ( VisualObject * object,
float curTime ) {}
static MetaClass classlnstance;
} ;

Задачей метода animate является изменение текущего преобразования объекта со временем для получения анимации. При этом необходимо соответствующим образом модифицировать класс VisualObject для поддержки аниматоров. Во-первых, нужно ввести массив аниматоров, которые будут последовательно применяться к объекту (точнее, к его текущему преобразованию). Во-вторых, удобно хранить два преобразования: одно (prigTrans-form) начальное, заданное при создании объекта, а другое (cwTransform), получаемое из origTransform после применения всех аниматоров.

class VisualObject : public Object {
protected:
Vector3D pos; // position of the object
Vector4D color; // color to modulate object
Transform3D origTransform; // original transform
// applied to objects
// (before animators) Transform3D curTransform; // current transform (build
// from original by
// animators)
Array animators;
BoundingBox boundingBox; // bounding box of object
};

Тогда в объект VisualObject можно добавить ссылку на соответствующий аниматор и его вызов из метода update.

Добавляем модели

void VisualObject :: update ( Controller * controller,
float curTime )
{
curTransform = transform; // reset transform
// let every animator to // modify curTransform
for ( Array :: Iterator it = animators.getlterator () ; lit.end (); ++it )
{
Animator * animator = (Animator *) it.value (); animator -> animate ( this, curTime );
}
buildBoundingBox ();
}

Простейшим примером аниматора может служить класс, служащий для вращения объекта вокруг заданной оси с постоянной скоростью. Это как раз и делает следующий класс: л.

class RotationAnimator : public Animator {
private:
Vector3D axis;
float speed;

⇐ Предыдущая| |Следующая ⇒