Cesium JS椭球切面计算
Cesium JS ellipsoid tangent plane calculation
问题
我对 Cesium 如何计算大地测量和地心表面法线有点困惑。由计算法线生成的平面在给定点实际上并不与椭球面相切,而且,由大地表面法线生成的平面与由地心表面法线生成的平面相同。
示例以及我为什么需要这个
在此 Sandcastle 中,当您单击地球表面时,将绘制 XYZ 轴以及应与椭球体相切的平面。
我需要的是在给定点处获得与椭圆体相切的 XY 平面,然后将其他点投影到该平面上。问题是我看到飞机根本不与椭球相切。
顺便说一下 - 当我使用内置方法时:Cesium.EllipsoidTangentPlane();我也得到了奇怪的结果 - 平面仍然不与椭球相切并且还漂浮在 space 中的某个地方。这里是 sandcastle.
感谢任何帮助,因为我不明白这里发生了什么。
平面的法线定义在平面的局部坐标系,其中x、y、z轴分别表示地球(world或ECEF)中的东、北、上方向.
所以如果在ECEF中给定了一个平面的法向量,你就得像这样在平面的局部坐标系下进行转换。
// get the local coordinate system of the plane
var transform = Cesium.Transforms.eastNorthUpToFixedFrame(clickedPoint);
// get invert matrix
var inv = Cesium.Matrix4.inverseTransformation(transform, new Cesium.Matrix4());
// in this case actually world normal coincide with up direction(z axis of coordinate system)
// to avoid error we slightly extend it.
var extendedWordNormal = Cesium.Cartesian3.multiplyByScalar(clickedPoint, 1.001, new Cesium.Cartesian3());
// it will be nearly same as (0, 0, 1)
var localNormal = Cesium.Matrix4.multiplyByPoint(inv, extendedWordNormal, new Cesium.Cartesian3());
//var localNormal = new Cesium.Cartesian3(0, 0, 1);
请检查这个sandcastle and this sample
问题
我对 Cesium 如何计算大地测量和地心表面法线有点困惑。由计算法线生成的平面在给定点实际上并不与椭球面相切,而且,由大地表面法线生成的平面与由地心表面法线生成的平面相同。
示例以及我为什么需要这个
在此 Sandcastle 中,当您单击地球表面时,将绘制 XYZ 轴以及应与椭球体相切的平面。
我需要的是在给定点处获得与椭圆体相切的 XY 平面,然后将其他点投影到该平面上。问题是我看到飞机根本不与椭球相切。
顺便说一下 - 当我使用内置方法时:Cesium.EllipsoidTangentPlane();我也得到了奇怪的结果 - 平面仍然不与椭球相切并且还漂浮在 space 中的某个地方。这里是 sandcastle.
感谢任何帮助,因为我不明白这里发生了什么。
平面的法线定义在平面的局部坐标系,其中x、y、z轴分别表示地球(world或ECEF)中的东、北、上方向. 所以如果在ECEF中给定了一个平面的法向量,你就得像这样在平面的局部坐标系下进行转换。
// get the local coordinate system of the plane
var transform = Cesium.Transforms.eastNorthUpToFixedFrame(clickedPoint);
// get invert matrix
var inv = Cesium.Matrix4.inverseTransformation(transform, new Cesium.Matrix4());
// in this case actually world normal coincide with up direction(z axis of coordinate system)
// to avoid error we slightly extend it.
var extendedWordNormal = Cesium.Cartesian3.multiplyByScalar(clickedPoint, 1.001, new Cesium.Cartesian3());
// it will be nearly same as (0, 0, 1)
var localNormal = Cesium.Matrix4.multiplyByPoint(inv, extendedWordNormal, new Cesium.Cartesian3());
//var localNormal = new Cesium.Cartesian3(0, 0, 1);
请检查这个sandcastle and this sample