|
|
文章出自:http://www.azure.com.cn
如有转载请注明出处。
原文连接:
http://www.azure.com.cn/article.asp?id=269
广告牌并不是什么令人心动的技术,但我敢说是最实用的技术,
在粒子系统和场景优化方面,起着重要的作用。
下面我用最明了的公式和步骤解释实现的整个过程,
希望对初学者有帮助。
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
|
|