osgearth看不见靠近摄像机的物体怎么办

本文介绍如何在接近地面视点时调整osgEarth中的Camera裁剪面参数,以解决因默认近裁剪面过大而导致无法看到近处物体的问题。通过使用AutoClipPlaneCullCallback回调函数,可以动态调整near和far的值。

osgearth关于近地面Camera远近裁剪面的设置
视点接近地面时,由于默认的近裁剪面near太大,导致看不见靠近摄像机的物体,这时需要重新调节near和far的值(或者near/far的比率),可以使用osgEarth::Util::AutoClipPlaneCullCallback(osgEarth::MapNode* mapNode)
例如:
osgViewer::Viewer viewer;
viewer.getCamera()->addCullCallback( new osgEarth::Util::AutoClipPlaneCullCallback(mapNode) );

 

osgEarth 中获取地形法线并根据该法线调整物体姿态,通常涉及以下几个步骤: ### 获取地形法线 osgEarth 提供了用于查询地形高度和法线的接口。可以使用 `osg::Geode` 或 `osg::Node` 结合 `osgUtil::LineSegmentIntersector` 来执行射线检测(Ray Intersection),从而获取特定点的地形法线。 ```cpp osg::Geode* createTerrainGeode(osgViewer::Viewer* viewer, const osg::Vec3d& position) { osgUtil::LineSegmentIntersector::CoordinateSystem cs = osgUtil::Intersector::LOCAL; osgUtil::LineSegmentIntersector* intersector = new osgUtil::LineSegmentIntersector(cs, position + osg::Vec3(0, 0, 1000), position - osg::Vec3(0, 0, 1000)); osgUtil::IntersectionVisitor iv(intersector); viewer->getCamera()->accept(iv); if (intersector->containsIntersections()) { const osgUtil::LineSegmentIntersector::Intersection& intersection = intersector->getFirstIntersection(); osg::Vec3 normal = intersection.primitiveIndex >= 0 ? intersection.getPrimitiveNormal() : osg::Vec3(0, 0, 1); return dynamic_cast<osg::Geode*>(intersection.drawable->getParent(0)); } return nullptr; } ``` 通过上述代码,可以获取到与地形交点处的法线向量 `normal`,它表示该点的垂直方向。 ### 根据地形法线调整物体姿态 一旦获取了地形法线,就可以使用它来调整物体的姿态,使其贴合地形表面。一种常见的做法是构建一个旋转矩阵或四元数,将物体的局部 Z 轴对齐到地形法线方向。 ```cpp osg::Matrixd computeRotationToAlignZAxisWithNormal(const osg::Vec3d& normal) { osg::Vec3d up(0.0, 0.0, 1.0); osg::Vec3d axis = up ^ normal; // 计算叉积作为旋转轴 double angle = acos(up * normal); // 计算角度 return osg::Matrixd::rotate(angle, axis); } ``` 使用这个函数生成的矩阵,可以设置物体的变换矩阵以实现姿态调整: ```cpp osg::Geode* geode = ...; // 待调整姿态的物体 osg::MatrixTransform* xform = dynamic_cast<osg::MatrixTransform*>(geode->getParent(0)); if (xform) { xform->setMatrix(computeRotationToAlignZAxisWithNormal(normal)); } ``` 这种方法确保了物体始终朝向地形表面,并且可以有效地用于模拟车辆、人物等需要贴合地面的对象。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值