В настоящее время я изучаю OpenGL и получил свой первый набор геометрии и текстур.
Теперь я пытаюсь настроить модель иерархии родитель-потомок между различными графическими акторами.Я понимаю, что это обычно реализуется так:
void Draw(){
glPushMatrix();
<apply all transformations>
<draw this model>
<for each child c of this actor:>
c.Draw();
glPopMatrix();
}
Таким образом, дети будут наследовать все преобразования родителя (масштаб, положение, вращение).Но иногда мне бы хотелось, чтобы применялись только определенные преобразования (например, актер со спецэффектами должен двигаться вместе со своим родителем, но не использовать вращение своего родителя, пока актер в шлеме хочет унаследовать все преобразования).
ИдеяЯ придумал передать параметры преобразования, которые должны быть применены к функциям рисования:
class Actor{
Vec3 m_pos, m_rot, m_scale; //This object's own transformation data
std::vector<Actor*> m_children;
void Draw(Vec3 pos, Vec3 rot, Vec3 scale){
(translate by pos) //transform by the given parent data
(rotate around rot)
(scale by scale)
glPushMatrix(); //Apply own transformations
(translate by m_pos)
(rotate around m_rot)
(scale by m_scale)
(draw model)
glPopMatrix(); //discard own transformations
for( Actor a : m_children ){
glPushMatrix();
a.Draw( pass m_pos, m_rot and/or m_scale depending on what the current child wants to inherit );
glPopMatrix();
}
}
}
void StartDrawing(){
glLoadIdentity();
//g_wold is the "world actor" which everything major is attached to.
g_world.Draw( Vec3(0,0,0), Vec3(0,0,0), Vec3(0,0,0) );
}
(Псевдокод. Может быть ошибочным, но должен передать идею.)
Но это выглядит довольно неопрятно и выглядит как гораздо большая рабочая нагрузка для программы (поскольку было бы куча дополнительной векторной математики).
Я немного читал об иерархическом моделировании, но вся литература опохоже, предполагается, что каждый ребенок всегда хочет наследовать все родительские свойства.
Есть ли более эффективные способы сделать это?