目录
3D模型(3D Models)
(1)快速入门(Quick start)
(2)动画(Animations)
(3)各取所需(Picking)
(4)转化COLLADA为glTF(Converting COLLADA to glTF)
(5)故障排除(Troubleshooting)
I Troubleshooting on Mac
II Troubleshooting on Windows
(6)资源(Resources)
3D模型(3D Models)
本章将介绍如何通过cesium原始API对3D Models进行转化、加载和使用。如果是刚开始学习Cesium,可以先跳到空间数据可视化章节
Cesium支持使用glTF的关键帧动画、皮肤和人体节点挑选,glTF是一种由科纳斯组织(WebGL与COLLADA的联合)新兴起来的工业级web 3D模型格式
(1)快速入门(Quick start)
Cesium可以使用一些现有的二进制glTF模型:
①螺旋桨转动的飞机;
②轮子转动的地面车辆;
③循环走步的人;
④热气球;
⑤一辆牛奶卡车(包括Draco-compressed牛奶卡车)。
这些模型都有各自的存放目录Apps/SampleData/models。大多数有原始的COLLADA文件(.dae),glTF文件(.gltf)或者二进制的glTF文件(.glb)。Cesium apps中原始的COLLADA文件不需要使用。
开始code代码加载这些模型,首先在沙堡(Sandcastle)中打开Hello World样例。在var viewer = ... 下面增加scene变量。
var scene = viewer.scene;
然后,通过Cesium.Model.fromGltf来加载地面车辆模型,代码如下:
var modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(
Cesium.Cartesian3.fromDegrees(-75.62898254394531, 40.02804946899414, 0.0));
var model = scene.primitives.add(Cesium.Model.fromGltf({
url : '../../../../Apps/SampleData/models/GroundVehicle/GroundVehicle.glb',
modelMatrix : modelMatrix,
scale : 200.0
}));
点击F8,使用右上角的地理编码工具放大到Exton,PA。
先看到的是直视下的地面车辆。可以使用右点鼠标拖动放大靠近车辆,也可以使用鼠标中间键拖动斜视角观察车辆。
Cesium.Model.fromGltf异步加载glTF模型及模型外部文件,然后渲染完成加载,其内部已经解决了readyPromise。这里仅仅需要.gltf文件的url。
fromGltf中的scale选项可以放大模型。许多真实尺寸的模型可能比较小,在测试中可以使用scale选项来放大模型,有时会放的非常大,例如200000.0,如下所示:
通过modelMatrix的选项fromGltf可以定位和旋转模型。样例中创建了一个地方坐标系统的模型,使用Cesium.Transforms.eastNorthUpToFixedFrame创建了一个地方由东到北的坐标系,坐标原点为经度-75.62898254394531度,纬度40.02804946899414度。这里使用的modelMatrix属性可以随意移动改变模型。
通过在var viewer = ...后任何位置增加以下代码,使用Cesium观察员可以看到坐标系:
viewer.extend(Cesium.viewerCesiumInspectorMixin);
点击F8,观察UI出现在左上角。展开Primitives,点击Pick a Primitive,然后点击选中地面车辆,再点击show reference frame。
x轴(east东)是红色,y轴(north北)是绿色,z轴(up上)是蓝色。
使用相同的代码通过改变url,可以加载飞机和人。参考Cesium.Model.fromGltf查看详细内容。
(2)动画(Animations)
每个模型都有内置的动画,这些动画都是由artist设计。设计者们通过定义几个关键的姿势来创造一个动画,Cesium在运行时通过插值来构建平滑的动画。
为了使动画动起来,在Cesium.Model.fromgltf之后增加以下代码:
Cesium.when(model.readyPromise).then(function(model) {
model.activeAnimations.addAll({
loop : Cesium.ModelAnimationLoop.REPEAT
});
});
由于动画片段存储在glTF模型中,在访问使用之前必须等待readyPromise解析之后。使用addAll来播放模型中的所有动画,Cesium.ModelAnimationLoop.REPEAT来循环动画,直到其被从activeAnimations收集器中移除。使用add可以播放特定id(glTF JSON属性名)的动画。
除了loop选项外,addAll和add提供了其它选项来控制动画的开始、停止、速度、方向等。例如下面的动画有相对于Cesium时钟一半的速度,而且是反方向。
model.activeAnimations.addAll({
loop : Cesium.ModelAnimationLoop.REPEAT,
speedup : 0.5,
reverse : true
});
add返回一个ModelAnimation对象(addAll返回对象数组),对象中包含动画的开始、停止及更新每一帧的事件。这样就允许启动一个相对于另一个的动画,可以查看开始、停止和更新事件。
动画和Cesium时钟是同步的,因此可以在回放部件按下时看到它们。也可以使用时间轴和回放部件来加快,降低和反转动画速度。
可以通过初始化Viewer来自动播放动画:
var viewer = new Cesium.Viewer('cesiumContainer', {
shouldAnimate : true
});
(3)各取所需(Picking)
像所有Cesium基本元素一样,Scene.pick将返回选中模型作为它一部分的模型。另外,glTF node和glTF mesh的glTF id(JSON属性名)也会返回,这样可以准确的选出不同模型的组成部分。如下示例可以在终端中打印出鼠标光标下的node和mesh名。
var handler = new Cesium.ScreenSpaceEventHandler(scene.canvas);
handler.setInputAction(
function (movement) {
var pick = scene.pick(movement.endPosition);
if (Cesium.defined(pick) && Cesium.defined(pick.node) && Cesium.defined(pick.mesh)) {
console.log('node: ' + pick.node.name + '. mesh: ' + pick.mesh.name);
}
},
Cesium.ScreenSpaceEventType.MOUSE_MOVE
);
(4)转化COLLADA为glTF(Converting COLLADA to glTF)
使用web-based COLLADA-to-glTF converter将COLLADA模型转化为Cesium使用的glTF,这种方式把.dae文件和图像转化为带有嵌入图像的.glTF文件。
(5)故障排除(Troubleshooting)
如果在Cesium中加载3D模型有问题,首先需要查明问题所在。以下几点可能会出问题:
- 建模工具的COLLADA导出器,例如Maya、Modo、SketchUp等;
- COLLADA-to-glTF转化器;
- Cesium glTF渲染器。
I Troubleshooting on Mac
II Troubleshooting on Windows
Windows中,Visual Studio 2013(免费社区版也含有)有模型编辑器可以加载打开COLLADA模型文件。
(6)资源(Resources)
查看沙堡中的3D模型示例(3D models example)及模型(Model)和模型动画收集器(ModelAnimationCollection)的相关文档。