自定义回调控制OSG模型进行移动操作

1、新建vs控制台项目,勾选空项目

2、新建.h文件命名为osg.h,用来包含用到的OSG头文件

#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osg/Node>
#include <osg/MatrixTransform>
#include <osgUtil/Optimizer>

3、新建cpp文件,用来写回调,以及主函数


4、在cpp文件中加入以下代码。

//******************************************************************//
//				此文件中添加mycallback回调函数和主程序				//
//******************************************************************//

#include "osg.h"
#include <Windows.h>
//添加回调
class mycallback:public osg::NodeCallback
{
public:
	mycallback(float pos)
	{
		m_pos=pos;
	}
	virtual void operator() (osg::Node* node,osg::NodeVisitor* nv)
	{
		osg::ref_ptr<osg::MatrixTransform> transpos=dynamic_cast<osg::MatrixTransform*>(node);
		if (nv&&transpos&&nv->getFrameStamp())
		{
			
			//double time=nv->getFrameStamp()->getReferenceTime();获取当前运行时间
			m_pos++;
			//飞机运行下一个位置,可以在此设置translate三个参数数学值,让它实现在固定路劲上飞行
			transpos->setMatrix(osg::Matrix::translate(0.0f+cosf(0.02*m_pos),1.0f,0.0f+sinf(0.02*m_pos))*
				osg::Matrix::rotate(60,1.0f,0.0f,0.0f));
			//Sleep(1000);
		}
		traverse(node,nv);
	}
protected:
	int m_pos;
};

int main()
{
	//主函数
	//创建viewer
	osgViewer::Viewer  FirViewer;
	//创建group组节点
	osg::ref_ptr<osg::Group>FirRoot=new osg::Group();
	//加载模型NODE
	osg::ref_ptr<osg::Node>firnode1=osgDB::readNodeFile("D:\\OSG\\data\\glider.osg");
	//创建模型矩阵变换matrix节点
	osg::ref_ptr<osg::MatrixTransform> transpos=new osg::MatrixTransform();
	//设置回调
	transpos->setUpdateCallback(new mycallback(1));
	//为回调传入模型指针
	transpos->addChild(firnode1);
	//将变换节点加入组节点
	FirRoot->addChild(transpos);
	//加载viewer显示播放
	FirViewer.setSceneData(FirRoot);
	FirViewer.realize();
	FirViewer.run();


	return 0;
}


 5、运行结果,飞机转圈。 
 

6、回调函数原型

virtual void operator() (osg::Node* node,osg::NodeVisitor* nv)
{

	//需要执行的操作
	traverse(node,nv);
}
7、回调方法

setUpdatedataCallback();
setCullCallback();
setDrawCallback();
setEventCallback();
setReadFileCallback();
setWriteFileCallback();




猜你喜欢

转载自blog.csdn.net/yuan2424/article/details/78397501