OsgEarth3 PlaceNode添加Icon图片

OsgEarth3 PlaceNode添加Icon图片

osgEarth::Style pm;
pm.getOrCreate<osgEarth::IconSymbol>()->declutter() = true;
pm.getOrCreate<osgEarth::TextSymbol>()->halo() = osgEarth::Color("#5f5f5f");

osgEarth::PlaceNode* pNode = new osgEarth::PlaceNode(osgEarth::GeoPoint(mapSRS, 102.4843167207031, 30.81374538948102, 1000, osgEarth::ALTMODE_ABSOLUTE), "PlacNode_Icon", pm);

osg::ref_ptr<osg::Image> pImage = osgDB::readImageFile("C:/Users/PC/Pictures/srtm_dem.png");
if (pImage.valid())
{
	pImage->scaleImage(64, 64, 1);
	pNode->setIconImage(pImage);
}

在这里插入图片描述
但是如果要修改Icon的Size,如果直接像如下的调用,并不能生效:pNode->getIconImage()->scaleImage(128, 128, 1);

查看了下OsgEarth3内PlaceNode的setIconImage源码,需要调用到内部的complie函数才能重新获取修改的image进行绘制。
在这里插入图片描述
所以在修改image的scale后,又调用了一次setStyle来使PlaceNode内部调到complied函数以更新绘制:

pNode->getIconImage()->scaleImage(128, 128, 1);
pNode->setStyle(pm);

在这里插入图片描述

其实这样scale后的Icon图片绘制出来会被拉伸模糊,如果可以重新new一个Image后,调用setIconImage修改,当然,为了能够更新到绘制,还是需要用这个折中的办法,调用setStyle

osg::ref_ptr<osg::Image> pImage = osgDB::readImageFile("C:/Users/PC/Pictures/srtm_dem.png");
if (pImage.valid())
{
	pImage->scaleImage(128, 128, 1);
	pNode->setIconImage(pImage);
	pNode->setStyle(pm);
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将osgEarth placenode图标居中,可以使用以下方法: 1.在创建placenode时,设置其anchor point为(0.5,0.5),这会将图标的中心点设置为placenode的中心点。 ``` osgEarth::Features::Feature* feature = new osgEarth::Features::Feature(geometry, srs, osgEarth::AltitudeMode::ALTMODE_RELATIVE); osgEarth::Annotation::PlaceNode* placeNode = new osgEarth::Annotation::PlaceNode(feature, mapNode); placeNode->setAnchorPosition(osgEarth::GeoPoint(srs, latitude, longitude, altitude, osgEarth::ALTMODE_RELATIVE)); placeNode->setDynamic(true); placeNode->setStyle(style); placeNode->setAnchorPoint(osg::Vec2d(0.5, 0.5)); //设置anchor point为(0.5,0.5) ``` 2.通过设置placenode的scale值来调整图标的大小,使其与placenode的大小相匹配。这将确保图标placenode中居中。 ``` osgEarth::Symbology::Style style; style.getOrCreate<osgEarth::Symbology::IconSymbol>()->url() = "icon.png"; style.getOrCreate<osgEarth::Symbology::IconSymbol>()->size() = 32; style.getOrCreate<osgEarth::Symbology::IconSymbol>()->alignment() = osgEarth::Symbology::IconSymbol::ALIGN_CENTER_BOTTOM; osgEarth::Annotation::PlaceNode* placeNode = new osgEarth::Annotation::PlaceNode(feature, mapNode); placeNode->setAnchorPosition(osgEarth::GeoPoint(srs, latitude, longitude, altitude, osgEarth::ALTMODE_RELATIVE)); placeNode->setDynamic(true); placeNode->setStyle(style); placeNode->setAnchorPoint(osg::Vec2d(0.5, 0.5)); //设置anchor point为(0.5,0.5) placeNode->setScale(osg::Vec3d(1.0, 1.0, 1.0) * 32.0 / style.get<osgEarth::Symbology::IconSymbol>()->size()); //设置scale值 ``` 这些方法将确保placenode图标始终居中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值