Cesium中文教程-3D模型(3D Models)

2023-11-09

目录

 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)的相关文档。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cesium中文教程-3D模型(3D Models) 的相关文章

  • React Native 将样式设置为 State

    我想用backgroundColor of style1作为一种状态 并在函数中改变它change 我怎样才能访问style1 我的观点是调用该函数change从另一个函数 使按钮将其颜色更改为黄色 然后在一段时间后再次将其颜色更改为蓝色
  • 获取单词中重复次数最多的字母的数量

    我正在尝试计算单词中重复次数最多的字母的数量 function GreatestCount str var count for var i 0 i
  • 为具有可变内容的内联块元素提供相同的高度?

    我有 4 个宽度固定但内容可变的内联块元素 并且我希望所有这些元素具有相同的高度 最大元素的高度 请参见这个jsfiddle http jsfiddle net kKZXj 我应该如何实现这个目标 如果仅使用 css 无法做到这一点 那么使
  • 从字符串中删除货币符号并使用 Javascript 中的单行转换为数字

    我下面有一个字符串 它是以英镑为单位的价格 我想删除货币符号 然后将其转换为我可以用来与另一个值进行比较的数字 价格 例如 X gt Y 14 50 我之前已将字符串转换为用于货币的数字 var priceNum parseFloat pr
  • 如何使用 JqGrid 子网格进行内联编辑?

    我知道如何使用主网格进行内联编辑 但是有没有办法对子网格进行内联编辑 这是我的 JS 文件 function var lastsel list jqGrid url example php postData q 1 datatype jso
  • javascript获取上周的第一天和最后一天[重复]

    这个问题在这里已经有答案了 我想用 javascript 获取上周的第一天 星期一 和最后一天 星期日 我已经检查过其他主题 但它不起作用 我还需要处理前一周是否是两个不同的月份 我正在使用此代码 但最后一个星期日是 06 03 2014
  • IE 9 的子元素不透明,我无法使用 captify 阻止它

    好的 我正在使用一段名为 Captify 的 javascript 它为您的图像添加了一个带有文本的小弹出窗口 适用于所有接受 IE9 的浏览器 IE9 会淡化弹出 div 中的所有内容 我已阅读其子元素问题 但无法修复它 由于在网上任何地
  • 是否可以用 json 进行表达式/计算?

    我使用出色的 json server 作为应用程序的后端 它对于访问自定义端点以检索一些数据非常有用 但是如果它允许我进行计算 表达式以便我也可以模仿后端行为 那将会非常有用 以这个数据结构为例 products name football
  • GeoJSON 要素坐标未显示在 OpenLayers 地图上

    我正在尝试显示一个GeoJSON地图上的多边形 我使用了 OpenLayers 提供的示例以及以下数据 但仅显示第二个多边形 var geojsonObject type FeatureCollection crs type name fe
  • 如何滚动到 jQuery Mobile 中的页面元素?

    我有一个很长的 jQuery 移动页面 并且想在页面加载后滚动到该页面中间的元素 到目前为止 我已经尝试了一些事情 最成功的是 jQuery document bind mobileinit function var target if t
  • 在 NPM 上捆绑并发布客户端 Web 代码

    我制作了一个 JavaScript 文件 假设它的内容是这样的 let myCoolAlert str gt alert str in a different js file SO doesn t allow you to cross fi
  • RxJS - 从可观察对象中获取最后 n 个元素

    我想从可观察对象中获取最后 3 个元素 假设我的时间线是这样的 a b c d e f g h i j gt where a b c d e f g h i j are emitted values 每当发出新值时 我想立即获取它 因此它可
  • 如何在 svelte 中制作搜索过滤器

    我有两个组件在组件树中距离很远 我对如何在两者之间进行通信存有疑问 我有搜索组件 listItems 和商店 商店 svelte
  • 如何在变量名中使用变量

    所以我正在使用这样的 json 变量 opponentInvData item1 它包含项目 1 到 6 我需要动态访问不同的项目并将它们设置为空 itemNum 是我需要访问的特定项目 我正在尝试使用 eval 函数 var itemNu
  • 如何在 Javascript 中将字符串数组转换为特定的树结构

    我从后端获取文件路径列表 它代表文件夹结构 如下所示 paths path to file1 doc path to file2 doc foo bar doc 路径的长度是任意的 为了使用文件树组件 角度2树组件 https github
  • 如何逐步绘制矢量路径? (拉斐尔.js)

    如何逐步动画化矢量路径 就像它被绘制一样 换句话说 慢慢地逐像素地显示路径 我在用着Rapha l js but如果您的答案不是特定于库的 例如可能有一些通用的编程模式可以完成此类事情 我对矢量动画相当陌生 欢迎 使用直线路径很容易做到 就
  • 垃圾收集器不适用于 NodeJS / Chrome 中的类型化数组

    我最初将其记录为原项目中的一个问题 https github com nodejs help issues 3590 它立即转移到帮助主题 没有很好的解释 所以现在我想在这里提问 如果我们在 NodeJS v14 v16 v17 中运行以下
  • 使用 Promise 语法编写同步代码有什么好处吗?

    有同步承诺这样的概念吗 使用 Promise 语法编写同步代码有什么好处吗 try foo bar a b bam catch e handleError e 可以写成类似的东西 但使用同步版本then foo then bar bind
  • 将元素添加到 D3 圆包节点

    我正在尝试制作一个可缩放的圆形包装图 我希望每个子圆圈包含一个较小的图表 该图表始终具有相同的结构 即 4 列 只有条形的高度会改变 我尝试添加一个简单的rect到目前为止我的图表 但矩形没有添加到圆圈中并且是静态的 JS var marg
  • Javascript:修改原型不会影响现有实例[重复]

    这个问题在这里已经有答案了 我创建了原型的 2 个实例 更改了原型中的函数 更改反映在两个实例中 很棒 但是 当我通过删除该函数来修改原型时 该函数对于现有实例仍然存在 function A this name cool A prototy

