Billboard(广告牌)实现的逐步推导

来源:互联网 发布:php计算日期相差天数 编辑:程序博客网 时间:2024/04/27 19:34
 广告牌并不是什么令人心动的技术,但我敢说是最实用的技术,
在粒子系统和场景优化方面,起着重要的作用。

下面我用最明了的公式和步骤解释实现的整个过程,
希望对初学者有帮助。

1、获得当前的模型视图矩阵
GLfloat viewMatrix[16];
glGetFloatv(GL_MODELVIEW_MATRIX, viewMatrix);

2、转置此矩阵就会找到up和right向量
[ m0 m1 m2 m3 ]
[ m4 m5 m6 m7 ]
[ m8 m9 m10 m11]
[ m12 m13 m14 m15]
转置为
[ m0 m4 m8 m12 ]
[ m1 m5 m9 m13 ]
[ m2 m6 m10 m14 ]
[ m3 m7 m11 m15 ]


3、从矩阵中抽取相应的向上和向右矢量(红色部分)
vec3 right(viewMatrix[0], viewMatrix[4], viewMatrix[8]);
vec3 up(viewMatrix[1], viewMatrix[5], viewMatrix[9]);

4、计算新的坐标
newPoint = centerPoint + up * heightScale + right * widthScale;
对于位于中心点的左边的角点,其widthscale值取负,而对于位于中心点
下方的角点,其heightScale应为负值。

5、绘制一个Billboard Quad
//左下角
glTexCoord2f(0.0, 1.0); glVertex3fv(point + (right + up) * -size).v);
//右下角
glTexCoord2f(1.0, 0.0); glVertex3fv(point + (right - up) * size).v);
//右上角
glTexCoord2f(1.0, 1.0); glVertex3fv(point + (right + up) * size).v);
//左上角
glTexCoord2f(0.0, 1.0); glVertex3fv(point + (right - up) * -size).v);

另外对于y轴向的Billboard, 我们只用使它的up vector 等于(0, 1, 0), 就可以了!!

www.azure.com.cn