游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6695|回复: 8

谁在 OGRE 中使用过 PhysX 给点帮助

[复制链接]

3

主题

16

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2007-10-15 20:34:00 | 显示全部楼层 |阅读模式
Ogre中使用PhysX可以通过 NxOgre包装器来用。但是NxOgre文档太少,不好学,所以决定先开始自己在Ogre中直接使用PhysX,熟悉了之后再用NxOgre.但是我在整合的时候遇到问题:


首先为OGRE框架的 BaseApplication 类添加成员变量:
NxScene * PhScene;
NxPhysicsSDK* sdk;

然后在Ogre的 createScene() 函数中:



//创建PhysX的 SDK 和 Scene
           this->sdk=NxCreatePhysicsSDK(NX_PHYSICS_SDK_VERSION);
         NxSceneDesc sd;
         sd.gravity=NxVec3(0.0,-9.8,0.0);
         this-&gthScene=sdk->createScene(sd);

//创建Actor,并绑定Actor和相应的Ogre的场景节点,PhysxTool是我写的一个Physx的工具类,定义在后面

         NxActor * boxActor=PhysxTool::CreateBoxActor(PhScene,NxVec3(5.0,5.0,5.0));
         boxActor->setGlobalPosition(NxVec3(0.0,20.0,0.0));

         boxActor->userData=(void*)this->mSceneMgr->getSceneNode("Box_Node");
         boxActor->addForce(NxVec3(0.0,-20.0,0.0));

         PhScene->simulate(0.016);
         PhScene->flushStream();


在frameStarted 函数中:


          PhScene->simulate(evt.timeSinceLastFrame*6);
        PhScene->flushStream();
        PhScene->fetchResults(NX_RIGID_BODY_FINISHED,true);

          PhysxTool::ApplyAllActorsToSceneNode(PhScene);



以下是用到的PhysxTool工具类的函数。


static NxActor* PhysxTool:: CreateBoxActor(NxScene* scene,NxVec3  size)
        {
                NxBoxShapeDesc bd;
                bd.dimensions.set(size.x,size.y,size.z);

                NxActorDesc ad;
                ad.shapes.pushBack(&bd);
                NxActor* act=scene->createActor(ad);
                return act;
        }

static void PhysxTool::ApplyAllActorsToSceneNode(NxScene* PhScene)
        {
                NxU32 nb=PhScene->getNbActors();
                NxActor** actors=PhScene->getActors();
                while(nb--)
                {
                        NxActor* actor=*actors++;
                        Ogre::SceneNode * node=(Ogre::SceneNode*)actor->userData;
                        NxVec3 pos=actor->getGlobalPosition();
                        NxQuat quat=actor->getGlobalOrientationQuat();
                        node->setPosition(pos.x,pos.y,pos.z);
                       
                }
        }




程序编译链接顺利,我想既然做到这份上,盒子应该会向下掉吧,然而盒子始终不动。高手帮帮忙!

我将在下面附上程序截图!

3

主题

16

帖子

16

积分

新手上路

Rank: 1

积分
16
 楼主| 发表于 2007-10-15 20:42:00 | 显示全部楼层

Re: 谁在 OGRE 中使用过 PhysX 给点帮助

程序截图
sf_20071015204132.jpg

3

主题

16

帖子

16

积分

新手上路

Rank: 1

积分
16
 楼主| 发表于 2007-10-16 00:04:00 | 显示全部楼层

Re:谁在 OGRE 中使用过 PhysX 给点帮助

原因已经找到,问题已解决,谢谢

1

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2007-11-14 17:06:00 | 显示全部楼层

Re: 谁在 OGRE 中使用过 PhysX 给点帮助

英雄,怎么解决的阿,我也遇到这个问题了,郁闷ing......

3

主题

16

帖子

16

积分

新手上路

Rank: 1

积分
16
 楼主| 发表于 2007-11-19 13:34:00 | 显示全部楼层

Re: 谁在 OGRE 中使用过 PhysX 给点帮助

低级错误。
没有给 Actor 设置 body,
系统会把这个actor当作静态对象。

18

主题

211

帖子

419

积分

中级会员

Rank: 3Rank: 3

积分
419
发表于 2008-4-17 12:26:00 | 显示全部楼层

Re:谁在 OGRE 中使用过 PhysX 给点帮助

