Cesium 实战教程 - 三种方式(CZML、nodeTransformations)修改模型节点组件属性(比例、旋转、移动等)

news2024/11/23 23:43:10

Cesium 实战教程 - 三种方式(CZML、nodeTransformations)修改模型节点组件属性(比例、旋转、移动等)

    • 核心代码
    • 完整代码
    • 在线示例

关于 Cesium 设置模型组件的动作,之前是通过 CZML + articulations 来实现的,最近在官网发现一个示例,可以直接操作模型的 node 节点,来实现模型组件的动作。

本文介绍几种给模型组件设置动作的方法,包括 CZML articulationsCZML nodeTransformations 以及代码(model.nodeTransformations 实现模型动作。

三种设置方式,效果是一致的,但是操作难度略有差别。

CZML articulations 需要先给模型添加自定义的关节动作,才可以通过代码来实现动作。

CZML nodeTransformations 相对比较方便,只需要知道节点(node)名称就可以实现动作,只是设置参数略有不同。

model.nodeTransformations 完全是由代码来实现的,比较自由,但是需要对相关代码比较熟悉。

三种方式各有优势,使用哪种,取决于项目需求。

本文包含核心代码、完整代码以及在线示例三部分。


核心代码

1. CZML articulations 关节动作

在这里插入图片描述

// 自定义动作,需要模型存在自定义关节属性
"articulations": {
    // 导弹组件向前移动
    // MoveZ 为 glTF 中自定义的关节名称
    "missiles MoveZ": {
        // 开始移动时刻
        "epoch": "2023-06-14T10:10:00Z",
        // 设置移动参数
        "number": [
            // 当前 epoch 时刻,第 0 秒的时,Z 轴移动的距离(米)
            0, 0,
            // 当前 epoch 时刻,第 300 秒的时,Z 轴移动的距离(米)
            // 与模型行进方向相反
            300, -60
        ]
    },
}    
  

详情请参考:Cesium 实战 - AGI_articulations 扩展:模型自定义关节动作

2. CZML nodeTransformations 实现节点动作

在这里插入图片描述

// 设置火焰显示隐藏
"nodeTransformations": {
    "SRB_Flame4": {
        // 旋转(按照模型设置的中心点)
        "scale": {
            "epoch": "2023-06-14T10:00:20Z",
            // 设置时刻与比例
            // 0 比例表示隐藏,1 比例表示显示
            "cartesian": [
                // 0 秒、x 比例、y 比例、z 比例
                0.0, 0, 0, 0,
                // 5 秒、x 比例、y 比例、z 比例
                5.0, 1.0, 1.0, 1.0,
                800.0, 1.0, 1.0, 1.0,
                1600.0, 1.0, 1.0, 1.0,
            ],
            // nextTime: 500,
        },
    },
}

2. model.nodeTransformations 代码实现动作


 // 获取模型实体
 const entity = dataSource.entities.getById("Vulcan");

 // 模型视角跟随
 viewer.trackedEntity = entity;

 console.log(entity.model.nodeTransformations);

 // 定义比例节点转换,用于显示隐藏
 const transformation = new Cesium.NodeTransformationProperty({
     scale: new Cesium.Cartesian3(1.0, 1.0, 1.0)
 });

 // 记录当前时间
 const current = viewer.clock.currentTime.secondsOfDay;


 // 模型实体添加节点控制
 entity.model.nodeTransformations.addProperty('SRB_Flame2', transformation);

 
 // 时间轴监听事件
 let onTickEvent;

 // 时间轴监听回调
 function adjust() {

     // 200 秒后隐藏 SRB_Flame2 组件
     if (viewer.clock.currentTime.secondsOfDay > current + 200) {

         const transformation = new Cesium.NodeTransformationProperty({
             scale: new Cesium.Cartesian3(0.0, 0.0, 0.0)
         });

         entity.model.nodeTransformations.SRB_Flame2 = transformation;

         onTickEvent();
     }
 }

onTickEvent = viewer.clock.onTick.addEventListener(adjust);

// 设置观察角度
entity.viewFrom = new Cesium.Cartesian3(-1000, 100,-1000);


完整代码


<style>
  @import url(../templates/bucket.css);
</style>
<div id="cesiumContainer" class="fullSize"></div>
<div id="loadingOverlay"><h1>Loading...</h1></div>
<div id="toolbar">
  <span>
    
    <h2>请调整至合适视角!<h4/><br/>
    
    开始阶段:SRB_Flame2 (通过 model.nodeTransformations 控制)尾焰开启<br/><br/>
    和 BoosterFlames (通过 czml articulations控制)尾焰开启!<br/><br/>
    
    viewer时钟 100 秒之后,BoosterFlames 尾焰关闭,<br/><br/>
    
    SRB_Flame4 和 SRB_Flame6(通过 czml nodeTransformations 控制) 开启!<br/><br/>
  
  </span>
</div>
    

// 火箭模拟发射数据
const czml = [
    {
        "id": "document",
        "name": "SpaceX",
        "version": "1.0",
        "clock": {
            "interval": "2023-06-14T10:00:00Z/2023-06-14T10:17:33Z",
            "currentTime": "2023-06-14T10:00:00Z",
            "multiplier": 10,
            "range": "CLAMPED",
            "step": "SYSTEM_CLOCK_MULTIPLIER"
        }
    },
    {
        "id": "Vulcan",
        "availability": "2023-06-14T10:00:00Z/2023-06-14T10:17:33Z",
        "name": "Vulcan",
        "billboard": {
            "show": true,
            "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAAjSURBVChTYyAa/EcDUGEIgIphAKg0XRSAAFQMDqDChAADAwDC13+BJ+0oDwAAAABJRU5ErkJgggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
            "scale": 1,
            "pixelOffset": {
                "cartesian2": [
                    0, 0
                ]
            },
            "eyeOffset": {
                "cartesian": [
                    0, 0, 0
                ]
            },
            "horizontalOrigin": "CENTER",
            "verticalOrigin": "CENTER",
            "color": [
                {
                    "interval": "2023-06-14T10:00:00Z/2023-06-14T10:10:00Z",
                    "rgba": [
                        0, 255, 0, 255
                    ]
                },
                {
                    "interval": "2023-06-14T10:10:00Z/2023-06-14T10:13:20Z",
                    "rgba": [
                        255, 255, 0, 255
                    ]
                },
                {
                    "interval": "2023-06-14T10:13:20Z/9999-12-31T23:59:59.9999999Z",
                    "rgba": [
                        255, 0, 255, 255
                    ]
                }
            ]
        },
        "label": {
            "show": false,
            "text": "Vulcan",
            "font": "21pt Lucida Console",
            "style": "FILL_AND_OUTLINE",
            "scale": 0.5,
            "pixelOffset": {
                "cartesian2": [
                    5, -4
                ]
            },
            "horizontalOrigin": "LEFT",
            "verticalOrigin": "CENTER",
            "fillColor": [
                {
                    "interval": "2023-06-14T10:00:00Z/2023-06-14T10:10:00Z",
                    "rgba": [
                        0, 255, 0, 255
                    ]
                },
                {
                    "interval": "2023-06-14T10:10:00Z/2023-06-14T10:13:20Z",
                    "rgba": [
                        255, 255, 0, 255
                    ]
                },
                {
                    "interval": "2023-06-14T10:13:20Z/9999-12-31T23:59:59.9999999Z",
                    "rgba": [
                        255, 0, 255, 255
                    ]
                }
            ],
            "outlineColor": {
                "rgba": [
                    0, 0, 0, 255
                ]
            },
            "outlineWidth": 2
        },
        "path": {
            "show": [
                {
                    "interval": "2023-06-14T10:00:00Z/2023-06-14T10:17:33Z",
                    "boolean": true
                }
            ],
            "width": 5,
            "resolution": 1,
            "leadTime": [
                {
                    "interval": "2023-06-14T10:00:00Z/2023-06-14T10:17:33Z",
                    "epoch": "2023-06-14T10:00:00Z",
                    "number": [
                        0, 1053,
                        1053, 0
                    ]
                }
            ],
            "trailTime": [
                {
                    "interval": "2023-06-14T10:00:00Z/2023-06-14T10:17:33Z",
                    "epoch": "2023-06-14T10:00:00Z",
                    "number": [
                        0, 0,
                        1053, 1053
                    ]
                }
            ],
            "material": {
                polylineGlow: {
                    color: [{
                        "interval": "2023-06-14T10:00:00Z/2023-06-14T10:10:00Z",
                        rgba: [255, 0, 0, 255],
                    },
                        {
                            "interval": "2023-06-14T10:10:00Z/2023-06-14T10:13:20Z",
                            rgba: [0, 0, 255, 255],
                        },
                        {
                            "interval": "2023-06-14T10:13:20Z/9999-12-31T23:59:59.9999999Z",
                            rgba: [255, 0, 255, 255],
                        }
                    ],
                    glowPower: 0.25,
                    // taperPower: 0.5,
                },
            },
        },
        "model": {
            "show": true,
            "gltf": [
                {
                    "interval": "2023-06-14T10:00:00Z/9999-12-31T23:59:59.9999999Z",
                    "uri": "https://cesium.com/public/SandcastleSampleData/launchvehicle.glb"
                }
            ],
            "minimumPixelSize": 512,
            "scale": 15,
            "runAnimations": false,
            // 自定义的关节动作设置火焰
            "articulations": {
				// 火箭中间火焰
                "BoosterFlames Size": {
                    "epoch": "2023-06-14T10:00:00Z",
                    "number": [
                        0, 1,
                        49, 1,
                        50, 0,
                        9999, 0
                    ]
                },

            },

            // nodeTransformations 设置火焰显示隐藏
            "nodeTransformations": {
                // 第六个火焰节点名称
                "SRB_Flame6": {
                    // 比例(按照模型设置的中心点)
                    "scale": {
                        "epoch": "2023-06-14T10:00:00Z",
                        "cartesian": [
                            0.0, 0, 0, 0,
                            120.0, 0, 0, 0,
                            121.0, 1.0, 1.0, 1.0,
                            200.0, 1.0, 1.0, 1.0,
                        ],
                    },
                },

                // 第五个火焰节点名称
                "SRB_Flame4": {
                    // 比例(按照模型设置的中心点)
                    "scale": {
                        "epoch": "2023-06-14T10:00:00Z",
                        "cartesian": [
                            0.0, 0, 0, 0,
                            150.0, 0, 0, 0,
                            151.0, 1.0, 1.0, 1.0,
                            200.0, 1.0, 1.0, 1.0,
                        ],
                    },
                },
            },
        },
        "position": {
            "interpolationAlgorithm": "LAGRANGE",
            "interpolationDegree": 2,
            "referenceFrame": "FIXED",
            "epoch": "2023-06-14T10:00:00Z",
            "cartesian": [
                0.000, -2174195.199042614, 4389988.019058515, 4070606.7900844226,
                250.000, -2828836.74243954, 4527941.384141082, 4322899.592600973,
                750.000, -3812052.7676919936, 3910960.7948377975, 4168079.0591541207,
                1053.000, -3929362.40133975, 3277792.786767426, 3795371.463871257,
            ]
        },
        "orientation": {
            "velocityReference": "#position"
        },
    },
];


const viewer = new Cesium.Viewer("cesiumContainer", {
    shouldAnimate: true,
});

const dataSourcePromise = viewer.dataSources.add(
    Cesium.CzmlDataSource.load(czml)
);

dataSourcePromise
    .then(function (dataSource) {
  
        // 获取模型实体
        const entity = dataSource.entities.getById("Vulcan");
  
        // 模型视角跟随
        viewer.trackedEntity = entity;
  
        console.log(entity.model.nodeTransformations);

        // 定义比例节点转换,用于显示隐藏
        const transformation = new Cesium.NodeTransformationProperty({
            scale: new Cesium.Cartesian3(1.0, 1.0, 1.0)
        });

        // 记录当前时间
        const current = viewer.clock.currentTime.secondsOfDay;

        // 模型实体添加节点控制
        entity.model.nodeTransformations.addProperty('SRB_Flame2', transformation);

        // 时间轴监听事件
        let onTickEvent;
  
        // 时间轴监听回调
        function adjust() {

            // 200 秒后隐藏 SRB_Flame2 组件
            if (viewer.clock.currentTime.secondsOfDay > current + 100) {
              
                console.log('SRB_Flame2 尾焰关闭!');

				// 重新定义火焰比例
                const transformation = new Cesium.NodeTransformationProperty({
                    scale: new Cesium.Cartesian3(0.0, 0.0, 0.0)
                });

                entity.model.nodeTransformations.SRB_Flame2 = transformation;

                onTickEvent();
            }
        }

        onTickEvent = viewer.clock.onTick.addEventListener(adjust);
  
      // 设置观察角度
      entity.viewFrom = new Cesium.Cartesian3(-1000, 100,-1000);

    })
    .catch(function (error) {
        console.error(error);
    });


在线示例

三种方式(CZML、nodeTransformations)修改模型节点组件属性(修改比例、旋转、移动等)

在这里插入图片描述

在这里插入图片描述


参考博客:

[1]: 【Cesium】计算模型的朝向四元数,实现模型运动中调整朝向

[2]: czml api

[3]: CZML Model - Node Transformations.html

[4]: Transformations 代码设置节点旋转

[5]: cesium-CZML描述动态场景

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/846943.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

xAI与GPT-4:探索宇宙真实本质的AI之战

xAI与GPT-4&#xff1a;AI之战 写在前面第一部分推动科学研究提升人机交互引发伦理和社会问题 第二部分模型的进一步优化跨领域合作人机融合 反AI斗士 马斯克进军AI中国的AI产业怎么样AI这把火&#xff0c;还能怎么烧&#xff1f;最后总结 北京时间7月13日凌晨&#xff0c;马斯…

加速手机充电,打开这个小技巧,让充电速度翻倍,快速充满电量

加速手机充电&#xff0c;打开这个小技巧&#xff0c;让充电速度翻倍&#xff0c;快速充满电量 通过打开这个小技巧&#xff0c;我们可以在有限的时间内快速充满手机电量&#xff0c;解决了电量不足的困扰。不再需要长时间等待充电&#xff0c;让我们能够更加便捷地使用手机&a…

微服务监控技术skywalking的部署与使用(亲测无坑)

微服务监控技术skywalking的部署与使用 1. 前期准备2. skywalking安装部署2.1 Java Agent2.2 apache/skywalking-oap-server2.3 apache/skywalking-ui 3. 项目启动4.效果展示 1. 前期准备 注&#xff1a;本篇文章采用docker部署&#xff0c;采用8.2.0版本&#xff0c;版本一定…

vue+Highcharts绘制3D饼图

效果图 一、下载highcharts插件 npm install highcharts 二、main.js全局配置插件 import Highcharts from "highcharts/highcharts"; import highcharts3d from "highcharts/highcharts-3d"; highcharts3d(Highcharts); 三、封装highcharts.vue组件 …

FreeFileSync 12.5 正式发布,文件夹比较与同步软件

导读FreeFileSync 是一款开源软件&#xff0c;适用于 Windows、macOS 和 Linux。FreeFileSync 本质是一个用于文件夹对比和同步的软件&#xff0c;它可以创建和管理所有重要文件的备份副本。FreeFileSync 不是每次都复制每个文件&#xff0c;而是确定源文件夹和目标文件夹之间的…

vue-baidu-map-3x 使用记录

在 Vue3 TypeScript 项目中&#xff0c;为了采用 标签组件 的方式&#xff0c;使用百度地图组件&#xff0c;冲浪发现了一个开源库 ovo&#xff0c;很方便&#xff01;喜欢的朋友记得帮 原作者 点下 star ~ vue-baidu-map-3xbaidu-map的vue3/vue2版本&#xff08;支持v2.0、v…

海外ASO优化之如何给应用选择正确的类别

将我们的应用程序放在Apple App Store和Google Play正确的类别中&#xff0c;不仅对按类别浏览应用的用户有帮助&#xff0c;而且能够帮助我们的应用程序获得良好排名。 1、应用程序属于多个类别的解决方案。 需要选择最能描述我们应用程序的类别&#xff0c;检查一下每个类别…

.net几行代码音乐API各排行榜 热搜 入库

对比了几家大厂的音乐API的接口 这家相对规范些 现在开始从零开始 net6敏捷开发对接 入库吧 关键技术工具和思维 1 json 生成类 2 分析类 规划表设计3 sqlsuger codefirst 生成表 4 封装get post 连接5 类映射automapper6 sqlsuger 插入数据 1 json 生成类 宇宙 第 一的…

轻量级低代码平台,快速生成应用程序及不同类型的CRM系统

私有化部署的低代码快速开发平台 无需代码或通过少量代码就可以快速生成应用程序的开发平台。 这套低代码管理后台平台可以支持多种企业应用场景&#xff0c;包括但不限于 OA系统、 CRM系统、 ERP系统、项目管理系统、进销存系统等。无论是懂技术的开发人员还是不懂技术的业务…

多通道振弦数据记录仪应用于桥梁监测

随着城市化进程的加快&#xff0c;城市桥梁的数量不断增加。对于城市交通的保障作用&#xff0c;桥梁的重要性不言而喻。而为了保障桥梁的安全&#xff0c;桥梁监测的重要性也越来越受到人们的重视。在桥梁监测中&#xff0c;多通道振弦数据记录仪的应用得到了广泛的认可和应用…

算法通关村第五关——n数之和问题解析

1. 两数之和问题 力扣第1题就是两数之和问题&#xff0c;给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那两个整数&#xff0c;并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一…

聚观早报|美团创始人王慧文退出;马斯克将直播与扎克伯格笼斗

【聚观365】8月8日消息 美团创始人王慧文退出马斯克将在X上直播与扎克伯格笼斗蚂蚁微尘故事余承东微博透露鸿蒙4新进展华为出资15亿成立地产公司 美团创始人王慧文退出 据国家企业信用信息公示系统显示&#xff0c;北京光年之外科技有限公司在近期完成工商变更&#xff0c;创…

Hadoop理论及实践-HDFS读写数据流程(参考Hadoop官网)

NameNode与DataNode回顾 主节点和副本节点通常指的是Hadoop分布式文件系统&#xff08;HDFS&#xff09;中的NameNode和DataNode。 NameNode&#xff08;主节点&#xff09;&#xff1a;NameNode是Hadoop集群中的一个核心组件&#xff0c;它负责管理文件系统的命名空间和元数据…

uni——不规则tab切换(skew)

案例展示 案例代码 <!-- 切换栏 --> <view class"tabBoxs"><view class"tabBox"><block v-for"(item,index) in tabList" :key"index"><view class"tabItem":class"current item.id&…

Vue 本地应用 记事本 v-on v-model v-for使用

vue当中如何生成列表结构&#xff1f;使用的指令是v-for&#xff0c;同时要有一个可以生成列表的数据&#xff0c;常用的是数组。记事本里面的内容并不复杂&#xff0c;所以这里使用字符串数组就行了。 获取用户输入的内容使用绑定v-model&#xff0c;双向数据绑定&#xff08…

黑马头条项目学习--Day1: 环境搭建、SpringCloud微服务(注册发现、网关)

Nacos注册发现、网关 a. 项目介绍b. app登录1) 需求分析2) 表结构分析3) 手动加密&#xff08;md5随机字符串&#xff09;4) 用户端微服务搭建5) 功能实现6) app网关7) 网关校验jwt8) 前端集成, 配置nginx a. 项目介绍 业务说明 技术栈说明 [外链图片转存失败,源站可能有防盗…

