查看: 2872|回复: 18

怎么画某个面与模型的交线

[复制链接]

该用户从未签到

发表于 2013-1-29 13:45:37 | 显示全部楼层 |阅读模式
想实现这样的功能:场景当中加载了一个模型,然后想画出比如Z=10这个平面与加载模型的交线,主要想把相交的线画出来。请问用多面体求交来做吗?怎么绘制这条曲线

该用户从未签到

发表于 2013-1-29 20:09:31 | 显示全部楼层
就是平面求交

该用户从未签到

发表于 2013-1-30 08:11:23 | 显示全部楼层
planeIntersection  worldPoint 就行了

该用户从未签到

 楼主| 发表于 2013-1-30 09:12:49 | 显示全部楼层
liuzhiyu123 发表于 2013-1-30 08:11
planeIntersection  worldPoint 就行了

还是不太清楚,对这块不太熟悉,能不能再讲仔细一点,谢谢。

该用户从未签到

 楼主| 发表于 2013-1-30 09:20:15 | 显示全部楼层
shininglwb 发表于 2013-1-30 09:12
还是不太清楚,对这块不太熟悉,能不能再讲仔细一点,谢谢。

我现在的情况是可以求得模型与平面是否相交,但是不知道怎么获取那些交点坐标来画出或者Highlight这条交线

该用户从未签到

发表于 2013-1-30 15:05:46 | 显示全部楼层
osg:lane plane(osg::vec4(10,0,0,0));
osgUtil::PlaneIntersector* pi = new osgUtil::PlaneIntersector(plane);
osgUtil::IntersectionVisitor iv(pi);

if(pi->containsIntersections())
{
for(osgUtil::PlaneIntersector::Intersections::iterator it = pi->getIntersections().begin();
      it!=pi.getIntersections().end(); it++)
{
//交点坐标
std::vector<osg::vec3d> intersectPoints = it->polyline;
//对应的参考矩阵
osg::RefMatrix mat = it->matrix;
}
}

该用户从未签到

 楼主| 发表于 2013-1-30 17:13:19 | 显示全部楼层
wanggang8826 发表于 2013-1-30 15:05
osg:lane plane(osg::vec4(10,0,0,0));
osgUtil:laneIntersector* pi = new osgUtil:laneIntersecto ...

请问一下,这段代码的意思是构建一个X=10的平面与场景进行求交运算,然后把求交后得到的焦点保存起来吗?我尝试了,但是调试发现求交结果为空,当然我用的是Z=15这个平面。之前用多面体求交是可以判断有相交的。

该用户从未签到

发表于 2013-1-31 09:16:29 | 显示全部楼层
shininglwb 发表于 2013-1-30 17:13
请问一下,这段代码的意思是构建一个X=10的平面与场景进行求交运算,然后把求交后得到的焦点保存起来吗? ...

(⊙o⊙)…写错了X=10的平面应该是osg::vec4(1,0,0,-10)。当然你用Z=15平面也一样,你没有得到交点是不是你的模型太小啊,你试一下在原点绘制一个半径为20的球,然后再用Z=15平面求交。

该用户从未签到

发表于 2013-1-31 09:18:48 | 显示全部楼层
漏了一句,在osgUtil::IntersectionVisitor iv(pi);之后添加node->accept(pi);

该用户从未签到

 楼主| 发表于 2013-1-31 10:11:35 | 显示全部楼层
wanggang8826 发表于 2013-1-31 09:18
漏了一句,在osgUtil::IntersectionVisitor iv(pi);之后添加node->accept(pi);

非常感谢你的指点。我尝试了画了一个半球为20的球,然后用Z=15的平面去求交线,然后画出来是可以的。之前没有检测到的原因可能是模型高度或者其他的问题,我找一下。再次感谢

该用户从未签到

 楼主| 发表于 2013-1-31 10:35:14 | 显示全部楼层
wanggang8826 发表于 2013-1-31 09:18
漏了一句,在osgUtil::IntersectionVisitor iv(pi);之后添加node->accept(pi);

ok,问题解决了。多谢你的不吝赐教

该用户从未签到

发表于 2013-1-31 14:07:26 | 显示全部楼层
shininglwb 发表于 2013-1-31 10:35
ok,问题解决了。多谢你的不吝赐教

不用客气,我也是前段时间也遇到过而已,顺便整理一下

该用户从未签到

发表于 2013-2-18 17:41:27 | 显示全部楼层
wanggang8826 发表于 2013-1-31 09:18
漏了一句,在osgUtil::IntersectionVisitor iv(pi);之后添加node->accept(pi);

这个面是不是只能是通过osg:lane plane(osg::Vec4(0,1,0,-10));设置?如果想要实现自己绘制的面进行相交可以么?

该用户从未签到

发表于 2013-2-19 10:53:24 | 显示全部楼层
Berly 发表于 2013-2-18 17:41
这个面是不是只能是通过osg:lane plane(osg::Vec4(0,1,0,-10));设置?如果想要实现自己绘制的面进行相交 ...

自己绘制的面你指的是用鼠标随意画出的面吗?那样你得首先求出面的平面方程,然后再使用平面求教器

该用户从未签到

发表于 2013-2-19 14:58:29 | 显示全部楼层
wanggang8826 发表于 2013-2-19 10:53
自己绘制的面你指的是用鼠标随意画出的面吗?那样你得首先求出面的平面方程,然后再使用平面求教器

哦,就是说是可以的哈,只要转换成Ax+By+Cz+D=0的形式就可以了,对么?谢谢哈

该用户从未签到

发表于 2013-2-20 08:40:11 | 显示全部楼层
Berly 发表于 2013-2-19 14:58
哦,就是说是可以的哈,只要转换成Ax+By+Cz+D=0的形式就可以了,对么?谢谢哈

对啊,将A、B、C、D四个参数传递给plane就行了

该用户从未签到

发表于 2013-2-20 09:27:12 | 显示全部楼层
wanggang8826 发表于 2013-2-20 08:40
对啊,将A、B、C、D四个参数传递给plane就行了

谢谢,再问个问题,是不是只能得到相交的点,得不到该面分割成的球的上半部分和下半部分,就是说不能用来切割么?

该用户从未签到

发表于 2013-2-20 09:48:43 | 显示全部楼层
只能得到相交的点,不能得到被“切割”的两部分,那个要自己实现,估计麻烦的很。这个不像现实中的切西瓜,一刀下去两半了。这个问题就和碰撞检测一样,游戏里面的人物怎么可以穿墙而过呢。在屏幕上看到的东西都是假的,只是看上去很规则的带有颜色的发光像素阵列而已。(⊙o⊙)…,我发现我好啰嗦。。。。

该用户从未签到

发表于 2013-2-20 09:52:30 | 显示全部楼层
osg自己有PlaneIntersector就可以完成平面与模型求交,得到的结果中就包含了Polyline。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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