查看: 2742|回复: 12

OSG与Physx结合的问题 急求!!

[复制链接]

该用户从未签到

发表于 2010-8-23 11:19:58 | 显示全部楼层 |阅读模式
我想在OSG中模拟链子运动,研究了一段时间,想调用Physx物理引擎来模拟运动,但是在两则结合上弄不懂,链子要有很多个节点,这些节点怎么连接,谁有这方面的经验或是例子吗?发我邮箱里也行,zhangdandan304@163.com 谢谢了!

该用户从未签到

 楼主| 发表于 2010-8-23 18:35:55 | 显示全部楼层
我看了一下,在osg中创建节点是可以实现的,但是节点的连接以及运动的模拟还没有思路,哪位高手能给指点一下?

该用户从未签到

发表于 2010-8-24 00:47:55 | 显示全部楼层
我记得NEHE里面有一个关于OpenGL绳子的模拟,,原理跟这个是差不多的,,
http://www.owlei.com/DancingWind/Course/Tutorial_40.htm

该用户从未签到

 楼主| 发表于 2010-8-25 15:51:05 | 显示全部楼层
3# FlySky

管理员您好!

      我想在osg中模拟链子的运动,最近看了论坛中的一些帖子,包括Array的一些发言,是不是现在osg与physx之间的接口只能实现box形状的模拟啊?如果我想模拟链子形状的运动(牵涉节点的连接),是不是就不能用physx来模拟,是不是因为他们之间的接口目前还没有?您的意思是不是我不能用物理引擎,只能自己设定物理分析与运动来实现模拟。
     请问除此之外还有什么办法吗?
     我现在是新手,处于不断摸索的阶段,以前试过softbody,也试过bullet,以及physx,都是模拟成功了,但是不知道怎么和osg结合,请您给指一条道路,一条能实现的方法。谢谢了!

该用户从未签到

发表于 2010-8-25 16:36:22 | 显示全部楼层
您能具体说说您是怎样在physx中实现模拟的?链子是一个一个圆环连接起来的么?
您在physx与osg所用的模型的形状是一样的么?如果是的话,只需要在GetPhysicsResults()之后读取每个节点的位置姿态然后传递给osg应该就可以了。

该用户从未签到

 楼主| 发表于 2010-8-25 18:50:47 | 显示全部楼层
5# aya_daxiang 我的链子是画出来的,就是用四个矩形立方体堆出来的,近看或许不太像,远看还是可以的,描画的源码如下:

NxActor* CreateRing(const NxVec3& pos, const NxVec3& boxDim, const NxReal density)
{
   NxActorDesc actorDesc;
        NxBodyDesc bodyDesc;


    NxBoxShapeDesc boxDesc1;
        
        boxDesc1.dimensions.set(boxDim.x/3,boxDim.y/8,(NxReal)0.06);
        boxDesc1.localPose.t = NxVec3(0,0.6,-(NxReal)0.1);
        actorDesc.shapes.pushBack(&boxDesc1);



        NxBoxShapeDesc boxDesc2;
        boxDesc2.dimensions.set(boxDim.x/3,boxDim.y/816,(NxReal)0.25);
        boxDesc2.dimensions.set(boxDim.x/3,boxDim.y/8,(NxReal)0.06);
        boxDesc2.localPose.t = NxVec3(0,-0.6,-(NxReal)0.1);
        actorDesc.shapes.pushBack(&boxDesc2);


        NxBoxShapeDesc boxDesc3;
        boxDesc3.dimensions.set((NxReal)0.05,boxDim.y,(NxReal)0.06);
        boxDesc3.localPose.t = NxVec3(boxDim.x/3,0,(NxReal)(0.201-0.25));
        actorDesc.shapes.pushBack(&boxDesc3);

        NxBoxShapeDesc boxDesc4;
        boxDesc4.dimensions.set((NxReal)0.05,boxDim.y,(NxReal)0.06);
        boxDesc4.localPose.t = NxVec3(-boxDim.x/3,0,(NxReal)(0.201-0.25));
        actorDesc.shapes.pushBack(&boxDesc4);

        if (density)
        {
                actorDesc.body = &bodyDesc;
                actorDesc.density = density;
        }
        else
        {
                actorDesc.body = NULL;
        }
        actorDesc.globalPose.t = pos;
        return gScene->createActor(actorDesc);        

}

void CreateRope(const NxVec3& pos, const NxReal segHeight, const NxReal segRadius, const int nbSegments, const NxReal density)
{

        //osg::Group* group = new osg::Group;
        //CreateRing(const NxVec3& pos, const NxVec3& boxDim, const NxReal density)
        NxI32 i;

        ropeSegs = new NxActor*[nbSegments];
        ropeLinks = new NxSphericalJoint*[nbSegments-1];

        for (i = 0; i < nbSegments; i++)
        {
                if(i%2==0)
                {
                    ropeSegs = CreateRing(pos + NxVec3(0,i*(2*segRadius+segHeight),0), NxVec3(0.5, 0.7, 0.02), density);
                        ropeSegs->setGlobalOrientationQuat(AnglesToQuat(NxVec3(0,90,0)));
                }
                else
                {
                    ropeSegs = CreateRing(pos + NxVec3(0,i*(2*segRadius+segHeight),0), NxVec3(0.5, 0.7, 0.02), density);
                }
        }

        for (i = 0; i < nbSegments - 1; i++)
        {//
                ropeLinks = CreateRopeSphericalJoint(ropeSegs, ropeSegs[i+1], pos + NxVec3(0,(i+1)*(2*segRadius+segHeight),0), NxVec3(0,1,0));
        }
     // group->addChild(ropeSegs);
   
}

