加载模型
this.tileset2 = new Cesium.Cesium3DTileset({
url: "http://localhost:9998/test/tileset.json",
maximumScreenSpaceError: 16,
preferLeaves: true,
skipLevelOfDetail: true,
baseScreenSpaceError: 1024,
skipScreenSpaceErrorFactor: 16,
skipLevels: 1,
immediatelyLoadDesiredLevelOfDetail: false,
loadSiblings: false,
cullWithChildrenBounds: true,
show: true,
});
this.viewer.scene.primitives.add(this.tileset2);
平移和修改高度
方法一:
const tileset = this.tileset2;
let offsetHeight=0;//需要调整的高度
var boundingSphere = tileset.boundingSphere;//3dtile的边界
var xoffect = 0.001;//x轴坐标平移量
var cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center);// 将笛卡尔坐标转换为地理坐标(弧度)
var surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, cartographic.height);
var offset = Cesium.Cartesian3.fromRadians(Cesium.Math.toRadians(Cesium.Math.toDegrees(cartographic.longitude)+xoffect),cartographic.latitude , offsetHeight);
//
var translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());
tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
方法二:
const tileset = this.tileset2;
var boundingSphere = tileset.boundingSphere;//3dtile的边界
var xoffect = 0.001;//x轴坐标平移量
let offsetHeight=0;//需要调整的高度
var cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center);// 将笛卡尔坐标转换为地理坐标(弧度)
console.log(Cesium.Math.toDegrees(cartographic.longitude))
console.log(Cesium.Math.toDegrees(cartographic.latitude))
!this.a && (this.a = Cesium.Math.toDegrees(cartographic.longitude));
!this.b && (this.b = Cesium.Math.toDegrees(cartographic.latitude));
var surface = Cesium.Cartesian3.fromRadians(Cesium.Math.toRadians(Cesium.Math.toDegrees(cartographic.longitude)-xoffect), cartographic.latitude, offsetHeight);
const mx = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(0))
var m = Cesium.Transforms.eastNorthUpToFixedFrame(surface);
// eastNorthUpToFixedFrame解析说明
// 从具有东北向上轴的参考帧计算4x4变换矩阵以提供的原点为中心,以提供的椭球的固定参考系为中心。局部轴定义为:
// x 轴指向当地的东部方向。
// y 轴指向本地北方向。
// z 轴指向穿过该位置的椭球面法线方向。
tileset._root.transform = m;
旋转
const tileset = this.tileset2;
var boundingSphere = tileset.boundingSphere;//3dtile的边界
var cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center);// 将笛卡尔坐标转换为地理坐标(弧度)
!this.a && (this.a = Cesium.Math.toDegrees(cartographic.longitude));//需要保留最原始的坐标值,否则第二次执行之后,模型位置会不对
!this.b && (this.b = Cesium.Math.toDegrees(cartographic.latitude));
var surface = Cesium.Cartesian3.fromRadians(Cesium.Math.toRadians(this.a), Cesium.Math.toRadians(this.b), 0);
//
const mx = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(45));//x轴旋转角度
var my = Cesium.Matrix3.fromRotationY(Cesium.Math.toRadians(45));//y轴旋转角度
var mz = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(45));//z轴旋转角度
//
var rotationX = Cesium.Matrix4.fromRotationTranslation(mx);
var rotationY = Cesium.Matrix4.fromRotationTranslation(my);
var rotationZ = Cesium.Matrix4.fromRotationTranslation(mz);
var m = Cesium.Transforms.eastNorthUpToFixedFrame(surface);
Cesium.Matrix4.multiply(m, rotationX, m);
Cesium.Matrix4.multiply(m, rotationY, m);
Cesium.Matrix4.multiply(m, rotationZ, m);
tileset._root.transform = m;
补充说明
1、tileset.modelMatrix:可以用来平移,旋转好像有问题。如果使用这个等于方法二的m,模型会飞到太空去。这个方法的旋转是围绕地球,不是模型自身,旋转中心好像是在世界坐标系中心,平移感觉又在模型本身中心
2、tileset._root.transformcesuim:加载的模型的旋转矩阵似乎储存在_root.transform里面的。
Cesium.Transforms.eastNorthUpToFixedFrame方法是得到世界坐标到某个点平移,得到变化后的矩阵。将这个值赋给_root.transform,模型就回移动旋转到指定位置
3、平移的位置过大的话,模型看起来好像旋转了一样,此时需要增加旋转角,例如模型从南半球移动到北半球,模型会存在一个角度差的
缩放
var boundingSphere = tileset.boundingSphere;//3dtile的边界
var cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center);// 将笛卡尔坐标转换为地理坐标(弧度)
!this.a && (this.a = Cesium.Math.toDegrees(cartographic.longitude));
!this.b && (this.b = Cesium.Math.toDegrees(cartographic.latitude));
//
var surface = Cesium.Cartesian3.fromRadians(Cesium.Math.toRadians(this.a), Cesium.Math.toRadians(this.b), 0);
var m = Cesium.Transforms.eastNorthUpToFixedFrame(surface);
//
var scale = Cesium.Matrix4.fromUniformScale(3);//缩放比例,大于1放大,小于1缩小
Cesium.Matrix4.multiply(m, scale, m)
tileset._root.transform = m;