第五节 利用Ogre 2.3实现雨,雪,爆炸,飞机喷气尾焰等粒子效果

news2024/11/19 23:23:09

本节主要学习如何使用Ogre2.3加载粒子效果。为了学习方便,直接将官方粒子模块Sample_ParticleFX单独拿出来编译,学习如何实现粒子效果。

一. 前提须知

  1. 如果参考官方示例建议用最新版的Ogre 2.3.1。否则找不到有粒子效果的示例。不要用官网Ogre2.3 script脚本编译源码!
  2. Ogre 1.x中关于实现粒子效果的官方示例材质太老,不支持固管,要写shader,不建议在Ogre 2.3中使用。要使用新的材质!
    Ogre 1.x中的材质:
material Examples/Flare
{
	technique
	{
		pass
		{
			lighting off
			scene_blend add
			depth_write off
			diffuse vertexcolour

			texture_unit
			{
				texture flare.png
			}
		}
	}
}

Ogre 2.3中的材质:

hlms Examples/Flare2 unlit
{
	depth_write		off
	cull_hardware	none

	scene_blend		add

	diffuse_map flaretrail.png
}

二. 新建项目工程的头文件和库文件配置如下:

注意:你需要把Media文件夹bin/Debug文件夹下的资源拷贝过来,具体拷贝到哪里大家应该很了解。
这里说下头文件和库文件的设置。
头文件:
在这里插入图片描述在这里插入图片描述库目录:
在这里插入图片描述在这里插入图片描述注意:这里改成窗口
在这里插入图片描述

三. 粒子效果总结

先展示下官网给的12个粒子效果,具体代码放到最后。

  1. 烟花效果,粒子Examples/Fireworks,材质官方没有给出,自己尝试模仿写了一个,添加到Particles.material文件中。
 Particles.material:
hlms Examples/Flare unlit
{
	depth_write		off
	cull_hardware	none

	scene_blend		add

	diffuse_map flare.png
}

在这里插入图片描述
2. 向上漂浮的绿色颗粒,粒子Examples/GreenyNimbus。材质自己为自己添加。

Particles.material:
hlms Examples/FlarePointSprite unlit
{
	depth_write		off
	cull_hardware	none

	scene_blend		add

	diffuse_map flare.png
}

在这里插入图片描述
3. 闪闪发光的紫色喷泉。粒子Examples/PurpleFountain。材质为官方自带。
在这里插入图片描述
4. 雨,粒子Examples/Rain。材质自己实现。

材质Particles.material:
hlms Examples/Droplet unlit
{
	depth_write		off
	cull_hardware	none

	scene_blend		add

	diffuse_map basic_droplet.png
}

在这里插入图片描述
5. 飞机喷气尾焰,粒子Examples/JetEngine1。粒子和材质代码详见官方示例。
在这里插入图片描述
6. 飞机喷气尾焰2,粒子Examples/JetEngine2。粒子和材质代码详见官方示例。
在这里插入图片描述
7. 向上漂浮的光环,类似龙卷风。粒子 Examples/Aureola。粒子和材质代码详见官方示例。
在这里插入图片描述
8. 四处游动的类似火花。粒子Examples/Swarm。粒子和材质代码详见官方示例。
在这里插入图片描述
9.漫天雪花,粒子Examples/Snow。粒子和材质代码详见官方示例。
在这里插入图片描述
10. 类似烟花。粒子Examples/Animated/Test1。粒子和材质代码详见官方示例。
在这里插入图片描述
11. 大雨滴,粒子Examples/Water/Rain。粒子和材质代码详见官方示例。
在这里插入图片描述
12. 烟雾。粒子Examples/Smoke。粒子代码见官方示例。材质代码自己写。如下:

材质Particles.material:
hlms Examples/Smoke unlit
{
	depth_write		off
	cull_hardware	none

	scene_blend		add

	diffuse_map Smoke15Frames.png
}

在这里插入图片描述

四. 代码

具体代码参考官方模块Sample_ParticleFX,这里为了单独测试不同粒子效果,把少数代码注释了。
ParticleFXGameState.cpp


