PhysX流體筆記

2021-06-07 14:04:02 字數 4200 閱讀 2658

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 物理模擬導致物體的一些屬性隨著時間進行變化,如位置,速度等.模擬...