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



  • 相关阅读:
    Domino Web开发规则之三:以资源管理库为中心开发
    关于在DOMINO中使用JAVA调用JAVA受限制类的解决办法
    Domino Web开发规则之一:Notes命名规范
    EXTJS与Domino相结合的例子
    LS函数:在AD中,查询指定用户条目
    如何访问个人邮箱中的未读邮件
    从Domino公式@DBLookup Web化谈如何实现通用函数
    IE6中运行EXTJS中某些组件无法解析DOMINO产生的JSON数据问题的解决办法
    Domino Web开发规则之二:DOMINO与开发相关的管理规范
    struts.xml文件中配置tiles.xml
  • 原文地址:https://www.cnblogs.com/huahai/p/7270942.html
Copyright © 2011-2022 走看看