|
我写了一段创建移动目标,并修改替换的代码,不知可否优化,请高人指点:
//创建单个航迹
osg::Node* createSingleFly(CString HJName,CString AirModelName,
double lon,double lat, double height,
double anglex,double angley,double anglez)
{
osg::ref_ptr<osg::Node> flyNode = osgDB::readNodeFile(AirModelName.GetBuffer());
if (!flyNode.valid())
{
return 0;
}
osg::StateSet* stateset = new osg::StateSet;
stateset->setMode(GL_LIGHTING, osg::StateAttribute::ON);
stateset->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
flyNode->setStateSet(stateset);
osg::ref_ptr<osg::MatrixTransform> mt = new osg::MatrixTransform;
osg::ref_ptr<osg::MatrixTransform> scaler = new osg::MatrixTransform;
// 模型缩放比例
double size = 100.;
int ppp;
ppp=AirModelName.Find(".");
CString m_TempStr,m_TempStr2;
m_TempStr=AirModelName.Mid(ppp-4,4);
m_TempStr2=AirModelName.Mid(ppp-8,8);
if((m_TempStr==_T("Ah11"))||
(m_TempStr==_T("c130"))||
(m_TempStr==_T("dh89"))||
(m_TempStr==_T("Mv22"))||
(m_TempStr==_T("Mi24")))
{
scaler->setMatrix( osg::Matrix::scale( size, size, size ) *
osg::Matrix::rotate( osg:egreesToRadians( 90.0f ), 0.0f, 0.0f, 1.0f ) *
osg::Matrix::rotate( osg::DegreesToRadians( 180.0f ), 0.0f, 1.0f, .0f ) *
osg::Matrix::rotate( osg::DegreesToRadians(180.0f ), 1.0f, 0.0f, .0f ) *
osg::Matrix::translate(-flyNode.get()->getBound().center()));
}
else if(m_TempStr2==_T("APACHE_L"))
{
scaler->setMatrix( osg::Matrix::scale( 10, 10, 10 ) *
osg::Matrix::rotate( osg::DegreesToRadians( 90.0f ), 0.0f, 0.0f, 1.0f ) *
osg::Matrix::rotate( osg::DegreesToRadians( 180.0f ), 0.0f, 1.0f, .0f ) *
osg::Matrix::rotate( osg::DegreesToRadians(180.0f ), 1.0f, 0.0f, .0f ) *
osg::Matrix::translate(-flyNode.get()->getBound().center()));
}
else
{
scaler->setMatrix( osg::Matrix::scale( size, size, size ) *
osg::Matrix::rotate( osg::DegreesToRadians( 0.0f ), 0.0f, 0.0f, 1.0f ) *
osg::Matrix::rotate( osg::DegreesToRadians( 180.0f ), 0.0f, 1.0f, .0f ) *
osg::Matrix::rotate( osg::DegreesToRadians(-270.0f ), 1.0f, 0.0f, .0f ) *
osg::Matrix::translate(-flyNode.get()->getBound().center()));
}
scaler->addChild(flyNode.get());
scaler->getOrCreateStateSet()->setMode(GL_RESCALE_NORMAL,osg::StateAttribute::ON);
mt->addChild(scaler.get());
mt->setMatrix(osg::Matrix::rotate(-(anglez+osg::inDegrees(90.0f)),0.0,0.0,1.0)
*osg::Matrix::rotate(angley,0.0,1.0,0.0)
*osg::Matrix::rotate((anglex-osg::inDegrees(90.0f)),1.0,0.0,0.0));
osg::Matrixd matrix;
_ellipsoidModel->computeLocalToWorldTransformFromLatLongHeight(osg::inDegrees(lat),
osg::inDegrees(lon),height,matrix);
mt->setMatrix(matrix);
mt->setName(HJName.GetBuffer());
return mt.release();
}
void add_ES_SingleFly(CString HJName,CString AirModelName,
double lon,double lat, double height,
double anglex,double angley,double anglez)
{
_HangjiGroup2->addChild(createSingleFly(HJName,AirModelName,lon,lat, height,anglex,angley,anglez));
}
void update_ES_SingleFly(CString HJName,CString AirModelName,
double lon,double lat, double height
,double anglex,double angley,double anglez)
{
std::string m_SearchName = HJName.GetBuffer();
//创建节点查找访问器
FindNodeVisitor SearchGZ(m_SearchName);
//启动访问器,开始执行遍历
// 是否开机状态
_HangjiGroup2->accept(SearchGZ);
//如果找不到则新画
if(!SearchGZ.getFirst())
add_ES_SingleFly(HJName,AirModelName,lon,lat, height,anglex,angley,anglez);
else
{
// _HangjiGroup2->replaceChild(SearchGZ.getFirst(),createSingleFly(HJName,AirModelName,lon,lat,height,anglex,angley,anglez));
setFlyMatrix((osg::MatrixTransform*)(SearchGZ.getFirst()),AirModelName,lon,lat,height,anglex,angley,anglez);
}
}
//替换模型
void replace_ES_SingleFly(CString HJName,CString AirModelName,
double lon,double lat, double height,
double anglex,double angley,double anglez)
{
std::string m_SearchName = HJName.GetBuffer();
//创建节点查找访问器
FindNodeVisitor SearchGZ(m_SearchName);
//启动访问器,开始执行遍历
// 是否开机状态
_HangjiGroup2->accept(SearchGZ);
//如果找到则新画
if(SearchGZ.getFirst())
_HangjiGroup2->replaceChild(SearchGZ.getFirst(),createSingleFly(HJName,AirModelName,lon,lat,height,anglex,angley,anglez));
}
//修改矩阵
void setFlyMatrix(osg::MatrixTransform* replaceNode,CString AirModelName,
double lon,double lat, double height,
double anglex,double angley,double anglez)
{
// 模型缩放比例
double size = 100.;
int ppp;
ppp=AirModelName.Find(".");
CString m_TempStr,m_TempStr2;
m_TempStr=AirModelName.Mid(ppp-4,4);
m_TempStr2=AirModelName.Mid(ppp-8,8);
osg::ref_ptr<osg::MatrixTransform> mt = new osg::MatrixTransform;
osg::ref_ptr<osg::MatrixTransform> scaler = new osg::MatrixTransform;
if((m_TempStr==_T("Ah11"))||
(m_TempStr==_T("c130"))||
(m_TempStr==_T("dh89"))||
(m_TempStr==_T("Mv22"))||
(m_TempStr==_T("Mi24")))
{
scaler->setMatrix( osg::Matrix::scale( size, size, size ) *
osg::Matrix::rotate( osg::DegreesToRadians( 90.0f ), 0.0f, 0.0f, 1.0f ) *
osg::Matrix::rotate( osg::DegreesToRadians( 180.0f ), 0.0f, 1.0f, .0f ) *
osg::Matrix::rotate( osg::DegreesToRadians(180.0f ), 1.0f, 0.0f, .0f ) *
osg::Matrix::translate(-replaceNode->getBound().center()));
}
else if(m_TempStr2==_T("APACHE_L"))
{
scaler->setMatrix( osg::Matrix::scale( 10, 10, 10 ) *
osg::Matrix::rotate( osg::DegreesToRadians( 90.0f ), 0.0f, 0.0f, 1.0f ) *
osg::Matrix::rotate( osg::DegreesToRadians( 180.0f ), 0.0f, 1.0f, .0f ) *
osg::Matrix::rotate( osg::DegreesToRadians(180.0f ), 1.0f, 0.0f, .0f ) *
osg::Matrix::translate(-replaceNode->getBound().center()));
}
else
{
scaler->setMatrix( osg::Matrix::scale( size, size, size ) *
osg::Matrix::rotate( osg::DegreesToRadians( 0.0f ), 0.0f, 0.0f, 1.0f ) *
osg::Matrix::rotate( osg::DegreesToRadians( 180.0f ), 0.0f, 1.0f, .0f ) *
osg::Matrix::rotate( osg::DegreesToRadians(-270.0f ), 1.0f, 0.0f, .0f ) *
osg::Matrix::translate(-replaceNode->getBound().center()));
}
scaler->getOrCreateStateSet()->setMode(GL_RESCALE_NORMAL,osg::StateAttribute::ON);
replaceNode->addChild(scaler.get());
mt->setMatrix(osg::Matrix::rotate(-(anglez+osg::inDegrees(90.0f)),0.0,0.0,1.0)
*osg::Matrix::rotate(angley,0.0,1.0,0.0)
*osg::Matrix::rotate((anglex-osg::inDegrees(90.0f)),1.0,0.0,0.0));
mt->getOrCreateStateSet()->setMode(GL_RESCALE_NORMAL,osg::StateAttribute::ON);
replaceNode->addChild(mt.get());
osg::Matrixd matrix;
_ellipsoidModel->computeLocalToWorldTransformFromLatLongHeight(osg::inDegrees(lat),
osg::inDegrees(lon),height,matrix);
replaceNode->setMatrix(matrix);
}
voi delete_ES_SingleFly()
{
// 清除组节点
if (_HangjiGroup2.valid())
{
if (_HangjiGroup2->getNumChildren())
{
if (!_HangjiGroup2 ->removeChildren( 0,
_HangjiGroup2->getNumChildren() ))
{
return;
}
}
}
} |
|