#include "ParticleFXGameState.h"

#include "CameraController.h"
#include "GraphicsSystem.h"
#include "OgreCamera.h"
#include "OgreHlmsManager.h"
#include "OgreHlmsPbs.h"
#include "OgreHlmsPbsDatablock.h"
#include "OgreHlmsSamplerblock.h"
#include "OgreItem.h"
#include "OgreMesh2.h"
#include "OgreMeshManager.h"
#include "OgreMeshManager2.h"
#include "OgreRoot.h"
#include "OgreSceneManager.h"
#include "OgreTextureFilters.h"
#include "OgreTextureGpuManager.h"
#include "OgreWindow.h"

#include "OgreParticleSystem.h"
//
#include <iostream>

using namespace Demo;

namespace Demo
{
    ParticleFXGameState::ParticleFXGameState(const Ogre::String& helpDescription) :
        TutorialGameState(helpDescription),
        mTime(0.0f)
    {
    }
    //-----------------------------------------------------------------------------------
    void ParticleFXGameState::createScene01()
    {
        Ogre::SceneManager* sceneManager = mGraphicsSystem->getSceneManager();

        Ogre::v1::MeshPtr planeMeshV1 = Ogre::v1::MeshManager::getSingleton().createPlane(
            "Plane v1", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
            Ogre::Plane(Ogre::Vector3::UNIT_Y, 1.0f), 50.0f, 50.0f, 1, 1, true, 1, 4.0f, 4.0f,
            Ogre::Vector3::UNIT_Z, Ogre::v1::HardwareBuffer::HBU_STATIC,
            Ogre::v1::HardwareBuffer::HBU_STATIC);

        Ogre::MeshPtr planeMesh = Ogre::MeshManager::getSingleton().createByImportingV1(
            "Plane", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, planeMeshV1.get(), true,
            true, true);

        {
            Ogre::Item* item = sceneManager->createItem(planeMesh, Ogre::SCENE_DYNAMIC);
            item->setDatablock("Marble");
            Ogre::SceneNode* sceneNode = sceneManager->getRootSceneNode(Ogre::SCENE_DYNAMIC)
                ->createChildSceneNode(Ogre::SCENE_DYNAMIC);
            sceneNode->setPosition(0, -1, 0);
            sceneNode->attachObject(item);

            // Change the addressing mode of the roughness map to wrap via code.
            // Detail maps default to wrap, but the rest to clamp.
            assert(dynamic_cast<Ogre::HlmsPbsDatablock*>(item->getSubItem(0)->getDatablock()));
            Ogre::HlmsPbsDatablock* datablock =
                static_cast<Ogre::HlmsPbsDatablock*>(item->getSubItem(0)->getDatablock());
            // Make a hard copy of the sampler block
            Ogre::HlmsSamplerblock samplerblock(*datablock->getSamplerblock(Ogre::PBSM_ROUGHNESS));
            samplerblock.mU = Ogre::TAM_WRAP;
            samplerblock.mV = Ogre::TAM_WRAP;
            samplerblock.mW = Ogre::TAM_WRAP;
            // Set the new samplerblock. The Hlms system will
            // automatically create the API block if necessary
            datablock->setSamplerblock(Ogre::PBSM_ROUGHNESS, samplerblock);
        }

        Ogre::SceneNode* rootNode = sceneManager->getRootSceneNode();

        Ogre::Light* light = sceneManager->createLight();
        Ogre::SceneNode* lightNode = rootNode->createChildSceneNode();
        lightNode->attachObject(light);
        light->setPowerScale(Ogre::Math::PI);
        light->setType(Ogre::Light::LT_DIRECTIONAL);
        light->setDirection(Ogre::Vector3(-1, -1, -1).normalisedCopy());

        sceneManager->setAmbientLight(Ogre::ColourValue(0.3f, 0.5f, 0.7f) * 0.1f * 0.75f,
            Ogre::ColourValue(0.6f, 0.45f, 0.3f) * 0.065f * 0.75f,
            -light->getDirection() + Ogre::Vector3::UNIT_Y * 0.2f);

      /*  Ogre::ParticleSystem* pSystem0 = sceneManager->createParticleSystem("Examples/PurpleFountain");
        Ogre::ParticleSystem* pSystem1 = sceneManager->createParticleSystem("Examples/Aureola");
        Ogre::ParticleSystem* pSystem2 = sceneManager->createParticleSystem("Examples/Animated/Test1");

        Ogre::SceneNode* sceneNode = rootNode->createChildSceneNode();
        sceneNode->attachObject(pSystem0);
        sceneNode = rootNode->createChildSceneNode();
        sceneNode->attachObject(pSystem1);
        sceneNode = rootNode->createChildSceneNode();
        sceneNode->setPosition(Ogre::Vector3(10, 0, 0));
        sceneNode->attachObject(pSystem2);*/

        Ogre::ParticleSystem* pSystem0 = sceneManager->createParticleSystem("Examples/Smoke");
        Ogre::SceneNode* sceneNode = rootNode->createChildSceneNode();
        sceneNode->attachObject(pSystem0);

        //参数获取
        unsigned short numAffectors = pSystem0->getNumAffectors();
        Ogre::ParticleAffector* particleAffector = pSystem0->getAffector(0);
       /* for (int i = 0; i < list.size(); i++) {
            Ogre::ParameterDef parameterDef = list[i];
            std::cout << parameterDef.description() << std::endl;

        }*/
        /*size_t s  = pSystem0->getParticleQuota();
        Ogre::ParticleAffector * particleAffector = pSystem0->getAffector(0);
        bool cull = pSystem0->getCullIndividually();
        bool castShadows = pSystem0->getCastShadows();
        Ogre::Real height = pSystem0->getDefaultHeight();
        pSystem0->getDefaultLightMask();
        Ogre::Real nonVisibleUpdateTimeout = pSystem0->getDefaultNonVisibleUpdateTimeout();
        pSystem0->getDefaultVisibilityFlags();*/
       /* Ogre::Item* particleSystem3_item = sceneManager->createItem(planeMesh, Ogre::SCENE_DYNAMIC);
        particleSystem3_item->setDatablock("Marble");
        mParticleSystem3_RootSceneNode = rootNode->createChildSceneNode();
        sceneNode = mParticleSystem3_RootSceneNode->createChildSceneNode();
        sceneNode->setScale(Ogre::Vector3(0.2f));
        sceneNode->attachObject(particleSystem3_item);

        Ogre::ParticleSystem* pSystem3 = sceneManager->createParticleSystem("Examples/Animated/Test1");
        mParticleSystem3_RootSceneNode->attachObject(pSystem3);
        mParticleSystem3_EmmitterSceneNode = mParticleSystem3_RootSceneNode->createChildSceneNode();
        pSystem3->setParticleEmitterRootNode(mParticleSystem3_EmmitterSceneNode);
        Ogre::Item* particleSystem3_emmiter_item =
            sceneManager->createItem(planeMesh, Ogre::SCENE_DYNAMIC);
        particleSystem3_emmiter_item->setDatablock("Marble");
        mParticleSystem3_EmmitterSceneNode->setScale(Ogre::Vector3(0.01f));
        mParticleSystem3_EmmitterSceneNode->attachObject(particleSystem3_emmiter_item);*/

        mGraphicsSystem->getCamera()->setPosition(Ogre::Vector3(0.0f, 40.0f, 120.0f));

        mCameraController = new CameraController(mGraphicsSystem, false);

        TutorialGameState::createScene01();
    }

