创建流体
来源:互联网 发布:逆光源网络剧未删减版 编辑:程序博客网 时间: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
- 创建流体
- PhysX流体笔记之创建粒子
- 流体设计
- IO流体系
- 流体模拟-项目方向
- 负边距流体布局
- 流体模拟技术
- PhysX流体笔记
- 流体粒子交互
- 网络流体积
- 输入/输出流体系
- 关于IO流体系
- Java IO 流体系
- 文字 流体模拟
- IO流体系图解
- CSS流体布局详解
- 流体布局FlowLayout
- Java输入输出流体系
- Process Request shows status of 'INITIATED' or 'PROCESSING' but nolonger running
- hdu 1008
- DBCP的配置参数
- 单片机(不基于os)下如何实现简单的内存管理(malloc,realloc和free函数的重新实现)
- HTTP 返回码
- 创建流体
- Extjs中动态生成树
- 广告投放系统(openx)
- 观察者模式【Observer Pattern】
- 指针函数和函数指针的区别
- android 3d游戏研究(二)(边学边写,多谢高手指正,鞠躬) :数据库
- pl/sql中模拟登录Oracle EBS并获得职责 .
- UML类图关系大全
- How to set the current user on the model instance in the admin: