Cesium 实战教程 - 调整 3dtiles 倾斜摄影大小

news2024/11/15 13:33:40

Cesium 实战教程 - 调整 3dtiles 倾斜摄影大小

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

之前由于误解遇到一个特殊的需求:想要把三维球上叠加倾斜摄影进行自由放大缩小,跟随地图的缩放进行缩放。

后来经过搜索、尝试,终于实现了需求。

但是,后来发现是误解需求了,甲方只是需要放大缩小地图,不需要改变倾斜摄影的比例。

不过也算是学习了一个功能,这里记录一下。

本文主要包括核心代码、完整代码、在线示例三部分


核心代码

这里介绍一下修改倾斜摄影比例缩放的方法。

由于 Cesium 近期版本变动,本文介绍的内容包含 Cesium 1.107.0 之前的版本以及之后的版本

两个版本最主要的区别是改变了 3dtile 的加载方式以及异步解析方式。

1. 1.107.0 以及之后的版本核心代码:

在这里插入图片描述

注意:await 关键字,需要在异步方法内使用!

比如:


async function addCesium3DTileset() {
    try {
        const tileset = await Cesium.Cesium3DTileset.fromUrl(url, options);

        viewer.scene.primitives.add(tileSet);
    } catch (error) {
        console.log(`Failed to load tileset: ${error}`);
    }
}

异步加载倾斜摄影核心代码:

这里注意:Cesium 沙盒中应该本身就是异步方法,因此可以直接使用。


// 获取倾斜摄影
// 注意,Cesium 1.107.0 及以后版本需要通过异步方式加载倾斜摄影
const tileSet = await Cesium.Cesium3DTileset.fromUrl("https://earthsdk.com/v/last/Apps/assets/dayanta/tileset.json");

// 创建倾斜摄影
viewer.scene.primitives.add(tileSet);

// 定位至倾斜摄影
viewer.zoomTo(tileSet, new Cesium.HeadingPitchRange(0, Cesium.Math.toRadians(-90), 0));

// 设置瓦片加载完成监听事件
tileSet.initialTilesLoaded.addEventListener(function () {

    // 获取倾斜摄影中心点
    const cartographic = Cesium.Cartographic.fromCartesian(tileSet.boundingSphere.center);
    // 获取表面坐标
    const surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, cartographic.height);

    // 记录局部坐标系
    scaleFrame = Cesium.Transforms.eastNorthUpToFixedFrame(surface);

    // 缩放
    if (scale) {
        // 获取比例四元数
        const _scale = Cesium.Matrix4.fromUniformScale(scale);
        // 记录比例四元数
        scaleMatrix4 = _scale.clone();
        Cesium.Matrix4.multiply(scaleFrame, _scale, scaleFrame);
    }

    // 倾斜摄影重新设置比例
    tileSet._root.transform = scaleFrame;


    // 添加参照点
    const entity = {
        point: new Cesium.PointGraphics({
            // 设置贴地
            heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
            // 设置颜色
            color: Cesium.Color.fromCssColorString("#ff0033"),
            // 设置大小
            pixelSize: 30,
            // 设置外边框
            outlineColor: Cesium.Color.fromCssColorString("#ff0033"),
            // 外边框宽度
            outlineWidth: 1,
        }),
        position: surface
    };
    viewer.entities.add(entity);
});


2. 1.107.0 之前的版本核心代码:


// 初始化倾斜摄影
const tileSet = new Cesium.Cesium3DTileset({
    url: "https://earthsdk.com/v/last/Apps/assets/dayanta/tileset.json"
});

// 异步读取倾斜摄影数据,并进行修改
tileSet.readyPromise.then(function () {

    // 添加倾斜摄影到地球中
    viewer.scene.primitives.add(tileSet);

    // 定位
    viewer.flyTo(tileSet);

    // 获取倾斜摄影中心点
    const cartographic = Cesium.Cartographic.fromCartesian(tileSet.boundingSphere.center);
    const surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, cartographic.height);
    // 记录局部坐标系
    const m = Cesium.Transforms.eastNorthUpToFixedFrame(surface);

    // 缩放
    if (scale) {
        const _scale = Cesium.Matrix4.fromUniformScale(scale);
        Cesium.Matrix4.multiply(m, _scale, m);
    }

    tileSet._root.transform = m;

    //参照点
    const entity = {
        id: "test",
        point: new Cesium.PointGraphics({
            heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
            color: Cesium.Color.fromCssColorString("#ff0033"),
            pixelSize: 30,
            outlineColor: Cesium.Color.fromCssColorString("#ff0033"),
            outlineWidth: 1,
        }),
        position: surface
    };
    viewer.entities.add(entity);
});



完整代码


