osg学习第三篇:碰撞检测(一)


绘制一个正方体:

//画正方体
osg::ref_ptr<osg::Geode> CreatBox()
{
	osg::ref_ptr<osg::Geode> gnode = new osg::Geode;
	gnode->addDrawable(new osg::ShapeDrawable(new osg::Box(osg::Vec3(0,0,0),10.0,10.0,10.0)));
	//gnode->addDrawable(new osg::ShapeDrawable(new osg::Box(osg::Vec3(0,0,0),0.1,0.1,20)));
	return gnode;
}

 

绘制线段:

//画线
osg::ref_ptr<osg::Geode> CreateLine(const osg::Vec3 &start, const osg::Vec3 &end)
{
	osg::ref_ptr<osg::Geode> gnode = new osg::Geode;
	osg::ref_ptr<osg::Geometry> gy = new osg::Geometry;

	osg::ref_ptr<osg::Vec3Array> coords = new osg::Vec3Array;

	gnode ->addDrawable(gy);
	gy->setVertexArray(coords);
	coords->push_back(start);
	coords->push_back(end);
	gy->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINE_LOOP,0,2));

	return gnode;
}


绘制小球(线段与正方体的碰撞点用小球标记)

//画球
osg::ref_ptr<osg::Geode> CreateSphere(osg::Vec3d ¢er)
{
	osg::ref_ptr<osg::Geode> gnode = new osg::Geode;
	gnode->addDrawable(new osg::ShapeDrawable(new osg::Sphere(center,0.5)));
	return gnode;
}

 

碰撞检测的核心代码

	//碰撞检测核心代码。(线的碰撞)
	osgUtil::LineSegmentIntersector::Intersections intersections;
	osg::ref_ptr<osgUtil::LineSegmentIntersector> ls = new osgUtil::LineSegmentIntersector(start,end);
	osg::ref_ptr<osgUtil::IntersectionVisitor> iv = new osgUtil::IntersectionVisitor(ls);
	//


输出碰撞的点

//输出所有的交点
	if(ls->containsIntersections())
	{
		intersections = ls->getIntersections();
		for(osgUtil::LineSegmentIntersector::Intersections::iterator iter = intersections.begin();iter != intersections.end();iter++)
		{
			std::cout << iter->getWorldIntersectPoint().x()<< "  "<< iter->getWorldIntersectPoint().y()<< "  "<< iter->getWorldIntersectPoint().z()<<std::endl;
			group->addChild(CreateSphere(iter->getWorldIntersectPoint()));
		}
	}

其中,在碰撞点的地方调用画球的函数,添加到组件中:

group->addChild(CreateSphere(iter->getWorldIntersectPoint()));

 

效果图:


 

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值