osgPresentation.AnimationMaterialCallback 是一个开源场景图库OpenSceneGraph中的类,继承于osg::StateAttributeCallback类。它在动画过程中控制材质的改变,实现动画效果的渲染。
osgPresentation.AnimationMaterialCallback具有以下主要功能:
使用osgPresentation.AnimationMaterialCallback类需要进行以下步骤:
以下是AnimationMaterialCallback的常用函数及描述:
函数名 | 描述 |
---|---|
constructor() | 构造函数,可以传入初始材质属性值,动画速度等参数。 |
setLoopMode( osg::AnimationPath::LoopMode mode) | 设置动画的循环模式。loopType 有如下值:<br />0 - osg::AnimationPath::NO_LOOPING (不循环)<br />1 - osg::AnimationPath::LOOP(正向循环)<br />2 - osg::AnimationPath::SWING(循环波动)<br />3 - osg::AnimationPath::SWING_LOOP(循环波动和正向循环) |
getLoopMode() | 获取动画的循环模式。 |
setMatrix(const osg::Matrix& m) | 设置动画初始矩阵。 |
setScale(double timeScale) | 设置动画时间缩放,默认值为1.0,可以对动画的速度进行调整。 |
double getScale() | 获取动画时间缩放倍数。 |
setAnimationPath(osg::AnimationPath *ap) | 设置动画路径,通过此路径实现材质动画。 |
osg::AnimationPath *getAnimationPath() | 获取材质动画路径。 |
setStartTime(double t) | 设置动画开始时间。 |
double getStartTime() | 获取动画开始时间。 |
setEndTime(double t) | 设置动画结束时间。 |
double getEndTime() | 获取动画结束时间。 |
virtual void operator()(osg::StateAttribute *attribute, osg::NodeVisitor *nv) | 重载()运算符,获取材质属性,并更新动画的状态。 |
以纹理动画为例,创建AnimationMaterialCallback对象,并将其添加到osg::StateSet中:
// 创建纹理对象
osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D;
// 加载两张纹理图片,设置动画模式为LOOP
osg::ref_ptr<osg::Image> image1 = osgDB::readImageFile("Textures/earth0.bmp");
osg::ref_ptr<osg::Image> image2 = osgDB::readImageFile("Textures/earth1.bmp");
osg::ref_ptr<osg::AnimationPath> path = new osg::AnimationPath;
path->setLoopMode(osg::AnimationPath::LOOP);
path->insert(0.0,osg::AnimationPath::ControlPoint(
osg::Vec3(0.0,0.0,0.0),osg::Quat(),osg::Vec3(1.0,1.0,1.0/2048.0)));
path->insert(1.0,osg::AnimationPath::ControlPoint(
osg::Vec3(0.0,0.0,0.0),osg::Quat(),osg::Vec3(1.0,1.0,1.0)));
// 创建 AnimationMaterialCallback 对象
osg::ref_ptr<osgPresentation::AnimationMaterialCallback> animCallback =
new osgPresentation::AnimationMaterialCallback;
animCallback->setAnimationPath(path);
animCallback->setLoopMode(osg::AnimationPath::LOOP);
animCallback->setMatrix(osg::Matrixd::translate(0.0,0.0,0.0));
animCallback->setScale(1.0);
animCallback->setStartTime(0.0);
animCallback->setEndTime(2);
// 设置纹理对象的动画属性
texture->setImage(0, image1);
texture->setImage(1, image2);
texture->setWrap(osg::Texture2D::WRAP_S, osg::Texture2D::REPEAT);
texture->setWrap(osg::Texture2D::WRAP_T, osg::Texture2D::REPEAT);
texture->setFilter(osg::Texture2D::MIN_FILTER, osg::Texture2D::LINEAR);
texture->setFilter(osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR);
texture->setDataVariance(osg::Object::DYNAMIC);
texture->setResizeNonPowerOfTwoHint(false);
// 将 AnimationMaterialCallback 对象添加到 StateSet 中
osg::StateSet *ss = node->getOrCreateStateSet();
ss->setTextureAttributeAndModes(0, texture, osg::StateAttribute::ON);
ss->setAttributeAndModes(animCallback, osg::StateAttribute::ON);
[1] OpenSceneGraph Documentation, OSGAnimation客户端编程参考。https://www.openscenegraph.org/documentation/OpenSceneGraphReferenceDocs/a01391.html。2021.10.
[2] 动画模块,OpenSceneGraph 3.6.5 User Guide。https://www.osgchina.org/wp-assets/openscenegraph-3.6.5/UserGuide/osgAnimation.pdf。2021.10.