<!DOCTYPE html>
<html lang="en">
<head>
    <!-- Use correct character set. -->
    <meta charset="utf-8"/>
    <!-- Tell IE to use the latest, best version. -->
    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
    <!-- Make the application on mobile take up the full browser screen and disable user scaling. -->
    <meta
            name="viewport"
            content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"
    />
    <title>Cesium model video</title>
    <link rel="stylesheet" href="./popup.css" type="text/css">
    <script src="http://openlayers.vip/examples/csdn/Cesium.js"></script>
    <script src="./cesium_init.js"></script>
    <script src="http://www.openlayers.vip/examples/resources/jquery-3.5.1.min.js"></script>
    <script src="./CesiumPopup.js"></script>
    <style>
        @import url(./Widgets/widgets.css);

        html,
        body,
        #cesiumContainer {
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
            overflow: hidden;
        }
    </style>

    <script>
        var _hmt = _hmt || [];
        (function () {
            var hm = document.createElement("script");
            hm.src = "https://hm.baidu.com/hm.js?f80a36f14f8a73bb0f82e0fdbcee3058";
            var s = document.getElementsByTagName("script")[0];
            s.parentNode.insertBefore(hm, s);
        })();
    </script>
</head>
<body>
<div id="cesiumContainer"></div>
<script>


    // 创建三维球
    const viewer = init();

	// 初始化地球
const viewer = new Cesium.Viewer('cesiumContainer');

// 获取倾斜摄影
const tileSet = await Cesium.Cesium3DTileset.fromUrl("https://earthsdk.com/v/last/Apps/assets/dayanta/tileset.json");

// 创建倾斜摄影
viewer.scene.primitives.add(tileSet);

// 定位至倾斜摄影
viewer.zoomTo(tileSet, new Cesium.HeadingPitchRange(0, Cesium.Math.toRadians(-90), 0));


// 初始偏移参数
// 平移参数
const tx = 200;
const ty = 0;
const tz = -430;

// 旋转参数
const rx = 0;
const ry = 0;
const rz = 0;

// 初始比例
const scale = 1;

// 局部坐标系
let scaleFrame;

// 比例四元数
let scaleMatrix4;

// 设置瓦片加载完成监听事件
tileSet.initialTilesLoaded.addEventListener(function () {

    // 获取倾斜摄影中心点
    const cartographic = Cesium.Cartographic.fromCartesian(tileSet.boundingSphere.center);
    const surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, cartographic.height);

    // 记录局部坐标系
    scaleFrame = Cesium.Transforms.eastNorthUpToFixedFrame(surface);

    //平移
    const _tx = tx ? tx : 0;
    const _ty = ty ? ty : 0;
    const _tz = tz ? tz : 0;
    const tempTranslation = new Cesium.Cartesian3(_tx, _ty, _tz);
    const offset = Cesium.Matrix4.multiplyByPoint(scaleFrame, tempTranslation, new Cesium.Cartesian3(0, 0, 0));
    const translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());
    tileSet.modelMatrix = Cesium.Matrix4.fromTranslation(translation);

    //旋转
    if (rx) {
        const mx = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(rx));
        const rotate = Cesium.Matrix4.fromRotationTranslation(mx);
        Cesium.Matrix4.multiply(scaleFrame, rotate, scaleFrame);
    }

    if (ry) {
        const my = Cesium.Matrix3.fromRotationY(Cesium.Math.toRadians(ry));
        const rotate = Cesium.Matrix4.fromRotationTranslation(my);
        Cesium.Matrix4.multiply(scaleFrame, rotate, scaleFrame);
    }

    if (rz) {
        const mz = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(rz));
        const rotate = Cesium.Matrix4.fromRotationTranslation(mz);
        Cesium.Matrix4.multiply(scaleFrame, rotate, scaleFrame);
    }

    // 缩放
    if (scale) {
        const _scale = Cesium.Matrix4.fromUniformScale(scale);
        // 记录比例四元数
        scaleMatrix4 = _scale.clone();
        Cesium.Matrix4.multiply(scaleFrame, _scale, scaleFrame);
    }

    tileSet._root.transform = scaleFrame;


    // 参照点
    const entity = {
        point: new Cesium.PointGraphics({
            heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
            color: Cesium.Color.fromCssColorString("#ff0033"),
            pixelSize: 30,
            outlineColor: Cesium.Color.fromCssColorString("#ff0033"),
            outlineWidth: 1,
        }),
        position: surface
    };
    viewer.entities.add(entity);
});


// 还原比例
function revertTransform(mtx4) {
    let inverse = Cesium.Matrix4.inverse(mtx4.clone(), new Cesium.Matrix4());
    Cesium.Matrix4.multiply(scaleFrame, inverse.clone(), scaleFrame);
}

