游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4995|回复: 11

Billboard(广告牌)实现的逐步推导,扫盲!

[复制链接]

32

主题

1259

帖子

1351

积分

金牌会员

Rank: 6Rank: 6

积分
1351
发表于 2007-1-19 16:44:00 | 显示全部楼层 |阅读模式
文章出自:http://www.azure.com.cn
如有转载请注明出处。

原文连接:
http://www.azure.com.cn/article.asp?id=269

广告牌并不是什么令人心动的技术,但我敢说是最实用的技术,
在粒子系统和场景优化方面,起着重要的作用。

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

1、获得当前的模型视图矩阵

  1. GLfloat viewMatrix[16];
  2. 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、从矩阵中抽取相应的向上和向右矢量(红色部分)

  1. vec3 right(viewMatrix[0], viewMatrix[4], viewMatrix[8]);
  2. vec3 up(viewMatrix[1], viewMatrix[5], viewMatrix[9]);
复制代码


4、计算新的坐标

  1. newPoint = centerPoint + up * heightScale + right * widthScale;
复制代码

对于位于中心点的左边的角点,其widthscale值取负,而对于位于中心点
下方的角点,其heightScale应为负值。

5、绘制一个Billboard Quad

  1. //左下角
  2. glTexCoord2f(0.0, 1.0); glVertex3fv(point + (right + up) * -size).v);
  3. //右下角
  4. glTexCoord2f(1.0, 0.0); glVertex3fv(point + (right - up) * size).v);
  5. //右上角
  6. glTexCoord2f(1.0, 1.0); glVertex3fv(point + (right + up) * size).v);
  7. //左上角
  8. glTexCoord2f(0.0, 1.0); glVertex3fv(point + (right - up) * -size).v);
复制代码


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

www.azure.com.cn

10

主题

219

帖子

236

积分

中级会员

Rank: 3Rank: 3

积分
236
QQ
发表于 2007-1-20 04:22:00 | 显示全部楼层

Re:Billboard(广告牌)实现的逐步推导,扫盲!

把你的教程整理一下,出个合集吧,叫 "Azure教你学3D"
hehe

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2007-1-20 08:48:00 | 显示全部楼层

Re:Billboard(广告牌)实现的逐步推导,扫盲!

不用那么麻烦,用视图矩阵的逆矩阵改变_41,_42_43到(px,py,pz)就可以了,几行代码就搞定了

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2007-1-20 08:49:00 | 显示全部楼层

Re:Billboard(广告牌)实现的逐步推导,扫盲!

绕点的公告牌其实很EASY, Y轴公告牌相反还麻烦点。

35

主题

1735

帖子

1739

积分

金牌会员

Rank: 6Rank: 6

积分
1739
QQ
发表于 2007-1-20 08:49:00 | 显示全部楼层

Re:Billboard(广告牌)实现的逐步推导,扫盲!

支持一下,本菜以为广告牌是最基本最常用的技术了,不可不学。 [em5]

7

主题

35

帖子

35

积分

注册会员

Rank: 2

积分
35
发表于 2007-1-20 14:23:00 | 显示全部楼层

Re:Billboard(广告牌)实现的逐步推导,扫盲!

是GL的哦

121

主题

2029

帖子

2034

积分

金牌会员

Rank: 6Rank: 6

积分
2034
QQ
发表于 2007-1-20 19:04:00 | 显示全部楼层

Re:Billboard(广告牌)实现的逐步推导,扫盲!

支持扫盲帖。。。

8

主题

284

帖子

296

积分

中级会员

Rank: 3Rank: 3

积分
296
QQ
发表于 2007-1-21 17:50:00 | 显示全部楼层

Re:Billboard(广告牌)实现的逐步推导,扫盲!

…………

最简单的方法就是弄一个观察矩阵的逆矩阵让最初面对摄影机的一直面对摄影机不就完结了。

8

主题

716

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2007-1-22 11:03:00 | 显示全部楼层

Re:Billboard(广告牌)实现的逐步推导,扫盲!

更简单的方法就是在glsl里不去乘View矩阵就好了

8

主题

284

帖子

296

积分

中级会员

Rank: 3Rank: 3

积分
296
QQ
发表于 2007-1-23 06:04:00 | 显示全部楼层

Re: Re:Billboard(广告牌)实现的逐步推导,扫盲!

千里马肝: Re:Billboard(广告牌)实现的逐步推导,扫盲!

更简单的方法就是在glsl里不去乘View矩阵就好了


这招不错,学到了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 13:04

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表