精华内容
参与话题
问答
  • PhysX入门教程(全)

    2019-02-01 10:15:00
    在国际上出名的物理引擎有Havok,Vortex,ODE,Novodex,Takamak等等其中ode是一个免费开源的物理引 擎,而Novodex就是PhysX的前身被Ageia收购之后改名为PhysX,是一个可以免费用于非商品用途的引擎。在这里选用...

    一、安装
    在国际上出名的物理引擎有Havok,Vortex,ODE,Novodex,Takamak等等其中ode是一个免费开源的物理引 擎,而Novodex就是PhysX的前身被Ageia收购之后改名为PhysX,是一个可以免费用于非商品用途的引擎。在这里选用PhysX来作为 入门教程,主要是因为它的帮助比较丰富而且开发包可以免费获得。
    关于PhysX sdk的安装.首先要进入http://support.ageia.com下载SDK,网站http://support.ageia.com下載安裝 文件.請注重的是Ageia的SDK只对注册用户开放下载。注册是免费的,但似乎要经过审核才会开通,不过一般都会通过的。我注册的时候似乎是第二天才收 到开通邮件。有两个安装文件是必须下载的System Software.exe和PhysX 2.3.3 SDK Core.exe前一个是底层驱动后一个是程序内核最新的SDK是2.4.1但是只针对商业客户开放。对于初学者来说最好把PhysX 2.3.3 SDK Training Pragrams.exe也一起下载,里面包含了从初级到高级的一系列教程,对学习这个引擎很有帮助。把所有东西下载下来之后,接着是安装了安装很简 单一路next下去就可以了但是为了让VC中设置方便一点建设把PhysX 2.3.3 SDK Core.exe的安装路径改短一点例如我的就是安装在D:/PhysX中。
    安装好了之后后开始对VC编译环境进行设置。
    首先在Tools→Options→Directories→Inclund Fik中加入以下目录.
    D:/PhysX/SDKS/Physics/include
    D:/PhysX/SDKS/Founddation/include
    D:/PhysX/SDKS/PhysXLoader/include
    然后在…àLibrary Fiks中加入以下目录:
    D:/PhysXdks/LIB/Win32
    以 上用到的“D:/PhysX”指的是sdk安装目录以你机器中的安装路径为准本教程的示例程序用到了opengl和glut作为渲染引擎你的计算机 如何没有安装glut库那也请先到www.opengl.org上www.opengl.org下载一个安装上去。在这里就不打算深入讨论glut了, 没有基础的朋友可以先自学一下。


    二.、PhysX概述
    首先来介绍一下PhysX编程的几个术语以及它们之间的相互联系。
    1. Scene场景:就像演员表演都需要一个舞台一样 PhysX的所有物理运动都在这个scene中进行。
    2. Actor角色:在场景中所有参与运算的实体都是一个角色或许我这样表达不是很准确大家慢慢体会吧!
    3. bosy刚体:用来记录物体之间世界交互的各种系数如速度阻尼等.
    4. shape形状:描述和表达某一角色的形状PhysX中提供4种基本形状,盒子,球,胶囊以及平面。

    从 上面图可以看到,PhysX编程其实很简朴首先定义各种不同的角色(actor)然后指定每个角色的形状(shape)属性和刚体(body)属 性,最后是把这些角色都加入到场景(scene)空间中去这样就可以构造出一个完整的物理世界。下面我将详细描述编程的步骤.
    三.编程实现
    1.创建scene
    NxsceDesc sceneDesc:
    SceneDesc.grauity = gDefaultGravity;//指定重力加速度(-9.81f)
    SceneDesc.broadphase = NX_BROADPHASE_COHERENT;
    SceneDesc.collisionDetection= true; //是否开启碰撞检测
    Gscene =gPhysicsSDK→createScene(sceneDesc);
    首先我们要创建一个场景的描述(Descriptor),PhysX SDK就利用这个场景描述结构来创建生成一个场景实例.
    描述(Descriptor)在整个SDK编程过程中会被广泛地使用。描述其实就是一个数据结构主要是用来保存各种在创建实体时所需要的相关信息。你可以调整描述体中各种参数来达到不同的效果当然你可以不作任何修改这样的话实体在创建时会使用描述体的默认值。
    在本例子中我们创建一个指定了重力加速以及碰撞检测算法的场景实例。PhysX SDK中提拱了三种碰撞检测算法提拱给大家选择.这里选用的是“broad phase-coheret collison detoction”。
    2.给场景(scene)增加物理材质(Materials)
    物理材质指的是某一详细物体的表面属性和碰撞属性这些属性可以确定一个物体和另一个物体发生碰撞时,是如何在该的物体上反弹滑动或者滚动的。
    你可以给场景中的所有物体指定一个相同的默认物理材质。
    //创建默认材质
    Nxmaterial* defaultMaterial=gscene → getMaterialFromIndex(0);
    Default Material→setRestitution(0.9);//还原系数为0的时候没有还原.
    DefaultMaterial→setStaticFriction(0.5);//静摩擦系数.
    DefaultMaterial→setDynamicFricfion(0.5);//动摩擦系数.
    以上材质的系数最小值都是0最大值是1,假如要实现一个物体落在地上会自动弹跳那就得把还原系数设得大一点。
    3.创建地面
    在本程序例子中只有两个角色实体地面和盒子.我们首先来看如何创建地面.
    NxPlane shapeDesc planeDesc;
    NxActorDesc actorDesc;
    actorDesc.shapes.pushBack(&phane Desc);
    gscene→createActor(AcforDesc);
    创建一个地面角色这可能是角色创建的最简朴的方法了只用到了四行代码首先分别创建一个平面形状描述和角色描述两个描述都不作任何修改也就是使用它们的默认值.平面的中央位于世界坐标原点(000)处,而法线则是指向y轴的正方向。
    第二步把平面描述添加到角色描述中的形状列表中去,从这里我们也可以看到,一个角色是可以包含多个形状物体的。
    第 三步就是把角色加到场景(scene)中去,也许你会注意到,前面我们所说的一个角色实体必须包括形状描述和刚体描述,两大部份,为什么这里只有形状描 述呢?其实,刚体描述也是存在的,当你没有为它指定的时候,角色创建时会自动生成一个默认的刚体描述。一个刚体的默认值是这样的:它不会移动但是会把与它 发生碰撞的物体反弹回去。因为它的质量是无限大的。
    4、 创建盒子
    前面介绍了如何创建一个地面,这是场景中最简朴的一个角色了下面我们将要创建一个稍为复杂一点的角色,一个盒子。
    Int size=5
    NxBodyDesc BodyDesc;
    BodyDesc.angularDamping=0.5f;
    BodyDesc.linearVelocity=NxUec3(0.0f0.0f0.0f)
    NxBoxShapeDesc BoxDesc;
    BoxDesc.dinesions=NxUec3(float(size)float(size)float(size));
    NxActorDesc BoxActorDesc;
    BoxActorDesc.shapes.pushBack(&BosDesc);
    BosActorDsec.body= &BodyDesc;
    BoxActorDesc.desity=0.10f;
    BoxActorDesc.globalpose.t=NxVec3(0.0.20.0.0.0);
    Gscene→createActor(BoxActorDesc)→userData=(viud*)size;
    这 里我们创建了一个叫“Box”的场景角我。我们可以看到,盒子角色完整地包含了形状和刚体两大部份。和创建平面角色不同的是盒子角色描述中多了 “desity”“globalpose”两个分量分别指的是密度和初始位置SDK会根据密度和体积来自动计算角色的质量。
    “globalpose”指的是在世界位标中的相对位置值得注重的是:
    PhysX中与坐标尺寸相关的数值其单位都是“米”(m)。
    5.绘制与运动
    完成了以上的预备工作之后接下来便是检验成果的最后冲刺了.
    Whik(nbActors--)

    NxActor*actor=*actors++;
    If(!actor->userData) continue;
    glpushMatrix();
    float glamat[16];
    actor->getGlobalPose().getColumnMajor44(glmat);
    glColor4f(1.0f1.0f1.0f1.0f);
    glMultMatrix(glmat);
    glutWireCube(float(int(actor→userData))*2.0f);
    glPopMatrix();

    上面是绘制场景的程序这里因为不需要绘制地面因此第一行跳过平面角色直接绘制盒子.
    OK现在我们可以让程序运行起来了在窗口可以看见生成的一个立方体盒子.但是为什么那个盒子不会落下来,不会运动呢?这是因为我们还没有加入实时运算函数。在绘制盒子之前加入以下三行:

    Gscene→fetchResults(NX_RIGID_BODY_FINFSHED);
    gsceng→Simulate(1/60.0f);
    gscene→flushstream();
    这样盒子就会产生自由落体运动其中simulate(1/60.0)是一个积分函数用来求位移.这里用到了固定间隔时间1/60.0秒其实最好是使用一些系统时间函数来计算上一次刷屏到现在的时间,这样会让物体运动更加逼真。
    四.总结
    这 是一个PhysX物理引擎的Hello World入门程序为了让大家更清楚地看到程序总体框架我把程序的功能尽量写得简朴。在接下来的一段时间里我会写一些复杂的相关教程希望各位网友 友持。当然,我也是一边学一边写,难免会出现错差,假如你们发现我的文章有问题的话,请E-mail:huawenguang@sina.com 告诉知我,也欢迎在这方面有共同爱好的朋友来信交流.
    特殊感谢我身边一个朋友的支持!
    五、源代码

    // A minimal Novodex application test.
    // 以下代码,先安装好PhysX SDK,及按要求配置好路径之后才能编译。
    // 建义用使用VC2003以上版本,VC6.0在我这里有一个“return”错误,把“return”去掉就可以编译通过。
    // 运行的时候假如提示缺少DLL文件,请在/bin/win32 目录中找到相应的DLL文件把它拷贝到工程文件夹中,
    // 或者拷贝到系统systems32/ 文件夹中
    // NxBoxes by Pierre Terdiman (01.01.04)
    // author: huawenguang@sina.com
    #define NOMINMAX
    #ifdef WIN32
    #include
    #include
    #include
    #elif LINUX
    #include
    #include
    #elif __APPLE__
    #include
    #include
    #elif __CELLOS_LV2__
    #include
    #endif
    #include
    // Physics code
    #undef random
    #include "NxPhysics.h"
    //#include "ErrorStream.h"
    #pragma comment( lib "PhysXLoader.lib" )
    static bool gPause = false;
    static NxPhysicsSDK* gPhysicsSDK = NULL;
    static NxScene* gScene = NULL;
    static NxVec3 gDefaultGravity(0.0f -9.81f 0.0f);
    static float gRatio=1.0f;
    static void InitNx()
    {
    // Initialize PhysicsSDK
    gPhysicsSDK = NxCreatePhysicsSDK(NX_PHYSICS_SDK_VERSION 0 NULL);
    if(!gPhysicsSDK) return;
    gPhysicsSDK->setParameter(NX_MIN_SEPARATION_FOR_PENALTY -0.05f);
    // Create a scene
    NxSceneDesc sceneDesc;
    sceneDesc.gravity = gDefaultGravity;
    sceneDesc.broadPhase = NX_BROADPHASE_COHERENT;
    sceneDesc.collisionDetection = true;
    gScene = gPhysicsSDK->createScene(sceneDesc);
    NxMaterial * defaultMaterial = gScene->getMaterialFromIndex(0);
    defaultMaterial->setRestitution(0.9f);
    defaultMaterial->setStaticFriction(0.1f);
    defaultMaterial->setDynamicFriction(0.1f);
    // Create ground plane
    NxPlaneShapeDesc PlaneDesc;
    PlaneDesc.d = -5.0f;
    NxActorDesc ActorDesc;
    ActorDesc.shapes.pushBack(&PlaneDesc);
    gScene->createActor(ActorDesc);
    //CreateCube(NxVec3(0.020.00.0)5);
    // Create body
    //
    int size = 5;
    NxBodyDesc BodyDesc;
    BodyDesc.angularDamping = 0.5f;
    // BodyDesc.maxAngularVelocity = 10.0f;
    BodyDesc.linearVelocity = NxVec3(0.0f0.0f0.0f);
    NxBoxShapeDesc BoxDesc;
    BoxDesc.dimensions = NxVec3(float(size) float(size) float(size));
    NxActorDesc BoxActorDesc;
    BoxActorDesc.shapes.pushBack(&BoxDesc);
    BoxActorDesc.body = &BodyDesc;
    BoxActorDesc.density = 0.10f;
    BoxActorDesc.globalPose.t = NxVec3(0.020.00.0);
    gScene->createActor(BoxActorDesc)->userData = (void*)size;
    }
    static void RenderCallback()
    {

    // Clear buffers
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    // Setup camera
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60.0f 1.0 1.0f 10000.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0.0 5.1 50.0 0.0 0.0 0.0 0.0f 1.0f 0.0f);
    gScene->fetchResults(NX_RIGID_BODY_FINISHED);
    gScene->simulate(1/60.0f);
    gScene->flushStream();

    // Keep physics &graphics in sync
    int nbActors = gScene->getNbActors();
    NxActor** actors = gScene->getActors();
    while(nbActors--)
    {
    NxActor* actor = *actors++;
    if(!actor->userData) continue;
    glPushMatrix();
    float glmat[16];
    actor->getGlobalPose().getColumnMajor44(glmat);
    glMultMatrixf(glmat);
    glColor4f(1.0f 1.0f 1.0f 1.0f);
    glutWireCube(float(int(actor->userData))*2.0f);
    glPopMatrix();
    }
    glutSwapBuffers();
    }
    int main(int argc char** argv)
    {
    // Initialize Glut
    printf("PhysX Hello World!");
    glutInit(&argc argv);
    glutInitWindowSize(512 512);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    int mainHandle = glutCreateWindow("PhysX Hello World!");
    glutSetWindow(mainHandle);
    glutDisplayFunc(RenderCallback);
    glutIdleFunc(RenderCallback);
    // Setup default render states
    glClearColor(0.3f 0.4f 0.5f 1.0);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_CULL_FACE);
    glEnable(GL_LIGHTING);
    // Physics code
    InitNx();
    // ~Physics code
    // Run
    glutMainLoop();

    if(gPhysicsSDK &&gScene) gPhysicsSDK->releaseScene(*gScene);
    gPhysicsSDK->release();
    return 0;
    }


    再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

    转载于:https://www.cnblogs.com/skiwnchiwns/p/10344920.html

    展开全文
  • PhysX入门教程(全)

    千次阅读 2010-03-08 17:04:00
    在国际上出名的物理引擎有Havok,Vortex,ODE,Novodex,Takamak等等其中ode是一个免费开源的物理引 擎,而Novodex就是PhysX的前身被Ageia收购之后改名为PhysX,是一个可以免费用于非商品用途的引擎。在这里选用...

    一、安装
    在国际上出名的物理引擎有Havok,Vortex,ODE,Novodex,Takamak等等其中ode是一个免费开源的物理引 擎,而Novodex就是PhysX的前身被Ageia收购之后改名为PhysX,是一个可以免费用于非商品用途的引擎。在这里选用PhysX来作为 入门教程,主要是因为它的帮助比较丰富而且开发包可以免费获得。
    关于PhysX sdk的安装.首先要进入http://support.ageia.com下载SDK,网站http://support.ageia.com下載安裝 文件.請注重的是Ageia的SDK只对注册用户开放下载。注册是免费的,但似乎要经过审核才会开通,不过一般都会通过的。我注册的时候似乎是第二天才收 到开通邮件。有两个安装文件是必须下载的System Software.exe和PhysX 2.3.3 SDK Core.exe前一个是底层驱动后一个是程序内核最新的SDK是2.4.1但是只针对商业客户开放。对于初学者来说最好把PhysX 2.3.3 SDK Training Pragrams.exe也一起下载,里面包含了从初级到高级的一系列教程,对学习这个引擎很有帮助。把所有东西下载下来之后,接着是安装了安装很简 单一路next下去就可以了但是为了让VC中设置方便一点建设把PhysX 2.3.3 SDK Core.exe的安装路径改短一点例如我的就是安装在D:/PhysX中。
    安装好了之后后开始对VC编译环境进行设置。
    首先在Tools→Options→Directories→Inclund Fik中加入以下目录.
    D:/PhysX/SDKS/Physics/include
    D:/PhysX/SDKS/Founddation/include
    D:/PhysX/SDKS/PhysXLoader/include
    然后在…àLibrary Fiks中加入以下目录:
    D:/PhysXdks/LIB/Win32
    以 上用到的“D:/PhysX”指的是sdk安装目录以你机器中的安装路径为准本教程的示例程序用到了opengl和glut作为渲染引擎你的计算机 如何没有安装glut库那也请先到www.opengl.org上www.opengl.org下载一个安装上去。在这里就不打算深入讨论glut了, 没有基础的朋友可以先自学一下。


    二.、PhysX概述
    首先来介绍一下PhysX编程的几个术语以及它们之间的相互联系。
    1. Scene场景:就像演员表演都需要一个舞台一样 PhysX的所有物理运动都在这个scene中进行。
    2. Actor角色:在场景中所有参与运算的实体都是一个角色或许我这样表达不是很准确大家慢慢体会吧!
    3. bosy刚体:用来记录物体之间世界交互的各种系数如速度阻尼等.
    4. shape形状:描述和表达某一角色的形状PhysX中提供4种基本形状,盒子,球,胶囊以及平面。

    从 上面图可以看到,PhysX编程其实很简朴首先定义各种不同的角色(actor)然后指定每个角色的形状(shape)属性和刚体(body)属 性,最后是把这些角色都加入到场景(scene)空间中去这样就可以构造出一个完整的物理世界。下面我将详细描述编程的步骤.
    三.编程实现
    1.创建scene
    NxsceDesc sceneDesc:
    SceneDesc.grauity = gDefaultGravity;//指定重力加速度(-9.81f)
    SceneDesc.broadphase = NX_BROADPHASE_COHERENT;
    SceneDesc.collisionDetection= true; //是否开启碰撞检测
    Gscene =gPhysicsSDK→createScene(sceneDesc);
    首先我们要创建一个场景的描述(Descriptor),PhysX SDK就利用这个场景描述结构来创建生成一个场景实例.
    描述(Descriptor)在整个SDK编程过程中会被广泛地使用。描述其实就是一个数据结构主要是用来保存各种在创建实体时所需要的相关信息。你可以调整描述体中各种参数来达到不同的效果当然你可以不作任何修改这样的话实体在创建时会使用描述体的默认值。
    在本例子中我们创建一个指定了重力加速以及碰撞检测算法的场景实例。PhysX SDK中提拱了三种碰撞检测算法提拱给大家选择.这里选用的是“broad phase-coheret collison detoction”。
    2.给场景(scene)增加物理材质(Materials)
    物理材质指的是某一详细物体的表面属性和碰撞属性这些属性可以确定一个物体和另一个物体发生碰撞时,是如何在该的物体上反弹滑动或者滚动的。
    你可以给场景中的所有物体指定一个相同的默认物理材质。
    //创建默认材质
    Nxmaterial* defaultMaterial=gscene → getMaterialFromIndex(0);
    Default Material→setRestitution(0.9);//还原系数为0的时候没有还原.
    DefaultMaterial→setStaticFriction(0.5);//静摩擦系数.
    DefaultMaterial→setDynamicFricfion(0.5);//动摩擦系数.
    以上材质的系数最小值都是0最大值是1,假如要实现一个物体落在地上会自动弹跳那就得把还原系数设得大一点。
    3.创建地面
    在本程序例子中只有两个角色实体地面和盒子.我们首先来看如何创建地面.
    NxPlane shapeDesc planeDesc;
    NxActorDesc actorDesc;
    actorDesc.shapes.pushBack(&phane Desc);
    gscene→createActor(AcforDesc);
    创建一个地面角色这可能是角色创建的最简朴的方法了只用到了四行代码首先分别创建一个平面形状描述和角色描述两个描述都不作任何修改也就是使用它们的默认值.平面的中央位于世界坐标原点(000)处,而法线则是指向y轴的正方向。
    第二步把平面描述添加到角色描述中的形状列表中去,从这里我们也可以看到,一个角色是可以包含多个形状物体的。
    第 三步就是把角色加到场景(scene)中去,也许你会注意到,前面我们所说的一个角色实体必须包括形状描述和刚体描述,两大部份,为什么这里只有形状描 述呢?其实,刚体描述也是存在的,当你没有为它指定的时候,角色创建时会自动生成一个默认的刚体描述。一个刚体的默认值是这样的:它不会移动但是会把与它 发生碰撞的物体反弹回去。因为它的质量是无限大的。
    4、 创建盒子
    前面介绍了如何创建一个地面,这是场景中最简朴的一个角色了下面我们将要创建一个稍为复杂一点的角色,一个盒子。
    Int size=5
    NxBodyDesc BodyDesc;
    BodyDesc.angularDamping=0.5f;
    BodyDesc.linearVelocity=NxUec3(0.0f0.0f0.0f)
    NxBoxShapeDesc BoxDesc;
    BoxDesc.dinesions=NxUec3(float(size)float(size)float(size));
    NxActorDesc BoxActorDesc;
    BoxActorDesc.shapes.pushBack(&BosDesc);
    BosActorDsec.body= &BodyDesc;
    BoxActorDesc.desity=0.10f;
    BoxActorDesc.globalpose.t=NxVec3(0.0.20.0.0.0);
    Gscene→createActor(BoxActorDesc)→userData=(viud*)size;
    这 里我们创建了一个叫“Box”的场景角我。我们可以看到,盒子角色完整地包含了形状和刚体两大部份。和创建平面角色不同的是盒子角色描述中多了 “desity”“globalpose”两个分量分别指的是密度和初始位置SDK会根据密度和体积来自动计算角色的质量。
    “globalpose”指的是在世界位标中的相对位置值得注重的是:
    PhysX中与坐标尺寸相关的数值其单位都是“米”(m)。
    5.绘制与运动
    完成了以上的预备工作之后接下来便是检验成果的最后冲刺了.
    Whik(nbActors--)

    NxActor*actor=*actors++;
    If(!actor->userData) continue;
    glpushMatrix();
    float glamat[16];
    actor->getGlobalPose().getColumnMajor44(glmat);
    glColor4f(1.0f1.0f1.0f1.0f);
    glMultMatrix(glmat);
    glutWireCube(float(int(actor→userData))*2.0f);
    glPopMatrix();

    上面是绘制场景的程序这里因为不需要绘制地面因此第一行跳过平面角色直接绘制盒子.
    OK现在我们可以让程序运行起来了在窗口可以看见生成的一个立方体盒子.但是为什么那个盒子不会落下来,不会运动呢?这是因为我们还没有加入实时运算函数。在绘制盒子之前加入以下三行:

    Gscene→fetchResults(NX_RIGID_BODY_FINFSHED);
    gsceng→Simulate(1/60.0f);
    gscene→flushstream();
    这样盒子就会产生自由落体运动其中simulate(1/60.0)是一个积分函数用来求位移.这里用到了固定间隔时间1/60.0秒其实最好是使用一些系统时间函数来计算上一次刷屏到现在的时间,这样会让物体运动更加逼真。
    四.总结
    这 是一个PhysX物理引擎的Hello World入门程序为了让大家更清楚地看到程序总体框架我把程序的功能尽量写得简朴。在接下来的一段时间里我会写一些复杂的相关教程希望各位网友 友持。当然,我也是一边学一边写,难免会出现错差,假如你们发现我的文章有问题的话,请E-mail:huawenguang@sina.com 告诉知我,也欢迎在这方面有共同爱好的朋友来信交流.
    特殊感谢我身边一个朋友的支持!
    五、源代码

    // A minimal Novodex application test.
    // 以下代码,先安装好PhysX SDK,及按要求配置好路径之后才能编译。
    // 建义用使用VC2003以上版本,VC6.0在我这里有一个“return”错误,把“return”去掉就可以编译通过。
    // 运行的时候假如提示缺少DLL文件,请在/bin/win32 目录中找到相应的DLL文件把它拷贝到工程文件夹中,
    // 或者拷贝到系统systems32/ 文件夹中
    // NxBoxes by Pierre Terdiman (01.01.04)
    // author: huawenguang@sina.com
    #define NOMINMAX
    #ifdef WIN32
    #include
    #include
    #include
    #elif LINUX
    #include
    #include
    #elif __APPLE__
    #include
    #include
    #elif __CELLOS_LV2__
    #include
    #endif
    #include
    // Physics code
    #undef random
    #include "NxPhysics.h"
    //#include "ErrorStream.h"
    #pragma comment( lib "PhysXLoader.lib" )
    static bool gPause = false;
    static NxPhysicsSDK* gPhysicsSDK = NULL;
    static NxScene* gScene = NULL;
    static NxVec3 gDefaultGravity(0.0f -9.81f 0.0f);
    static float gRatio=1.0f;
    static void InitNx()
    {
    // Initialize PhysicsSDK
    gPhysicsSDK = NxCreatePhysicsSDK(NX_PHYSICS_SDK_VERSION 0 NULL);
    if(!gPhysicsSDK) return;
    gPhysicsSDK->setParameter(NX_MIN_SEPARATION_FOR_PENALTY -0.05f);
    // Create a scene
    NxSceneDesc sceneDesc;
    sceneDesc.gravity = gDefaultGravity;
    sceneDesc.broadPhase = NX_BROADPHASE_COHERENT;
    sceneDesc.collisionDetection = true;
    gScene = gPhysicsSDK->createScene(sceneDesc);
    NxMaterial * defaultMaterial = gScene->getMaterialFromIndex(0);
    defaultMaterial->setRestitution(0.9f);
    defaultMaterial->setStaticFriction(0.1f);
    defaultMaterial->setDynamicFriction(0.1f);
    // Create ground plane
    NxPlaneShapeDesc PlaneDesc;
    PlaneDesc.d = -5.0f;
    NxActorDesc ActorDesc;
    ActorDesc.shapes.pushBack(&PlaneDesc);
    gScene->createActor(ActorDesc);
    //CreateCube(NxVec3(0.020.00.0)5);
    // Create body
    //
    int size = 5;
    NxBodyDesc BodyDesc;
    BodyDesc.angularDamping = 0.5f;
    // BodyDesc.maxAngularVelocity = 10.0f;
    BodyDesc.linearVelocity = NxVec3(0.0f0.0f0.0f);
    NxBoxShapeDesc BoxDesc;
    BoxDesc.dimensions = NxVec3(float(size) float(size) float(size));
    NxActorDesc BoxActorDesc;
    BoxActorDesc.shapes.pushBack(&BoxDesc);
    BoxActorDesc.body = &BodyDesc;
    BoxActorDesc.density = 0.10f;
    BoxActorDesc.globalPose.t = NxVec3(0.020.00.0);
    gScene->createActor(BoxActorDesc)->userData = (void*)size;
    }
    static void RenderCallback()
    {

    // Clear buffers
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    // Setup camera
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60.0f 1.0 1.0f 10000.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0.0 5.1 50.0 0.0 0.0 0.0 0.0f 1.0f 0.0f);
    gScene->fetchResults(NX_RIGID_BODY_FINISHED);
    gScene->simulate(1/60.0f);
    gScene->flushStream();

    // Keep physics &graphics in sync
    int nbActors = gScene->getNbActors();
    NxActor** actors = gScene->getActors();
    while(nbActors--)
    {
    NxActor* actor = *actors++;
    if(!actor->userData) continue;
    glPushMatrix();
    float glmat[16];
    actor->getGlobalPose().getColumnMajor44(glmat);
    glMultMatrixf(glmat);
    glColor4f(1.0f 1.0f 1.0f 1.0f);
    glutWireCube(float(int(actor->userData))*2.0f);
    glPopMatrix();
    }
    glutSwapBuffers();
    }
    int main(int argc char** argv)
    {
    // Initialize Glut
    printf("PhysX Hello World!");
    glutInit(&argc argv);
    glutInitWindowSize(512 512);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    int mainHandle = glutCreateWindow("PhysX Hello World!");
    glutSetWindow(mainHandle);
    glutDisplayFunc(RenderCallback);
    glutIdleFunc(RenderCallback);
    // Setup default render states
    glClearColor(0.3f 0.4f 0.5f 1.0);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_CULL_FACE);
    glEnable(GL_LIGHTING);
    // Physics code
    InitNx();
    // ~Physics code
    // Run
    glutMainLoop();

    if(gPhysicsSDK &&gScene) gPhysicsSDK->releaseScene(*gScene);
    gPhysicsSDK->release();
    return 0;
    }


    展开全文
  • PhysX学习笔记(1): 基础

    千次阅读 2009-07-22 00:04:00
    简单形状l NxBound3: AABBl NxBox: OBBl NxCapsule: 胶囊(线段+距离)l NxPlanel NxRayl NxSegment: 线段l NxSphere SDK 初始化:跟D3D差不多, 直接NxCreatePhysicsSDK就OK. 释放时不能delete, 因为那是DLL...

    简单形状

    l  NxBound3: AABB

    l  NxBox: OBB

    l  NxCapsule: 胶囊(线段+距离)

    l  NxPlane

    l  NxRay

    l  NxSegment: 线段

    l  NxSphere

     

    SDK 初始化:

    D3D差不多, 直接NxCreatePhysicsSDKOK. 释放时不能delete, 因为那是DLL内部的对象, 只能release(). 多次创建返回的都是同一实例, 因为内部为单件实现.

     

    对象实例:

    一般都通过接口的create*(), 参数都用description类封装成一个. 注意返回值自己验证合法性. 释放时只能是谁创建了它谁释放, 不能自己释放自己. Down casting通过isXXX()这样的函数返回指针, 一个函数两用….

     

    用户自定义数据:

    物理对象都有一个公有的userData(void*类型)可以用来保存自定义数据. 另外, 每个物理对象都可以设置一个名字(const char*)做为标识. 可惜都是指针这个地方极有可能变成野指针, 看来需要利用N3Atom<T>.

     

    状态保存:

    通过对象的saveToDesc()/loadFromDesc()来保存/还原

     

    参量:

    l  rigid body transform: 刚体变换

    l  position vector: 方位

    l  rotation matrix: 旋转矩阵(行列式必须为1)

    l  unit quaternion: 单位四元数, 表示旋转量

    l  direction/extents vector: 偏移/方向

    l  force vector: 力向量

    l  torque vector: 力矩

    l  velocity vector: 速度

    l  angular velocity vector: 角速度

    l  momentum vector: 动量

    l  angular momentum vector: 角动量

     

    工具函数:

    NxUtilLib

    展开全文
  • PhysX 物理引擎研究(一)源码编译

    千次阅读 2019-06-29 16:43:21
    Unity 3D 中的物理引擎分为 2D 引擎和 3D 引擎两部分,其中 2D 引擎使用的 Erin Catto 写的是 Box2D,而 3D 引擎使用的的 NVIDIA 的 PhysX,在 Unity Editor 中打开 Help — About Unty 可以看到 "Physics powered ...

    前言

    Unity 3D 中的物理引擎分为 2D 引擎和 3D 引擎两部分,其中 2D 引擎使用的 Erin Catto 写的是 Box2D,而 3D 引擎使用的的 NVIDIA 的 PhysX,在 Unity Editor 中打开 HelpAbout Unty 可以看到 "Physics powered by PhysX. (c) 2011 NVIDIA Corporation." 的字样。

    Unity 历史 PhysX 版本

    • 2005 年,Unity 1.0 就使用 PhysX 作为物理引擎

    • 2010 年,Unity 3.0 版本将 PhysX 版本从 2.6 升级到 2.8

    • 2014 年,Unity 5.0 版本将 PhysX 版本从 2.x 升级到 3.3

           参考:UpgradeGuide5-Physics

    • Unity 2018.3 版本开始,Unity 将 PhysX 版本从 3.3.1 升级到 3.4.2

      主要提升了稳定性和性能,且增加了多世界支持

      参考:UpgradeGuide20183

    • Unity 2019.1 又加入了 Physics Debugger 工具

      用于可视化检查场景中几何图形的碰撞器,通过 Window > Analysis > Physics Debugger 打开

      参考:Physics Debug Visualization

     

    PhysX 简介

    PhysX 是 NVIDIA 旗下的物理加速技术,利用 GPU 的处理能力来执行复杂的物理效果计算,利用 CUDA 技术,由显示核心加速运算。

    目前支持的平台有:Windows 、Linux 、Android ARM 、mac OS 和 iOS 。

    Github 源码:在 NVIDIAGameWorks 官方的 Github 仓库中有两份源码:

    目前主流的已集成了 PhysX 的游戏引擎有:Unity 3D 、Unreal Engine 3/4 等。(数据来源 phyxinfo

    更多 PhysX 的资讯可以查看官方网站 physxinfo.comphysx 总览

     

    下载 PhysX 源码

    从 Github 上下载 PhysX 4.0 源码:

    $ git clone https://github.com/NVIDIAGameWorks/PhysX.git

    工程有点大,大概 1.26G 左右,当然也可以直接下载 release 版本的压缩包:PhysX-4.0.0.zip ,然后解压

    下载完毕,工程目录如下:

    ├─ PhysX
    │  ├─ externals
    │  ├─ kaplademo
    │  └─ physx
    │  └─ pxshared

    下面是将 PhysX 引入我们自己的工程中的步骤,大致参考了 PhysXSetup.pdf

     

    安装 DirectX SDK

    假如只是想编译得到 SDK 的核心库,则不必安装此 SDK ,因为此 SDK 只在源码中的示例中被使用,即源码中提供的一个 demo 工程。符合要求的版本:Microsoft DirectX SDK 2010 年 6 月份及之后的版本,直接下载 DirectX SDK 9.29.1962 June 2010 ,然后双击进行安装即可,似乎只能装在 C 盘,其他盘装不了。

    然而,我在安装 DirectX 的过程中出现了 Error Code:s1023 导致安装失败。

    原因分析:

    DirectX 安装过程中会顺便安装 Microsoft Visual C++ 2010 x86 Redistributable - 1010.0.30319 组件,而电脑中已经存在比此版本更高的 C++ Redistributable ,我在控制面板看了一下,由于我安装了 VS 2010 、VS 2015 和 VS 2017 ,并且都安装了 C++ 支持相关的 SDK,因此我电脑中 C++ Redistributable 的版本也有很多个:

    看起来简直是噩梦,但其实跨大版本是不会冲突的。

    解决方案:

    因此只需要先卸载 Microsoft Visual C++ 2010 x86 Redistributable - 1010.0.40219 即可,包括 x64 和 x86。然后,再重新安装 DirectX 。

    其实回退版本影响并不大,当然,假如还希望安装被卸载掉的 C++ 组件,可以从 Microsoft Visual C++ 2010 Service Pack 1 Redistributable Package MFC Security Update 下载安装。

    更多 C++ Redistributable 版本可以在这里下载: Visual C++ Redistributable Packages and Related Registry Entries

     

    SDK 编译源码

    根据 官方文档 readme_windows 指出的编译要求:

    • CMake 3.12 或以上版本

    • Python 2.7.6 版本

    这里我使用的是 CMake 3.13.0-r3 和 Python 2.7.9 ,具体编译步骤如下:

    • 进入工程的 physx 目录,运行 generate_projects.bat 来生成 VS 解决方案,可以进入编译选择界面:

      E:\C++\libs\PhysX-4.0.0\physx>exit /b 0
      Preset parameter required, available presets:
      (0) android <--- Android-19, armeabi-v7a with NEON PhysX SDK
      (1) vc12win32 <--- VC12 Win32 PhysX general settings
      (2) vc12win64 <--- VC12 Win64 PhysX general settings
      (3) vc14win32 <--- VC14 Win32 PhysX general settings
      (4) vc14win64 <--- VC14 Win64 PhysX general settings
      (5) vc15win32 <--- VC15 Win32 PhysX general settings
      (6) vc15win64 <--- VC15 Win64 PhysX general settings
      Enter preset number:

      除了第一个 android 版本外,其余的都是 windows 平台下使用的,vc 版本对于 VS 编译器版本大致关系如下:

      Visual Studio 2013 : vc12 
      Visual Studio 2015 : vc14 
      Visual Studio 2017 : vc15

      这里我选择 6 ,则生成的工程用 VS 2017 打开,编译生成用 64 位的库。

    • 工程生成成功后,在 physx/compiler 目录下会多出一个 vc15win64 的目录:

      假如当前已安装了 VS2017 ,直接双击打开 PhysXSDK.sln 文件 。

       

    • 编译全部:

      然后依次选择菜单:调试 > 开始执行

      结果出现 3 个错误:

      58>------ 已启动生成: 项目: ALL_BUILD, 配置: debug x64 ------
      58>Building Custom Rule E:/C++/libs/PhysX-4.0.0/physx/compiler/public/CMakeLists.txt
      58>CMake does not need to re-run because E:/C++/libs/PhysX-4.0.0/physx/compiler/vc15win64/CMakeFiles/generate.stamp is up-to-date.
      ========== 生成: 成功 55 个,失败 3 个,最新 0 个,跳过 0 个 ==========

      查看输出日志,3 个错误分别是:

      29>已完成生成项目“SamplePlatform.vcxproj”的操作 - 失败。
      ...
      30>已完成生成项目“SampleRenderer.vcxproj”的操作 - 失败。
      ...
      44>已完成生成项目“Samples.vcxproj”的操作 - 失败。
      ...

      而导致失败的原因是:

      : fatal error C1083: 无法打开包括文件: “d3dx9.h”: No such file or directory

      这是因为源码中的 demo 依赖 DirectX SDK ,解决步骤如下:

      解决方案资源管理器 中分别选择报错的三个工程:SamplePlatformSampleRendererSamples右键 > 属性

      • 设置 include 目录

        C/C++ > 常规 > 附加头文件 ,进入编辑状态然后添加 DirectX SDK 安装目录中的 include 目录: C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include

      • 设置 lib 目录

        库管理器 > 常规 >附加库目录Samples 不是静态链接库,因此是 链接 > 常规 >附加库目录 ),进入编辑状态,添加目录 DirectX SDK 安装目录中的 Lib目录:C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib

      完成上述配置后,重新生成,输出如下表示编译完成了:

      59>------ 已跳过全部重新生成: 项目: INSTALL, 配置: release x64 ------
      59>没有为此解决方案配置选中要生成的项目 
      ========== 全部重新生成: 成功 58 个,失败 0 个,跳过 1 个 ==========

     

    运行示例

    physx\bin\win.x86_64.vc141.mt\debug 目录下会生成很多 .exe 文件,这些都是官方提供的示例,可以直接双击运行。例如 Samples_64.exe 运行结果:

     

    参考

    展开全文
  • Havok和Physx对比

    千次阅读 2009-01-22 03:14:00
    目前从市面上来讲,比较出名的就是havok公司的game dynamics sdk和刚刚加入NVIDIA 公司的PHYSX。在此我想讨论和比较的是两款物理引擎的性能的目前发展。2008年2月4日,全球视觉计算技术的行业领袖NVIDIA宣布,公司...
  • PhysX使用总结

    千次阅读 2015-03-31 14:46:14
     PhysX中的基本概念:   当前的物理引擎主要还是针对刚体的模拟,所以主要总结刚体部分。  PhysX中的概念主要有:  Shape: 描述物体的形状。其常用
  • Physx3.3 source code

    2016-02-04 12:46:51
    花了一个下午找到的,带工程文件的,至于怎么顺利运行还是大家自己研究。
  • official site: https://gameworksdocs.nvidia.com/PhysX/4.1/documentation/physxguide/Manual/Threading.html#threading 红色代表需要弄懂的。...This chapter explains how to use PhysX in mu...
  • 夸耀贫穷比夸富裕更卑鄙——斋藤绿雨 Official document: https://gameworksdocs.nvidia.com/PhysX/4.1/documentation/physxguide/Manual/HelloWorld.html#snippets 红色代表需要吸...
  • The PhysX API 物理运算引擎API Introduction 介绍 This chapter covers the basic patterns common to the PhysX application programming interface (API). 本章涵盖了基本模式常见的物理运算引擎应用程序编程...
  • Physx3.4学习随笔(入门篇1)-SDK与环境搭建SDK与环境搭建SDK获取PhysX Visual Debugger执行SnippetHelloworld SDK与环境搭建 本文主要介绍目前获取PhysX-3.4 SDK的方式和执行自带的Helloworld程序 SDK获取 原有的老...
  • [Packt Publishing] PhysX 物理建模 学习教程 (英文版) [Packt Publishing] Learning Physics Modeling with PhysX (E-Book) ☆ 图书概要:☆ Master the PhysX 3 Physics Engine and learn how to program your ...
  • official site: https://gameworksdocs.nvidia.com/PhysX/4.1/documentation/physxguide/Manual/API.html#the-physx-api 红色代表需要弄懂的。 Introduction This chapter covers the basic patterns common to ...
  • nVIDIA PhysX承袭自AGEIA PhysX,但Nvidia在此基础上推出了nVIDIA PhysX物理加速,并将PhysX物理加速功能移植到nVIDIA GPU中,用户不必额外购买PhysX物理加速卡就能享受到PhysX物理加速功能。借助CUDA架构,nVIDIA...
  • 劳动可以使我们摆脱三大灾祸:寂寞、恶习、贫困 --------------------- 歌德 ...Official document: https://gameworksdocs.nvidia.com/PhysX/4.1/documentation/physxguide/Manual/Introduction.htm...
  • PhysX入门教程

    2012-08-30 09:44:12
    如题,介绍了如何配置、安装PhysX,并附有几个简单的例子,方便初学者真正开始学习和使用PhysX
  • Havok和Physx对比

    千次阅读 2010-03-04 15:06:00
    dynamics sdk和刚刚加入NVIDIA 公司的PHYSX。在此我想讨论和比较的是两款物理引擎的性能的目前发展。 2008年2月4日,全球视觉计算技术的行业领袖NVIDIA宣布,公司已经签署了收购物理游戏技术的行业领
  • [PhysX] PhysX 物理建模 学习教程 (英文版)Learning Physics Modeling with PhysX.pdf 能找到的资料不多关于Physx的内容。
  • nVidia Physx SDK 2.8.4

    热门讨论 2012-09-07 13:30:33
    NVIDIA的PhysX物理引擎,这是2.8.4版本的。目前最新版本是3.2.0,不过改动较大,命名前缀大多以Px开头,而2.8.x版本的都以Nx开头。Good luck!
  • PhysX官方手册翻译

    千次阅读 2015-03-31 15:14:18
    PhysX官方手册翻译 本人水平有限,翻译中如果出现比较恶的句子...大家一定要查阅原文。 更新:2008-7-1 22:22 Raycasting(射线查询) 更新:2008-6-26 23:33 更新:2008-6-

空空如也

1 2 3 4 5 ... 20
收藏数 3,206
精华内容 1,282
关键字:

physx