OSG中的粒子系统

2024-01-14 14:38
文章标签 osg 粒子系统

本文主要是介绍OSG中的粒子系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

OSG中提供了粒子系统,可以实现雨雪效果。本文提供OSG中的粒子系统的基本使用。

源代码

#include <osgViewer/Viewer>
#include <osg/Geode>#include <osgParticle/ParticleSystem>
#include <osgParticle/ParticleSystemUpdater>
#include <osgParticle/ModularEmitter>int main(int, char **)
{osgViewer::Viewer viewer;           osg::Group *root = new osg::Group;//产生//粒子发射器,粒子产生的地方osgParticle::ModularEmitter *emitter = new osgParticle::ModularEmitter; root->addChild(emitter);//管理//粒子系统,对粒子进行管理osgParticle::ParticleSystem *ps = new osgParticle::ParticleSystem;emitter->setParticleSystem(ps);         //粒子发生器产生的粒子,都交给粒子系统管理//显示//几何节点,用来将粒子系统显示osg::Geode *geode = new osg::Geode;    geode->addDrawable(ps);root->addChild(geode);//更新//粒子系统更新器,对粒子进行动态更新osgParticle::ParticleSystemUpdater *psu = new osgParticle::ParticleSystemUpdater;psu->addParticleSystem(ps);root->addChild(psu);viewer.setSceneData(root);return viewer.run();
}

运行效果

这里写图片描述
如上图所示,这里打出了2个粒子。

代码解释

既然是粒子系统,首先要有粒子。

粒子

OSG中使用osgParticle::Particle这个类,来表示粒子。
而本例子中,使用的是默认的粒子,所以没出现粒子。
如果要产生自定义的粒子,则要自己定义一个Particle对象,然后将这个Particle对象设置为粒子产生器的模板。
这是通过函数Emitter::setParticleTemplate来实现的。

粒子产生

OSG中粒子的产生,使用的是一个叫做粒子发射器(Emiter)的东东。使用的类叫做osgParticle::Emitter。
这个粒子发射器,不停地产生新的粒子,每个粒子都从粒子产生器的初始位置发出,
然后以一定的初始发射角度和初始发射速度向外发出。
这里使用的是OSG自己内置的一个标准发射器osgParticle::ModularEmitter。

粒子管理

粒子发射器,不停地发射粒子,这些发射出来的粒子,如何管理呢?
这是通过粒子系统来进行的。
对应的类叫osgParticle::ParticleSystem。
粒子发射器,发射出来粒子后,交个粒子系统,就不用操心了。
这个转交的过程,是用过emitter->setParticleSystem(ps)实现的。

粒子显示

由于粒子系统本身,只负责管理粒子,并不负责显示粒子,所以,还需要一个东西,将粒子显示出来。
OSG中是通过osg::Geode将粒子系统显示出来。
然后通过geode->addDrawable(ps)将粒子系统与Geode结合起来。

粒子更新

由于粒子是在不停地运动,所以需要不停地更新。
粒子系统的更新是通过类osgParticle::ParticleSystemUpdater来实现的。
然后通过psu->addParticleSystem(ps);来将更新器和粒子系统进行关联。

最后,将粒子系统,加到场景中,需要添加三个东西到场景树中:发射器,显示的Geode,更新器。

这篇关于OSG中的粒子系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/605510

相关文章

QT+OSG+osg-earth显示一个球

目录 1、环境配置 2、在QT  Creator导入相关的库 3、代码部分 4、运行过程中的问题 5、相关参考 重要衔接:QT+OSG显示一个三维模型-CSDN博客 1、环境配置  系统:windows10系统 QT:版本5.15.2        编译器:MSVC2019_64bit        编辑器:QT  Creator OSG版本:3.7.0   64位

OpenGL/GLUT实践:粒子系统,并添加纹理、动态模糊、边界碰撞(电子科技大学信软图形与动画Ⅱ实验)

源码见GitHub:A-UESTCer-s-Code 文章目录 1 运行效果2 实验过程2.1 基本粒子系统2.1.1 定义粒子结构2.1.2 创建粒子并初始化2.1.2.1 创建粒子2.1.2.2 初始化 2.1.3 粒子状态更新与绘制2.1.3.1 绘制2.1.3.2 更新 2.1.4 实现效果 2.2 添加纹理2.2.1 纹理添加2.2.2 渲染粒子2.2.3 实现效果 2.3 运动

osg各个命名空间的细节描述

 基于osg3.0.0参考手册,本人翻译,如有错误或翻译不当敬请指出。 osgDB Namespace Reference Detailed Description The osgDB library provides support for reading and writing scene graphs, providing a plugin framework

QT+OSG显示一个三维模型

1、环境配置  系统:windows10系统 QT:版本5.15.2        编译器:MSVC2019_64bit        编辑器:QT  Creator OSG版本:3.7.0   64位      为MSVC环境下编译 osgQt:为第三方编译的库,OSG因为版本不同已经不提供osgQt的封装。 2、基本知识  osg是一个免费开源的c++第三方库,基于openGL

Windows下Qt5 MinGW4.9.2 OSG开发环境搭建

下载编译好的osg文件包 点击下载编译好的osg库文件配置系统环境 1) 在系统环境path后面添加osg下的bin路径: 注:添加前,记得添加分号;与上一个路径分隔开 2) data环境 测试 1) 开始->运行->cmd,进入命令行模式 2) 输入“osgversion”: 3) 出现OSG版本信息,环境配置OK!

OSG学习:LOD、数据分页、动态调度

LOD(level of detail):是指根据物体模型的结点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。在OSG的场景结点组织结构中,专门提供了场景结点osg::LOD来表达不同的细节层次模型。其中,osg::LOD结点作为父节点,每个子节点作为一个细节层次,设置不同的视域,在不同的视域下显示相应的子节点。 数据分页:在城市

OSG学习:阴影代码示例

效果图: 代码示例: #include <osgViewer/Viewer>#include <osg/Node>#include <osg/Geode>#include <osg/Group>#include <osg/Camera>#include <osg/ShapeDrawable>#include <osg/ComputeBoundsVisitor>#include

OSG数学基础:坐标系变换

三维实体对象需要经过一系列的坐标变换才能正确、真实地显示在屏幕上。在一个场景中,当读者对场景中的物体进行各种变换及相关操作时,坐标系变换是非常频繁的。坐标系变换通常包括:世界坐标系-物体坐标系变换、物体坐标系-世界坐标系变换和世界坐标系-屏幕坐标系变换(一个二维平面坐标系,即显示器平面,是非常标准的笛卡尔坐标系的第一象限区域)。 世界坐标系-物体坐标系变换 它描述的问题主要是关于物体本身的

OSG数学基础:坐标系统

坐标系是一个精确定位对象位置的框架,所有的图形变换都是基于一定的坐标系进行的。三维坐标系总体上可以分为两大类:左手坐标系和右手坐标系。常用的坐标系:世界坐标系、物体坐标系和摄像机坐标系。 世界坐标系 世界坐标系是一个特殊的坐标系,它建立了描述其他坐标系所需要的参考框架。从另一方面说,能够用世界坐标系来描述其他坐标系的位置,而不能用更大的、外部的坐标系来描述世界坐标系。世界坐标系也被广泛地

osg::Vec2 Vec3 Vec4

osg::Vec2可以用于保存2D纹理坐标。 osg::Vec3是一个三维浮点数数组。 osg::Vec4用于保存颜色数据。