osgAnimation.StackedTransform是一个OpenSceneGraph的类,用于创建具有多个变换的节点栈。此类允许用户在不同坐标系和/或关节空间中组合多个变换。
要创建一个osgAnimation.StackedTransform,您需要使用默认构造函数:
osg::ref_ptr<osgAnimation::StackedTransform> stackedTransform = new osgAnimation::StackedTransform();
要添加变换,请使用addTransform函数。下面展示了如何添加MatrixTransform变换:
osg::ref_ptr<osgAnimation::StackedTransform> stackedTransform = new osgAnimation::StackedTransform();
...
osg::Matrixd matrix;
stackedTransform->addTransform(osg::MatrixTransform::create(matrix));
您可以添加osgg::RotateTransform的方式也与之相似。
osg::Quat quat;
stackedTransform->addTransform(osg::RotateTransform::create(quat));
您可以使用getTransforms函数获取已添加的所有变换。
osg::ref_ptr<osgAnimation::StackedTransform> stackedTransform = new osgAnimation::StackedTransform();
...
osg::ref_ptr<osg::Transform> transform = stackedTransform->getTransforms();
您可以使用removeTransform函数删除堆栈中的变换。在下面的示例中,将删除第1个变换:
stackedTransform->removeTransform(1);
要将变换应用于节点,请使用osg::NodeVisitor,并使用StackedTransform::applyTo函数。下面的示例演示了如何将StackedTransform应用于场景中的节点:
class StackedTransformVisitor : public osg::NodeVisitor
{
public:
StackedTransformVisitor(osg::ref_ptr<osgAnimation::StackedTransform> stackedTransform) :
osg::NodeVisitor(TRAVERSE_ALL_CHILDREN),
_stackedTransform(stackedTransform)
{
}
void apply(osg::Transform& node) override
{
_stackedTransform->applyTo(node);
traverse(node);
}
private:
osg::ref_ptr<osgAnimation::StackedTransform> _stackedTransform;
};
...
osg::ref_ptr<osgAnimation::StackedTransform> stackedTransform = new osgAnimation::StackedTransform();
...
rootNode->accept(StackedTransformVisitor(stackedTransform));
您可以使用getStateSet函数将StackedTransform的状态保存到文件中,并在以后加载它们。下面的示例演示了如何实现此操作:
osg::ref_ptr<osgAnimation::StackedTransform> stackedTransform = new osgAnimation::StackedTransform();
...
osgDB::writeNodeFile(*stackedTransform->getStateSet(), "stacked_transform.osgt");
要加载序列化的StackedTransform,请使用osgDB::readNodeFile函数。例如:
osg::ref_ptr<osg::Node> loadedNode = osgDB::readNodeFile("stacked_transform.osgt");
osg::ref_ptr<osg::StateSet> stateSet = loadedNode->getStateSet();
osg::ref_ptr<osgAnimation::StackedTransform> loadedStackedTransform = dynamic_cast<osgAnimation::StackedTransform*>(stateSet->getAttribute(osg::StateAttribute::Type::STACKED_TRANSFORM));