粒子系統(tǒng)發(fā)射器

粒子發(fā)射器是用來(lái)限定粒子活動(dòng)范圍的,并給定隨機(jī)產(chǎn)生的粒子一個(gè)初始位移和速度。cesium默認(rèn)提供了4種粒子發(fā)射器。分別是
BoxEmitter 盒子粒子發(fā)射器,CircleEmitter 圓形粒子發(fā)射器,ConeEmitter 圓錐粒子發(fā)射器,SphereEmitter 球形粒子發(fā)射器

cesium默認(rèn)粒子發(fā)射器類型

1,BoxEmitter 盒子粒子發(fā)射器
(1)生成算法
用a,b,c分別為長(zhǎng),寬,高建立一個(gè)盒子。盒子中心點(diǎn)為原點(diǎn),建立x-y-z直角坐標(biāo)系。其中x的取值范圍(-a/2,a/2),y的取值范圍(-b/2,b/2),z的取值范圍(-c/2,c/2)
代碼

function createBoxPoints(a,b,c){
let x=Cesium.Math.randomBetween(-a/2, a/2)
  let y=Cesium.Math.randomBetween(-b/2, b/2)
  let z=Cesium.Math.randomBetween(-c/2, c/2)
  return {x,y,z}
}

效果


box內(nèi)產(chǎn)生隨機(jī)粒子的算法

評(píng)價(jià):這也是cesium采用的算法,能均勻在盒子內(nèi)產(chǎn)生隨機(jī)點(diǎn)

2,CircleEmitter 圓形粒子發(fā)射器
(1)生成算法1
根據(jù)圓的公式 xx + yy = rr;
取x在(-r,r)則 y等于r的平方減去x的平方得到結(jié)果之后再開方。這樣y的取值范圍就為(-Math.sqrt(r
r-xx),Math.sqrt(rr-x*x))
代碼

function createCirclePoints(radius){
let x=Cesium.Math.randomBetween(-radius, radius)
  let yMax=Math.sqrt(radius*radius-x*x)
  let y=Cesium.Math.randomBetween(-yMax, yMax)
  return {x,y,z:0}
}

效果

圓內(nèi)產(chǎn)生隨機(jī)點(diǎn)算法1

評(píng)價(jià):從圖中看出靠近圓邊線的點(diǎn)比較密集。中間部分的點(diǎn)比較稀疏
(2)生成算法2
x的取值范圍在(-r,r),y的取值范圍在(-r,r),然后根據(jù)圓的公式xx + yy = rr,只要(xx + yy)<rr
則隨機(jī)點(diǎn)就落在圓內(nèi)
代碼

function createCirclePoints2(radius){
let x=Cesium.Math.randomBetween(-radius, radius)
  
  let y=Cesium.Math.randomBetween(-radius, radius)
  let isInner=(x*x+y*y)<radius*radius;
  if(isInner){
    return {x,y,z:0}
  }
  
}

效果


圓內(nèi)產(chǎn)生隨機(jī)點(diǎn)算法2

評(píng)價(jià):使用這個(gè)算法會(huì)多產(chǎn)生一些在圓外的點(diǎn),但能滿足在圓內(nèi)均勻產(chǎn)生點(diǎn)的需求
(3)生成算法3
使用極坐標(biāo)的方式表示在園內(nèi)的點(diǎn),圓內(nèi)點(diǎn)(r,θ)可以任意表示為(r,θ ± 2kπ)或(?r,θ ± (2k+ 1)π)
代碼

function createCirclePoints3(radius){
let rad=Cesium.Math.randomBetween(0, radius)
  
  let theta=Cesium.Math.randomBetween(0, 2*Math.PI)
  var x = rad * Math.cos(theta);
  var y = rad * Math.sin(theta);
  return {x,y,z:0}
}

效果


圓內(nèi)產(chǎn)生隨機(jī)點(diǎn)算法3

評(píng)價(jià)
圓心產(chǎn)生的點(diǎn)比較密集,離圓心越遠(yuǎn)產(chǎn)生的點(diǎn)越稀疏。

3,ConeEmitter 圓錐粒子發(fā)射器
算法,暫時(shí)還不太明白
代碼

unction createConePoints(angle);{
  let radius = Math.tan(angle);
  let theta=Cesium.Math.randomBetween(0, 2*Math.PI)
let rad=Cesium.Math.randomBetween(0, radius)
  let x = rad * Math.cos(theta);
  let y = rad * Math.sin(theta);
let z = 1.0;
  return {x,y,z}
}

4,SphereEmitter 球形粒子發(fā)射器
(1)生成算法1
和園內(nèi)生成隨機(jī)點(diǎn)算法一樣,球內(nèi)生成隨機(jī)點(diǎn)也有好幾種算法。當(dāng)然效果各不一樣,cesium采用的極坐標(biāo)算法,先求θ的范圍(0,2Π),然后再確定φ的范圍(0,Π),
最后確定r的取值范圍(0,R)


球內(nèi)生成隨機(jī)點(diǎn)算法

代碼

function createSpherePoints(radius){
let rad=Cesium.Math.randomBetween(0, radius)
  
  let theta=Cesium.Math.randomBetween(0, 2*Math.PI)
  let phi=Cesium.Math.randomBetween(0,Math.PI)
  let x = rad * Math.cos(theta)*Math.sin(phi);
  let y = rad * Math.sin(theta)*Math.sin(phi);
  let z=rad*Math.cos(phi);
  return {x,y,z}
}

效果


球內(nèi)產(chǎn)生隨機(jī)點(diǎn)的算法1

評(píng)價(jià),和園內(nèi)極坐標(biāo)生成隨機(jī)點(diǎn)的算法一樣,靠近球心的點(diǎn)會(huì)比較密集,遠(yuǎn)離球心隨機(jī)點(diǎn)會(huì)越來(lái)越稀疏
5,其它拓展實(shí)現(xiàn),例如三角形內(nèi)隨機(jī)點(diǎn),矩形內(nèi)隨機(jī)點(diǎn),圓柱內(nèi)隨機(jī)點(diǎn),五角星內(nèi)隨機(jī)點(diǎn)等

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容