自定义节点更新回调

#include <Windows.h>
#include <osg\Node>
#include <osg\Group>
#include <osg\Geometry>
#include <osg\MatrixTransform>
#include <osg\NodeCallback>
#include <osgViewer\Viewer>
#include <osgViewer\ViewerEventHandlers>
#include <osgDB\ReadFile>

class ModelCallback : public osg::NodeCallback
{
public:
	ModelCallback() :angle_(0.0) { }

	virtual void operator()(osg::Node* node, osg::NodeVisitor* nv) override
	{
		osg::ref_ptr<osg::MatrixTransform> mt = dynamic_cast<osg::MatrixTransform*>(node);
		if (mt.valid())
		{
			osg::Matrix matrix;
			matrix.makeRotate(osg::DegreesToRadians(angle_),osg::Z_AXIS);
			mt->setMatrix(matrix);

			angle_ += 0.1;
		}
		traverse(node, nv);
	}

private:
	float angle_;
};

int main()
{
	osgViewer::Viewer viewer;

	osg::ref_ptr<osg::Group> group = new osg::Group();
	osg::ref_ptr<osg::MatrixTransform> mt = new osg::MatrixTransform();
	mt->addChild(osgDB::readNodeFile("glider.osg"));
	mt->setUpdateCallback(new ModelCallback());
	group->addChild(mt);

	viewer.setSceneData(group);
	viewer.addEventHandler(new osgViewer::StatsHandler());
	viewer.setUpViewInWindow(100, 100, 500, 400);

	return viewer.run();
}

posted @ 2021-08-28 14:06  暹罗吹雪  阅读(40)  评论(0编辑  收藏  举报