// 默认缩放
const viewModel = {
    tileScale: 50,
};

// cesium 沙盒内置组件
Cesium.knockout.track(viewModel);
const toolbar = document.getElementById("toolbar");
Cesium.knockout.applyBindings(viewModel, toolbar);


Cesium.knockout
    .getObservable(viewModel, "tileScale")
    .subscribe(function (newValue) {
        console.log(newValue);
        // 缩放
        if (newValue) {
            // 修改后的比例
            const _scale = Cesium.Matrix4.fromUniformScale(parseFloat(newValue) / 50);
            // 还原模型比例
            revertTransform(scaleMatrix4);
            scaleMatrix4 = _scale.clone();
            // 设置模型比例
            Cesium.Matrix4.multiply(scaleFrame, _scale, scaleFrame);
        }
        tileSet._root.transform = scaleFrame;
    });

</script>
</body>
</html>


    

在这里插入图片描述


在线示例

Cesium 1.107.0 调整模型大小

Cesium 1.106.1 调整模型大小

在这里插入图片描述

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

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

相关文章

什么是强化学习?

&#x1f4dd;什么是强化学习&#xff1f; 1. &#x1f4dd;监督&#xff0c;非监督&#xff0c;强化2. &#x1f4dd;非 i.i.d3. &#x1f4dd;强化学习基本形式4. &#x1f4dd;马尔可夫过程 &#x1f31f; 强化学习&#xff08;Reinforcement Learning&#xff0c;RL&#x…

windows安装kafka配置SASL-PLAIN安全认证

目录 1.Windows安装zookeeper&#xff1a; 1.1下载zookeeper 1.2 解压之后如图二 1.3创建日志文件 1.4复制 “zoo_sample.cfg” 文件 1.5更改 “zoo.cfg” 配置 1.6新建zk_server_jaas.conf 1.7修改zkEnv.cmd 1.8导入相关jar 1.9以上配置就配好啦&#xff0c;接下来启…

小红书博主排名丨狂揽近百万粉丝,女性议题成“爆款制造机”?

从上野千鹤子和北大女生的对谈&#xff0c;到电影《消失的她》&#xff0c;再到引爆“粉色狂潮”的电影《芭比》&#xff0c;近年来&#xff0c;女性话题、两性情感话题成为社会热门议题。“踩过恋爱所有坑&#xff0c;想给姑娘撑把伞”&#xff0c;近期&#xff0c;小红书博主…

2023年华数杯数学建模B题思路代码分析 - 不透明制品最优配色方案设计

# 1 赛题 B 题 不透明制品最优配色方案设计 日常生活中五彩缤纷的不透明有色制品是由着色剂染色而成。因此&#xff0c;不透明 制品的配色对其外观美观度和市场竞争力起着重要作用。然而&#xff0c;传统的人工配色 存在一定的局限性&#xff0c;如主观性强、效率低下等。因此…

docker容器学习笔记1

docker容器是干什么用的 docker就是一个轻量级的虚拟机&#xff0c;是一个容器&#xff0c;隔离性好&#xff0c;能够确保环境的统一&#xff0c;有效利用系统资源&#xff0c;轻松迁移和拓展。简单的可以理解为容器就是一个小型功能齐全的虚拟机。 实际上是如何使用的呢&…

RocketMQ发送消息超时异常

说明&#xff1a;在使用RocketMQ发送消息时&#xff0c;出现下面这个异常&#xff08;org.springframework.messging.MessgingException&#xff1a;sendDefaultImpl call timeout……&#xff09;&#xff1b; 解决&#xff1a;修改RocketMQ中broke.conf配置&#xff0c;添加下…

2023华数杯数学建模竞赛C题思路解析

如下为&#xff1a;2023华数杯数学建模竞赛C题 母亲身心健康对婴儿成长的影响 的思路解析 C题 母亲身心健康对婴儿成长的影响 母亲是婴儿生命中最重要的人之一&#xff0c;她不仅为婴儿提供营养物质和身体保护&#xff0c;还为婴儿提供情感支持和安全感。母亲心理健康状态的不…

HCIP作业3

题目 配置IP地址 R1 [r1]int g0/0/1 [r1-GigabitEthernet0/0/1]ip add 192.168.1.1 24 [r1-Serial4/0/0]ip add 12.1.1.1 24 R2 [r2]int s4/0/0 [r2-Serial4/0/0]ip add 12.1.1.2 24 [r2-Serial4/0/0]int s4/0/1 [r2-Serial4/0/1]ip add 32.1.1.1 24 [r2-Serial4/0/1]in…

数据管理基础知识