    void ParticleFXGameState::update(float timeSinceLast)
    {
        mTime += timeSinceLast;

        if (mTime > 10.0f)
            mTime = 0.0f;

       /* mParticleSystem3_RootSceneNode->setPosition(
            Ogre::Vector3(-50.0f * mTime / 10.0f + 25.0f, 2, -50));
        mParticleSystem3_EmmitterSceneNode->setPosition(
            Ogre::Vector3(20.0f * mTime / 10.0f - 10.f, 0.5, 20.0f * mTime / 10.0f - 10));*/

        TutorialGameState::update(timeSinceLast);
    }
}  // namespace Demo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/653465.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【微信小程序开发】第 8 课 - 小程序 API 的 3 大分类

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、小程序 API 概述 2、小程序 API 的 3 大分类 3、总结 1、小程序 API 概述 小程序中的 API 是由宿主环境提供的&#xff0c;…

一款基于 SpringCloud 的电商商城系统,小程序+管理端一套带走

项目介绍 Smart Shop 是一款基于 Spring Cloud MybatisPlusXXL-JOBredisVue 的前后端分离、分布式、微服务架构的 Java 商城系统&#xff0c;采用稳定框架开发及优化核心&#xff0c;减少依赖&#xff0c;具备出色的执行效率&#xff0c;扩展性、稳定性高&#xff0c;H5/小程序…

