р = pos + х right + у-up,
\х\< width/2, (12.6)
|_у| < height/2.
Добавляем эффекты
Для облегчения работы с панелями добавим соответствующие методы в классы View и OpenGlView.
virtual void drawBillboard ( const Vector3D& pos,
float size,
const Vector4D& color, Texture * txt = NULL );
virtual void drawBillboard ( const Vector3D& pos,
float width, float height, const Vector4D& color, Texture * txt = NULL );
Их реализация выглядит следующим образом:
vIE,
void OpenGlView :: drawBillboard ( const Vector3D& pos,
float width, float height, const Vector4D& color, Texture * txt )
{
width *= 0.5f;
height *= 0.5f; ; i.;j
Vector3D r ( camera -> getRightDir () * width );
Vector3D u ( camera -> getUpDir () * height );
Vector3D vl ( pos - r - u );
Vector3D v2 ( pos + r - u );
Vector3D v3 ( pos + r + u );
Vector3D v4 ( pos - r + u );
if ( txt != NULL )
if ( txt -> getld () != lastTextureld ) glBindTexture ( GL_TEXTURE_2D,
lastTextureld = txt->getld ()
glBegin ( GL_POLYGON );
glColor4fv ( color );
glTexCoord2f ( O.Of, O.Of ); glVertex3fv ( vl ) ;
glTexCoord2f ( l.Of, O.Of ) ; glVertex3fv ( v2 ) ;
glTexCoord2f (l.Of, l.Of); glVertex3fv ( v3 );
glTexCoord2f ( O.Of, l.Of ); glVertex3fv ( v4 );
glEnd();
}
Поскольку панель не является многоугольником, аналогичным граням сцены (она задается всего одной точкой, и размер ее и ориентация зависят от положения камеры, и, следовательно, не является экземпляром класса Polygon3D), так же как и различные модели, то будет удобным добавить в класс SubScene поддержку подобных неполигональных объектов. В первую очередь каждый такой объект должен уметь нарисовать себя. Кроме того, будет удобно сразу добавить в этот класс поддержку анимации. При этом возникает необходимость регулярно обновлять состояние объекта, за что, естественно, должна отвечать содержащая его комната. Поэтому подобный объект мы будем далее представлять при помощи следующего класса: