旋转3DTiles模型

407 阅读1分钟
//定义矩形的中心坐标与朝向
let params = {
  tx: 121, //模型中心X轴坐标(经度,单位:十进制度)
  ty: 32, //模型中心Y轴坐标(纬度,单位:十进制度)
  tz: 10, //模型中心Z轴坐标(高度,单位:米)
  rx: -100, //X轴(经度)方向旋转角度(单位:度)圆心应该是在地心,改动其中一个值的时候,不止变化了该变量,比如改动ry,模型的高度也有了显著上升
  ry: 10, //Y轴(纬度)方向旋转角度(单位:度)
  rz: 0, //Z轴(高程)方向旋转角度(单位:度)
  scale: 10,
};
//缩放
let scale = (value) => {
  params.scale = value;
  update3dtilesMaxtrix();
};
//旋转
let rotateX = (anglex) => {
  params.rx = anglex;
  update3dtilesMaxtrix();
};
let rotateY = (angley) => {
  params.ry = angley;
  update3dtilesMaxtrix();
};
let rotateZ = (anglez) => {
  params.rz = anglez;
  update3dtilesMaxtrix();
};

const update3dtilesMaxtrix = () => {
  // 把旋转的度数转换为弧度制,并建立一个围绕X轴的旋转矩阵
  let mx = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(params.rx));
  let my = Cesium.Matrix3.fromRotationY(Cesium.Math.toRadians(params.ry));
  let mz = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(params.rz));
  let rotationX = Cesium.Matrix4.fromRotationTranslation(mx);
  let rotationY = Cesium.Matrix4.fromRotationTranslation(my);
  let rotationZ = Cesium.Matrix4.fromRotationTranslation(mz);
  //平移
  let position = Cesium.Cartesian3.fromDegrees(params.tx, params.ty, params.tz);
  //缩放矩阵
  let scale = Cesium.Matrix4.fromUniformScale(params.scale);
  
  let m = Cesium.Transforms.eastNorthUpToFixedFrame(position); //以中心点建立一个矩阵

  Cesium.Matrix4.multiply(m, scale, m); //缩放矩阵相乘
  //旋转、平移矩阵相乘
  Cesium.Matrix4.multiply(m, rotationX, m);
  Cesium.Matrix4.multiply(m, rotationY, m);
  Cesium.Matrix4.multiply(m, rotationZ, m);

  //赋值给tileset
  tileset._root.transform = m;
};