zoukankan      html  css  js  c++  java
  • PhysX2.8教程1:启动Nvidia Physx

    来自:http://gputoaster.wordpress.com/2010/10/16/tutorial-1-kick-start-nvidia-physx/

       Let's Start    

    本篇主要内容:

    1) 创建PhysX上下文

    2)初始化图形环境Graphics Environment

    3)销毁PhysX 

       1) 初始化PhysX SDK   

    开始使用PhysXAPI之前,必须初始化SDK,必须obligatory。通常分一下几个步骤:

        创建NxPysicsSDK对象    

    SDK对象是一切的基础。如果SDK没有完成初始化,其后所有的对PhysX对象的操作都只能失败。

    NxPhysicsSDK *pPhysics ; //declare globally
    pPhysics = NxCreatePhysicsSDK(NX_PHYSICS_SDK_VERSION);
    if(!pPhysics)
       
    return;

        创建NxSceneDesc对象    

    场景包含如下特性properties:  bodies, restraints 和 effectors。

    它们之间会相互作用。场景负责随时间流逝模拟物体状态。

    可以同时存在多个场景,条件是所有场景都是某个大场景的一部分。

    NxVec3 defaultGravity(0.f, -9.8f0.f); //Declare somewhere in the global scope

    NxSceneDesc sceneDesc;
    sceneDesc.simType 
    = NX_SIMULATION_HW;
    sceneDesc.gravity 
    = defaultGravity;

    NxSceneDesc结构体有很多内容,每一项都可看做一个描述符,包含了创建NxScene所需的某项信息。

    可以用pushBack()方法添加描述符对象到对象描述的列表中。

    PhysX描述符定义了会影响到整个PhysX计算的性质nature, 行为behaviour和参数parameters.

    simType描述符定义了物理模拟可能是硬件模拟(NX_SIMULATION_HW)或软件模拟(NX_SIMULATION_SW)。硬件模拟需要硬件PPU单元的支持。Nvidia Geforce 8800GT以上的显卡都是支持的。ATI Radeon GPU也支持。

    gravity描述符定义的是重力参数,是一个3维向量值,y方向分量为-9.8,m/s。

    注: PhysX貌似默认是左右坐标系,+x左+y上+z屏幕向内) 

    除此以外,还有很多其他描述符。更多细节参考PhysX文档。 

        创建NxScene对象    

    上面创建的NxSceneDesc对象是一次性的,只在创建场景对象时有效。

    创建对象的方法是使用SDK对象以NxSceneDesc对象为参数调用其createScene()方法。 

    NxScene *pScene; //Declare Globally (Recommended)
    pScene = pPhysics->createScene(sceneDesc);

    if(!pScene)
    {
        sceneDesc.simType 
    = NX_SIMULATION_SW;
        sceneDesc.gravity 
    = defaultGravity;
        pScene 
    = pPhysics->createScene(sceneDesc);
        
    if (!pScene) return;

    可能会因为创建SDK对象时硬件不支持硬件模拟,因此pPhysics对象是NULL,后导致pScene创建失败为NULL。

    因此在第一次创建后如果为NULL,在此以软件模型的方式创建SDK对象,并创建pScene。

    或者你不需要这么麻烦,直接在创建SDK时就判断硬件对PPU的支持如何,像这样

    if (gPhysicsSDK->getHWVersion() > 0)
    sceneDesc.simType 
    = NX_SIMULATION_HW;
    else

    sceneDesc.simType = NX_SIMULATION_SW;   


        开始模拟    

    有了NxScene对象就可以用NxScene::simulate()方法开始模拟了。

    该方法接收一个表示时间间隔的参数。

    通过调用simulate(),PhysX引擎会进行一系列内部操作和计算,得出经过时间间隔之后场景的情形。

    void StartPhysics(void)
    {
    NxReal currentTime 
    = GetTime();
    pScene
    ->simulate(gDeltaTime);
    pScene
    ->flushStream();

    StartPhysics()方法是PhysX模拟到当前时刻。GetTime()返回是一个NxReal即float型,表示当前时间。

    flushStream(),在返回模拟结果前刷新缓存中的所有命令,保证PhysX完成了设置的命令。

       2)初始化图形环境   

    PhysX是独立于图形环境的。你喜欢在哪儿(OpenGL,D3D,Orge,OSG)使用它的模拟结果数据度可以。 


       3)销毁PhysX    

    if(pScene)
    {
        ...
        pPhysics
    ->releaseScene(*pScene);
    }

    if(pPhysics)

        pPhysics->release();  


  • 相关阅读:
    Java集合概述
    高可用性、负载均衡的mysql集群解决方案
    openOffice转换的时候乱码在linux下使用openOffice的时候发现在转换后出现了乱码
    (转)Linux安装SwfTools-0.9.2安装事,在执行make install时报错
    (转)java使用jsp servlet来防止csrf 攻击的实现方法
    (转)卫语句
    python的全局变量玩法还挺特别的
    那万恶的ssh真是麻烦
    关于有符号与无符号的字节
    开源而又强大的迷你型web服务器推荐
  • 原文地址:https://www.cnblogs.com/mumuliang/p/2080131.html
Copyright © 2011-2022 走看看