Cesium.Cartesian3(相当于Point3D)
Cesium.Matrix3(3x3矩阵,用于描述旋转变换)
Cesium.Matrix4(4x4矩阵,用于描述旋转加平移变换)
// 创建一个3X3 的旋转矩阵
let m3 = new Cesium.Matrix3(
1,0,0,
0,1,0,
0,0,1
)
// 通过一个旋转角度创建一个3X3的旋转矩阵
let m3 = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(60));
// 创建一个4X4 旋转平移变换矩阵
let m4 = new Cesium.Matrix4(
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
)
// 通过一个平移向量Cartesian3,创建一个4X4矩阵
let translation = new Cesium.Cartesian3( 20, 15, 0 );
let m4 = Cesium.Matrix4.fromTranslation(translation);
// 通过一个3X3的旋转矩阵创建一个4x4的矩阵
let rotationZ = Cesium.Matrix4.fromRotationTranslation(m3);
//根据不同方向的缩放比例生成缩放矩阵
const m = Cesium.Matrix4.fromScale(new Cesium.Cartesian3(7.0, 8.0, 9.0));
//相同的缩放比例生成缩放矩阵
const m = Cesium.Matrix4.fromUniformScale(2.0);
//计算当参考系是局部坐标时,此位置为原点的局部坐标系,到世界坐标的转换矩阵(eastNorthUpToFixedFrame)
let m = Cesium.Transforms.eastNorthUpToFixedFrame(position);
关键属性:
tileset._root.transform: The local transform of this tile.
tileset.modelMatrix: A 4x4 transformation matrix that transforms the entire tileset.
var params = {
tx: 114, //模型中心X轴坐标(经度,单位:十进制度)
ty: 22, //模型中心Y轴坐标(纬度,单位:十进制度)
tz: 0, //模型中心Z轴坐标(高程,单位:米)
rx: 60, //X轴(经度)方向旋转角度(单位:度)
ry: 30, //Y轴(纬度)方向旋转角度(单位:度)
rz: 0, //Z轴(高程)方向旋转角度(单位:度)
scale: 1 //缩放比例
};
function update3dtilesMaxtrix(params) {
//旋转
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));
//旋转矩阵Matrix3
let rotationX = Cesium.Matrix4.fromRotationTranslation(mx);
let rotationY = Cesium.Matrix4.fromRotationTranslation(my);
let rotationZ = Cesium.Matrix4.fromRotationTranslation(mz);
//平移旋转矩阵Matrix4
let position = Cesium.Cartesian3.fromDegrees(params.tx, params.ty, params.tz);
let m = Cesium.Transforms.eastNorthUpToFixedFrame(position);
let scale = Cesium.Matrix4.fromUniformScale(0.85);
// //缩放
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
return m;
}
this.tileset._root.transform = m;
【1】根据模型局部坐标偏移量进行平移
引自互联网
- 获取当前瓦片数据集的包裹范围(boundingSphere)中心(此时参考系是世界坐标)
- 计算当参考系是局部坐标时,此位置为原点的局部坐标系,到世界坐标的转换矩阵(eastNorthUpToFixedFrame)
- 利用上一步的转换矩阵,左乘一个局部平移向量,得到此平移向量在世界坐标系下的平移目标位置(矩阵×向量,结果是向量)
- 向量相减:世界坐标系下,指向平移目标点位的目标向量 - 指向模型中心的向量,得到世界坐标系下的平移向量
- 将世界坐标系下的平移向量转换成平移矩阵,赋予 tileset.modelMatrix
this.tileset.readyPromise.then(currentModel => {
const cartographic = Cesium.Cartographic.fromCartesian(this.tileset.boundingSphere.center);
//初始向量
const surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, cartographic.height);
//计算当前位置对应的Matrix4
const m = Cesium.Transforms.eastNorthUpToFixedFrame(surface);
//计算偏移矩阵
const _tx = 0;
const _ty = 0;
const _tz = 70;
const tempTranslation = new Cesium.Cartesian3(_tx, _ty, _tz);
//新位置向量
const offset = Cesium.Matrix4.multiplyByPoint(m, tempTranslation, new Cesium.Cartesian3(0,0,0));
//得到平移向量
const translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());
//根据平移向量生成平移矩阵
this.tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
});
注意:模型的原点不一定是boundingSphere.center,所以初始的this.tileset._root.transform与m = Cesium.Transforms.eastNorthUpToFixedFrame(surface) 不一样。
【2】根据偏移量进行坐标转换
function translate(origin, translateCartesian) {
let newPos = Cesium.clone(origin);
let transform = Cesium.Transforms.eastNorthUpToFixedFrame(origin); //东-北-上参考系构造出4*4的矩阵
/*构造平移变换矩阵获取坐标
let m = new Cesium.Matrix4();
Cesium.Matrix4.setTranslation(Cesium.Matrix4.IDENTITY, translateCartesian, m); //构造平移矩阵
let modelMatrix = Cesium.Matrix4.multiply(transform, m, transform); //平移矩阵左乘当前位置矩阵
Cesium.Matrix4.getTranslation(modelMatrix, newPos); //从位置矩阵中取出坐标信息
return newPos;
*/
/*平移向量变换生成新的向量
const newPos = Cesium.Matrix4.multiplyByPoint(transform, translateCartesian, new Cesium.Cartesian3(0,0,0));
return newPos;
/
}
const originPoint = Cesium.Cartesian3.fromDegrees(this.position.center[0],this.position.center[1], 0);
let newPoint = translate(originPoint, new Cesium.Cartesian3(x,y,z));