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 对整个模型进行全局变换。

相关推荐
多恩Stone2 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
多恩Stone2 天前
【3D-AICG 系列-15】Trellis 2 的 O-voxel Shape: Flexible Dual Grid 代码与论文对应
人工智能·python·算法·3d·aigc
在下胡三汉2 天前
为什么“资产土地”标准化主资产的 glTF、glb格式模型,为什么非常流行
3d
汉克老师2 天前
GESP2023年12月认证C++二级( 第三部分编程题(2) 小杨的H字矩阵)
c++·算法·矩阵·循环结构·gesp二级·gesp2级
2401_863801462 天前
3DTiles(.b3dm,i3dm,cmpt) 数据转换fbx转obj转max转su,cesium格式模型转换
3d
3Dmax效果图渲染研习社3 天前
2026年3ds Max云渲染平台哪个好?
3d
AI科技星3 天前
物理世界的几何建构:论统一场论的本体论革命与概念生成
人工智能·opencv·线性代数·算法·矩阵
没有bug.的程序员3 天前
订单系统重构史诗:从单体巨兽到微服务矩阵的演进、数据一致性内核与分布式事务
java·微服务·矩阵·重构·分布式事务·数据一致性·订单系统
super_lzb3 天前
【线性代数】矩阵第一讲:矩阵与矩阵的运算
线性代数·矩阵·考研数学·矩阵的计算