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();
    }
    结果图:



  • 相关阅读:
    分布式系统与机器学习相关笔记
    天坑:OpenGL制作游戏引擎备忘记录
    2016ACM-ICPC 大连站、青岛站、China-Final 赛后总结(无删版)by wanglangzhe || wmzksana
    CF 609E, 树链剖分
    CF 609F,线段树上二分 + set维护
    CF 540E, 树状数组
    hdu 5726, 2016多校1
    hdu5836, 2016CCPC网络赛
    SYSU-10,URAL 1675,容斥原理
    动态规划基础篇 from 51nod
  • 原文地址:https://www.cnblogs.com/huahai/p/7270942.html
Copyright © 2011-2022 走看看