数据管理原则 数据管理与其他形式的资产管理的共同特征&#xff0c;涉及了解组织拥有哪些数据以及可以使用这些数据完成哪些工作&#xff0c;然后确定如何最好的使用数据资产来实现组织目标与其他流程一样&#xff0c;他必须平衡战略和运营需求&#xff0c;通过遵循一套原则&a…

k8s nginx+ingress 配置

1 nginx> ingress 配置&#xff1a; 2 nginx >service 配置 3 nginx pod配置&#xff1a; 4 nginx.conf 配置文件&#xff1a; # web端v1server{listen 30006;add_header Strict-Transport-Security "max-age31536000; includeSubDomains";#add_header Content…

【练】要求定义一个全局变量 char buf[] = “1234567“,创建两个线程,不考虑退出条件,打印buf

要求定义一个全局变量 char buf[] "1234567"&#xff0c;创建两个线程&#xff0c;不考虑退出条件&#xff0c;另&#xff1a; A线程循环打印buf字符串&#xff0c;B线程循环倒置buf字符串&#xff0c;即buf中本来存储1234567&#xff0c;倒置后buf中存储7654321. 不…

方差分析||判断数据是否符合正态分布

方差分析练习题 练习学习笔记&#xff1a; &#xff08;1&#xff09; 标准差和标准偏差、均方差是一个东西。标准误差和标准误是一个东西。这两个东西有区别。 &#xff08;2&#xff09;单因素方差分析&#xff08;MATLAB求解&#xff09; &#xff08;3&#xff09;使用an…

重磅!EBImage包:为何如此火爆?它的图像处理到底有何不可思议之处?

一、简介 1.1 EBImage包简介 EBImage包是一个广受欢迎的用于图像处理和分析的R语言包。它提供了一套全面而强大的功能&#xff0c;支持多种图像格式的读取和写入&#xff0c;处理多维图像数据&#xff0c;并提供了各种先进的图像处理算法、特征提取和测量函数。 1.2 EBImage爆火…

STM32——LED内容补充(寄存器点灯及反转的原理)

文章目录 点灯流程开时钟配置IO关灯操作灯反转宏定义最后给自己说 本篇文章使用的是STM32F103xC系列的芯片&#xff0c;四个led灯在PE2,PE3,PE4,PE5上连接 点灯流程 1.开时钟 2.配置IO口 &#xff08;1&#xff09;清零指定寄存器位 &#xff08;2&#xff09;设置模式为推挽输…

【MyBatis】MyBatis 动态SQL

目录 动态标签&#xff1a;<if>动态标签&#xff1a;<trim>动态标签&#xff1a;<where>动态标签&#xff1a;<set>动态标签&#xff1a;<foreach> 动态标签&#xff1a;<if> 语法&#xff1a; <if test"photo!null"> .…

力扣 C++|一题多解之动态规划专题(2)

动态规划 Dynamic Programming 简写为 DP&#xff0c;是运筹学的一个分支&#xff0c;是求解决策过程最优化的过程。20世纪50年代初&#xff0c;美国数学家贝尔曼&#xff08;R.Bellman&#xff09;等人在研究多阶段决策过程的优化问题时&#xff0c;提出了著名的最优化原理&…

爬虫007_python中的输出以及格式化输出_以及输入---python工作笔记025

首先看输出 输出这里,注意不能直接上面这样,18需要转换成字符串 可以看到python中这个字符串和数字一起的时候,数字要转换一下成字符串. 然后这里要注意%s 和%d,这个s指的是字符串,d指的是数字 注意后面的内容前面要放个% ,然后多个参数的话,那么这里用(),里面用,号隔开 然…

寄存器详解(一)

目录 前言&#xff1a; 通用寄存器 示例&#xff1a; 通用寄存器的划分 汇编指令 cpu物理地址的形成 地址加法器运算示例&#xff1a; 1. 相关部件提供段地址和偏移地址 2. 段地址和偏移地址送入地址加法器 3. 段地址*16 4. 求出物理地址 5. 输出物理地址 段的概念 Deb…

SRM系统:提升供应商关系管理的利器

在现代供应链管理中&#xff0c;供应商关系的稳定和优化对企业的成功至关重要。为了更好地管理和维护供应商关系&#xff0c;许多企业开始利用供应商关系管理&#xff08;SRM&#xff09;系统。本文将围绕SRM系统的功能&#xff0c;探讨其在供应链管理中的重要性和优势。 一、…

大模型时代下,算法工程师该何去何从?

目录 一、大模型时代的罪与罚1.1、快速演进的大模型技术1.2、模型表现出的惊人创造力1.3、大模型AI对算法工程师的威胁性 二、算法工程师的破与发2.1、破——大模型时代给算法工程师带来的新机遇2.2、发——算法工程师如何适应大模型时代的变革 三、大模型时代下人才发展洞察 大…