首先粒子在地球上位置摆放很简单:
//传入的经纬度坐标 osg::Vec3d geoPoint; const SpatialReference* latLong = SpatialReference::get("wgs84"); //偏移在地球上的点 GeoPoint point(latLong, geoPoint.x(), geoPoint.y(), geoPoint.z(), eMode); osg::Matrix matrixGood; point.createLocalToWorld(matrixGood); //添加了spark里的osg::MatrixTransform直接设置矩阵就OK了 pMatrix->setMatrix(matrixGood);
Spark粒子在跟踪节点移动时候,有两种方式:
- 被一个MatrixTransForm节点添加,直接移动MatrixTransForm节点
这时候会有一些效果出现问题,比如,粒子移动时,想要spark已经喷射出的粒子不随MatrixTransForm移动的话就不能够实现。
我们来分析:spark是作为一个可渲染叶节点osg::Drawable添加进osg中的,这是一个整体。所以当它的父节点移动时,它必然移动。
2.基于以上原因,我们要移动的就应该是spark的喷射器了,这一点在osgspark的例子中也给出了方式,将spark直接加入到一个不动的场景节点中,然后在每帧更新的时候更新spark中的喷射器位置。
这个如果spark需要偏移不是特别远的时候也是可以使用的。
但是在osgEarth中使用的话,由于偏移的精度原因(或其他不知道的原因)会造成spark粒子出现问题:喷出的粒子不做公告牌运算了···
结合以上方式,经过不断测试,我发现可以将spark节点添加进MatrixTransForm中,并只在初始化时偏移一次MatrixTransForm到地球表面上,然后需要移动时,再偏移spark的相对位置。。。这样出来的效果是最好的。
那么现在就是要不断做地球经纬度偏移在xyz中的转换了