Cesium中加载实体的方法我经常用Cesium.Primitive和Cesium.Entity对象来添加,然后最近在找怎么使用cesium实现火箭部分节点脱落的动画,发现了CZML格式来加载实体:Cesium 支持使用 CZML(Cesium Language)格式加载实体。
CZML 是一种更强大和灵活的数据格式,适用于复杂的场景和动画效果。而直接使用JavaScript 对象字面量形式来创建实体,则更简单直接,适用于简单的场景和静态的实体。
下边是我编写的一个demo对象
const czml = [
{
id: "document", //节点的唯一标识符。文档节点,用于描述整个 CZML 数据的元数据信息。
name: "CZML Model",//文档的名称
version: "1.0",//CZML 版本号
clock: {//时钟设置,用于控制时间和动画
interval: "2023-05-31T08:00:00Z/2023-05-31T08:01:40Z",//时间间隔,表示场景的时间范围。
currentTime: "2023-05-31T08:00:00Z",//当前
multiplier: 1,//时间倍数,控制时间流逝的速度。
range: "LOOP_STOP",//时间范围循环方式,当到达时间范围的末尾时停止。
step: "SYSTEM_CLOCK_MULTIPLIER"//时间步进方式,使用系统时钟倍数进行步进。
}
},
{
id: "entity1",//实体节点,表示一个具体的实体,实体的唯一标识符。
availability: "2023-05-31T08:00:00Z/2023-05-31T08:01:40Z",//实体的可用时间范围。
position: {//实体的位置属性
epoch: "2023-05-31T08:00:00Z",//位置的参考时间。
cartographicDegrees: [
0,
101.200403,
30.396231,
0,
100,
108.400403,
31.396231,
800000,
]
},
orientation: {
velocityReference: "#position"//方向的参考属性,指向实体的位置属性。
},
model: {
gltf: "launchvehicle.glb",
minimumPixelSize: 128,
maximumScale: 20000,
articulations: {//模型的关节动画定义。
"Fairing Open": {
epoch: "2023-05-31T08:00:00Z",
number: [0, 0, 100, 120],
},
"Fairing Separate": {
epoch: "2023-05-31T08:00:00Z",
number: [0, 0, 60, -50],
},
"Fairing Drop": {
epoch: "2023-05-31T08:00:00Z",
interpolationAlgorithm: "LAGRANGE",//插值算法,这里使用拉格朗日插值算法
interpolationDegree: 1,//插值次数,表示使用1次插值
number: [0, 0, 30, -1, 45, -1, 60, -10, 100, -500],//关节动画的数值序列,用于控制关节动画的运动
},
},
},
path: {//实体的路径属性,表示实体的运动轨迹
show: true,
resolution: 1,//路径的分辨率
material: {//路径的材质属性
polylineGlow: {//光晕效果的材质
color: {
rgba: [255, 255, 0, 255]
},
glowPower: 0.1//光晕强度
}
},
width: 2,
leadTime: 100,//路径的前导时间
trailTime: 0,//路径的尾迹时间
showForwardPath: true,//是否显示正向路径
showBackwardPath: false//是否显示反向路径
}
}
];
const dataSourcePromise = viewer.value.dataSources.add(
Cesium.CzmlDataSource.load(czml)
);
dataSourcePromise.then(function (dataSource) {
const entity = dataSource.entities.getById("entity1");
resolve(entity)
})
.catch(function (error) {
console.error(error);
reject(error)
});
这段代码实现了火箭模型的路径和过程中的动画
其中interpolationAlgorithm属性有两个可选值
"LINEAR"
表示线性插值算法。该算法根据给定时间点处的关节角度,通过线性插值计算出其他时间点上的角度值。线性插值算法假设角度的变化率是匀速的
"LAGRANGE"
表示拉格朗日插值算法。该算法使用拉格朗日插值多项式来计算给定时间点处的关节角度。拉格朗日插值算法通过使用离散时间点上的角度值,根据拉格朗日插值多项式的公式计算其他时间点上的角度值。拉格朗日插值算法可以提供更平滑和精确的插值效果,特别是当关节动画的运动过程中存在非线性的变化时。
需要注意的是:拉格朗日插值算法在处理大量数据点时可能会受到龙格现象的影响,导致插值多项式的振荡现象。为了避免这种情况,可以考虑使用其他插值方法,如样条插值
interpolationDegree
是用于指定拉格朗日插值算法中插值多项式的阶数或次数。它决定了插值多项式的复杂性和精度。
取值通常是根据数据点的分布和插值的要求来选择的。较低的阶数会产生简单的插值多项式,但可能无法准确地拟合复杂的函数形状。较高的阶数可以提供更精确的插值结果,但会增加计算复杂性。