查看: 2656|回复: 11

请教关于osg::Polytope::TransformProvidingInverse的使用

[复制链接]

该用户从未签到

发表于 2010-7-1 17:54:37 | 显示全部楼层 |阅读模式
我想判断节点是否处于当前的视锥体内,看了几个关于这个问题的帖子,
现在,我大致的思路如下:
在主相机的更新回调中设置如下代码:
osg::matrix proj,modl,mvp;
proj=camera->getProjectionMatrix();//camera为场景主相机
modl=camera->getViewMatrix();
mvp=proj*modl;
m_Polytope->SetToUnitFrustum();
m_Polytope->TransformProvidingInverse(mvp);

最后利用节点的包围球和m_Polytope中得到的视锥体的面进行比较。

不知我的思路是否正确,请大家指教,谢谢!

该用户从未签到

发表于 2010-7-2 08:27:32 | 显示全部楼层
把每帧的MVP矩阵更新到m_Polytope中,这样应该可以得到当前的视锥体大小。注意MVP矩阵是camera->getViewMatrix() * camera->getProjectionMatrix();您这里似乎连乘的顺序不正确

该用户从未签到

 楼主| 发表于 2010-7-2 15:20:51 | 显示全部楼层
我在场景中,加了两个节点:
一个节点用于标记某点的位置,比如在osg::vec3(20.0,0.0,0.0)处,画一个球体
另外一个节点(比如cow)用来表示:当球体超出当前视锥体时,牛就隐藏,否则就显示。
然后用上述方法来判断节点是否处在当前的视锥体内(mvp顺序采用楼上的建议)
用鼠标向某个方向(比如向左)移动球体,直到看不见(超出当前视锥体),可牛仍然显示
具体原因,正在查找中。。。。。

该用户从未签到

发表于 2010-7-2 15:33:47 | 显示全部楼层
牛能显示证明在视锥体里头吧~~~

该用户从未签到

 楼主| 发表于 2010-7-2 15:38:00 | 显示全部楼层
谢谢。。
牛确实是在当前的视锥体
但是当球体移出当前的视锥体后
我就设置牛的nodemask(0),即:隐藏牛

该用户从未签到

 楼主| 发表于 2010-7-3 09:01:38 | 显示全部楼层
使用nehe教程中使用的方法搞定了

该用户从未签到

发表于 2010-7-5 08:28:03 | 显示全部楼层
能否向大家介绍一下您的方法呢

该用户从未签到

 楼主| 发表于 2010-7-5 09:46:18 | 显示全部楼层
本帖最后由 csu_zjh 于 2010-7-5 09:54 编辑

根据当前的投影矩阵(P)和模型视图矩阵(M)计算出一个裁剪矩阵C(M*P)
利用裁剪矩阵C再计算视锥体各个面的方程:
具体的过程可参考:
http://blog.csdn.net/whoismickey/archive/2009/03/22/4015638.aspx
http://blog.csdn.net/houdy/archive/2004/10/31/161222.aspx
计算过程中,注意osg和opengl矩阵行列优先顺序的区别,以及各个面的系数均需单位化就可以了
最后根据点(节点包围球球心)到视锥体各个面(各面法线均指向椎体内)的有符号距离来判断节点是否处于当前的视锥体内

该用户从未签到

发表于 2010-7-5 11:32:18 | 显示全部楼层
感谢分享~

该用户从未签到

发表于 2010-10-28 16:27:44 | 显示全部楼层
您好,我遇到一些关于视锥体计算上面的困惑,看了您的帖子,我自己怎么计算都有问题,我是这样的思路,因为 opengl是列主序,OSG是行主序,所以我先将
m_viewer->getCameraManipulaor()->getInverseViewMatrix()和m_viewer->getCamera()->getProJectionMatrix()转置,之后,  计算MVP,然后根据您给出的链接地址,抽取了6个面,然后,根据颠到平面的距离,判断是否是在视景体呢。。可是我的结果是错误的。。我QQ313364973,如果您方便,可以加我QQ。。。非常感谢。。

该用户从未签到

发表于 2010-10-29 08:17:54 | 显示全部楼层
所以我先将
m_viewer->getCameraManipulaor()->getInverseViewMatrix()和m_viewer->getCamera()->getProJectionMatrix()转置
事实上不需要,您只需使用matrix.ptr()就可以得到OpenGL中使用的float*矩阵数组了。至于为什么,事实上可以说OpenGL欺骗了您——它自称是列主序的(所有相关书籍也是这样写的),但是在您向glMultMatrix传递数据时,却不得不使用行主序矩阵传递

该用户从未签到

发表于 2010-10-29 09:08:05 | 显示全部楼层
OK, 那应该是这个原因了,我试试,谢谢阿ray~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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