查看: 1956|回复: 7

判断点是否在视口范围内

[复制链接]

该用户从未签到

发表于 2011-4-4 17:43:01 | 显示全部楼层 |阅读模式
//nehe44课光晕
while(!viewer.done())
{
  GLfloat t;
  osg::Matrix proj,modl,mvp;
  proj=viewer.getCamera()->getProjectionMatrix();//camera为场景主相机
  modl=viewer.getCamera()->getViewMatrix();
  mvp=modl*proj;
osg::Matrix currmar;
  currmar(0,0)=mvp(3,0)-mvp(0,0);
  currmar(0,1)=mvp(3,1)-mvp(0,1);
  currmar(0,2)=mvp(3,2)-mvp(0,2);
  currmar(0,3)=mvp(3,3)-mvp(0,3);
  t = GLfloat(sqrt(currmar(0,0) * currmar(0,0) + currmar(0,1) * currmar(0,1) + currmar(0,2) * currmar(0,2) ));
  currmar(0,0) /= t;
  currmar(0,1) /= t;
  currmar(0,2) /= t;
  currmar(0,3) /= t;
//求下右,远近的其他几个面,
省略
。。。。。。。。。
//
if(PointinFrum(currmar))//如果在视口范围内
{
Messagebox(NULL,"","",nULL);
}
}
}
其中
//判断在0,0,0点模型是否在视口范围内
bool PointinFrumosg::Matrix mvp )
{

int i;
for(i = 0; i < 6; i++)
{
  if(mvp(i,0) *0 + mvp(i,1) *0 + mvp(i,2) * 0+  mvp(i,3) <= 0)
  {
   return(FALSE);
  }
}
return(TRUE);
}
//*************
     我哪写的不对,为什么,我把模型移除视口了,还是弹出box;请各位帮忙看看。
    有没有更好的解决办法。
//*************

该用户从未签到

发表于 2011-4-5 09:12:48 | 显示全部楼层
具体的判断算法请参考雨雪粒子的裁减部分
osg:olytope frustum;
    frustum.setToUnitFrustum(false,false);
    frustum.transformProvidingInverse(*(cv->getProjectionMatrix()));
    frustum.transformProvidingInverse(*(cv->getModelViewMatrix()));

if (!frustum.contains(point)) return false;

该用户从未签到

发表于 2011-4-5 09:13:56 | 显示全部楼层
前些日子夜在搞光晕,已经测试过,此方法可行

该用户从未签到

 楼主| 发表于 2011-4-5 10:42:25 | 显示全部楼层
多谢,解决了

该用户从未签到

 楼主| 发表于 2011-4-5 11:01:38 | 显示全部楼层
回复 2# fenma3422


    问一下,判断某个点是否位于当前场景物体的前面,用哪个,当牛跑到相机后面时, 就不对了

该用户从未签到

发表于 2011-4-5 15:33:24 | 显示全部楼层
不明白你的意思

该用户从未签到

 楼主| 发表于 2011-4-6 11:09:15 | 显示全部楼层
回复 6# fenma3422
也就是如何判断物体是被遮挡;
osg::Vec3 p_start(0,0,0);
   
   osg::Vec3 p_end= viewer->getCamera()->getProjectionMatrix().getTrans();
    osg::ref_ptr<osgUtil:ineSegmentIntersector> lsi = new osgUtil::LineSegmentIntersector(p_start, p_end);
    osgUtil::IntersectionVisitor iv(lsi.get());
    _node->accept(iv);
    if (lsi->containsIntersections())
    {
    }
是 p_start, p_end位置不对吗,如何处理

该用户从未签到

发表于 2011-4-6 21:46:43 | 显示全部楼层
你用深度测试不行么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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