查看: 2684|回复: 8

请教关于裁剪的问题

[复制链接]

该用户从未签到

发表于 2009-10-14 20:52:18 | 显示全部楼层 |阅读模式
在场景中,读入了2个模型做为节点。
节点A的外接球半径 约为 节点B的 6000+ 倍。
2个节点同时显示在场景中时,将视点靠近 节点B 时,发现节点B的部分定点和面被意外的裁掉了。
请教下,这是什么原因呢?
看起来像是 节点A和节点B的 大小相距太远,而造成了计算偏差。

该用户从未签到

 楼主| 发表于 2009-10-14 20:53:36 | 显示全部楼层
PS:  使用的投影方式是 透视 投影。

该用户从未签到

发表于 2009-10-14 23:16:50 | 显示全部楼层
OSG默认是自动计算远近平面的,计算依据是物体的包围球以及远近平面的最大比率,后者可以通过Camera::setNearFarRatio()来设置,设置一个较小的值可以有助于避免您的情况;或者您也可以自己计算远近平面,先设置关闭自动计算DO_NOT_COMPUTE_NEAR_FAR

该用户从未签到

发表于 2009-10-15 11:25:38 | 显示全部楼层
当场景靠近摄像机时,容易出现节点的部分面被剪裁。用Camera::setNearFarRatio()设置很小的值效果也不理想。
最后干脆不用剪裁camera->setCullingMode( osg::CullSettings::NO_CULLING );这时居然仍有很多面被检测。
这是什么原因呢?

该用户从未签到

发表于 2009-10-15 12:00:02 | 显示全部楼层
Culling不是这个剪裁的意思,而是“裁减”,即略去场景中不需要渲染的对象。您的setNearFarRatio设置值是多少,仅仅根据您所提供的信息来看,这个函数足以解决问题了

该用户从未签到

发表于 2009-10-15 13:40:37 | 显示全部楼层
0.000001f(足够小了,实际上0.01效果还好点,哈哈~~)

靠近相机被剪裁
z1.JPG

正常的情况
z2.JPG

该用户从未签到

发表于 2009-10-15 13:42:38 | 显示全部楼层
nearFarRatio用于相机远近剪裁面的自动计算,OSG中的默认处理大致可以认为是:以场景中最远点的深度值做为远剪裁面深度值,并以此为基准,通过nearFarRatio计算近剪裁面深度值,最后使用这两个深度值更新投影矩阵。你看到的被“意外”裁剪的效果,应该是深度值小于近剪裁面的部分。
建议你根据你的场景的实际最大、最小深度值,设置一个合适的远近剪裁比。
如果想更彻底的解决问题,建议自己实现一下osg::CullSettings::ClampProjectionMatrixCallback这个回调(可以以指定的近焦为基准计算远剪裁面),设置给场景主相机(osg::Camera::setClampProjectionMatrixCallback)。

该用户从未签到

 楼主| 发表于 2009-10-18 22:21:08 | 显示全部楼层
谢谢  array,谢谢热心的朋友们。问题已经解决了。
to qele:
你的 nearfar 设得过小了,会出现那种情况。

该用户从未签到

发表于 2009-10-20 17:10:31 | 显示全部楼层
后来发现和ProjecView有关系。透视投影near/far大约是0.0001,设置near_far_rat为0.1,就没有远近平面剪裁错误的情况了。
谢谢各位朋友,快乐~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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