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

本节主要学习如何使用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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

6.17黄金反弹是否到顶,下周开盘如何布局

近期有哪些消息面影响黄金走势&#xff1f;下周黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;黄金周五(6月16日)小幅收高&#xff0c;但在触及5月以来最低盘中水准后本周以下跌收官。美市尾盘&#xff0c;现货黄金收报1957.68美元/盎司&#xff0c;下跌0.19美…

vmware设置centos客户机和windows宿主机共享文件夹

一、安装内核 kernel-devel 包 yum install gcc yum install kernel-devel-$(uname -r) 注意&#xff0c;如果自己修改过内核版本&#xff0c;需要确保 uname -r 显示的版本和实际使用的内核版本一致。 二、安装 vmware-tools 在vmware上点击菜单&#xff1a;虚拟机->安…

使用Nextcloud搭建私人云盘,并内网穿透实现公网远程访问

文章目录 摘要视频教程1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问 4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名 转载自cpolar极点云的文章&#xff1a;使用Nextcl…

LabVIEW开发基于Web数字图像处理

LabVIEW开发基于Web数字图像处理 数字图像处理已在各个领域找到了应用&#xff0c;并已成为一个高度活跃的研究领域。实际实施和实验在教育和研究活动中起着不可或缺的作用。为了方便快捷地实施数字图像处理操作&#xff0c;设计了一个先进的基于Web的数字图像处理虚拟实验室&…

一文搞定C++异常机制(附代码+详细解析)

C异常 1.引文C语言传统的处理错误的方式&#xff1a; 2.C异常概念3.异常的使用3.1 异常的抛出和捕获3.2 异常的重新抛出异常捕获中的内存泄漏问题 3.3异常安全3.4异常规范 4.异常优缺点5.总结&#xff1a; 1.引文 C语言传统的处理错误的方式&#xff1a; 终止程序&#xff0c…

python---列表和元组(5)

元组的相关操作 元组的创建 创建元组的时候指定初始值 元组中的元素也可以是任意类型 通过下标访问元组中的元素 下标从0开始到len-1结束 通过切片来获取元组中的一个部分 使用for循环来遍历元组 使用in 判定元素是否存在 使用index查找元素下标 使用来拼接两个元组 元…

2023年互联网Java面试复习大纲:ZK+Redis+MySQL+Java基础+架构

多数的公司总体上面试都是以自我介绍项目介绍项目细节/难点提问基础知识点考核算法题这个流程下来的。有些公司可能还会问几个实际的场景类的问题&#xff0c;这个环节阿里是必问的&#xff0c;这种问题通常是没有正确答案的&#xff0c;就看个人的理解&#xff0c;个人的积累了…

github action 基于个人项目实践

前言: DevOps 和 Jenkins 作为一名开发&#xff0c;虽然也没有经常听到 Devops &#xff08;研发和运维一体化&#xff09;这个概念&#xff0c;但日常工作中已经无处不在地用着 DevOps 工具。自研也好&#xff0c;基于开源项目改造也好&#xff0c;互联网公司基本都会有自已的…

Django-搭建sysinfo获取系统信息

文章目录 前言一、项目搭建二、主机信息监控三、Celery定时任务和异步任务 前言 使用Django&#xff0c;搭建sysinfo&#xff0c;Linux中,sysinfo是用来获取系统相关信息的结构体 本篇基于&#xff1a;https://github.com/hypersport/sysinfo#readme项目借鉴路径: https://gi…

基于开源大模型Vicuna-13B构建私有制库问答系统

本教程专注在怎么使用已经开源的模型和项目&#xff0c;构建一个可以私有化部署的问答知识库&#xff0c;而且整体效果要有所保障。 主要工作包括&#xff1a; 选择基础模型&#xff0c;openAI&#xff0c;claude 这些商用的&#xff0c;或者其他的开源的&#xff0c;这次我们…

中国金融,如何向科技要答案?