随机推荐

  • matlab开根号_matlab基本计算

    这里介绍的内容是使用MATLAB进行基本的数学计算 完成的是类似计算机计算数学算式的功能 这篇文章基本可以帮助你学会所有基本的matlab计算方法 1 基本计算 MATLAB中的基本的运算符号为 四则运算规则和平时使用的计算器相同 使用MA
  • C++语句 与简单方法

    语句 在c primer plus 第二章中除了讲到输出流 还提到了更多的语句 书中称之为Statement 简单看来语句有申明语句 赋值语句 调用函数的语句 下面看书上的一组例子 include
  • 锁的四种状态及升级过程

    锁的四种状态与锁升级过程 图文详解 一 前言 锁的状态总共有四种 级别由低到高依次为 无锁 偏向锁 轻量级锁 重量级锁 这四种锁状态分别代表什么 为什么会有锁升级 其实在 JDK 1 6之前 synchronized 还是一个重量级锁 是一
  • react脚手架、使用步骤、在react脚手架里做项目的步骤、反向代理

    脚手架 facebook的官方脚手架 1 安装 create react app CRA npm install create react app g yarn global add create react app 安装yarn 方法一
  • Shiro学习小记--身份验证得到principals

    项目使用shiro进行权限管理 Shiro国内目前资料极少 学习时完全就是根据张开涛的 跟我学Shiro 自己去摸索的 慢慢的开始入门 Shiro中有一个概念是principals 解释如下 principals 身份 即主体的标识属性 可
  • 软件测试-环境搭建思路/测试流程

    环境搭建思路 测试流程 1 软件测试环境搭建 1 1 搭建测试环境前 1 2 环境搭建模式 1 3 测试环境建设思路 2 测试过程 2 1 测试策划过程 2 1 1 需求分析 余额宝需求测试实战 2 1 2 测试策略 2 1 3 测试方案设
  • 视频教程-卷积神经网络从原理到实战-深度学习

    卷积神经网络从原理到实战 本科北京航空航天大学计算机科学与技术专业 长期从事图像算法和文本算法 曾就业于航天相关机密单位 熟悉FasterRCNN SSD YOLO MASKRCNN一系列图像框架 及Bert Bilstm等NLP相关技术
  • App隐私合规注意事项和相关材料

    合规条文相关资料 最新 移动互联网应用程序信息服务管理规定 2022年8月1日起施行 http www cac gov cn 2022 06 14 c 1656821626455324 htm 全国APP技术检测平台 APP公共服务系统 h
  • 【HarmonyOS】详解低代码端云一体化开发之数据模型

    关键字 元服务 低代码平台 端云一体化开发 数据模型 拖拽式UI 1 写在前面 上一篇中分享了关于低代码平台开发元服务的基本使用 有兴趣的可以看一下 文章地址如下 华为开发者论坛 但是在上一篇中我们的数据都是在端侧配置的 这种方式肯定是无法
  • IDEA 快捷键大全

    目录 一 文本编辑 二 光标操作 三 文本选择 四 代码折叠 五 辅助编码 六 上下文导航 七 查找操作 八 符号导航 九 代码分析 十 运行和调试 十一 代码重构 一 文本编辑 Ctrl Shift V 从历史选择粘贴 Ctrl D 复制
  • Java多线程实现的四种方式

    多线程实现的四种方式 1 继承Thread类 重写run方法 2 实现Runnable接口 重写run方法 实现Runnable接口的实现类的实例对象作为Thread构造函数的target 3 通过Callable和FutureTask创建
  • mbind: Operation not permitted

    问题描述 IntelliJ IDEA 中 Docker Integration 插件 启动 MySql 容器 然后使用 Navicat for MySQL 来连接 只要连接数据库就会出现 mbind Operation not permit
  • java 性能监控 jstack 线程死锁 JConsole 和 BTrace 图形化工具

    java 性能监控 工具 除了 javac java javap 之外 jdk 安装包还提供了很多其他工具 列出 bin 目录下的文件 TomChens MacBook Pro Commands tomchen ls appletviewe
  • 挖坑指南:npm install命令各参数的区别(--sava --save-dev -g)

    前言 在前端工作中 npm已经成为必不可少的一部分 npm install可以为我们的项目安装依赖 那么这个命令的参数 各代表什么含义呢 开始 我们逐一来看看npm install save dev 安装我们项目开发时的依赖 比如一些插件
  • [Unity][AssetBundle]从AB包中加载Material材质球

    名字为111的AB包中 已经有打包的材质 名字为 test using UnityEditor public AssetBundle ab material public Material m
  • Ubuntu16.04为ROS搭建Qt开发环境

    很早之前就听说了Qt有ROS插件可以使用 只是阴 lan 差 de 阳 qu 错 gao 一直到今天还是在使用纯文本的方式在开发ROS 上午心 shou 血 bu 来 liao 潮 le 走上了Qt ros qtc plugin的不归路 所
  • 【华为机试真题Python】字符串消消乐游戏

    目录 题目描述 测试用例 参考代码 题目描述 输入一个只包含英文字母的字符串 字符串中的两个字母如果相邻且相同 就可以消除 在字符串上反复执行消除的动作 直到无法继续消除为止 此时游戏结束 输出最终消除完后留下的字符串 测试用例 用例1 输
  • 网络编程学习笔记

    网络基础 协议的概念 什么是协议 从应用的角度出发 协议可理解为 规则 是数据传输和数据的解释的规则 假设 A B双方欲传输文件 规定 第一次 传输文件名 接收方接收到文件名 应答OK给传输方 第二次 发送文件的尺寸 接收方接收到该数据再次
  • 编写 golang 命令行小工具

    1 前言 把想了很久的命令行小工具写了个demo 前几天看了 7 天仿 gin 项目 于是今天借鉴了其路由匹配方式 写出了这个demo 思路是 创建一个类似路由的map key值为选项 value为选项信息的结构体 结构体中保存有选项的动作
  • Cesium中文教程-3D模型(3D Models)

    目录 3D模型 3D Models 1 快速入门 Quick start 2 动画 Animations 3 各取所需 Picking 4 转化COLLADA为glTF Converting COLLADA to glTF 5 故障排除 T