Cesium中3D模型的运动可以使用CZML直接驱动,但使用该方法前提是能事先计算出3D模型的运动轨迹,具有很大的局限性。那么如何实时驱动3D模型呢?
Cesium渲染过程分析
Cesium渲染过程的分析可以参考链接1。Cesium的渲染始于虚拟地球组件CesiumWidget的startRenderLoop方法,在该方法中将调用requestAnimationFrame函数开始渲染。
虚拟地球组件CesiumWidget包含Scene组件,在其render方法随后调用Scene的render方法。在场景组件Scene的render方法中提供了preUpdate、postUpdate、preRender、postRender四个事件对象,这四个事件对象将是我们实时驱动3D模型的关键。
preUpdate事件
在Cesium更新渲染周期开始之前以目标帧率触发preUpdate事件。
1 | scene.postUpdate.addEventListener(function() { |
postUpdate事件
在场景更新之后,新帧渲染之前以目标帧率触发postUpdate事件。
preRender事件
在场景更新之后,新帧渲染之前触发preRender事件。
1 | scene.preRender.addEventListener(function() { |
postRender事件
在新帧渲染之后触发postRender事件。
实时驱动3D模型
从上一节对Cesium渲染过程分析可知,要实时驱动3D模型,应订阅场景Scene的preUpdate事件,在preUpdate事件的处理函数中改变3D模型的位置和姿态。
订阅preUpdate事件
1 | //订阅场景的preUpdate事件 |
获取czml实体的参数
1 | viewer.scene.preUpdate.addEventListener(function(scene, time) { |
使用Entity API加载3D模型
1 | var viewer = new Cesium.Viewer('cesiumContainer'); |
使用Primitive API加载3d模型
1 | var viewer = new Cesium.Viewer('cesiumContainer'); |
参考链接
- Cesium摄像头跟踪飞机实体时晃动问题分析,by jack huang.
- Improving Performance with Explicit Rendering, by Gabby Getz.
- Cesium 源码打包入门 [ver1.72] ,by mob604756f3c518.