泛型粒子系統的設計5 (轉)

themoney發表於2007-09-15
泛型粒子系統的設計5 (轉)[@more@]

:namespace prefix = o ns = "urn:schemas--com::office" />

// 一維向量隨機初始化器

template<

  class _ParticleType,

  class _RandGenerator,

  class _RandDistribution

> class TUniformRanVec1Initializer {

protected:

  typedef _ParticleType  tParticle;

  typedef _RandGenerator  tGenerator;

  typedef _RandDistribution  tDistribution;

  typedef boost::variate_generator< _RandGenerator, _RandDistribution >  tVarGen;

  // 數值生成器

  tVarGen  m_VGen;

public:

  TUniformRandomVec1Initializer( void )

  : m_VGen( tGenerator( 1 ), tDistribution() )

  {}

  // 設定種子

  void Seed( boost::uint32_t nSeed ) {

  m_VGen.engine().seed( nSeed );

  }

  // 設定分佈器

  void SetDist( const tDistribution& Dist ) {

  m_VGen.distribution() = Dist;

  }

  // 初始化

  template< size_t nIndex >

  void Action( tParticle& p ) {

  p.Part< nIndex >().m_Value = m_VGen();

  }

};

TUniformRandomVec1Initializer是一個一維隨機初始化器,它接受3個模板引數,_ParticleType用於指定所需要初始化的粒子型別,_RandGenerator用於指定隨機數生成器(詳細說明請參看Boost.Random的文件),_RandDistribution用於指定隨機數分佈器(詳細說明請參看Boost.Random的文件)。公共成員Seed用於設定隨機數生成器的種子,SetDist用於設定隨機數分佈器。

TUniformRandomVec2Initializer二維隨機初始化器,

TUniformRandomVec3Initializer三維隨機初始化器,

TUniformRandomVec4Initializer四維隨機初始化器,

TSphereRandomVec2XYInitializer三維XY平面圓形隨機初始化器,

TSphereRandomVec2XZInitializer三維XZ平面圓形隨機初始化器,

TSphereRandomVec2YZInitializer三維YZ平面圓形隨機初始化器,

的使用都與此類似,詳細使用請參看本文所附例程,詳細實現請參看本文所附及Boost.Random文件。

如果以上提到的內建初始化器中並沒有您需要的,那麼動手自定義一個初始化器也是一件非常輕鬆愉快的事情。

// 根據壽命修正退色因子

template<

  class _ParticleType,

  size_t nFadeIndex

> class TFixFadeByLifeInitializer {

protected:

  typedef _ParticleType  tParticle;

public:

  // 執行初始化

  template< size_t nIndex >

  void Action( tParticle& p ) {

  p.Part< nFadeIndex >().m_Value = 1.0 / p.Part< nIndex >().m_Value;

  }

};

這裡我們自定義了一個根據初始壽命值修正退色因子的初始化器,它接受兩個模板引數,_ParticleType用於指定所需要初始化的粒子型別,nFadeIndex用於指定退色因子在粒子結構中的。

四、器

更新器和初始化器一樣也粒子重要的組成部分,每個更新器都必須有個一公共的帶有一個size_t型模板引數的Action成員函式,此函式接受一個從上次更新到現在的時間間隔作為引數,TParticleSystem將此函式對粒子進行更新,模板引數nIndex用於指定所需要更新的粒子部分。系統中內建了幾個常用的更新器:

// 空更新器

template<

  class _ParticleType

> class TNilActor {

protected:

  typedef _ParticleType tParticle;

public:

  template< size_t nIndex >

  void Action( const double&, tParticle& ) {

  }

};

TNilActor是一個空更新器, 它有一個模板引數,_ParticleType用於指定所需要更新的粒子型別,如果指定其為某個粒子部分的更新器系統將不對此粒子部分進行更新動作。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10794571/viewspace-969590/,如需轉載,請註明出處,否則將追究法律責任。

相關文章