添加火灾效果、消防车漫游动画这些不是难点,其他博主文章里有很多,对我而言难点在于,着火点和消防车停车的位置都是用户自定义的,因此,消防车喷水的水柱参数需要根据两个坐标进行计算,在网上没找到相关的方法,故在此记录一下。
将水柱的运动轨迹模拟为斜抛运动,着火点即是轨迹的最高点。
重力g可以自己自定义(我定义的3.8),需要计算的参数是:
1、水柱的角度,即heading、pitch值;
2、水柱的初始速度、生命周期;
计算步骤如下:
设:p1为着火点、p2为消防车停车点(笛卡尔坐标)
1、由两点的坐标计算两点间的距离:
distance=Cesium.Cartesian3.distance(p1,p2)
2、计算两点的heading值:
3、计算pitch值:
注意:非两点的pitch值,而是斜抛起点的切线与水平方向的夹角!
根据两点坐标求出水平方向、垂直方向的长度x0、y0;(先转为经纬度坐标,求出高度差y0,利用距离和高度,通过勾股定理求x0)
通过斜抛运动解析式,可得 夹角a的tan值,tan(a) = 2*y0/x0;
生命周期 t = Math.aqrt((tan(a) * x0) / g)
初始速度 speed = g * t / sin(a)
pitch = 90° - a * 180° / π
4、设置相关参数
通过求出的heading值和pitch值设置emitterModelMatrix,设置喷射角度:
function computeEmitterModelMatrix() {
hpr = Cesium.HeadingPitchRoll.fromDegrees(110.0, 30.0, 0.0, hpr); // 倾斜角度
trs.translation = Cesium.Cartesian3.fromElements(0, 0, 1, translation); // 发射高度
trs.rotation = Cesium.Quaternion.fromHeadingPitchRoll(hpr, rotation);
return Cesium.Matrix4.fromTranslationRotationScale(trs, emitterModelMatrix);
}
参考:
Cesium项目实战(13)-应急处理、消防处理(粒子系统) - 小专栏
其余参数:
{
......
gravity: -g,
minimumSpeed: speed,
maximumSpeed: speed,
lifetime: t,
......
}