700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > cesium 3DTileset的平移 旋转 缩放

cesium 3DTileset的平移 旋转 缩放

时间:2019-01-26 17:18:03

相关推荐

cesium 3DTileset的平移 旋转 缩放

加载模型

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);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;

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。