supermap iclient3d for cesium中的平移,旋转
昨天写的模型机头不是速度的方向
基础知识
屏幕坐标系,笛卡尔空间直角坐标系,大地坐标系
平移和旋转都是基于笛卡尔空间直角坐标系,也就是基于地心。但是我们想实现模型的旋转是基于模型的局部坐标系,那么就要坐标转换。
向量归一化:单位向量
平移
平移思路:
源点笛卡尔坐标系坐标1,终点局部坐标系坐标2,(1)然后计算局部坐标系到笛卡尔坐标系的转换矩阵m,(2)m与坐标2算出终点笛卡尔坐标系坐标,(3)得到笛卡尔坐标系坐标1向笛卡尔坐标系终点坐标的转换矩阵,(4)然后相乘
实现
传入参数是模型entity对象
const Translation =(plane:any)=>
{
//飞机原来的位置
let origin=Cesium.Cartesian3.fromDegrees(104.173,30.822,600)
console.log(origin)
//(1) 局部转笛卡尔的转换矩阵
const m = Cesium.Transforms.eastNorthUpToFixedFrame(origin)
// 平移量的局部坐标系
const tempTranslation = new Cesium.Cartesian3(500,500,0)
// (2) 终点的笛卡尔坐标
const offset = Cesium.Matrix4.multiplyByPoint(m, tempTranslation, new Cesium.Cartesian3(0, 0, 0))
//计算两个笛卡尔的分量差异
const translation = Cesium.Cartesian3.subtract(offset, origin, new Cesium.Cartesian3())
//(3) 分量差异=>转换矩阵
let m2=Cesium.Matrix4.fromTranslation(translation)
//(4) 坐标×转换矩阵(你也可以用分量的xyz直接加)
var newPoint = Cesium.Matrix4.multiplyByPoint(m2, origin, new Cesium.Cartesian3());
plane.position=newPoint
}
旋转
思路:
好像可以通过很多次矩阵转换达到目标,不过这里我使用