昨天写的模型机头不是速度的方向
基础知识
屏幕坐标系,笛卡尔空间直角坐标系,大地坐标系
平移和旋转都是基于笛卡尔空间直角坐标系,也就是基于地心。但是我们想实现模型的旋转是基于模型的局部坐标系,那么就要坐标转换。
向量归一化:单位向量
旋转矩阵左乘右乘:
思考:给定一个初始旋转矩阵 R1,绕向量 r 旋转 θ 度得到旋转矩阵 R2,最终得到旋转矩阵 R3。那么,是 R3 等于 R2 乘以 R1 还是 R3 等于 R1 乘以 R2 呢?
固定坐标系:每次旋转都根据同一坐标系旋转,左乘单个旋转矩阵. 典型代表:RPY角
非固定坐标系:每次旋转都根据上一次旋转后的坐标系旋转,右乘单个旋转矩阵. 典型代表:ZYZ角
参考文章旋转矩阵变换的乘积顺序问题---机器人学_旋转矩阵可以交换顺序-CSDN博客
东北天坐标系
x正东,y正北,z指天
平移
平移思路:
源点笛卡尔坐标系坐标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
}
旋转
思路:
我的想法在初始点算出偏移角度,然后后续在速度的方向上偏移这个角度就可以了
(1)源点的局部坐标向笛卡尔坐标转换的矩阵m
(2)局部坐标系下旋转的变化矩阵n
(3)速度方向矩阵p
(4)mn绕局部坐标系旋转所以左乘,p是笛卡尔坐标系