Cesium中对Cesium.Cesium3DTileset模型进行偏移

本文介绍了如何在Cesium中使用Cesium3DTileset的modelMatrix属性来调整模型的位置和高度,通过计算与包围球的关系实现平移和高度变化,以及矩阵变换的概念背景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Cesium中对Cesium.Cesium3DTileset模型进行偏移

3D Tiles 是将用于流式传输3D内容,包括建筑物,树木,点云,矢量数据。3DTiles 数据集以分块,分级渲染,将大数据量三维数据以分块,分层的形式组织起来,可以大量减轻浏览器和GPU的渲染压力。
但是很多时候,我们添加的3D Tiles 模型他的位置,并不是我们想要的位置。由于单个瓦片的位置信息是写到了数据中的(.b3dm 和对应的 json 文件中), 如果能整体调整加载后的 Tileset,就是最好的选择。

而 3D Tiles 的 modelMatrix 刚好可以实现更改位置的效果

2. 对3D Tiles 模型进行偏移

const translation = Cesium.Cartesion3.fromArray([x, y, z]);
// x: 就是我们要向相对他现在的位置偏移多少的X量
// y: 就是我们要向相对他现在的位置偏移多少的y量
// z: 就是我们要向相对他现在的位置偏移多少的z量

const m = Cesium.Matrix4.fromTranslation(translation);
// 然后我们将这个生成的矩阵,重新赋值给 3D tiles 的 _modelMatrix 就可以了
titleset.modelMatrix = m;

我们是可以通过改变他的模型矩阵(modelMatrix) 就可以修改一个模型的位置,这里可以参考《webgl 编程指南》中的内容

这里面说,一个三维场景中,要包含:视图矩阵,投影矩阵,模型矩阵。

视图矩阵 : 规定了我们观察者,是从何角度(视角)来观察这个三维场景
投影矩阵: 因为我虽然我在描述一个三维场景,但是我们最终还是在一个二维屏幕上去展示的画面。
模型矩阵: 就包含了,这个模型的各种变换,平移,旋转,缩放。

这三个矩阵也有统称为: MVP矩阵

所以模型矩阵就是描述这个模型的平移,旋转,缩放的变换。

3. 如何将一个 3D Tiles 模型调整到指定的位置
const boundingSphere = titleset.boundingSphere;
// 获取这个3D Tiles的包围球
const offset = Cesium.Cartesian3.fromDegrees(116.416342, 39.920912, 300); // 目的位置
const translation = Cesium.Cartesian3.subtract(offset, boundingSphere.center, new Cesium.Cartesian3());
tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
4. 调整它的高度
let height = 300; // 新的高度
var cartographic = Cesium.Cartographic.fromCartesian(tileset.boundingSphere.center);
var surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, cartographic.height);
var offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude,height);
var translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());
tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
### 修改 Cesium3D Tileset 模型的位置 当在 Cesium 中加载 3D Tiles 后发现模型位置存在轻微偏移时,可以利用 `modelMatrix` 属性来调整模型的位置、旋转以及缩放。此属性接受一个 4x4 的变换矩阵作为参数[^1]。 为了精确控制模型的位置,可以通过创建一个新的变换矩阵并应用于 `tileset.modelMatrix` 来实现平移效果: ```javascript // 创建一个用于平移的矩阵 var translation = Cesium.TranslationRotationScale.fromArray([dx, dy, dz]); var modelMatrix = Cesium.Matrix4.fromTranslation(translation); // 应用新的变换矩阵给 tileset 实例 tileset.modelMatrix = modelMatrix; ``` 上述代码片段展示了如何通过指定 dx、dy 和 dz 参数来进行三维空间内的位移操作,从而纠正可能出现的位置偏差问题。 如果需要更复杂的转换(比如同时包含旋转和平移),也可以组合多个基本变换形成复合变换矩阵后再赋值给 `modelMatrix` 属性。 另外,在某些情况下,可能是因为原始数据本身存在问题所引起的偏移现象;此时建议检查源文件是否正确无误,并考虑更新至最新版本的数据集以排除此类可能性[^3]。 #### 使用回调函数动态设置 Model Matrix 对于那些希望实时交互地调整模型位置的应用场景而言,可以在 `readyPromise` 成功解析之后再设定 `modelMatrix` ,这样能确保所有的资源都已完全加载完毕并且处于就绪状态: ```javascript const url = '/gt-qxsy/gt-caijian/tileset.json'; const tileset = new Cesium.Cesium3DTileset({ url, }); that.map.scene.primitives.add(tileset); that.map.zoomTo(tileset); tileset.readyPromise.then(() => { // 动态计算所需的 transformation matrix 并应用之 }); ``` 这种做法不仅能够提高用户体验流畅度,而且有助于避免因过早尝试访问未初始化的对象而导致潜在错误的发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值