查看: 717|回复: 0

按照视频(第十一讲)里做碰撞检测,程序一直出现问题

[复制链接]

该用户从未签到

发表于 2016-4-29 17:58:28 | 显示全部楼层 |阅读模式
代码没有报出任何的问题。在win10系统下和win7系统运行之后,就崩了严重的直接死机,只有在一台win8上运行没有问题,困扰我一星期了。。。谢谢各位大神!!!
#include "../Common/Common.h"

#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osg/Geode>
#include <osg/ShapeDrawable>
#include <osg/Geometry>

#include <osgUtil/IntersectionVisitor>

#include <iostream>

#ifdef _DEBUG
#pragma comment(lib, "../Debug/Common.lib")
#else
#pragma comment(lib, "../Release/Common.lib")
#endif

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:rawArrays(osg:rimitiveSet:INE_LOOP, 0, 2));

        return gnode;
}

osg::ref_ptr<osg::Geode> CreateSphere(const osg::Vec3d &center)
{
        osg::ref_ptr<osg::Geode> gnode = new osg::Geode;
        gnode->addDrawable(new osg::ShapeDrawable(new osg::Sphere(center, 0.5)));
        return gnode;
}

osg::ref_ptr<osg::Geode> CreateBox()
{
        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;
}


int main()
{
        osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
        osg::ref_ptr<osg::Group>  group = new osg::Group;
        osg::Vec3 start = osg::Vec3(-10, 7, 15);
        osg::Vec3 end = osg::Vec3(5, -4, -12);
        //std::cout<<"a";

        //
        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);
        //std::cout<<"a";
        //

        //osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("glider.osg");
        //std::cout<<"a";
        osg::ref_ptr<osg::Geode> node =CreateBox();
        group->addChild(node);
        //std::cout<<"a";
        node->accept(*iv.get());
        //std::cout<<"a";
        group->addChild(CreateLine(start,end));
        //std::cout<<"a";

        //如果有碰撞,则输出所有的交点
        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()));
                }
        }
        //         else
        //         {
        //                 std::cout<< ls->containsIntersections() << sendl;
        //         }

        viewer->setSceneData(group);
        return viewer->run();
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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