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 对象,并遍历场景中所有骨骼动画,以打印所有骨骼的名称。