查看: 1567|回复: 4

关于利用matrixtransform类型节点进行交集测试的问题!

[复制链接]

该用户从未签到

发表于 2012-9-10 21:57:54 | 显示全部楼层 |阅读模式
如题:先上代码:
int getCollisionPointMask(osg::Vec3 pos,osg::Node * node , osg::Matrix localMatrix)
{


        //球场节点为空则返回0
        if (!node )
                return 0;

        osg::Vec3f fromPoint=localMatrix.preMlt(pos+osg::Vec3(0,0,100));
        osg::Vec3f toPoint=localMatrix.preMlt(pos+osg::Vec3(0,0,-10));

        osgUtil::IntersectVisitor iv;
        //iv.setTraversalMask(_intersectTraversalMask);

        osg::ref_ptr<osg:ineSegment> segForward = new osg::LineSegment;
        segForward->set(fromPoint,toPoint);

        if (!segForward->valid())
                return 0;

        iv.addLineSegment(segForward.get());

        node->accept(iv);


        if (iv.hits())
        {
                osgUtil::IntersectVisitor::HitList& hitList = iv.getHitList(segForward.get());
                if (!hitList.empty())
                {
                        osg::Vec3d ip = hitList.front().getWorldIntersectPoint();

                        //得到物体
                        //osg::ref_ptr<osg::Node> node = new osg::Node();
                        //osg::ref_ptr<osg::Group> parent = new osg::Group();

                        osgUtil::IntersectVisitor::HitList::iterator itr;
                        itr=hitList.begin();
                        osg::NodePath& nodePath = itr->_nodePath;

                        osg::ref_ptr<osg::Node> node = (nodePath.size()>=1)?nodePath[nodePath.size()-1]:0;
                        osg::ref_ptr<osg::Group> parent = (nodePath.size()>=2)?dynamic_cast<osg::Group*>(nodePath[nodePath.size()-2]):0;

                        if ( parent->getNodeMask()==291)
                        {
                                //        PhysicsManager::terrain = parent->getNodeMask();
                                return parent->getNodeMask();
                        }

                        //输出接点信息
                        /*std::string strParentNode = parent->getName();
                        std::string strSelfNode        = node->getName();



                        if (strParentNode!=""|| strSelfNode!="")
                        {       
                        std::cout<<"*************************************************************"<<std::endl;
                        std::cout<<"arent NodePath:"<< parent->getName() <<",Parent NodePathMask:"<<parent->getNodeMask()<<std::endl;
                        std::cout<<"Self NodePath:"<< node->getName()          <<",Self NodePathMask:"  <<node->getNodeMask()  <<std::endl;
                        std::cout<<"*************************************************************"<<std::endl;
                        }*/

                        //没有得到掩码
                        return 0;
                }

                //碰撞点空
                return 0;
        }

        return 0;

}



代码大致如上,相信这个一看大家都明白要干什么!代码仅仅表示一下意思而已!

现在有一个问题,我用max建的模型,当上边的那个矩阵localMatrix拿的是一个节点类型为matrixtransform类型的节点的矩阵的时候,交集测试竟然拿不到交集,也就是没有交点!但是,我修改建模的一些方式,是之前的那个节点从matrixtransform类型group类型的节点的时候,就可以进行交集测试,拿到交集了!我真的不明白为什么会有这个问题?matrixtransform节点为什么不能进行局部的交集测试呢,而group类型的节点可以!

另外,对于maya模型,不论是matrixtransform类型的节点还是group类型的节点,都可以进行交集测试拿到交集,就是max建的模型会存在这个问题!


还请高手指教,真的不明白!很疑惑,各位指点指点吧,拜谢拜谢!!!!

该用户从未签到

 楼主| 发表于 2012-9-11 10:56:36 | 显示全部楼层
我在程序中用了这么一句,m_matWToGreen.set(osg::computeWorldToLocal(this->getNodePath()));就是在节点遍历中找到这个节点以后算的,难道是这个算法的问题?
我比较了一下max与maya模型,导成osg文件的情况!
如下图:
max模型(节点类型为Matrixtransform):
max.jpg

maya模型(节点类型为Matrixtransform): maya.jpg

max模型(节点类型为Group): max1.jpg
为什么maya的那个节点,matrix矩阵里边第四行跟max模型里边的matrix矩阵的第四行不一样呢?一个是有值的,一个是没有值得,这个是什么意思呢??

那这个时候,为什么将max模型的那个节点改成group类型的节点以后,里边却没有了matrix矩阵,而这个时候,不改变程序任何内容,出现的结果跟maya是一样的,这个之间有何玄机呢??

问题较多,望大家讨论一下,我实在想不出什么原因了!随便发表一下看法都行,没准能有所启发!

该用户从未签到

发表于 2012-9-11 20:17:55 | 显示全部楼层
这块也不是很清楚,总感觉取出矩阵的时候,都是取出它父节点的getmatrix的才有矩阵,自己取的话就是单位阵。

该用户从未签到

 楼主| 发表于 2012-9-11 22:16:30 | 显示全部楼层
starmessage 发表于 2012-9-11 20:17
这块也不是很清楚,总感觉取出矩阵的时候,都是取出它父节点的getmatrix的才有矩阵,自己取的话就是单位阵。 ...

我感觉那个computeWorldToLocal()已经算了所有的节点了啊,这个节点路径里边算了他的父节点了。可是为什么不对呢?
还有一个特别奇怪的是,在程序不变的情况下,为什么对maya所建的模型没有问题呢?是不是maya模型建的跟max又不一样的地方呢?

还有一个地方比较奇怪,就是上图中的maya建的模型,那个矩阵是个单位矩阵,但是max的不是,不知道那个矩阵是什么意思!恶心呐!!!不懂啊,期待高手解救!

该用户从未签到

发表于 2012-9-12 07:56:34 | 显示全部楼层
本帖最后由 liuzhiyu123 于 2012-9-12 07:57 编辑

不同的建模软件导出的场景树可能不同,因为导出插件不是同一个人完成的,虽然最后的结果相同,但是场景树的结构可以不同
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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