osgParticle.DomainOperator
是OpenSceneGraph中的粒子操作类,提供了一个范围操作类的实现。
DomainOperator
根据给定的范围(域),过滤掉不在范围内的粒子。粒子可以被包围在一个盒子或球体内或在给定的平面上。
class DomainOperator : public osgParticle::Operator
{
public:
DomainOperator();
DomainOperator(const osg::Vec3& corner1, const osg::Vec3& corner2, bool keep);
DomainOperator(const osg::Vec3& center, float radius, bool keep, bool discardOutside=true);
DomainOperator(const osg::Plane& plane, bool keep);
DomainOperator(const DomainOperator& copy, const osg::CopyOp& copyop = osg::CopyOp::SHALLOW_COPY);
META_Object(osgParticle, DomainOperator);
void setBox(const osg::Vec3& corner1, const osg::Vec3& corner2, bool keep);
void setSphere(const osg::Vec3& center, float radius, bool keep, bool discardOutside=true);
void setPlane(const osg::Plane& plane, bool keep);
const osg::Vec3& getCorner1() const;
void setCorner1(const osg::Vec3& corner);
const osg::Vec3& getCorner2() const;
void setCorner2(const osg::Vec3& corner);
const osg::Vec3& getCenter() const;
void setCenter(const osg::Vec3& center);
float getRadius() const;
void setRadius(float radius);
bool getKeep() const;
void setKeep(bool keep);
bool getDiscardOutside() const;
void setDiscardOutside(bool discardOutside);
virtual void beginOperate(osgParticle::Program *prg);
virtual void operate(osgParticle::Particle *P, double dt);
virtual void endOperate();
protected:
virtual ~DomainOperator();
bool isOutOfRange(const osg::Vec3& position, float radius) const;
bool isOutOfRange(const osg::Vec3& position) const;
osg::Vec3 _corner1, _corner2;
osg::Vec3 _center;
float _radius;
bool _keep;
bool _discardOutside;
bool _isBox, _isSphere, _isPlane;
osg::Plane _plane;
};
DomainOperator()
:构造一个默认的DomainOperator
对象。DomainOperator(const osg::Vec3& corner1, const osg::Vec3& corner2, bool keep)
:构造一个盒子形状的DomainOperator
对象,其中前两个参数指定了盒子的两个角的位置,第三个参数指定了是否需要保留在盒子内的粒子。DomainOperator(const osg::Vec3& center, float radius, bool keep, bool discardOutside=true)
:构造一个球形状的DomainOperator
对象,其中第一个参数指定了球心的位置,第二个参数指定了球的半径,第三个参数指定了是否需要保留在球内的粒子,第四个参数是可选的,指定了是否丢弃不在球外的粒子。DomainOperator(const osg::Plane& plane, bool keep)
:构造一个平面形状的DomainOperator
对象,其中第一个参数指定了平面的位置,第二个参数指定了是否需要保留在平面内的粒子。void setBox(const osg::Vec3& corner1, const osg::Vec3& corner2, bool keep)
:设置一个盒子形状的范围,其中前两个参数指定了盒子的两个角的位置,第三个参数指定了是否需要保留在盒子内的粒子。void setSphere(const osg::Vec3& center, float radius, bool keep, bool discardOutside=true)
:设置一个球形状的范围,其中第一个参数指定了球心的位置,第二个参数指定了球的半径,第三个参数指定了是否需要保留在球内的粒子,第四个参数是可选的,指定了是否丢弃不在球外的粒子。void setPlane(const osg::Plane& plane, bool keep)
:设置一个平面形状的范围,其中第一个参数指定了平面的位置,第二个参数指定了是否需要保留在平面内的粒子。const osg::Vec3& getCorner1() const
:获取盒子的第一个角的位置。void setCorner1(const osg::Vec3& corner)
:设置盒子的第一个角的位置。const osg::Vec3& getCorner2() const
:获取盒子的第二个角的位置。void setCorner2(const osg::Vec3& corner)
:设置盒子的第二个角的位置。const osg::Vec3& getCenter() const
:获取球的球心位置。void setCenter(const osg::Vec3& center)
:设置球的球心位置。float getRadius() const
:获取球的半径。void setRadius(float radius)
:设置球的半径。bool getKeep() const
:获取是否需要保留在范围内的粒子。void setKeep(bool keep)
:设置是否需要保留在范围内的粒子。bool getDiscardOutside() const
:获取是否丢弃不在范围外的粒子。void setDiscardOutside(bool discardOutside)
:设置是否丢弃不在范围外的粒子。virtual void beginOperate(osgParticle::Program *prg)
:开始进行操作。virtual void operate(osgParticle::Particle *P, double dt)
:对每个粒子进行操作。virtual void endOperate()
:操作结束。bool isOutOfRange(const osg::Vec3& position, float radius) const
:判断点是否在设定的范围之外,其中第一个参数为点的位置,第二个参数为半径。bool isOutOfRange(const osg::Vec3& position) const
:判断点是否在设定的范围之外,其中参数为点的位置。osg::ref_ptr<osgParticle::DomainOperator> domain = new osgParticle::DomainOperator;
// 设置盒子范围
domain->setBox(osg::Vec3(-50.0f, -50.0f, 0.0f), osg::Vec3(50.0f, 50.0f, 150.0f), true);