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

評(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(rr-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}
}
效果

評(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}
}
}
效果

評(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}
}
效果

評(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)

代碼
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}
}
效果

評(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)等