楼主,,能把例子发给我吗?我的邮箱是:njw1985@sina.com...谢了!!!

18

主题

211

帖子

419

积分

中级会员

Rank: 3Rank: 3

积分
419
发表于 2008-4-17 13:45:00 | 显示全部楼层

Re:谁在 OGRE 中使用过 PhysX 给点帮助

有两个问题:一是怎么将OGRE里面的Mesh转化为PhysX中的数据模型;二是怎么设置Actor的body?楼主能讲讲吗?

27

主题

79

帖子

87

积分

注册会员

Rank: 2

积分
87
发表于 2008-5-5 03:11:00 | 显示全部楼层

Re: Re:谁在 OGRE 中使用过 PhysX 给点帮助

njw1985: Re:谁在 OGRE 中使用过 PhysX 给点帮助

有两个问题:一是怎么将OGRE里面的Mesh转化为PhysX中的数据模型;二是怎么设置Actor的body?楼主能讲讲吗?


我用AGEIA连DIRECTX直接用过,只要把Vertex,index buffer 传到trianglemesh shape description中,再设置一下参数,ageia 会cooking 出一个trianglemesh 在物理世界里面。
NXOGRE是个ageia简化接口,可能会有直接的createtrianlgemesh的函数,不用自己去写了,在ogre英文官方论坛里面找找吧。
这里是我convert我的地形为trianglemesh的代码:

NxActor * CPhysX::CreateTerrainMesh(const NxVec3& pos,const NxU32 length, const NxU32 width,IDirect3DVertexBuffer9* vb,IDirect3DIndexBuffer9* ib)//,const NxReal stride)
{
        NxVec3* fsVerts = NULL;
        WORD* fsFaces = NULL;
         

        //Initialize flat surface verts
        NxU32 nbVerts=length*width;


        fsVerts = new NxVec3[nbVerts];
       
        VertexPNUVT* vCol = 0;
        vb->Lock(0,0,(void**)&vCol,0);
        for(DWORD i=0;i<nbVerts;i++)
        {
                memcpy(&fsVerts, &vCol, sizeof(D3DXVECTOR3));
        }
    vb->Unlock();


        NxU32 nbFaces = (length-1)*(width-1)*2;
        fsFaces = new WORD[nbFaces*3];
        WORD* pIB = NULL;
        ib->Lock(0,0,(void**)&pIB,0);
        memcpy(fsFaces, pIB, sizeof(WORD)*nbFaces*3);
        ib->Unlock();

        NxTriangleMeshDesc fsDesc;
        fsDesc.numVertices                                = nbVerts;
        fsDesc.numTriangles                                =nbFaces;
        fsDesc.pointStrideBytes                        = sizeof(D3DXVECTOR3);
        fsDesc.triangleStrideBytes                = 3*sizeof(WORD);
        fsDesc.points                                        = fsVerts;
        fsDesc.triangles                                = fsFaces;                                                       
        fsDesc.flags                                        =NX_MF_16_BIT_INDICES;

        //because the triangle mesh is CW not CCW so must set this to ensure collision correct.
    fsDesc.flags |=NX_MF_FLIPNORMALS;
       
        NxTriangleMeshShapeDesc fsShapeDesc;

        gCooking = NxGetCookingLib(NX_PHYSICS_SDK_VERSION);
        bool ok =  gCooking->NxInitCooking();
   
        // Cooking from memory
        MemoryWriteBuffer buf;
        bool status = gCooking->NxCookTriangleMesh(fsDesc, buf);
               
               

        fsShapeDesc.meshData = PhysicsSDK->createTriangleMesh(MemoryReadBuffer(buf.data));
   

        if (fsShapeDesc.meshData)
    {
            NxActorDesc actorDesc;
            actorDesc.shapes.pushBack(&fsShapeDesc);
            actorDesc.globalPose.t = pos;
            NxActor* actor = Scene->createActor(actorDesc);
                //SetActorCollisionGroup(actor,3);
            return actor;
//      gPhysicsSDK->releaseTriangleMesh(*fsShapeDesc.meshData);
    }

        return NULL;

}

18

主题

211

帖子

419

积分

中级会员

Rank: 3Rank: 3

积分
419
发表于 2008-5-5 08:34:00 | 显示全部楼层

Re:谁在 OGRE 中使用过 PhysX 给点帮助

好的,谢谢 xueyouchao!!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-28 13:16

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表