24 thoughts to “Cesium实战(十九)解决新版本3DTile旋转缩放问题”

  1. 我每次旋转之前都先为模型做了定位,就是执行了下面的代码,模型能够定位到我需要的点,然后再旋转就还是不见了。请问会不会是定位和旋转的处理逻辑有什么问题啊。
    var cartographic = Cesium.Cartographic.fromCartesian(tileset.boundingSphere.center);
    var newCartographic = Cesium.Cartographic.fromDegrees(newLongitude, newLatitude, newHeight);
    var surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, cartographic.height);
    var offset = Cesium.Cartesian3.fromRadians(newCartographic.longitude, newCartographic.latitude, newCartographic.height);
    var translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());
    tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);

    然后我的模型是BentleyContextcapture直接导出的3dtile格式,虽然加载模型没问题,但还是会报“This tileset JSON uses the “content.url” property which has been deprecated. Use “content.uri” instead.”,也不知道是不是文件的原因。

    1. 1. 你这么写,只能调整高度
      2. 3dtile的json文件规则改过一次,最早文件路径的键值关键字用的url,后来改成了uri,你把json文件中的url批量替换成uri,就不会报这个问题了

      1. 对,我是想怎么同时调整高度并旋转,我调整完位置和高度后,旋转就不能实现。文档里面的效果好像也不能同时调整高度和旋转。不知道你那边有没有思路,还请赐教。

  2. 为什么将模型移至原点后还要对旋转矩阵进行两次倒转再进行操作?这一步不太能理解,能说明讲解下吗

    1. function scale(value){
      var m1 = Cesium.Matrix3.fromScale(new Cesium.Cartesian3(value, value, value));
      trasnlate(m1);
      }
      new Cesium.Cartesian3(valuex, valuey, valuez) 自己构建一个

      1. 那请问如果想做到连续变换的话应该怎么做呢?比如我先沿x轴进行了旋转,再沿y轴旋转时是在之前沿x轴旋转后的状态下旋转。

  3. 动态修改了角度,模型不见了?跪求大佬帮忙!
    // …
    let viewModel = {
    height: 0,
    rotateX: 0,
    rotateY: 0,
    rotateZ: 0
    };
    document.getElementById(“addRotateX”).addEventListener(“click”, function () {
    viewModel.rotateX += 50;
    changeRotateX(tileset, viewModel.rotateX);
    });
    // …

    function changeRotateX(tileset, rotateX = Number(rotateX)) {
    if (!tileset || isNaN(rotateX)) return;
    let m1 = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(rotateX) /*角度转弧度*/);
    tileset.modelMatrix = Cesium.Matrix4.multiplyByMatrix3(tileset.modelMatrix, m1, new Cesium.Matrix4());
    }

    1. movetotile内容就是viewer.zoomTo(tileset, new Cesium.HeadingPitchRange(0.0, -0.5, tileset.boundingSphere.radius * 2.0));
      这里不需要,删掉就行,文章内已删掉

  4. 写的非常棒,很受用 ~ 已解决问题了 ~~~
    发现在较新版本 cesium 1.99 依然是这样滴
    倾斜摄影的 3dtiles 没问题,
    建模软件生成的 3dtiles ,Cesium.Matrix4.multiplyByMatrix3(m,m1,m); 旋转模型消失
    原来中心点在 地球的中心啊