zoukankan      html  css  js  c++  java
  • [原][osg][osgEarth][粒子特效]关于粒子特效库在osgEarth中,位置摆放问题,跟踪节点移动问题

    首先粒子在地球上位置摆放很简单:

    //传入的经纬度坐标
    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粒子在跟踪节点移动时候,有两种方式:

    1. 被一个MatrixTransForm节点添加,直接移动MatrixTransForm节点

    这时候会有一些效果出现问题,比如,粒子移动时,想要spark已经喷射出的粒子不随MatrixTransForm移动的话就不能够实现。

    我们来分析:spark是作为一个可渲染叶节点osg::Drawable添加进osg中的,这是一个整体。所以当它的父节点移动时,它必然移动。

    2.基于以上原因,我们要移动的就应该是spark的喷射器了,这一点在osgspark的例子中也给出了方式,将spark直接加入到一个不动的场景节点中,然后在每帧更新的时候更新spark中的喷射器位置。

             这个如果spark需要偏移不是特别远的时候也是可以使用的。

             但是在osgEarth中使用的话,由于偏移的精度原因(或其他不知道的原因)会造成spark粒子出现问题:喷出的粒子不做公告牌运算了···

    结合以上方式,经过不断测试,我发现可以将spark节点添加进MatrixTransForm中,并只在初始化时偏移一次MatrixTransForm到地球表面上,然后需要移动时,再偏移spark的相对位置。。。这样出来的效果是最好的。

    那么现在就是要不断做地球经纬度偏移在xyz中的转换了

  • 相关阅读:
    解决跨域问题的后端解决方案
    java-反射
    验证接口实现类对于接口中所有方法是否都要重写?
    完成Triangle时遇到的问题
    刚知道的一种算法
    完成ATM编程练习题时遇到的问题
    完成Account编程练习遇到的问题
    完成StopWatch编程练习题时遇到的一些问题
    Window环境下Java备份和恢复Mysql数据
    IDEA导入项目不下载依赖问题
  • 原文地址:https://www.cnblogs.com/lyggqm/p/6872225.html
Copyright © 2011-2022 走看看