• OSG学习:自动对齐节点示例


     
    /**********************************************************
    *Write by FlySky
    *zzuxp@163.com  http://www.OsgChina.org
    **********************************************************/
    
    #include <osgViewer/Viewer>
    
    #include <osg/Node>
    #include <osg/Geometry>
    #include <osg/Geode>
    #include <osg/Group>
    #include <osg/AutoTransform>
    
    #include <osgDB/ReadFile>
    #include <osgDB/WriteFile>
    
    #include <osgText/Text>
    
    #include <osgUtil/Optimizer>
    
    #include <iostream>
    
    //创建自动变换节点
    osg::ref_ptr<osg::Node> createAutoTransform(osg::Vec3& position, float size, std::string& label,
    	osg::AutoTransform::AutoRotateMode autoMode, osgText::Text::AxisAlignment axisAlignment)
    {
    	osg::ref_ptr<osg::Geode> geode = new osg::Geode();
    
    	//字体
    	std::string font("fonts/cour.ttf");
    
    	//创建Text对象
    	osg::ref_ptr<osgText::Text> text = new osgText::Text();
    	geode->addDrawable(text.get());
    
    	//设置字体
    	text->setFont(font);
    	//设置字体的分辨率,默认为32*32
    	text->setFontResolution(128.0f, 128.0f);
    	//设置字体的大小
    	text->setCharacterSize(size);
    	//设置对齐方式
    	text->setAlignment(osgText::Text::CENTER_CENTER);
    	//设置方向
    	text->setAxisAlignment(axisAlignment);
    	//设置文字
    	text->setText(label);
    
    	//关闭光照
    	geode->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
    
    	//创建自动变换节点
    	osg::ref_ptr<osg::AutoTransform> at = new osg::AutoTransform();
    	//添加子节点
    	at->addChild(geode.get());
    
    	//设置自动变换方式
    	at->setAutoRotateMode(autoMode);
    	//根据屏幕大小来缩放节点,默认为false,设置为true时,节点无法缩放
    	at->setAutoScaleToScreen(false);
    	//at->setAutoScaleToScreen(true) ;
    	//设置缩放的最大和最小比例
    	at->setMinimumScale(0.0f);
    	at->setMaximumScale(5.0f);
    	//设置位置
    	at->setPosition(position);
    
    	return at.get();
    }
    int main()
    {
    	osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
    
    	osg::ref_ptr<osg::Group> root = new osg::Group();
    
    	std::string text("Fly To Sky");
    
    	/*
    	三种变换模式:
    	ROTATE_TO_SCREEN  自动朝向屏幕
    	ROTATE_TO_CAMERA	自动朝向相机
    	NO_ROTATION			无
    	*/
    	//添加ROTATE_TO_SCEREEN模式变换节点
    	root->addChild(createAutoTransform(osg::Vec3(0.0f, 0.0f, 0.0f), 60.0f, text,
    		osg::AutoTransform::ROTATE_TO_SCREEN, osgText::Text::XY_PLANE));
    
    	//添加NO_ROTATION模式变换节点
    	root->addChild(createAutoTransform(osg::Vec3(0.0f, 0.0f, 0.0f), 60.0f, text,
    		osg::AutoTransform::NO_ROTATION, osgText::Text::YZ_PLANE));
    
    	//添加ROTATE_TO_CAMERA模式变换节点
    	//root->addChild(createAutoTransform(osg::Vec3(0.0f,0.0f,0.0f),60.0f,text,
    	//	osg::AutoTransform::ROTATE_TO_CAMERA,osgText::Text::XY_PLANE)) ;
    
    	//优化场景数据
    	osgUtil::Optimizer optimizer;
    	optimizer.optimize(root.get());
    
    	viewer->setSceneData(root.get());
    
    	viewer->realize();
    
    	viewer->run();
    
    	return 0;
    }

  • 相关阅读:
    Binary Search Tree Iterator
    Oracle迁移:Linux->Windows
    OCP考点实战演练02-日常维护篇
    Oracle数据库全球化
    Oracle管理磁盘空间和资源
    Oracle数据库资源管理
    使用普通用户替代root来管理IEE
    记录一则ORA-12154,ORA-12560解决过程
    Oracle段收缩功能
    Oracle使用SQL传输表空间
  • 原文地址:https://www.cnblogs.com/huahai/p/7270947.html
Copyright © 2020-2023  润新知