Billboard (Биллборд/Спрайт)
Биллборд - прямоугольник, лицевая сторона которого всегда ориентирована на камеру, т.е. перпендикулярна вектору взгляда. Обычно используются для вывода систем частиц и импостеров.
Пример реализации:
Итак, имеем центр биллборда(точка в которой мы хотим его нарисовать), и камеру, которая представлена 3 единичными векторами: up, right, direction. Векторы эти можно получить из рассчитанной матрицы вида в Direct3D и из модельно-видовой матрицы в OpenGL ИЛИ вычислить вручную используя вектор direction( billboardPos - cameraPos ) и два векторных произведения. Для ориентации биллборда нужны всего два вектора - up и right, которые будут использованы для вычисления 4 точек биллборда, делать это можно на CPU, а можно и на GPU, используя возможности программируемого конвейера.
Fixed pipeline:
// ** p - положение биллборда // ** s - полуразмер биллборда // ** r - right вектор (единичный) // ** u - up вектор (единичный) // ** Вычисляем 4 точки биллборда cVector3 v0 = position - r*s - u*s; // ** Сдвигаемся влево-вниз от центра биллборда cVector3 v1 = position - r*s + u*s; // ** Влево-вверх... cVector3 v2 = position + r*s + u*s; // ** Вправо-вверх cVector3 v3 = position + r*s - u*s; // ** Вправо-вниз... // ** И рисуем glBegin(GL_QUADS ); glTexCoord2f( 0, 0 ); glVertex3fv( &v0.x ); glTexCoord2f( 1, 0 ); glVertex3fv( &v1.x ); glTexCoord2f( 1, 1 ); glVertex3fv( &v2.x ); glTexCoord2f( 0, 1 ); glVertex3fv( &v3.x ); glEnd( );
Programmable pipeline: