分享
 
 
 

泛型粒子系统的设计1

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

摘要:本文阐述了如何利用C++的Template开发出方便组装,适合各种应用的泛型粒子系统,开发过程中使用到了Boost.Mpl和Boost.Random。

关键字:粒子系统,泛型编程,Boost

〇、引言

在各种3D应用中,粒子系统扮演着举足轻重的角色。雨雪的模拟、流水的模拟、火焰的模拟等等都离不开粒子系统。传统的粒子系统的开发很难同时满足各种各样的需要,只能针对特定的应用做特定的开发,有没有什么方法可以开发出适合各种应用的粒子系统呢?这让我们想到了求助C++的Template。

一、 粒子结构

在传统的粒子系统中我们常看到这样的粒子结构的定义。

struct SParticle {

tVector3 m_vPos;

tVector3 m_vVel;

tColor m_cColor;

tReal m_rFade;

tReal m_rLife;

};

这样做的缺点就是整个粒子的结构被固定死了,无法适应不同的需要,针对不同类型的粒子就必须定义不同的结构。为了解决这个问题我们把粒子拆分成不同的部分,这样就可以按需要进行组装,并且针对粒子的特定部分制定的算法可以得到充分的复用。我们可以做如下拆分:

// 粒子位置

struct SParticlePos {

tVector3 m_vPos;

};

// 粒子速度

struct SParticleVel {

tVector3 m_vVel;

};

// 粒子颜色

struct SParticleColor {

tColor m_cColor;

};

// 粒子退色因子

struct SParticleFade {

tReal m_rFade;

};

// 粒子寿命

struct SParticleLife {

tReal m_rLife;

};

把粒子拆分以后我就需要一个组装机制。

// 粒子组装器

template<

class _PartIter,

class _PartsVector

> class TParticlePartHolder

: public boost::mpl::deref< _PartIter >::type,

, public TParticlePartHolder< _PartIter::next >

{};

template<

class _PartsVector

> class TParticlePartHolder< boost::mpl::end< _PartsVector >::type, _PartsVector >

: public boost::blank

{};

这里用到了Boost的mpl库中的类型序列容器作为粒子组装器的_PartsVector模板参数,它可以是boost::mpl::vector或其它与之兼容的类型序列容器,用于容纳粒子个各个不同部分。_PartsIter模板参数是_PartsVector的一个跌代器,它指向了位于_PartsVector中的一个粒子部分。TParticlePartHolder是一个自递归继承的模板类,递归结束条件由一个偏特化的TParticlePartHolder确定。粒子组装器每一次递归继承一个_PartIter所指向的粒子部分(通过boost::mpl::deref<>获取),并把_PartIter向后移动一次传入下一次递归,直到_PartIter指向了_PartsVector容器的末端(继承一个空类boost::blank)。

有了粒子组装器我们还需要一个名为TParticlePolicy的模板类把它包装起来。

// 粒子

template<

class _PartsVector

> struct TParticlePolicy

: public TParticlePartHolder< boost::mpl::begin< _PartsVector >::type, _PartsVector >

{

typedef _PartsVector tPartsVector;

// 部分数

static const int s_ciNumOfParts = boost::mpl::size< _PartsVector >::type::value;

}

TPaticlePolicy接受一个名为_PartsVector的类型序列容器,并以指向_PartsVector首的迭代器(通过boost::mpl::begine<>获取)和_PartsVector作为参数继承TParticlePartHolder。

现在就可以个把各个不同的粒子部分组装起来了。如组装一个具有位置、速度、颜色和寿命等属性的粒子我们可以这样写代码:

TParticlePolicy<

boost::mpl::vector<

SParticlePos,

SParticleVel,

SParticleColor,

SParticleLife

>

>

看到这里也许您还有一些不太清楚,让我们用一张继承结构图来说明:

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有