Cesium快速上手-学习

Install

package.json 中 workspaces后追加:"workspaces":[...], "private":true

yarn build-docs // 创建帮助文档
yarn start // 启动项目

初始化

// 少UI初始化
var widget = new Cesium.CesiumWidget("id")


cesium-widget.png

scene

Scene中有一些内置的图元对象:地球(globe)、无空盒(skyBox)、太阳(sun)、moon(月亮)等;另外还有2个用来由用户自行控制存放对象的数据 ,即primitives 和 groundPrimitives. (图元 和 贴地图元)



primitives(图元)

primitives.png

图元类 对应 一个三维渲染对象

图元是Cesium用来绘制三维对象的一个独立的结构。图元类有:Globe(地球)、Model(模形)、Primitive、BillboardCollection、ViewportQuad等。

Globe绘制的是全球地形,它需要2个东西:

  • 地形高程信息(只能有一个)
  • 影像图层(地球表皮-Appearance,其可叠加多个)
    整个地形的绘制也是渐进式的,即视线看到的地方才会去调度想着的地形高程信息,找到对应位置的地形影像贴上。然而Globe只是一个图元。同此可见一个图元可以相当复杂。

注:图元没有基类,但是所有的图元都会有update函数;Primitives类不是基类,只是图元的一种,起作用是用来绘制各种几何体;3. 图元是一类对象绘制的集合,可以包含多个WebGL在drawcall.

Model

hpr

Billboard

