利用OpenGL点精灵实现云模拟(Cloud Simulation Using OpenGL PointSprite)

原创 2010年08月29日 14:40:00

 [教学视频]计算机图形学基础 在线学习教程  

*原创文章,转载请注明出处*

 

利用OpenGL点精灵实现云模拟

 Cloud Simulation Using OpenGL PointSprite

 

 

这篇教程介绍一种利用OpenGL点精灵,也就是PointSprite来实现云的模拟。在网上找了一些资料和论文,都是模拟真实的云和光照,且都比较复杂。后来看到一篇文章,介绍了一篇相对简单但效果比较好的方法。首先建立好云的轮廓模型,可以使用3DMax或其他的建模工具,然后创建该模型的包围体,将包围体中属于云的部分抽取出来,最后对抽取出来的部分进行三角化,然后贴图,最后加上光照。受到该方法的启发,这里我介绍一种更为简单的方法来实现对云的模拟。

 

和从文件读取云模型相比,用代码生成云的轮廓要快的多。云的轮廓我们可以用球来模拟,使用多个不同大小的球可以组成不同形状的云。图Fig1中显示了利用三个半径不同的球组成的云的形状。当然你也可以使用更多不同大小的球来组成更逼真,更复杂的云。

 

 

 

 

Fig1. 不同大小的球组成的云的形状

 

描述这样三个球只需用几个结构体即可。

 

      struct VECTOR3

      {

           float x,y,z;

           VECTOR3(){}

           VECTOR3(float _x, float _y, float _z)

           {

                 x = _x; y = _y; z = _z;

           }

      };

 

结构体VECTOR3是一个三维向量结构体,用来表示球的圆心。再加上半径R我们就可以描述球的几何性质了。于是球的结构体可以定义为

 

      struct Sphere

      {

           VECTOR3 C;

           float   R;

           Sphere(){}

           Sphere(VECTOR3 c, float r)

           {

                 C.x = c.x; C.y = c.y; C.z = c.z;

                 R = r;

           }

      };

 

接下来就要得到整个云的包围盒,包围盒可以用包围盒立方体对角线上的两个顶点来描述,这里使用顶点坐标全为负和全为正的两个点。包围盒机构体可以定义为

 

      struct BoundingBox

      {

           VECTOR3 origin;

           VECTOR3 MinPt;

           VECTOR3 MaxPt;

           Line Boundaries[12];

      };

 

在上面的结构体中,origin表示包围盒的中心坐标,MinPt表示全为负的顶点,MaxPt表示全为正的顶点。利用球心所在位置和球半径就可以决定包围盒的大小。用每一个球的球心位置减去该球的半径,然后比较这个值,最小的就是MinPt的值。同样用每一个球的球心位置加上该球的半径,其中最大的就是MaxPt的值。为了方便后面绘制该包围球,该结构体中还有一个Line结构体,该结构体表示包围盒的边的信息,定义如下

 

struct Line

      {

           VECTOR3 origin;

           VECTOR3 end;

      };

 

 

很明显Line结构体中originend分别表示包围体一条边的起点和终点。Fig2显示了Fig1中云形状的包围盒。

 

(a)

(b)

 

 Fig2. 云的包围盒

 

 

为了用PointSprite来模型云,我们需知道每个PointSprite在三维空间中的位置。而这些位置就是由云的形状来决定的。只要能找到每个球内的PointSprite,那么就能利用PointSprite来模拟云的形状了。这里用的方法有点体渲染(Volume Rendering)的味道。先将包围盒分成一个一个的体素(voxel)voxel的多少由voxel的大小来决定。现在要做的就是抽取出所有球内的voxel

抽取的过程很简单,只要判断当前voxel和球的位置关系即可。将voxel的坐标带入球的方程(已知球心和半径),判断和半径的关系,只要小于等于半径的平方,那么该voxel就在球内。

 

(x-a)2+(y-b)2+(z-c)2 R2

 

上式中(a,b,c)为球心,R为半径。

 

 

(a)

(b)

(c)

(d)

 
 

Fig3 从包围盒中抽取云轮廓内的体素

 

