|
现在渲染了一个地球,打算在北京的位置放一个飞机模型,可是利用经纬度转换后竟然不是那个位置,不知道是参数转换的问题还是矩阵变换的问题,如下是效果图和代码:
#include "stdafx.h"
#include <osg/Geode>
#include <osg/Group>
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
#include <osgViewer/Viewer>
#include <osgText/Text>
#include <osg/CoordinateSystemNode>
#include <osg/MatrixTransform>
//#include <osgUtil/>
int _tmain(int argc, _TCHAR* argv[])
{
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
osg::ref_ptr<osg::CoordinateSystemNode> csn = new osg::CoordinateSystemNode();
csn->setEllipsoidModel(new osg::EllipsoidModel());
//读取地球模型
osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("F:/osgtemp/earth.osg");
csn->addChild(node.get());
//读取飞机模型
osg::Node* cessna = osgDB::readNodeFile("cessna.osg");
osg::MatrixTransform* mt = new osg::MatrixTransform();
osg::MatrixTransform* scaler = new osg::MatrixTransform();
//缩放飞机模型到合适的尺寸
if (cessna)
{
double s = 200000.0 / cessna->getBound().radius();
scaler->addChild(cessna);
scaler->setMatrix(osg::Matrixd::scale(s,s,s));
scaler->getOrCreateStateSet()->setMode(GL_RESCALE_NORMAL,osg::StateAttribute::ON);
}
mt->addChild(scaler);
//好像下面的是设置飞机的模型位置
osg:uat rotation;
rotation.makeRotate(osg:egreesToRadians(90.0),0.0,0.0,1.0);
osg::EllipsoidModel* ellipsoid = csn->getEllipsoidModel();
if (ellipsoid)
{
osg::Matrix inheritedMatrix;
inheritedMatrix.makeIdentity();
osg::Matrixd matrix(inheritedMatrix);
//osg::Matrixd matrix;
ellipsoid->computeLocalToWorldTransformFromLatLongHeight(39.9,116.3,100000,matrix);
matrix.preMultRotate(rotation);
mt->setMatrix(matrix);
}
csn->addChild(mt);
viewer->setSceneData(csn.get());
viewer->realize();
viewer->run();
return 0;
}
对于上面的代码还有一处疑问,ellipsoid->computeLocalToWorldTransformFromLatLongHeight(39.9,116.3,100000,matrix);中的第三个参数是什么意思 当我把这个值设置小一点的时候,当相机拉近的时候飞机的模型就会消失,不知道是什么原因。 |
|