3dtile平移子模型以及修改 3D Tiles 模型的模型矩阵z平移

第一段代码:应用平移变换到子模型

这段代码的目的是获取子模型的变换矩阵,并将其平移 10 个单位。

javascript 复制代码
 if (submodel) {
        // 获取当前子模型的变换矩阵
        let transform = submodel.transform
        // 创建一个向上的平移矩阵,平移 10 个单位
        let translationMatrix = Cesium.Matrix4.fromTranslation(new Cesium.Cartesian3(0, 0, 10))
        // 将平移矩阵应用到子模型的原始变换矩阵上
        let newTransform = Cesium.Matrix4.multiply(transform, translationMatrix, new Cesium.Matrix4())
        // 将更新后的变换矩阵应用到子模型
        submodel.transform = newTransform
        console.log('子模型的新变换矩阵已更新。')
      } else {
        console.log('未找到 ID 为 3 的子模型。')
      }

参考:局部修改3dtiles子模型的位置

解释:
  • submodel.transform 是子模型的当前变换矩阵,它是一个 4x4 的矩阵,包含了子模型的平移、旋转和缩放信息。
  • Cesium.Matrix4.fromTranslation(new Cesium.Cartesian3(0, 0, 10)) 创建了一个只包含平移的变换矩阵,这里表示沿着 Z 轴平移 10 个单位。
  • Cesium.Matrix4.multiply(transform, translationMatrix, new Cesium.Matrix4()) 将原始的变换矩阵和新的平移矩阵相乘,生成一个新的变换矩阵 newTransform
  • submodel.transform = newTransform 最后将计算出来的新变换矩阵应用到子模型上,从而实现子模型的平移。

第二段代码:修改 3D Tiles 模型的模型矩阵

这段代码是用来计算模型的变换,并将其应用于 3D Tiles 模型的 modelMatrix,目的是通过修改模型的 modelMatrix 来调整其在世界坐标系中的位置。

javascript 复制代码
changeHeight(tileset, height) {
  let Cesium = this.ffCesium.Cesium;

  if (!tileset || !tileset.boundingSphere) {
    console.error("Invalid tileset.");
    return;
  }

  // 3D Tile 模型的边界球体
  var boundingSphere = tileset.boundingSphere;
  
  // 获取模型的原始地理坐标(经纬度和高度)
  var cartographic_original = Cesium.Cartographic.fromCartesian(boundingSphere.center);
  
  // 将原始地理坐标转换回直角坐标系(Cartesian3)
  var Cartesian3_original = Cesium.Cartesian3.fromRadians(
    cartographic_original.longitude, 
    cartographic_original.latitude, 
    cartographic_original.height
  );

  // 计算目标高度对应的新的直角坐标(Cartesian3)
  var Cartesian3_offset = Cesium.Cartesian3.fromRadians(
    cartographic_original.longitude, 
    cartographic_original.latitude, 
    height
  );

  // 计算偏移量
  var translation = Cesium.Cartesian3.subtract(Cartesian3_offset, Cartesian3_original, new Cesium.Cartesian3());

  // 获取原始模型矩阵(避免覆盖原有变换)
  var modelMatrix = tileset.modelMatrix || Cesium.Matrix4.IDENTITY;

  // 基于原有模型矩阵进行平移
  tileset.modelMatrix = Cesium.Matrix4.multiplyByTranslation(modelMatrix, translation, new Cesium.Matrix4());
}

使用:

javascript 复制代码
  promise.then((result) => {
          result.changeHeight(result, 100)
})
解释:
  • tileset.boundingSphere 获取模型的边界球体信息,boundingSphere.center 是模型的中心点位置(在世界坐标系中的 Cartesian3 坐标)。
  • Cesium.Cartographic.fromCartesian(boundingSphere.center) 将模型的中心位置从 Cartesian3 坐标转换为地理坐标(经度、纬度、高度)。这一步是为了获取模型的中心点在地理坐标系中的位置。
  • Cesium.Cartesian3.fromRadians(cartographic_original.longitude, cartographic_original.latitude, cartographic_original.height) 将地理坐标(弧度制)转换回 Cartesian3 坐标。
  • Cesium.Cartesian3.fromRadians(cartographic_original.longitude, cartographic_original.latitude, height) 通过给定新的高度 height 来生成一个新的 Cartesian3 坐标,表示在相同的经纬度上但不同的高度位置。
  • Cesium.Cartesian3.subtract(Cartesian3_offset, Cartesian3_original, new Cesium.Cartesian3()) 计算出新的平移向量 translation,表示从原始位置到新高度位置的偏移。
  • tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation) 将这个平移向量转换为一个矩阵,并应用到模型的 modelMatrix 上,从而将整个 3D Tiles 模型平移到新的位置。

两者关系和区别:

  1. 子模型的变换矩阵 (submodel.transform)

    • 适用于操作 子模型,比如将模型中的某个部件进行平移、旋转或缩放。
    • 通过修改子模型的 transform 属性来控制其局部变换。
    • 这种变换是局部的,即仅影响子模型本身,不会改变其他子模型或整个 tileset 的位置。
  2. 3D Tiles 模型的模型矩阵 (tileset.modelMatrix)

    • 适用于整个 3D Tiles 模型,即操作整个模型的位置、旋转和缩放。
    • 通过修改 modelMatrix,可以改变整个模型在世界坐标系中的位置和方向。
    • 这里的变换通常涉及对模型进行全局的平移操作,可能是为了调整其位置或者适应其他空间要求。

总结:

  • 第一段代码演示了如何平移子模型,通过变换矩阵调整子模型的局部位置。
  • 第二段代码演示了如何平移整个 3D Tiles 模型,通过计算偏移量并应用到 tileset.modelMatrix 来调整整个模型的位置。

如果你想要同时操作多个子模型并进行全局平移,通常需要结合使用这些方法。你可以先对每个子模型应用局部变换(例如平移),然后再通过 tileset.modelMatrix 对整个模型进行全局变换。

相关推荐
phoenix@Capricornus4 小时前
单位球面在线性变换下的像以及线性变换诱导的加权 2-范数的等值面(To 战老师)
线性代数·机器学习·矩阵
陈天伟教授4 小时前
eDrawings 2026 x64 Edition-免费 3D 模型和 2D 工程图查看器
3d
Ivanqhz10 小时前
注意力机制
线性代数·算法·矩阵·哈希算法·dnn
workflower1 天前
设备单元级(L1)实施路径
人工智能·线性代数·矩阵·机器人·开源
Tian_Hang1 天前
eclipse ditto 学习笔记
运维·服务器·开发语言·javascript·3d
剑挑星河月1 天前
54.螺旋矩阵
java·算法·leetcode·矩阵
AI视觉网奇1 天前
BambuStudio 编译实战 2026
3d
AI前沿资讯1 天前
AI3D角色生产如何减少返工?用 V2Fun 前移建模与动画流程
人工智能·3d
蓝速科技1 天前
蓝速科技视觉 3D 全息舱 AI 数字人一体机带灯与无灯款深度评测
人工智能·科技·3d
尘中远1 天前
【Qwt 7.0 系列】3D 数据可视化 —— OpenGL 高性能三维绘图
qt·3d·qcustomplot·qwt·科学绘图·高性能绘图