zoukankan      html  css  js  c++  java
  • OSG学习:使用已有回调示例

     回调的类型有很多种,一般很容易就想到的是UpdateCallBack,或者EventCallBack,回调的意思就是说,你可以规定在某件事情发生时启动一个函数,这个函数可能做一些事情。这个函数就叫做回调函数。

    #include<osgMatrixTransform>
    #include<osgPositionAttitudeTransform>
    #include<osgGeode>
    #include<osgDBRegistry>
    #include<osgDBReadFile>
    #include<osgGATrackballManipulator>
    #include<osgViewerViewer>
    
    //创建一条路径
    osg::AnimationPath* createAnimationPath(const osg::Vec3& center, float radius, double looptime)
    {
    	//路径实体
    	osg::AnimationPath* animationPath = new osg::AnimationPath;
    	//设置循环模式为LOOP
    	animationPath->setLoopMode(osg::AnimationPath::LOOP);
    	//设置关键点数
    	int numSamples = 40;
    	float yaw = 0.0f;
    	float yaw_delta = 2.0f*osg::PI / ((float)numSamples - 1.0f);
    	float roll = osg::inDegrees(30.0f);
    	//设置时间间隔
    	double time = 0.0f;
    	double time_delta = looptime / (double)numSamples;
    	//插入关键点与时间以及旋转角度和位置
    	for (int i = 0; i < numSamples; ++i)
    	{
    		osg::Vec3 position(0, 0, 0);
    		osg::Quat rotation(osg::Quat(roll, osg::Vec3(0.0, 1.0, 0.0))*osg::Quat(-(yaw + osg::inDegrees(90.0f)), osg::Vec3(0.0, 0.0, 1.0)));
    		//具体插入操作
    		animationPath->insert(time, osg::AnimationPath::ControlPoint(position, rotation));
    		yaw += yaw_delta;
    		time += time_delta;
    	}
    	return animationPath;
    }
    //创建移动模型
    osg::Node* createMovingModel(const osg::Vec3& center, float radius)
    {
    	float animationLength = 10.0f;
    	//创建的路径
    	osg::AnimationPath* animationPath = createAnimationPath(center, radius, animationLength);
    	osg::Group* model = new osg::Group;
    	//读取模型,并隐藏它下面的第一个节点
    	osg::Node* fountain = osgDB::readNodeFile("fountain.osgt");
    	fountain->asGroup()->getChild(0)->setNodeMask(0);
    	//如果读取成功,则更新赋予它的路径
    	if (fountain)
    	{
    		osg::PositionAttitudeTransform* xform = new osg::PositionAttitudeTransform;
    		//设置更新回调
    		xform->setUpdateCallback(new osg::AnimationPathCallback(animationPath, 0.0, 1.0));
    		//加入子模型节点
    		xform->addChild(fountain);
    		model->addChild(xform);
    	}
    	return model;
    }
    //创建模型
    osg::Node* createModel()
    {
    	osg::Vec3 center(0.0f, 0.0f, 0.0f);
    	float radius = 1.0f;
    	osg::Group* root = new osg::Group;
    	//创建移动的节点,以radius为半径转圈
    	osg::Node* movingModel = createMovingModel(center, radius*0.8f);
    
    	//把节点加入到root中并返回
    	root->addChild(movingModel);
    	return root;
    }
    //主函数
    int main(int argc, char** argv)
    {
    	osgViewer::Viewer viewer;
    	//创建模型
    	osg::Node* model = createModel();
    	viewer.setSceneData(model);
    	viewer.setCameraManipulator(new osgGA::TrackballManipulator());
    	viewer.realize();
    	return viewer.run();
    }
    结果图:



  • 相关阅读:
    Java开发之富文本编辑器TinyMCE
    将博客搬至CSDN
    利用Docker搭建java项目开发环境
    Linux上传和下载之Xshell
    JSP中利用JSTL标签对日期格式化
    MySQL数据库localhost的root用户登陆遭遇失败
    CentOS7下 简单安装和配置Elasticsearch Kibana Filebeat 快速搭建集群日志收集平台(版本6.x)
    CentOS下递归遍历文件夹下所有文件,查找指定字符
    谷歌浏览器插件不让离线安装怎么办?
    X-Forwarded-For 会少记录一次代理服务器的IP
  • 原文地址:https://www.cnblogs.com/huahai/p/7270942.html
Copyright © 2011-2022 走看看