翻译一篇关于OpenGL实现Billboarding技术的文章

转自http://blog.sina.com.cn/s/blog_6bd83ee00100zrjz.html

这篇文章来自Billboarding Tutorial,原作者为António Ramires Fernandes。

伪Billboarding技术-快速而简单的实现球形Billboards
将要介绍的这种方法并不是一种真正意义上的billboarding,但是他提供了一种廉价的方法以达到近似的效果,对于一部分程序来说已经足够了。

下面这幅图是一个演示画面。它显示了一个雪人和一些经过billboard处理过的树。虽然很难说这些树就是严格面朝相机的,但是它们确实面向了与相机视线垂直的一个平面。

翻译一篇关于OpenGL实现Billboarding技术的文章

下面的图表更加清晰的反映了这种关系。位于底部的黑色圆点代表相机。由相机发出的矢量箭头表示了相机目前的视线方向。同时这个矢量也确定了一个与相机视线方向垂直的平面。图中的物体01,02,03被旋转使得它们的正面矢量朝着这个平面。这里假设所有物体都被置于圆点并且面向Z轴的正方向。

翻译一篇关于OpenGL实现Billboarding技术的文章

为了实现这一效果需要获取模型视图矩阵。首先你应该知道模型视图矩阵存储了几何图形的变换包括旋转,缩放和平移。这个矩阵包含了所有需要的变换,通过这些变换将你输入的坐标和世界坐标转换为相机坐标。

翻译一篇关于OpenGL实现Billboarding技术的文章

矩阵的第四列的上面3个值代表了关于相机位置和方向的本地原点的位置。上面的3X3子矩阵包含了缩放和旋转操作。将这个子矩阵置为单位矩阵可以有效的将这些操作屏蔽,以便使相机的视线方向与世界坐标系Z轴方向一致。相机的向上和向右矢量也和世界坐标系一致,也就是说这种billboard方式是一种伪球形billboarding.这个billboard的中心是原点。如果你打算使用这种billboarding方式,那么当使用者向上或向下看时树好像在向前或向后弯曲,这多少会有些尴尬。这是因为billboard的定向依赖于和相机位置相反的相机方向。

翻译一篇关于OpenGL实现Billboarding技术的文章

实际上,将子矩阵置为单位矩阵意味着你所绘制的物体不会发生任何旋转。因此,如果相机视线对着Z轴负方向,那么物体总是以同样的方式绘制。
缩放操作也同时无效,如果你用这种方式将无法让树变高,除非你在改变模型视图矩阵之后再进行缩放。

第一步操作是保存当前模型视图矩阵,之后获取模型视图矩阵。再将3X3的子矩阵置为单位矩阵。将这个矩阵加载到OpenGL状态机中,然后在本地坐标系中绘制你的物体。最后恢复原来的模型视图矩阵。

float modelview[16]; 
int i,j; 
// save the current modelview matrix 
glPushMatrix(); 
// get the current modelview matrix 
glGetFloatv(GL_MODELVIEW_MATRIX , modelview); 
// undo all rotations 
// beware all scaling is lost as well 
for( i=0; i<3; i++ ) 
for( j=0; j<3; j++ ) 
{ if ( i==j ) 
   modelview[i*4+j] = 1.0; 
  else 
   modelview[i*4+j] = 0.0;
 }
 // set the modelview with no rotations and scaling 
glLoadMatrixf(modelview); 
drawObject(); 
// restores the modelview matrix 
glPopMatrix();
上面的代码段可以使物体旋转至面朝相机视线垂直的平面,旋转的中心为坐标原点。

浅墨出品,零资源分下载,分享精神至上~ 源码的配套博文是 《 【Visual C++】游戏开发五十四 浅墨DirectX教程二十一 视觉上的诡计:公告板(Billboard)技术》 ,文章地址http://blog.csdn.net/poem_qianmo/article/details/13278851, 点击Release文件夹下的exe文件可以直接看到运行效果,运行需要DirectX运行库的支持。报缺少D3D的DLL系列错误的童鞋们请google/百度一下 “DirectX 9.0c runtime”,下载并装个最新版的。 报缺少MVCR100D.Dll错误的朋友们去下一个安装就可以了,或者直接点击sln打开工程再次编译一次。 背景音乐来自火影忍者疾风传 用键盘上W,A,S,D,I,J,K,L,↑,↓,←,→12个键加上鼠标在美丽的三维空间中翱翔。包括了Direct3D初始化,DirectInput输入处理,顶点缓存,文字输出,颜色,纹理贴图,四大变换,三维天空模拟,粒子系统等等知识。 另外,关于雪花粒子效果提醒大家一下,可在SnowParticleClass.h中的PARTICLE_NUMBER宏中改变雪花粒子数量,默认粒子数量为3000,1G显存的显卡取10万粒子数量帧数就只有8帧了。所以要自己改雪花粒子数量的话请根据自己的显卡性能酌情选择,如果你取个非常大的50万粒子数量,显卡吃不消烧了可别怪我- - 如果是想调试并运行源代码,但是报错了,请去下载最新版DirectX SDK并进行DirectX开发环境的配置。 编写环境:VS2010 我的博客地址是http://blog.csdn.net/zhmxy555,源码结合配套文章一起看效果更佳。 希望能和大家一起交流,共同学习,共同进步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值