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

转载于:https://www.cnblogs.com/huahai/p/7270947.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用OSGEarth 2.10实现卫星轨道的绘制代码示例: ```cpp #include <osgEarth/MapNode> #include <osgEarthUtil/Sky> #include <osgEarthUtil/Controls> #include <osgEarthUtil/ExampleResources> #include <osgEarthUtil/Orbit> #include <osgEarthUtil/Controls> #include <osgEarthUtil/EarthManipulator> #include <osgEarthAnnotation/AnnotationRegistry> #include <osgEarthAnnotation/AnnotationNode> #include <osgViewer/Viewer> using namespace osgEarth; using namespace osgEarth::Util; using namespace osgEarth::Annotation; using namespace osgEarth::Util::Controls; //创建一个标记节点 AnnotationNode* createLabel(osg::Vec3d position, const std::string& text) { LabelNode* label = new LabelNode(text); label->setStyle( new TextStyle( Color::White, Color::Black, 2.0f)); AnnotationNode* node = new AnnotationNode( label, GeoPoint( MapNode::getMapSRS(), position, ALTMODE_RELATIVE), AltitudeSymbol::CLAMP_TO_TERRAIN); return node; } int main(int argc, char** argv) { osgViewer::Viewer viewer; //创建地球模型 osgEarth::Map* map = new osgEarth::Map(); osgEarth::TerrainOptions options; options.enableMercatorFastPath() = true; map->setTerrainOptions(options); osgEarth::ImageLayer* layer = new osgEarth::ImageLayer(osgEarth::TileSourceOptions::create("world"), osgEarth::ProfileOptions::create("global-geodetic")); map->addLayer(layer); osgEarth::ModelLayer* modelLayer = new osgEarth::ModelLayer(osgEarth::ModelLayerOptions("Earth")); osgEarth::ModelSourceOptions modelOptions; modelOptions.setURL(osgEarth::URI(osgEarth::URI::ZERO, EXAMPLES_DIR) + "osgearth/globe.earth"); modelLayer->addModel(modelOptions); map->addLayer(modelLayer); osg::ref_ptr<osgEarth::MapNode> mapNode = new osgEarth::MapNode(map); //创建相机 osg::ref_ptr<osg::Camera> camera = viewer.getCamera(); camera->setViewport(0, 0, 800, 600); camera->setProjectionMatrixAsPerspective( 30.0, static_cast<double>(800) / static_cast<double>(600), 1.0, 1000.0); //创建卫星轨道 osg::ref_ptr<Orbit> orbit = new Orbit(); orbit->setCenter(osg::Vec3d(0.0, 0.0, 0.0)); orbit->setRadius(6371000.0 + 1000000.0); orbit->setInclination(osg::DegreesToRadians(45.0)); orbit->setNumSegments(100); orbit->setRenderBinNumber(1); orbit->setAutoScaleToScreen(true); orbit->setColor(osg::Vec4(1.0, 1.0, 0.0, 1.0)); mapNode->addChild(orbit.get()); //创建标记节点 osg::Vec3d position = orbit->getPosition(osg::Timer::instance()->time_s()); osg::ref_ptr<AnnotationNode> label = createLabel(position, "Satellite"); mapNode->addChild(label.get()); //设置相机的初始位置和目标 osgEarth::Util::EarthManipulator* manipulator = new osgEarth::Util::EarthManipulator(); manipulator->setViewpoint(osgEarth::Viewpoint( osgEarth::SpatialReference::get("wgs84"), -122.4167, 37.7833, 5000.0, 0.0, -90.0, 500000.0)); viewer.setCameraManipulator(manipulator); //添加天空盒 osg::ref_ptr<SkyNode> sky = SkyNode::create(map); mapNode->addChild(sky.get()); //设置相机的初始位置和目标 osgEarth::Viewpoint vp( osgEarth::SpatialReference::get("wgs84"), -122.4167, 37.7833, 5000.0, 0.0, -90.0, 500000.0); manipulator->setViewpoint(vp); viewer.setSceneData(mapNode.get()); return viewer.run(); } ``` 在这个示例中,我们首先创建了一个地球模型,并将其添加到地图中。接着,我们创建了一个相机,并设置了其视口和投影矩阵。然后,我们创建了一个卫星轨道,将其添加到地球模型中,并创建了一个标记节点,将其添加到地球模型中。最后,我们添加了一个天空盒,并设置了相机的初始位置和目标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值