查看: 2439|回复: 6

碰撞检测的问题

[复制链接]

该用户从未签到

发表于 2008-8-6 22:02:01 | 显示全部楼层 |阅读模式
想实现的功能:当吊具下放的时候检测,是否碰到集装箱,是的话停止下放,可惜不知道哪出了什么问题,我觉得关键可能是无法获取DOFTransfrom节点的position值,所以检测线段构造有问题,请教大家怎么解决,谢谢了

#include "chqDataType.h"
using std::endl;

chqDataType::chqDataType(osg::Node* n)
{       
        m_x=0.0;
        m_z=0.0;
        //获取吊具节点
        findNodeVisitor findDiaoJu("master_1");
        n->accept(findDiaoJu);
        diaojuNode=dynamic_cast<osgSim:OFTransform*>(findDiaoJu.getFirst());

        //获取吊绳节点
        findNodeVisitor findRope("rope_1");
        findDiaoJu.getFirst()->accept(findRope);
        ropeNode=dynamic_cast<osgSim::DOFTransform*>(findRope.getFirst());

        findNodeVisitor findRopeC("rope_c_1");
        findDiaoJu.getFirst()->accept(findRopeC);
        ropeCNode=dynamic_cast<osgSim::DOFTransform*>(findRopeC.getFirst());

        //获取吊钩节点
        findNodeVisitor findHook("hook_pj_1");
        findDiaoJu.getFirst()->accept(findHook);
        hookNode=dynamic_cast<osgSim::DOFTransform*>(findHook.getFirst());
}

chqDataType::~chqDataType(void)
{

}

void chqDataType::updateDiaoJuMove()
{
  
   if (m_x<=12.0)
   {
          //移动吊具
          m_x += 0.1;
      diaojuNode->setCurrentTranslate(osg::Vec3(m_x,0,0));
   }
   else
   {
     //放下吊钩
     updateHookDown();
   }
}
void chqDataType::updateHookDown()
{
     if (m_z>=-8)
         {
                 //放下吊钩
                 m_z-=0.05;
                 hookNode->setCurrentTranslate(osg::Vec3(0,0,m_z));

                 //伸缩吊绳
                 ropeNode->setCurrentScale(osg::Vec3(1,1,1+abs(m_z)/3));
                 ropeCNode->setCurrentScale(osg::Vec3(1,1,1+abs(m_z)/1.55));

                 osgUtil::IntersectVisitor iv;
                 osg::ref_ptr<osg:ineSegment> segDown=new osg::LineSegment();
                 
                 const osg::BoundingSphere& bs=hookNode->getBound();

                 float zMax=bs.center().z()+bs.radius();
                 float zMin=bs.center().z()-bs.radius();
         std::cout<<zMax<<zMin<<std::endl;
                 segDown->set(osg::Vec3(-20,0,20),osg::Vec3(-20,0,0));
                 iv.addLineSegment(segDown.get());

                 hookNode->accept(iv);
               
            if(iv.hits())
        {
          osgUtil::IntersectVisitor::HitList& hitList = iv.getHitList(segDown.get());
          if(!hitList.empty())
            {
              osgUtil::Hit heightTestResults;
              heightTestResults = hitList.front();

                          //与箱子发生碰撞,因此停止运动
                          std::cout<<"吊到箱子了"<<std::endl;
             }
          }
         }
}

该用户从未签到

发表于 2008-8-7 09:29:41 | 显示全部楼层
DOFTransform的特性可以参考Multigen软件中DOF的用法,它更多地被用来控制各种关节的运动。
您的设计如果使用PositionAttitudeTransform会不会更方便一些?平移、旋转和缩放,以及当前位置矩阵的取得都很简单,也更常用一些。

该用户从未签到

 楼主| 发表于 2008-8-7 17:45:09 | 显示全部楼层
谢谢版主的回答,实际上我也更倾向于使用PositionAttitudeTransform,但是进行如下转换发生错误,模型中节点为DOF节点,请问这是为什么呢?
diaojuNode=dynamic_cast<osgSim:OFTransform*>(findDiaoJu.getFirst());

该用户从未签到

 楼主| 发表于 2008-8-7 17:45:47 | 显示全部楼层
或者有什么方法能将节点转换为PositionAttitudeTransform类型?

该用户从未签到

发表于 2008-8-7 20:19:50 | 显示全部楼层
不可以把DOFTransform节点转换成PositionAttitudeTransform节点,两者之间没有继承特性。
声明时就要声明为PositionAttitudeTransform的指针或变量

该用户从未签到

 楼主| 发表于 2008-8-7 20:39:54 | 显示全部楼层
//吊具节点声明
        osg:ositionAttitudeTransform* diaojuNode;

        //获取吊具节点
        findNodeVisitor findDiaoJu("master_1");
        n->accept(findDiaoJu);
        diaojuNode=dynamic_cast<osg::PositionAttitudeTransform*>(findDiaoJu.getFirst());
需要操作的节点是Creator模型中的一部分,查询到的应该是node类型,这个在程序里面转换是错误的,想不通怎么转换?

该用户从未签到

发表于 2008-8-7 21:00:40 | 显示全部楼层
原帖由 湖面之舟 于 2008-8-7 20:39 发表
//吊具节点声明
        osg:ositionAttitudeTransform* diaojuNode;

        //获取吊具节点
        findNodeVisitor findDiaoJu("master_1");
        n->accept(findDiaoJu);
        diaojuNode=dynamic_cast(findDiaoJu.getFirst());
需 ...


Node类型也是不可以转换为PositionAttitudeTransform类型的,反过来则是可以的。
您需要了解模型文件中这个节点具体是什么类型,如果不是Transform或者其派生节点,那么就没有办法执行平移等操作;当然如果模型文件中节点已经是DOFTransform,那么使用dynamic_cast转换为DOFTransform是可以的,此时请了解DOF的特性并实现其功能
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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