osgEarth添加模型及其标牌

void Entity3D::add3DModel() {
	//添加模型
	QString path = _entity->getEntityInfo(EIC_3D_MODEL).toString();
	std::string modelPath = path.toLocal8Bit().data();
	osg::ref_ptr<osg::Node> nodeFile = osgDB::readNodeFile(modelPath);
	osg::ref_ptr<osg::MatrixTransform> nodeMt = new osg::MatrixTransform;//平移矩阵

	osg::ref_ptr<osg::MatrixTransform> nodeMtR = new osg::MatrixTransform;//旋转矩阵
	nodeMt->addChild(nodeMtR);
	osg::ref_ptr<osg::MatrixTransform> nodeMtS = new osg::MatrixTransform;//缩放矩阵
	nodeMtR->addChild(nodeMtS);
	nodeMtS->addChild(nodeFile);

	EarthMapMgr()->getModelRoot()->addChild(nodeMt);

	osg::Matrix m;
	EarthMapMgr()->getMapNode()->getMapSRS()->getEllipsoid()->computeLocalToWorldTransformFromLatLongHeight(
		osg::DegreesToRadians(_entity->getLat()),
		osg::DegreesToRadians(_entity->getLon()),
		_entity->getAlt(),
		m);

	nodeMt->setMatrix(m);
	nodeMt->addDescription("model-3d");
#if 0
	nodeMt->getOrCreateStateSet()->setMode(GL_LIGHT0, osg::StateAttribute::ON);
	nodeMt->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::ON);
	nodeMt->getOrCreateStateSet()->setMode(GL_RESCALE_NORMAL, osg::StateAttribute::ON);
#endif

	nodeMt->getOrCreateStateSet()->setMode(GL_LIGHT1, osg::StateAttribute::ON);
	nodeMt->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::ON);
	nodeMt->getOrCreateStateSet()->setMode(GL_RESCALE_NORMAL, osg::StateAttribute::ON);
	nodeMt->getOrCreateStateSet()->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON);
	//设置模型显示比例
	nodeMtS->setMatrix(osg::Matrix::scale(_scale, _scale, _scale));

	_entityNode = nodeMt;
}
}

void Entity3D::createLabel(std::string label, double fontSize) {
	osg::ref_ptr<osgText::Text> textPtr = new osgText::Text;
	textPtr->setFont("./Map/3D/fonts/simsun.ttc");
	textPtr->setCharacterSize(fontSize);
	QString context = QString::fromLocal8Bit(label.data());
	textPtr->setText(context.toStdString(), osgText::String::Encoding::ENCODING_UTF8);

	osg::ref_ptr<osg::Geode> geodePtr = new osg::Geode;
	geodePtr->addDrawable(textPtr);

	osg::ref_ptr<osg::AutoTransform> nodeAT = new osg::AutoTransform;//自动缩放矩阵
	nodeAT->setAutoRotateMode(osg::AutoTransform::AutoRotateMode::ROTATE_TO_SCREEN);//始终朝向屏幕
	nodeAT->setAutoScaleToScreen(true);
	nodeAT->setMinimumScale(1.0);//视角缩放的时候,字体的缩放比例变化 1.0-最小的缩放比例
	nodeAT->addChild(geodePtr);

	//添加到三维模型上
	osg::MatrixTransform* mt = dynamic_cast<osg::MatrixTransform*>(_entityNode.get());
	osg::MatrixTransform* mtR = dynamic_cast<osg::MatrixTransform*>(mt->getChild(0));
	osg::MatrixTransform* mtS = dynamic_cast<osg::MatrixTransform*>(mtR->getChild(0));
	
	mtS->addChild(nodeAT);
}
  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值