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;
}

posted @ 2017-06-28 20:43  huahai  阅读(745)  评论(0编辑  收藏  举报