首先粒子在地球上位置擺放很簡單:
//傳入的經緯度坐標 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中的轉換了