一个科技初创公司&#xff0c;能否凭借科创成果及时获得信贷准入&#xff1f; 一个农民兄弟能否在春播时&#xff0c;获得精准的无抵押贷款&#xff1b;秋收时&#xff0c;通过银行App找到性价比最高的买家&#xff1f; 一家企业&#xff0c;能否通过其生产及交易信息获取线上融…

React diff的原理是什么

一、是什么 跟Vue一致&#xff0c;React通过引入Virtual DOM的概念&#xff0c;极大地避免无效的Dom操作&#xff0c;使我们的页面的构建效率提到了极大的提升 而diff算法就是更高效地通过对比新旧Virtual DOM来找出真正的Dom变化之处 传统diff算法通过循环递归对节点进行依…

WIFI中的频段、信道、信道带宽

一、波长、波速与频率 波长波速/频率 “波速”由“介质”决定。 “频率”由“波源”决定。 “波长”由“介质”(波速V)、“波源”(频率f)共同决定。&#xff08;λV/f&#xff09; 波长&#xff08;wavelength&#xff09;&#xff1a; 指波在一个振动周期内传播的距离。也就…

Flutter自定义系列之折线波动图,心率图,价格走势图

随着前两篇文章的学习&#xff0c;我今天继续给大家演示下简单的自定义之折线波动图&#xff0c;心率图&#xff0c;价格走势图。 这里&#xff0c;我们创建一个自定义的StatefulWidget&#xff0c;用于显示动态的价格线。 我们将使用CustomPaint和CustomPainter来绘制价格线…

英伟达开发板学习系列---国产【Jetson Xavier NX】系统安装及基础配置

1. 前言 最近新买了Jetson Xavier NX, 和之前英伟达原厂的NX的区别在于国产Jetson Xavier NX 是核心板使用的是英伟达的&#xff0c;扩展板是国产的。具体详情如下&#xff1a; 官方NX和国产NX详情区别 2. 设置系统从固态硬盘启动 官方NX出厂是直接将SD卡&#xff08;64/12…

51单片机“密码锁”代码详解

注&#xff1a;此代码一经过验证&#xff0c;读者不必怀疑其正确性&#xff0c;如果烧录进去没有反应&#xff0c;请自行检查引脚端口配置&#xff0c;以及仔细分析代码实现原理。倘若能静下心来分析代码&#xff0c;一定能受益匪浅。 废话不多说&#xff0c;&#xff0c;直接…

网络系统安全——MS15_034漏洞利用与安全加固

Kali 192.168.124.162 Windows server 2008 192.168.124.169 检查2008服务器的IIS网站是否正常&#xff0c;进入2008服务器&#xff0c;使用ie浏览器访问本机地址 切换到kali&#xff0c;使用命令ping来测试他们的连通性 然后使用使用命令curl测试&#xff0c;测试&#x…

【每日挠头算法题(8)】最后一个单词的长度|重新排列字符串

文章目录 一、最后一个单词的长度思路1&#xff1a;从后往前遍历具体代码如下&#xff1a; 思路2&#xff1a;具体代码如下&#xff1a; 二、重新排列字符串思路具体代码如下&#xff1a; 一、最后一个单词的长度 点我直达~ 思路1&#xff1a;从后往前遍历 从后往前遍历&…

动态规划I (45、55、62、63)

按顺序刷确实效率太低了&#xff0c;今天开始要按顺序的同时也按标题来了&#xff0c;全面加油&#xff01;这种应该以后会更多直接总结题解了&#xff0c;自我学习用&#xff0c;全靠大佬&#xff0c;贴贴&#xff01;&#xff01;含45、55、62、63 CP55 跳跃游戏 题目描述&…

优雅草蜻蜓T系统·专业版服务端以及后台部署说明-完整步骤-语音会议室支持多人语音,屏幕分享,导航配置,会议管理,会员管理

蜻蜓T系统专业版服务端以及后台部署 1&#xff0c;解压文件和基础环境配置 将源码用git工具克隆到/www/wwwroot git clone git地址 或者是由优雅草发送的商业源码文件包直接进行解压 ​ 编辑切换为居中 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;…