创建流体

来源:互联网 发布:逆光源网络剧未删减版 编辑:程序博客网 时间:2024/05/01 05:57

声明:本文出自physx技术文档,原文为英文

创建流体

 

         创建一个流体,需调用NxScene::createFluid()和恰当的描述符号。见粒子交互章节,其中有一系列参数影响流体行为的描述。

 

         直接指定粒子的初始位置,速率等等,或使用发射器创建新的粒子。通过使用NxParticleData结构和NxFluidDesc::initialParticleData成员可以创建初始粒子状态。

 

         如果你不希望创建初始的一系列粒子,可以简单地设置initialParticleData成员numParticlesPtr为NULL。

 

         你或许仍希望通过使用如渲染等来指定输出的缓冲区(粒子写入数据particleWriteData)。

 

         如果你指定了初始的粒子数据(initialParticleData),可以同样使用NxParticleData结构来写入粒子数据(particleWriteData)。

 

         在创建流体时,SDK中仅仅使用以下初始粒子数据(initialParticleData)可以读取。

 

bufferPos – 每个个体粒子的位置。

bufferVel – 每个粒子的速率。

bufferLife – 每个粒子的寿命。

 

如果这些成员为NULL,那么SDK使用初始值。NxParticleData的其余部分仅仅通过使用SDK中的模拟来写入。详见粒子渲染(particle rendering)中。

 

然后你可能要通过使用NxFluid::addParticles函数手动地添加粒子。关于有多少粒子可以添加具有一个限制,该限制依赖于用户设置和当前流体中的粒子数量。默认的最大限制是每个缓冲帧具有4096个粒子,但最详细的限制为:最小为( NxParameter::NX_CONSTANT_FLUID_MAX_PARTICLES_PER_STEP,NxFluidDesc::maxParticles - *NxParticleData::numParticlesPtr )

 

注:新版本2.7.0的addParticles()缓冲粒子的方法不能够在创建下一帧缓冲中被创建(因为已经达到了限制)。

 

注:2.7.0的新的特征是不可能获得新添加的粒子的IDs,应使用:NxFluidDesc::particleCreationIdWriteData.

 

注:循环数据所允许的每个指定的缓冲状态(e.g., bufferPosByteStride)没有被紧紧包裹或交错。对于仅仅排列的数组来说,典型的大小(元素)已经足够了。

 

可以创建一个流体运行的软件,而不是默认的是,在硬件上。要做到这一点,简单地降低流体中的描述符NX_FF_HARDWARE标志。

 

这使您能够运行在Windows PC上的流体,无PPU。该选项目前还没有其他平台。

 

还要注意的是性能会比在硬件上相当糟糕,尤其是在与大量的动态对象的场景。

 

例:

 

         指定初始粒子状态

 

    //Set structure to pass particles, and receive them after every simulation step    NxParticleData particles;
 

particles.maxParticles = gParticleBufferCap;
    particles.numParticlesPtr =&gParticleBufferNum;
    particles.bufferPos =&gParticleBuffer[0].x;
    particles.bufferPosByteStride =sizeof(NxVec3);

 

    //Create a fluid descriptor

NxFluidDesc fluidDesc;

 

fluidDesc.kernelRadiusMultiplier = 2.3f;
    fluidDesc.restParticlesPerMeter =10.0f;
    fluidDesc.stiffness = 200.0f;
    fluidDesc.viscosity = 22.0f;
    fluidDesc.restDensity = 1000.0f;
   fluidDesc.damping = 0.0f;
    fluidDesc.staticCollisionRestitution= 0.4f;
    fluidDesc.staticCollisionAdhesion =0.1f;
    fluidDesc.simulationMethod =NX_F_SPH;
    fluidDesc.initialParticleData =particles;
    fluidDesc.particlesWriteData =particles;

 

    gFluid =gScene->createFluid(fluidDesc);

 

然后创建粒子发射器

 

    //Create fluid    NxFluidDesc fluidDesc;    fluidDesc.setToDefault(); 
 
    fluidDesc.simulationMethod = NX_F_SPH;
    fluidDesc.staticCollisionRestitution = 0.1;    fluidDesc.staticCollisionAdhesion = 0.5;       fluidDesc.maxParticles = MAX_PARTICLES;      fluidDesc.restParticlesPerMeter = 50;       fluidDesc.stiffness = 1;       fluidDesc.viscosity = 6;
 
    gParticles = new NxVec3[fluidDesc.maxParticles];    fluidDesc.particlesWriteData.bufferPos = &gParticles[0].x;      fluidDesc.particlesWriteData.bufferPosByteStride = sizeof(NxVec3);          fluidDesc.particlesWriteData.maxParticles = fluidDesc.maxParticles;       fluidDesc.particlesWriteData.numParticlesPtr = &gNumParticles; 
    gScene->createFluid(fluidDesc);

        

         流体内存共享

 

         2.7.0是一个新的功能,如果你创建四个以上的流体具有完全相同的NxFluidDesc:: maxParticles设置,PPU开始共享内存之间的流体。这使得有可能创造更多的流体,由于内存共享释放内存在PPU。

 

即使它是在相同的时间,现在可以有更多的流体在PPU,它是一个好主意,只有模拟播放器的图,是在流体,使用NX_FF_ENABLE标志。

 

一个不错的使用情况是:40流体,例如一个游戏水平与M NR的maxParticles20和20 N NR的maxParticles,不是所有的人都是可见的同时。

 

请注意,只有在同一场景内的液体可以共享内存。

 

例子:

 

SampleParticle Fluid

 

涉及的API

 

NxFluid

NxFluidDesc

NxScene

NxParticleData

 


原创粉丝点击