查看: 1715|回复: 3

模型加载之自动缩放 随机旋转 对齐法线 随机缩放

[复制链接]
  • TA的每日心情
    开心
    2020-3-20 17:50
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2020-3-17 09:44:04 | 显示全部楼层 |阅读模式
    本帖最后由 liyihongcug 于 2020-3-17 20:01 编辑

    //osg中光照只会对有法线的模型起作用,而模型经过缩放后法线是不会变得,
                    //所以需要手动设置属性,让法线随着模型大小变化而变化。GL_NORMALIZE 或 GL_RESCALE_NORMAL
                    model->getOrCreateStateSet()->setMode(GL_RESCALE_NORMAL, osg::StateAttribute::ON);


    自动缩放 随机自己设置

    模型驱动其他要点,显示模式,最大range 最小range  lOD缩放 paped
    LOD算法步骤:
    1.根据用户设定的距离模式(视点到包围球中心距离,在屏幕上占有的像素大小),计算一个距离;
    2.判断_rangeList的尺寸与numChildren,如果小于孩子数量就让numChildren与_randgelist的数量相等
    3.遍历numChildren,在范围内的就accep(nv),不accept(nv)的节点将不会被渲染遍历到就不会被渲染出来
    pagedLOD继承了LOD其traveser比LOD复杂得多,先看看算法步骤:
    1.如果遍历器类型是CULL_VISITOR,就把该遍历器上一帧遍历完成后的帧数记录下来(意思就是保存上一帧是第几帧)。
    2.对于每一个孩子计算其距离(required_range),跟LOD的相同。
    3.循环_rangeList(这个东西保存了所有孩子的范围),判断刚才计算到的required_range是否在某个个_rangeList里面,如果范围链的尺寸没有超过当前孩子的数量就accept(显示) 。4.加载之前消失的节点 blog.csdn.net/qq_16123279/article/details/82665053
  • TA的每日心情
    开心
    2020-3-20 17:50
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2020-3-18 11:19:37 | 显示全部楼层
    本帖最后由 liyihongcug 于 2020-3-21 22:20 编辑

    osg漫游器重新设计
    相机平移  前 后 左 右 升高 下降(视高)
    相对于相机本身  抬头  低头(俯仰角) 左转 右转(方位角)   
    相对于屏幕中心点的飞机 远离 (观察到俯仰角也在变化) 逆时针 顺时针  向上旋转 向下旋转

    osgEarth加载模型后底部出现遮挡加上自动平面裁剪避免遮挡:osgearth关于近地面Camera远近裁剪面的设置
    视点接近地面时,由于默认的近裁剪面near太大,导致看不见靠近摄像机的物体,这时需要重新调节near和far的值(或者near/far的比率),可以使用osgEarth::Util::AutoClipPlaneCullCallback(osgEarth::MapNode* mapNode)
    例如:
    osgViewer::Viewer viewer;
    viewer.getCamera()->addCullCallback( new osgEarth::Util::AutoClipPlaneCullCallback(mapNode) );
  • TA的每日心情
    开心
    2020-3-20 17:50
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2020-3-31 13:21:26 | 显示全部楼层
    osgEarth2.8添加模型
    #include <osgEarthDrivers/model_simple/SimpleModelOptions>



    SimpleModelOptions modelOptions;
    modelOptions.url() = "cow.osg.(100,100,100).scale";
    modelOptions.location() = osg::Vec3(116, 40, 100);//北京地区坐标
    map->addModelLayer(new ModelLayer("model layer", modelOptions));

    //视点定位北京地区
    osgEarth::Viewpoint vp("", 116, 40, 0.0, -2.50, -90.0, 1.5e6);
    (dynamic_cast<EarthManipulator*>(viewer.getCameraManipulator()))->setViewpoint(vp);





    有时候模型没有纹理,需要.osgearth_shadergen插件

    osg::Node* cessna = osgDB::readNodeFile("data/model/su33.ive.osgearth_shadergen.1.scale");

    该用户从未签到

    发表于 2020-7-15 09:17:07 | 显示全部楼层
    前辈,请教一下SimpleModel的形式加载模型和以ModelNode的形式加载有什么区别
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    OSG中国官方论坛-有您OSG在中国才更好

    网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

    联系我们

    • 工作时间:09:00--18:00
    • 反馈邮箱:1315785073@qq.com
    快速回复 返回顶部 返回列表