你看看能给点建议不?谢谢!

该用户从未签到

发表于 2010-8-26 10:54:53 | 显示全部楼层
你把在createRing得到的每一个actor,在osg的场景中都创造一个包含有圆环模型的transform节点(比如matrixtransform或者pat)来与之对应,然后将这个acotr的userData指针指向这个transform节电。这样在gScene->fetchResults之后,遍历gScene的actors,得到actor的position和orientation,然后利用这个来更新所对应transform节点的位置和方向。要注意physx跟osg的坐标系是不一样的,所以需要转换一下。

该用户从未签到

 楼主| 发表于 2010-8-29 13:18:57 | 显示全部楼层
7# aya_daxiang
按照您说的,在createRing得到的每一个actor,在osg的场景中都创造一个包含有圆环模型的transform节点(比如matrixtransform或者pat)来与之对应,然后将这个acotr的userData指针指向这个transform节电。这些都做了,现在我纠结在圆环模型的连接上,我用的是NxSphericalJointDesc, ropeLinks = CreateRopeSphericalJoint(ropeSegs, ropeSegs[i+1], pos + NxVec3(0,(i+1)*(2*segRadius+segHeight),0), NxVec3(0,1,0));
但是总是出错,不知问题出在哪儿?怎样才能设置连接呢?

该用户从未签到

 楼主| 发表于 2010-8-30 22:14:56 | 显示全部楼层
physx模拟运动需要调用函数glutMainLoop(),而这个函数是死循环,也就是活在physx中节点的运动坐标就没有机会取出来,也就没有办法映射到osg中,aya_daxiang  请问有什么解决方法吗?

该用户从未签到

发表于 2010-8-31 09:00:23 | 显示全部楼层
很显然您需要把glutMainLoop换成OSG的仿真循环,glut的所有代码都需要在这里摒弃

该用户从未签到

发表于 2010-8-31 09:38:48 | 显示全部楼层
9# zhangdandan
您需要看一下这个例子,以为您看过了呢...

http://3dcalc.pl/osg-examples/osgPhysX1.zip

另外方便的话,请检查下您的短消息。

该用户从未签到

发表于 2010-8-31 13:30:26 | 显示全部楼层
呵呵,楼主估计是卡在这了,供参考
  1. void DriveCallBack::operator()( osg::Node* node,osg::NodeVisitor* nv )
  2. {
  3. RunPhysics();

  4. int nbActors = gScene->getNbActors();//得到场景中角色的数量
  5. NxActor** actors = gScene->getActors();//得到场景中所有角色的队列
  6. while(nbActors--)
  7. {
  8. NxActor* actor = *actors++;

  9. if (nbActors!=0)
  10. {

  11.    float glmat[16];      


  12.    gScene->getActors()[nbActors]->getGlobalPose().getColumnMajor44(glmat);
  13.    osg::Matrix mat;
  14.    osg::Matrix rot;
  15.    mat.set(glmat[0],glmat[1],glmat[2],glmat[3],glmat[4],
  16.     glmat[5],glmat[6],glmat[7],glmat[8],glmat[9],glmat[10],glmat[11],glmat[12],glmat[13],glmat[14],glmat[15]);
  17.       

  18.    //OSG与PhysX坐标系差别
  19.    rot.makeRotate(
  20.     osg::DegreesToRadians(0.0), osg::Vec3(0,1,0), // 滚转角(Y轴)
  21.     osg::DegreesToRadians(90.0), osg::Vec3(1,0,0) , // 俯仰角(X轴)
  22.     osg::DegreesToRadians(0.0), osg::Vec3(0,0,1)); // 航向角(Z轴)
  23.    mat=mat*rot;

  24.    //打印位置数据
  25.    //cout<<glmat[0]<<" "<<glmat[1]<<" "<<glmat[2]<<" "<<glmat[3]<<std::endl;
  26.    //cout<<glmat[4]<<" "<<glmat[5]<<" "<<glmat[6]<<" "<<glmat[7]<<std::endl;
  27.    //cout<<glmat[8]<<" "<<glmat[9]<<" "<<glmat[10]<<" "<<glmat[11]<<std::endl;
  28.    //cout<<glmat[12]<<" "<<glmat[13]<<" "<<glmat[14]<<" "<<glmat[15]<<std::endl;

  29.    //更新图形场景
  30.    mtBox[nbActors-1]->setMatrix(mat);

  31. }

  32. }

  33. traverse(node,nv);

  34. }
复制代码

该用户从未签到

 楼主| 发表于 2010-9-1 20:20:55 | 显示全部楼层
12# 湖面之舟

请问您那个RunPhysics();  做的是什么工作? 调用的是什么方法?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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