基于MSP430 红外避障-遥控小车(电赛必备 附项目代码)

文章目录 一、硬件清单二、模块连接三、程序设计四、项目源码 项目环境&#xff1a; 1. MSP430F55292. Code Composer Studio3. 蓝牙调试助手 项目简介&#xff1a; 小车可分为3种工作模式&#xff0c;每种工作模式都会打印在OLED显示屏上&#xff0c;通过按键转换工作模式。 模…

RocketMQ 5.x broker注册到Nameserve源码分析

这里是weihubeats,觉得文章不错可以关注公众号小奏技术&#xff0c;文章首发。拒绝营销号&#xff0c;拒绝标题党 RocketMQ版本 5.1.0 背景 入口 这里源码入口我们就从broker启动开始查看吧&#xff0c;然后慢慢到NameServer 由于不知道具体代码在哪&#xff0c;所以我们就…

Three.js阴影

目录 Three.js入门 Three.js光源 Three.js阴影 使用灯光后&#xff0c;场景中就会产生阴影。物体的背面确实在黑暗中&#xff0c;这称为核心阴影&#xff08;core shadow&#xff09;。我们缺少的是落下的阴影&#xff08;drop shadow&#xff09;&#xff0c;即对象在其他…

汇总当下的AI绘画模型

AI绘画从今年过年那阵儿兴起&#xff0c;到现在(2023.8)已经半年过去了&#xff0c;涌现了很多风格迥异的模型&#xff0c;我在这里简单汇总一些。 一、写实人物类 1.1 AWPortrait 比较拟真的人物肖像 1.2 XXMix_9realistic 2.5D人物模型&#xff0c;因为画面带有一丝油画的…