【Cesium】3d tiles 初始位置设置

3d tiles的初始位置由tileset.json中root.transform的变换矩阵指定。该矩阵为建模坐标系原点转换到世界坐标系中的变换矩阵。javascript

当3d tiles未指定根节点变换矩阵,经过如下两中方法能够指定模型初始位置java

一、直接在tileset.json设置json

假设已知3d tiles模型的建模坐标系的原点(0,0,0)在世界坐标系中的坐标(WGS84)。异步

const modelMat4=Cesium.Transforms.eastNorthUpToFixedFrame(origin);

而后将modelMat4的值添加到tileset.json中root.transform。url

{
  "asset": {
    "version": "1.0"
  },
  "geometricError": 500,
  "root": {
    "transform": [
      0.05602263155122217,
      0.6403416087687968,
      0.7660444431189781,
      0,
      -0.9961946980917457,
      0.08715574274765825,
      0,
      0,
      -0.06676517241775076,
      -0.7631294127377697,
      0.6427876096865391,
      0,
      -426427.5649314479,
      -4874089.370505605,
      4077985.572200376,
      1
    ],
    "geometricError": 0.2,
    "refine": "REPLACE",
    "content": {
      
    },
    "children": [
      .....
      .....
    ]
  }
}

二、在程序代码中指定3d

//origin为模型坐标系原点的世界坐标
            const modelMat4=Transforms.eastNorthUpToFixedFrame(origin);
            const tileset=scene.primitives.add(new Cesium3DTileset({
                url:url
            }));
            tileset.readyPromise.then(function(){//异步加载成功
                tileset.modelMatrix=modelMat4;//指定根节点变换矩阵
                viewer.camera.flyToBoundingSphere(tileset.boundingSphere);
            })

tileset.json中的transform属性是一个4X4放射变换矩阵,以列主序存储,它将tile的局部坐标系变换到父tile的坐标系,或者能够说就是转换到tileset根节点的坐标系。code

更普遍地说,3d tiles中的矩阵变换顺序为:orm

  1. glTF节点层次变换
  2. glTFY轴朝上变换到Z轴朝上
  3. 特定于tile格式的变换(.b3dm  .bidm )
  4. Tile 变换矩阵
  5. 根节点变换矩阵
  6. Cesium3DTileset中设置的变换矩阵ModelMatrix