Cesium 内置变量 czm_ellipsoidInverseRadii

Cesium 内置变量 czm_ellipsoidInverseRadii

js 复制代码
// 定义: 椭球体沿主轴 (x, y, z) 方向半径的倒数
// 类型: vec3
czm_ellipsoidInverseRadii
js 复制代码
// 实现
ellipsoid._oneOverRadii = new Cartesian3(
  x === 0.0 ? 0.0 : 1.0 / x,
  y === 0.0 ? 0.0 : 1.0 / y,
  z === 0.0 ? 0.0 : 1.0 / z,
);
应用

ellipsoidSurfaceFunction

js 复制代码
// 确定给定点是位于 3D 空间中椭球体表面的表面上、内部还是外部
float ellipsoidSurfaceFunction(vec3 point)
{
  // 归一化, 缩放到单位球上
  vec3 scaled = czm_ellipsoidInverseRadii * point;
  return dot(scaled, scaled) - 1.0;
}

椭球体: 一个以原点为中心、半轴长为 (a)、(b)、© 的椭球体的方程为:
x 2 a 2 + y 2 b 2 + z 2 c 2 = 1 \frac{x^2}{a^2} + \frac{y^2}{b^2} + \frac{z^2}{c^2} = 1 a2x2+b2y2+c2z2=1

这里的 a , b , c a,b,c a,b,c是椭球体沿 x , y , z x,y,z x,y,z轴的半轴长度。

单位球体 :单位球体是以原点为中心、半径为 1 的球体,其方程为:
x 2 + y 2 + z 2 = 1 x^2 + y^2 + z^2 = 1 x2+y2+z2=1

归一化的目标是通过坐标变换,将椭球体的方程转换为单位球体的方程。

要将椭球体归一化为单位球体,我们需要对坐标进行缩放,使得椭球体的半轴长度被归一化为 1。具体步骤如下:

定义一个新的坐标系 ( x ′ , y ′ , z ′ ) (x', y', z') (x′,y′,z′),通过以下线性变换将原始坐标 ( x , y , z ) (x, y, z) (x,y,z) 映射到归一化坐标:
x ′ = x a , y ′ = y b , z ′ = z c x' = \frac{x}{a} , \quad y' = \frac{y}{b} , \quad z' = \frac{z}{c} x′=ax,y′=by,z′=cz

这等价于将点 (x, y, z) 乘以一个对角缩放矩阵,其对角元素是椭球体半轴长度的倒数:

x ′ y ′ z ′ \] = \[ 1 / a 0 0 0 1 / b 0 0 0 1 / c \] \[ x y z \] \\begin{bmatrix} x' \\ y' \\ z' \\end{bmatrix} = \\begin{bmatrix} 1/a \& 0 \& 0 \\\\ 0 \& 1/b \& 0 \\\\ 0 \& 0 \& 1/c \\\\ \\end{bmatrix} \\begin{bmatrix} x \\ y \\ z \\end{bmatrix} \[x′ y′ z′\]= 1/a0001/b0001/c \[x y z

代码实现:

js 复制代码
// 实现了上述缩放变换,将输入点 point = (x, y, z) 转换为归一化坐标 scaled = (x', y', z') = (x/a, y/b, z/c)。
vec3 scaled = czm_ellipsoidInverseRadii * point;

因此,通过这种缩放,椭球体的表面被映射到单位球体的表面

js 复制代码
// 计算变换后点的平方欧几里得距离
dot(scaled, scaled)

d o t ( s c a l e d , s c a l e d ) = x ′ 2 + y ′ 2 + z ′ 2 = x 2 a 2 + y 2 b 2 + z 2 c 2 \begin{align} dot(scaled, scaled) &= x'^2 + y'^2 + z'^2 \\ &=\frac{x^2}{a^2} + \frac{y^2}{b^2} + \frac{z^2}{c^2} \end{align} dot(scaled,scaled)=x′2+y′2+z′2=a2x2+b2y2+c2z2

f ( x , y , z ) = x 2 a 2 + y 2 b 2 + z 2 c 2 − 1 f(x,y,z) = \frac{x^2}{a^2} + \frac{y^2}{b^2} + \frac{z^2}{c^2} - 1 f(x,y,z)=a2x2+b2y2+c2z2−1

  • f ( x , y , z ) = 0 f(x,y,z)=0 f(x,y,z)=0, 原始点在椭球体表面
  • f ( x , y , z ) < 0 f(x,y,z)<0 f(x,y,z)<0, 原始点在椭球体
  • f ( x , y , z ) > 0 f(x,y,z)>0 f(x,y,z)>0, 原始点在椭球体

出处

js 复制代码
// 计算点 point 相对于椭球体表面的距离
float cartesianToGeographic(vec3 cartesian)
{
    vec3 inverseRadii = czm_ellipsoidInverseRadii;
    float radiix = 1.0/inverseRadii.x;
    float radiiy = 1.0/inverseRadii.y;
    float radiiz = 1.0/inverseRadii.z;
    float scale = sqrt( 1.0 / (cartesian.x * cartesian.x / (radiix * radiix) + cartesian.y * cartesian.y / (radiiy * radiiy) + cartesian.z * cartesian.z / (radiiz * radiiz)));
    vec3 pos = scale * cartesian;
    float dis = distance(cartesian, pos);
    return dis;
}

类似的功能:

js 复制代码
bool czm_ellipsoidContainsPoint(vec3 ellipsoid_inverseRadii, vec3 point)
{
    vec3 scaled = ellipsoid_inverseRadii * (czm_inverseModelView * vec4(point, 1.0)).xyz;
    return (dot(scaled, scaled) <= 1.0);
}
相关推荐
gis_rc2 天前
python下shp转3dtiles
python·3d·cesium·3dtiles·数字孪生模型
grasperp3 天前
3DTiles数据切片工具,支持LAS、OBJ、FBX 3DTiles怎么切片?3DTiles切片
cesium·3dtiles·三维gis·3dtiles切片·数据切片
duansamve5 天前
Cesium中实现在地图上移动/旋转点、线、面
cesium
冥界摄政王6 天前
CesiumJS学习第四章 替换指定3D建筑模型
3d·vue·html·webgl·js·cesium
冥界摄政王8 天前
Cesium学习第二章 camera 相机
node.js·html·vue3·js·cesium
冥界摄政王9 天前
Cesium学习第一章 安装下载 基于vue3引入Cesium项目开发
vue·vue3·html5·webgl·cesium
你们瞎搞11 天前
Cesium加载20GB航测影像.tif
前端·cesium·gdal·地图切片
闲云一鹤12 天前
Cesium 使用 Turf 实现坐标点移动(偏移)
前端·gis·cesium
二狗哈12 天前
Cesium快速入门34:3dTile高级样式设置
前端·javascript·算法·3d·webgl·cesium·地图可视化
二狗哈13 天前
Cesium快速入门33:tile3d设置样式
3d·状态模式·webgl·cesium·地图可视化