文档章节

Cesium教程番外篇--自定义Geometry(一)

罗松与拇指
 罗松与拇指
发布于 2014/06/26 12:58
字数 593
阅读 1837
收藏 1

原文地址:http://my.oschina.net/u/149294/blog/284363

首先

由于Cesium目前接口还不是很稳定,每个版本之间差异较大,所以请确保你下载了最版本b29,并且配置好了环境,参见环境配置

Cesium交流群:115883691,欢迎大家一起来讨论Cesium相关技

开始

直接上代码

var TetrahedronGeometry = function(){
        var negativeRootTwoOverThree = -Math.sqrt(2.0) / 3.0;
        var negativeOneThird = -1.0 / 3.0;
        var rootSixOverThree = Math.sqrt(6.0) / 3.0;
        
        //四面体的四个顶点
        var positions = new Float64Array(4 * 3);

        // position 0
        positions[0] = 0.0;
        positions[1] = 0.0;
        positions[2] = 1.0;

        // position 1
        positions[3] = 0.0;
        positions[4] = (2.0 * Math.sqrt(2.0)) / 3.0;
        positions[5] = negativeOneThird;

        // position 2
        positions[6] = -rootSixOverThree;
        positions[7] = negativeRootTwoOverThree;
        positions[8] = negativeOneThird;

        // position 3
        positions[9] = rootSixOverThree;
        positions[10] = negativeRootTwoOverThree;
        positions[11] = negativeOneThird;

        var attributes = new Cesium.GeometryAttributes({
            position : new Cesium.GeometryAttribute({
                componentDatatype : Cesium.ComponentDatatype.DOUBLE,
                componentsPerAttribute : 3,
                values : positions
            })
        });

        //顶点索引
        var indices = new Uint16Array(4 * 3);

        // back triangle
        indices[0] = 0;
        indices[1] = 1;
        indices[2] = 2;

        // left triangle
        indices[3] = 0;
        indices[4] = 2;
        indices[5] = 3;

        // right triangle
        indices[6] = 0;
        indices[7] = 3;
        indices[8] = 1;

        // bottom triangle
        indices[9] = 2;
        indices[10] = 1;
        indices[11] = 3;
        
        //包围球
        var boundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(0.0,0.0,0.0),1.0);

        var geometry = Cesium.GeometryPipeline.computeNormal(new Cesium.Geometry({
            attributes: attributes,
            indices: indices,
            primitiveType: Cesium.PrimitiveType.TRIANGLES,
            boundingSphere: boundingSphere
        }));

        this.attributes = geometry.attributes;
        this.indices = geometry.indices;
        this.primitiveType = geometry.primitiveType;
        this.boundingSphere = geometry.boundingSphere;
        //this.boundingSphere = Cesium.BoundingSphere.fromVertices(positions);
    };

四面体是四个顶点组成的,为了不损失精度在保存顶点位置的时候我们使用了Float64Array

四面体的每个面都又三个顶点组成,通过使用顶点索引我们可以减少所要使用的顶点数,节约内存。每个顶点都将被使用3次,索引的存储使用Uint16Array,加入超过6k也可以用Uint32Array。

通过上述代码我们定义了一个四面体,接下来我们来把它加到场景中。

var cesiumWidget = new Cesium.CesiumWidget('cesiumContainer');
    var scene = cesiumWidget.scene;
    var ellipsoid = cesiumWidget.scene.globe.ellipsoid;
    
    //模型矩阵
    var modelMatrix = Cesium.Matrix4.multiplyByUniformScale(
            Cesium.Matrix4.multiplyByTranslation(
                    Cesium.Transforms.eastNorthUpToFixedFrame(ellipsoid.cartographicToCartesian(
                            Cesium.Cartographic.fromDegrees(-100.0, 40.0))),
                    new Cesium.Cartesian3(0.0, 0.0, 200000.0)),
            500000.0);
    
    //四面体的实例
    var instance = new Cesium.GeometryInstance({
        geometry : new TetrahedronGeometry(),
        modelMatrix : modelMatrix,
        attributes : {
            color : Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.WHITE)    //白色
        }
    });
    
    //加入场景
    scene.primitives.add(new Cesium.Primitive({
        geometryInstances : instance,
        appearance : new Cesium.PerInstanceColorAppearance({
            flat : true,
            translucent : false
        })
    }));