pnpm + monorepo架构思想小试牛刀

写在前面 今天要写的是关于一种前端全新架构的方式&#xff0c;monorepo这是目前相对来讲比较新的一种前端架构&#xff0c;整好趁着最近在学&#xff0c;就利用这个平台记录一下学习的一个过程&#xff0c;上一篇文章更新的是react&#xff0c;后面也会一样更新&#xff0c;今…

深入理解Java虚拟机jvm-运行时数据区域(基于OpenJDK12)

运行时数据区域 运行时数据区域程序计数器Java虚拟机栈本地方法栈Java堆方法区运行时常量池直接内存 运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域 有各自的用途&#xff0c;以及创建和销毁的时间&#xff0c;有的…

持续改进与创新:水库大坝安全管理方式

随着工业的快速发展&#xff0c;大坝建设已成为经济发展的重要部分。然而&#xff0c;由于自然环境的破坏以及人类因素的干扰&#xff0c;大坝的安全问题备受关注。每年都有不少大坝事故爆发&#xff0c;造成无法预估的损失。据统计&#xff0c;截至2006年我国共有3260座水库已…

【AntDB数据库】AntDB数据库跨地域多中心部署

跨地域多中心部署 **** 某省核心账务库案例 **** 通信行业核心业务系统已经与某款国外成熟商业数据库深度捆绑多年&#xff0c;为改变这一现状&#xff0c;实现数据库“自主可控”的目标&#xff0c;某省经过多轮调研选型与评测最终选择AntDB分布式内存数据库进行核心产生系统…

Linux线程同步(上)

文章目录 1. 同步的概念2. 条件变量函数2.1 等待函数2.2 样例 3. 生产者消费者模型4. 阻塞队列4.1 模拟阻塞队列的生产消费模型4.2 构造函数和析构函数4.3 生产接口和消费接口4.4 创建线程进行测试 1. 同步的概念 互斥可能会导致一个执行流长时间得不到某种资源。也叫饥饿问题…

健身房小程序怎么做?

如果把预约小程序用好了&#xff0c;会给你的场馆经营带来很多意想不到的好处&#xff0c;解决用户线上约客的问题&#xff0c;顶多只发挥了 20% 的作用&#xff0c;那另外 80% 的用法是什么呢&#xff1f; 高效推荐名片服务行业做的是口碑&#xff0c;用户靠的是转介绍&#x…

SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)

SignalR快速入门 ~ 仿QQ即时聊天&#xff0c;消息推送&#xff0c;单聊&#xff0c;群聊&#xff0c;多群公聊&#xff08;基础》提升&#xff0c;5个Demo贯彻全篇&#xff0c;感兴趣的玩才是真的学&#xff09; 官方demo:http://www.asp.net/signalr/overview/getting-started…

超大模型如何实现3D WEB轻量化渲染?

Hoops Communicator是Tech Soft 3D旗下的主流产品之一&#xff0c;具有强大的、专用的高性能图形内核&#xff0c;专注于基于Web的高级3D工程应用程序。其由HOOPS Server和HOOPS Web Viewer两大部分组成&#xff0c;提供了HOOPS中的HOOPS Convertrer、Data Authoring的模型转换…

