osgAnimation.ActionVisitor
类是 OpenSceneGraph 的 osgAnimation 模块中的一个访问者类,用于遍历和访问动画动作(Action)。
osg::Referenced
↳ osg::Object
↳ osgAnimation::ActionVisitor
osgAnimation.ActionVisitor
继承自 osg::Object
,因此具有可参考(Referenced)的特性。
osgAnimation::ActionVisitor::ActionVisitor()
构造函数。
virtual void osgAnimation::ActionVisitor::apply(osgAnimation::Action& action)
访问 Action
对象的方法。可重载实现具体的访问逻辑。
参数:
action
: 要访问的 Action
对象。virtual void osgAnimation::ActionVisitor::apply(osgAnimation::ActionAnimation& actionAnimation)
访问 ActionAnimation
对象的方法。可重载实现具体的访问逻辑。
参数:
actionAnimation
: 要访问的 ActionAnimation
对象。virtual void osgAnimation::ActionVisitor::apply(osgAnimation::ActionBlendIn& actionBlendIn)
访问 ActionBlendIn
对象的方法。可重载实现具体的访问逻辑。
参数:
actionBlendIn
: 要访问的 ActionBlendIn
对象。virtual void osgAnimation::ActionVisitor::apply(osgAnimation::ActionBlendOut& actionBlendOut)
访问 ActionBlendOut
对象的方法。可重载实现具体的访问逻辑。
参数:
actionBlendOut
: 要访问的 ActionBlendOut
对象。virtual void osgAnimation::ActionVisitor::apply(osgAnimation::ActionCallback& actionCallback)
访问 ActionCallback
对象的方法。可重载实现具体的访问逻辑。
参数:
actionCallback
: 要访问的 ActionCallback
对象。virtual void osgAnimation::ActionVisitor::apply(osgAnimation::ActionEase& actionEase)
访问 ActionEase
对象的方法。可重载实现具体的访问逻辑。
参数:
actionEase
: 要访问的 ActionEase
对象。virtual void osgAnimation::ActionVisitor::apply(osgAnimation::ActionKeyframe& actionKeyframe)
访问 ActionKeyframe
对象的方法。可重载实现具体的访问逻辑。
参数:
actionKeyframe
: 要访问的 ActionKeyframe
对象。virtual void osgAnimation::ActionVisitor::apply(osgAnimation::ActionList& actionList)
访问 ActionList
对象的方法。可重载实现具体的访问逻辑。
参数:
actionList
: 要访问的 ActionList
对象。virtual void osgAnimation::ActionVisitor::apply(osgAnimation::ActionMix& actionMix)
访问 ActionMix
对象的方法。可重载实现具体的访问逻辑。
参数:
actionMix
: 要访问的 ActionMix
对象。virtual void osgAnimation::ActionVisitor::apply(osgAnimation::ActionOperation& actionOperation)
访问 ActionOperation
对象的方法。可重载实现具体的访问逻辑。
参数:
actionOperation
: 要访问的 ActionOperation
对象。virtual void osgAnimation::ActionVisitor::apply(osgAnimation::ActionRepeat& actionRepeat)
访问 ActionRepeat
对象的方法。可重载实现具体的访问逻辑。
参数:
actionRepeat
: 要访问的 ActionRepeat
对象。virtual void osgAnimation::ActionVisitor::apply(osgAnimation::ActionSpeed& actionSpeed)
访问 ActionSpeed
对象的方法。可重载实现具体的访问逻辑。
参数:
actionSpeed
: 要访问的 ActionSpeed
对象。virtual void osgAnimation::ActionVisitor::apply(osgAnimation::ActionStripAnimation& actionStripAnimation)
访问 ActionStripAnimation
对象的方法。可重载实现具体的访问逻辑。
参数:
actionStripAnimation
: 要访问的 ActionStripAnimation
对象。virtual void osgAnimation::ActionVisitor::reset()
重置访问状态的方法。osgAnimation.ActionVisitor
对象在遍历过程中,会记录上一个访问的动作(如果有),在遍历下一个动作时会跳过上一个访问的动作。调用该方法可以重置访问状态,使得一个 osgAnimation.ActionVisitor
对象可以多次遍历同一个动作树。
以下示例代码演示了如何使用 osgAnimation.ActionVisitor
类访问一个 osgAnimation::Action
对象的骨骼树,并打印每个骨骼的名称:
class PrintBoneNamesVisitor : public osgAnimation::ActionVisitor
{
public:
PrintBoneNamesVisitor() {}
void apply(osgAnimation::Action& action) override
{
// 获取骨骼姿态通道集合
const osgAnimation::BoneMap& boneMap = action.getOrCreateStateSet()->getOrCreateUniform("BoneMap", osg::Uniform::FLOAT_MAT4);
for (osgAnimation::BoneMap::const_iterator iter = boneMap.begin(); iter != boneMap.end(); ++iter)
{
// 打印骨骼名称
osg::NodePath nodePath = osgAnimation::getParents(iter->second->first);
nodePath.push_back(iter->second->second);
osg::ref_ptr<osg::Node> boneNode = osg::findNodeInNodePathByName(nodePath, iter->second->second->getName());
if (boneNode.valid())
{
std::cout << boneNode->getName() << std::endl;
}
}
traverse(action);
}
};
// 打印场景中所有骨骼名称
PrintBoneNamesVisitor printVisitor;
animationManager->getAnimationList().accept(printVisitor);
在上面的代码中,我们创建了一个自定义 osgAnimation::ActionVisitor
类,重载了 apply()
方法以访问骨骼通道。在 apply()
方法中,我们获取了骨骼姿态通道集合,并通过迭代访问其中的每个骨骼,最后打印骨骼名称。最后,我们创建一个 PrintBoneNamesVisitor
对象,并遍历场景中所有骨骼动画,以打印所有骨骼的名称。