运行代码,你将看到如下画面

这个四面体是不是看的不是很清楚啊,你确定这是四面体?难道不是三角形?,确实!!!

现在我们把创建四面体实例的代码替换为下面这样:

var instance = new Cesium.GeometryInstance({
        geometry : Cesium.GeometryPipeline.toWireframe(new TetrahedronGeometry()),
        modelMatrix : modelMatrix,
        attributes : {
            color : Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.WHITE)
        }
    });

现在再来看看呢,GeometryPipeline.toWireframe将会使几何体使用Lines来绘制



© 著作权归作者所有

共有 人打赏支持
罗松与拇指
粉丝 13
博文 4
码字总数 3941
作品 0
海淀
程序员
私信 提问
各种GeometryInstance的添加方法

Cesium.Math.setRandomNumberSeed(1234); var viewer = new Cesium.Viewer('cesiumContainer'); var scene = viewer.scene; var primitives = scene.primitives; var solidWhite = Cesium.Co......

zhishiqu
01/09
0
0
Cesium中Clock控件及时间序列瓦片动态加载

发这篇文章实在不容易,导致我的简书被封号,原因是在文中插入了一个他们禁止的链接。。。好吧,什么都不说了! 前言 前面已经写了两篇博客介绍Cesium,一篇整体上简单介绍了Cesium如何上手,...

魏守峰
2017/12/16
0
0
翻译 Cesium入门教程(一)------环境配置 Hello World

转载请注明出处 http://my.oschina.net/u/149294/blog/202433 本人建了一个QQ群:115883691,欢迎大家一起来讨论Cesium相关技术 首先确保你的浏览器支持Cesium 判断你的浏览器是否支持Cesiu...

罗松与拇指
2014/02/23
0
0
Cocos学习笔记

说明: (1)基于cocos2dx2.2.3,使用C++语言,在Visual Studio 2010进行开发的。 (2)基于cocos2dx3.x ,使用C++语言,在Visual Studio 2013 与 Xcode进行开发的。 (3)基于Cocos Code ID...

shahdza
2014/08/12
0
0
Cesium学习笔记(五)几何和外观

之前的笔记种记录了Cesium可以使用实体(如多边形和椭球)创建不同的地质类型。例如:使用点阵图在地球上创建一个矩形 下面将记录primitives ,并查看形成它们的类型Geometry和Appearance类型...

HobHunter
2017/07/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

js垃圾回收机制和引起内存泄漏的操作

JS的垃圾回收机制了解吗? Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。 JS中最常见的垃圾回收方式是标记清除。 工作原理:是当变量进入环境时,将这个变量标记为“...

Jack088
昨天
10
0
大数据教程(10.1)倒排索引建立

前面博主介绍了sql中join功能的大数据实现,本节将继续为小伙伴们分享倒排索引的建立。 一、需求 在很多项目中,我们需要对我们的文档建立索引(如:论坛帖子);我们需要记录某个词在各个文...

em_aaron
昨天
13
0
"errcode": 41001, "errmsg": "access_token missing hint: [w.ILza05728877!]"

Postman获取微信小程序码的时候报错, errcode: 41001, errmsg: access_token missing hint 查看小程序开发api指南,原来access_token是直接当作parameter的(写在url之后),scene参数一定要...

两广总督bogang
昨天
18
0
MYSQL索引

索引的作用 索引类似书籍目录,查找数据,先查找目录,定位页码 性能影响 索引能大大减少查询数据时需要扫描的数据量,提高查询速度, 避免排序和使用临时表 将随机I/O变顺序I/O 降低写速度,占用磁...

关元
昨天
11
0
撬动世界的支点——《引爆点》读书笔记2900字优秀范文

撬动世界的支点——《引爆点》读书笔记2900字优秀范文: 作者:挽弓如月。因为加入火种协会的读书活动,最近我连续阅读了两本论述流行的大作,格拉德威尔的《引爆点》和乔纳伯杰的《疯传》。...

原创小博客
昨天
30
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部