电脑提示msvcr120.dll丢失的解决方法win10,总共有三种,那个更方便

电脑修复经验分享&#xff0c;dll动态链接库文件丢失修复教程&#xff0c;DLL 文件&#xff0c;即动态链接库&#xff0c;也有人称作应用程序拓展。一种可执行文件&#xff0c;允许程序共享执行特殊任务所需的代码和其他资源。msvcr120.dll也是属于dll文件之一&#xff0c;在Wi…

python 面向对象 对象

类 构造函数 # 创建类 class Student:name None # 成员属性age None # 成员属性def say(self): # 成员方法print(self.name)# 构造函数def __init__(self,name,age):self.name nameself.age age#创建类对象 my_student Student() # 对象的属性 赋值 my_student.name …

Mysql数据库——用户管理与授权

Mysql数据库——用户管理与授权 一、登录用户的管理1&#xff0e;新建用户2&#xff0e;查看用户信息3&#xff0e;重命名用户4&#xff0e;删除用户5&#xff0e;修改当前登录用户密码6&#xff0e;修改其他用户密码7&#xff0e;忘记 root 密码的解决办法 二、数据库用户授权…

【Docker】Docker中Linux 容器、网络虚拟化与虚拟局域网的技术特点详细讲解

前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 &#x1f4d5;作者简介&#xff1a;热…

Stream流学习前置知识之匿名内部类

目录 匿名内部类 概念 语法体 案例演示 匿名内部类 概念 没有名字的内部类 用于在程序中创建一个只使用一次的临时类 使用 new 关键字来创建一个对象&#xff0c;重写该类的方法或实现该类的接口 语法体 new 父类构造器或接口() {// 匿名内部类的定义 } 案例演示 T…

【深度学习】基于Qt的人脸识别系统,门禁人脸识别系统,Python人脸识别流程,树莓派

文章目录 人脸识别过程人脸检测人脸对齐人脸特征提取特征距离比对人脸识别系统 人脸识别过程 在深度学习领域做人脸识别的识别准确率已经高到超出人类识别&#xff0c;但综合考虑模型复杂度&#xff08;推理速度&#xff09;和模型的识别效果&#xff0c;这个地方还是有做一些…

网络安全大厂面试题合集+面试题文档

以下为网络安全各个方向涉及的面试题&#xff0c;星数越多代表问题出现的几率越大&#xff0c;祝各位都能找到满意的工作。 注&#xff1a;本套面试题&#xff0c;已整理成pdf文档&#xff0c;但内容还在持续更新中&#xff0c;因为无论如何都不可能覆盖所有的面试问题&#xf…

阿里巴巴开源Chat2DB v1.0.11 初体验

阿里巴巴开源Chat2DB v1.0.11 初体验 前言什么是Chat2DB下载安装安装配置Chat2DB初体验配置数据源准备测试数据认识几个功能菜单开始测试自然语言转SQLSQL解释SQL优化 使用总结后续功能结语 前言 作为一名阿里巴巴开源项目的拥护者&#xff0c;从Chat2DB开源至今都有关注这个开…

计算机视觉重磅会议VAlSE2023召开,合合信息分享智能文档处理技术前沿进展

近期&#xff0c;2023年度视觉与学习青年学者研讨会 (Vision And Learning SEminar, VALSE) 圆满落幕。会议由中国人工智能学会、中国图象图形学学会主办&#xff0c;江南大学和无锡国家高新技术产业开发区管理委员会承办。超五千名专家学者、知名高校师生以及来自OPPO、华为、…

docker 容器的网络类型

目录 vmware的三种网卡模式&#xff08;网络模式&#xff09; docker里的四种网络类型 参考资料&#xff1a;Docker四种网络模式 - 简书 (jianshu.com) 1、桥接模式&#xff08;默认情况&#xff09; 2、host模式 3、none模式 4、container模式 创建桥接模式网卡 网卡…