physx流體筆記之發射器
發射器用於直接建立流體粒子,可以實現模擬水龍頭、噴嘴、流血的傷口等。
它有兩種模式:
第一種,常壓力(constant pressure),發射粒子的壓力是固定的,水射出一條線可以用這個模擬。
第二種,常流速(constant flow rate),發射器在每幀保持發射固定數量的粒子。通過操做nxfluidemitterdesc::rate,可以動態的更改流速,通過nxfluidemitterdesc的nx_fef_enabled標誌,可以開啟或者關閉發射器
建立發射器
需要乙個nxfluidemitterdesc,設定引數,然後用這個描述符呼叫nxfluid::createemitter()方法來建立。
簡單介紹一下幾個nxfluidemitterdesc中筆記重要的引數:
relpose 發射器的姿態,位置和旋轉等
type 發射器型別,可以是常壓力或常流速,分別對應
nx_pe_constant- pressure和 nx_pe_constant_flow_rate
shape 發射器的形狀,當前版本中有兩中型別,方形(nx_pe_rectangular)和橢
圓形(nx_pe_ellipse)
particlelifetime 發射器發出的粒子的生存時間,以秒記,如果設為零,粒子將一直存活,直到碰
到drain(這個詞暫時沒找到合適的翻譯)
maxparticles 發射器可以發射的最大的粒子數,當發射的粒子數達到最大值後,發射器停止創
建粒子,然後用已經落地的粒子重新開始發射。設為0,不限制發射的粒子數,
它會一直發射,直到到達fluid的最大粒子數。
rate 每秒鐘發射的粒子數。只在nx_pe_constant_flow_rate時才有效
dimensionx,dimensiony 發射器的尺寸
示例**
建立發射器
nxfluidemitterdesc emitterdesc;
emitterdesc.settodefault();emitterdesc.dimensionx = 0.03;
emitterdesc.dimensiony = 0.03;
emitterdesc.relpose.id();nxreal mat = ;
emitterdesc.relpose.setcolumnmajor44(mat);
emitterdesc.rate = 5.0;emitterdesc.randomangle = 0.1f;
emitterdesc.fluidvelocitymagnitude = 6.5f;
emitterdesc.maxparticles = max_particles;
emitterdesc.particlelifetime = 4.0f;
emitterdesc.type = nx_fe_constant_flow_rate;
emitterdesc.shape = nx_fe_ellipse;
gfluidemitter = gfluid->createemitter(emitterdesc);
將physx文件按自己的語言組織了一遍。 純粹隨筆性質。
建立粒子的描述符是nxfluiddesc,方法有三種:一是直接指定粒子的初始位置和速度,二是使用發射器建立,三是使用nxparticledata和nxfluiddesc::initialparticledata,傳遞初始的粒子狀態來建立。
如果不希望在一開始就指定粒子的初始狀態,簡單的將nxfluiddesc的numparticlesptr置為null即可。
為了渲染,需要指定資料輸出的緩衝區,particlewritedata。要注意的是,如果你要在一開始時就指定粒子的狀態,那麼多個fluid,不允許使用同乙個nxparticledata資料結構。
建立時,nxparticledata的下面幾個成員比較重要,physx sdk會讀取這些資料:
bufferpos 儲存粒子的位置
buffervel 儲存每個粒子的速度
bufferlife 儲存每個粒子的生存時間
如果這些成員都是null,physx會使用預設值。nxparticledata的其它成員,只在渲染時被實時的更新,這裡不用理會。
建立了之後,你可能還希望動態地向其中新增新的粒子,方法addparticles可以實現此功能。這個方法是有條件限制的,具體能新增多少的粒子,取決於建立時引數的設定以及當前fluid中已存在的粒子數。physx預設的最大粒子數是4096。
fluid的模擬可以有兩種模式,軟體和硬體模擬,預設是採用硬體加速。如果要指定使用軟體模擬,在nxfluiddesc中取消nx_ff_hardware標誌。暫時只支援在windows上使用軟體模擬。不過軟體模擬的話,效率是很低的。
示例**:
第一種,指定初始狀態的建立方法
//set structure to pass particles, and receive them after every simulation step
nxparticledata particles;
particles.numparticlesptr = &gparticlebuffernum;particles.bufferpos = &gparticlebuffer[0].x;
particles.bufferposbytestride = sizeof(nxvec3);
//建立描述符
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.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.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.numparticlesptr = &gnumparticles;
gscene->createfluid(fluiddesc);
PhysX流體筆記之建立粒子
將physx文件按自己的語言組織了一遍。純粹隨筆性質。建立粒子的描述符是nxfluiddesc,方法有三種 一是直接指定粒子的初始位置和速度,二是使用發射器建立,三是使用nxparticledata和nxfluiddesc initialparticledata,傳遞初始的粒子狀態來建立。如果不希望...
基於PhysX的流體模擬
physx作為全球最優秀的物理引擎之一,在被顯示卡老大nvidia公司收購之後,越來越受到人們的關注。前不久,nvidia公司發布了乙個支援physx cuda的顯示卡驅動,從而正式向世人宣告,乙個用顯示卡來進行物理加速的時代將要到來。我們來看一下如何用physx開發包,來實現流體的模擬。physx...
PhysX學習筆記 2 動力學 1
場景 scene 物理模擬發生的場所,包含了actor,joint,effector.跟圖形引擎裡的scene 差不多,可以有多個例項存在,互不干涉.場景沒有特別的大小限制.功能有重力,射線揀取,開關硬拼檢測等.模擬時序 timing 物理模擬導致物體的一些屬性隨著時間進行變化,如位置,速度等.模擬...