Fig3中可以看到,(a)中显示了包围盒的所有体素,(b)中抽取出了在云形状内部的部分体素。(c)中可以清楚的看到云内部体素的形状,而(d)则是将云内部每个体素的位置加上一定随机扰动的结果。

 

有了云内部voxel,就可以将每个voxel当作一个PointSprite,适当的调节PointSprite的大小和体素的大小,然后给PointSprite贴上带alpha通道的纹理即可,如Fig4

 

 

(a)

(b)

  Fig4 PointSprite模拟的云

 

整个云模拟的过程中,重要的部分就是将包围盒中用于模拟云的球内部的体素抽取出来。只要正确的抽取出云内部的体素,那么云的形状也就得到了。具体的内容是实现方法可以参考该教程的源代码。如果OpenGL版本不支持PointSprite,请更新OpenGL驱动,并下载高版本的OpenGL库。

 

 

下载该教程和源代码 

 

 

*原创文章,转载请注明出处*

opengl动态云彩的模拟

  • 2009年04月21日 12:55
  • 79KB
  • 下载

【Unity Shader】2D动态云彩

写在前面赶在年前写一篇文章。之前翻看2015年的SIGGRAPH Course(关于渲染的可以去selfshadow的博客里找到,很全)的时候看到了关于体积云的渲染。这个课程讲述了开发者为游戏《地平线...
  • candycat1992
  • candycat1992
  • 2016-01-29 12:58:01
  • 11272

OpenGL点精灵云模拟

  • 2010年08月29日 14:48
  • 691KB
  • 下载

渲染世界的OPENGL<15>纹理进阶-点精灵

点精灵(Point Sprite)使用点精灵我们可以通过绘制一个3D点将一个2D纹理图像显示在任意位置上。 点精灵最常见的应用就是微粒系统。我们可以用点来表示在屏幕上移动的大量微粒,来产生一些视觉效...
  • memories_sunset
  • memories_sunset
  • 2016-10-01 15:25:29
  • 1019

OpenGLES---点精灵

PositionSpriteShader.hpp //varying 关键字 :vs和fs共享数据(建议vs和fs中速写一致) const char *vs={ "precision lowp...
  • GameCocos2dx
  • GameCocos2dx
  • 2016-06-06 14:42:11
  • 843

OpenGL点精灵PointSprite详解: 纹理映射,旋转,缩放,移动

openGL点精灵PointSprite详解: 纹理映射,旋转,缩放,移动
  • tom_221x
  • tom_221x
  • 2014-08-08 09:44:35
  • 3283

OpenGL点精灵(Point Sprite)

From:http://iiunknown.blogbus.com/logs/48250551.html 在很多粒子的demo中,看到把粒子显示成一个个小球,如果你以为那是用glutSolidS...
  • Jackers679
  • Jackers679
  • 2012-05-22 10:13:37
  • 5276

opengl中点精灵的使用

在各种图形应用中,常常需要对大量的点状物体进行渲染(如水流,火焰,雪花等等),这时应该怎么对大量的点进行纹理贴图呢?...
  • lzhlzz
  • lzhlzz
  • 2013-07-17 12:04:25
  • 2493

[OpenGL] 动态的水面模拟

真实的水面模拟在三维游戏领域一直是一个非常热门的问题,因为在大型的场景中,流体总是不可避免地会存在的。在这一方面,我也查了不少资料,总结而言,水面模拟一般有这么几个方法:         1.比较简单...
  • ZJU_fish1996
  • ZJU_fish1996
  • 2016-08-25 20:53:06
  • 5154

openGL按照载体自身坐标系旋转

openGL坐标系旋转 立方体在openGL下可以使用glRotatef(angle, x, y, z)进行旋转,但是此时的坐标系是固定的世界坐标系,比如说立方体绕z轴旋转某一角度后,立方体...
  • zhangchao0426
  • zhangchao0426
  • 2016-12-21 13:33:53
  • 1145
收藏助手
不良信息举报
您举报文章:利用OpenGL点精灵实现云模拟(Cloud Simulation Using OpenGL PointSprite)
举报原因:
原因补充:

(最多只允许输入30个字)