function createModel(url, height, heading, pitch, roll) {
  height = Cesium.defaultValue(height,0.0);
  heading = Cesium.defaultValue(heading, 0.0);
  pitch = Cesium.defaultValue(pitch,0.0);
  roll = Cesium.defaultValue(roll,0.0);

var hpr = new Cesium.HeadingPitchRoll(heading,pitch,roll);
var origin = Cesium.Cartesian3.fromDegrees(-123.0744619, 44.0503706, height);
var modelMatrix = Cesium.Transforms.headingPitchRollToFixedFrame(origin, hpr);

scene.primitives.removeAll(); // 清除之前的model
model = scene.primitives.add(Cesium.Model.fromGltf({url, modelMatrix, minimumPixelSzie: 128});
// minimumPixedSize 最小尺寸,地球缩小时,model尺寸不会小于128像素。

model.readPromise.then(function(model) {
    model.color = Cesium.Color.fromAlpha(getColor(viewModel.color), Number(viewModel......);
    model.colorBlenMode = getColorBlendMode(viewModel.colorBlendMode);
    model.colorBlendAmount = viewModel.colorBlendAmount;
    // Play and loop animations at half-speed
  });
}

Model图元的使用

  • Heading( 左>右,正数值表示)
  • Pitch( 下>上(抬头),正数值表示,-90代表面朝下看地球)
  • Roll-以自身为轴。()
  • origin 是地球空间直角坐标系中的位置(以地球为圆心,x朝向欧洲,y朝向亚洲,z朝向北极)

Add Billboard by reference frame


image.png

scene.camera.lookAt(target, offset)

// 相机目标点的位置,一般为物体的正中心
var center = Cesium.Matrix4.multiplyByPoint(model.modelMatrix, model.boundingSphere);

// 以center为中心,以什么姿态和距离去看
var hpr = new Cesium.HeadingPitchRange(heading, pitch, r*2.0);

scene.camera.lookAt(center, hpr);

注:如果不想以center为中心围绕,则使用lookAtTransform(transform,offset)

scene.camera.lookAtTransform(transform, offset)

使用目标和变换矩阵设置摄影机的位置和方向。
camera.lookAtTransform(Cesium.Matrix4.IDENTITY);

注:画多个批次个Model时,使用ModelInstanceCollenction
var collection = scene.primitives.add( new Cesium.ModelInstanceCollenction({url, instances}) )

UI交互面板用的knockout.js-一个脚本库


UI交互面板

billboard

http://localhost:8080/Apps/Sandcastle/index.html?src=Billboards.html&label=All

polylines

http://localhost:8080/Apps/Sandcastle/index.html?src=development%2FPolylines.html&label=Development

注:SimplePolyline 简版Polyline, 不带position.
GroundPolyline 贴地线. 其只能加到scene.groundPrimitives.add(new Cesium.GroundPolylinePrimitive({...})

地形加载 terrainProvider

http://localhost:8080/Apps/Sandcastle/index.html?src=Imagery%20Layers.html&label=Development

影像的加载

http://localhost:8080/Apps/Sandcastle/index.html?src=Cartographic%20Limit%20Rectangle.html&label=Development

http://localhost:8080/Apps/Sandcastle/index.html?src=Imagery%20Cutout.html&label=Development

Primitive图元

http://localhost:8080/Apps/Sandcastle/gallery/development%2FBox.html

http://localhost:8080/Apps/Sandcastle/gallery/development%2FCircle.html

结构图解


localhost:8080/Apps/Sandcastle/gallery/development%2FPolyline.html

3DTiles

new Cesium.Cesium3DTileset(options)也是图元的一种。

Appearance&Material

  • new Cesium.PerInstanceColorAppearance(options)
    具有颜色属性的GeometryInstance实例的外观。这允许使用相同的Primitive绘制多个几何体实例,每个实例都具有不同的颜色.


    e.g.
  • new Cesium.MaterialAppearance(options)
    任意几何体的外观(例如,与 EllipsoidSurfaceAppearance相反),支持使用材质着色。

e.g.

Camera和Scene中的其他函数的使用

http://localhost:8080/Apps/Sandcastle/index.html?src=Camera%20Tutorial.html&label=Tutorials

viewer.camera === viewer.scene.camera

lookXXX 相机的朝向

  • look(axis, angle) 按angle(角度)围绕axis(轴), 旋转相机的每个方向矢量
  • lookAt(target, offset)
  • lookAtTransform(transform, offset)
  • lookLeft(amount) / lookRight(amount) / lookUp(amount) / lookDown(amount) amount为角度
    camera.lookRight(option), 参数amount为正值camera向右看, 为负值camera向左看。
    camera.lookUp(option),参数amount为正值camera向上看,为负值camera向下看。
const lookFactor = 0.05;
camera.lookRight(x * lookFactor);
camera.lookUp(y * lookFactor);

move(direction, amount) 沿direaction(方向), 按amount平移摄影机的位置

  • move(direction, amount)

  • moveBackward(amount)

  • moveDown(amount)

  • moveForward(amount) / moveLeft(amount) / moveRight(amount) / moveUp(amount) / moveDown(amount)

  • flyTo(options)


Viewer/Entities组合的使用

Viewer/Entities 是 Cesium推荐的组合方式。

Entities下可add的几何体有:

Cesium/Viewer核心组件:

  • dataSourceDisplay管理加载dataSources数据集

cesiumWidget管理所有的三维窗口对象

其他UI组件(定制好的UI组件)

Viewer/Entities的作用:

  1. 方便创建真观的对象,同时做到性能优化(billboard、point等)
  2. 提供一些方便使用的函数:flyTo/zooTo
  3. 赋予Entity对象时间这个属性,对象有动态特性(Primitive没有)
  4. 提供一些UI组件
  5. 大量的快捷方式,camera等未必是好事儿。
  6. Datasource模式来加载大规模数据, 如: geojson.

写primitives图元创建方式相比,Entities.add方式创建几何体会更方便。Primitives类似于webGL的创建思路构建模型,而Entities简化了Primitives的复杂性,以对象的方式创建,使用上更加灵活。Entities创建的对象其内部最终还是会生成[scene.]Primitives组合和渲染。

primitives添加几何体的方式

var modelMatrix = Cesium.Matrix4.multiplyByTranslation(...);
var cylinderGeometry = new Cesium.CylinderGeometry({
  length, ..., topRadius: xxx, bottomRadius: xxx, vertexFormat: xxx
})

var greenCylinder = new Cesium.GeometryInstance({
  geometry: cylinderGeometry,
  modelMatrix: modelMatrix,
  attributes: ...
});

var redCone = new  Cesium.GeometryInstance({
  geometry: cylinderGeometry,
  modelMatrix: ...,
  attributes: ...
})

scene.primitives.add(new Cesium.Primitive({
  geometryInstances: [greenCylinder, redCone],
  appearance: ...
}))

// 使用 new Cesium.Viewer()创建带有时间进度条、地图搜索、显示模式切换等小组合的初始化viewer的方式
var viewer = new Cesium.Viewer("xxx");
viewer.entities集合,用于存放几何体。

viewer.entities 的类型是 new Cesium.EntityCollection(owner)
EntityCollection其下有add(entity/object)方法(返回Entity)

add(new Entity(...)) 也可简写 add({....})

e.g.

// 蓝色盒子
var boxBlue = viewer.entities.add({
  name: "box1",
  box: {
    dimensions: new Cesium.Cartesian3(...),
    materail: Cesium.Color.BLUE
  }
});

// 圆柱体
var Cylinder = viewer.entities.add({
  name: "cylinder",
  cylinder: {
    length: 400000.0, // 圆柱体的高度
    topRadius: 200000.0, bottomRadius: 200000.0, // 上下圆的半径
    material: Cesium.Color.GREEE.withAlpha(0.5), // 加透明
    outline: true, outlineColor: Cesium.Color.DARK_GREEN, // 轮廓线及颜色
  }
});

注:圆椎体设置 toRadius: 0bottomRadius: 0

// 绿色圆
var greenCircle = viewer.entities.add({
  position: Cesium.Cartesian3.fromDegrees(x,x,x),
  name: "Green Circle",
  ellipse: {
    semiMinorAxis: 30000.0,
    semiMajorAxis: 30000.0,
    material: Cesium.Color.GREEN,
    height: 200000.0,
    outline: true, // 外轮廓线,有height此属性才生效
  }
});

Datasource


dataSources加载数据后会帮我们创建entities
dataSource有多种格式,如Czml、GeoJSON、KML、自定义(entities: EntityCollection)等

Viewer.entities 等同于 Viewer.dataSourceDisplay.defaultDataSource,前者 是 后者 的简写形式。

var viewer = new Cesium.Viewer("xxx");
Sandcastle.addDefaultTOolbarButton("Default styling", function(){ 
  // 加载几何体数据集文件(.topjson)(多个几何体对象)
viewer.dataSources.add(Cesium.GeoJsonDataSource.load("../../SampleData/xxx.topojson")
});

Cesium/Viewer核心组件

  • dataSourceDisplay管理加载dataSources数据集
  • cesiumWidget管理所有的三维窗口对象
  • 其他UI组件(定制好的UI组件)
UI

Viewer.flyTo & Viewer.zoomTo

  • Camera.flyTo(options) - 需要指定相当的源、目标位置信息
  • Viewer.flyTo(target, options) - 需要指定对象,如:Entity对象,比Camera.flyTo(options)更方便。


property的使用 -- Cesium的Property机制总结

https://www.jianshu.com/p/e57c6a7cb5e4

Property最大的特点是和时间相互关联,在不同的时间可以动态地返回不同的属性值。而Entity则可以感知这些Property的变化,在不同的时间驱动物体进行动态展示。
Cesium宣称自己是数据驱动和time-dynamic visualization,这些可都是仰仗Property系统来实现的。


image.png
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容