模型文件如上图
一需求
要解析三维模型, 只需要解析其中tileset.json文件即可
因为需求中需要计算点是否在模型上, 所以需要计算出模型的范围(最大最小坐标)
基础字段解释
gltfUpAxis: 这表明3D模型的上方向是Z轴。在许多3D模型中,Y轴通常被用作上方向,但在某些情况下,它可能是Z轴。
geometricError 是一个估计值,表示当前节点表示的几何体与实际几何体之间的差异。
它通常用于视锥体裁剪和LOD(Levels of Detail)选择。
content 部分提供了指向包含此节点数据的资源的URI。在这个例子中,它是一个指向Block/tileset.json的URI,这可能是一个包含更多3D Tiles数据的子tileset。
children 数组包含此节点的子节点。每个子节点都可以有自己的boundingVolume、content、geometricError等属性。
refine 属性描述了当需要更精细的几何体表示时,应如何替换当前节点。在这个例子中,REPLACE意味着当需要更精细的几何体时,应使用子节点来替换当前节点。
关键坐标解析
坐标系统:boundingVolume 的坐标通常基于特定的坐标系统,如WGS 84基准。在某些情况下,纬度和经度可能是以弧度表示的。
中心点坐标 (Center):
x 坐标: -1574921.75
y 坐标: 5325839
z 坐标: 3126338.5
半尺寸 (Half-Sizes):
x 方向上的半长度: 6.875
y 方向上的半长度: 6.25
z 方向上的半长度: 6.375
" ------------------------------------------------------------------------------------------------------"
SO
最小 x 坐标: 中心点x - 半尺寸x = -1574921.75 - 6.875
最大 x 坐标: 中心点x + 半尺寸x = -1574921.75 + 6.875
最小 y 坐标: 中心点y - 半尺寸y = 5325839 - 6.25
最大 y 坐标: 中心点y + 半尺寸y = 5325839 + 6.25
最小 z 坐标: 中心点z - 半尺寸z = 3126338.5 - 6.375
最大 z 坐标: 中心点z + 半尺寸z = 3126338.5 + 6.375
如果只需要解析模型的中心点, 直接将xyz进行转换就好
Last WGS84 转换
/**
* 地固坐标转经纬度
* @param xyz三个值
* @return
*/
public static XYZ xyzToLlh(Double x,y,z) {
public static final double a = 6378137.0;
public static final double f = 298.257223563;
public static final double b = 6356752.314245;
double epsilon = 0.000000000000001;
double d2r = Math.PI / 180;
double r2d = 180 / Math.PI;
double e = Math.sqrt(a * a - b * b) / a;
double curB = 0;
double N = 0;
double calB = Math.atan2(z, Math.sqrt(x * x + y * y));
int count = 0;
while (Math.abs(curB - calB) * r2d > epsilon && count < 25){
curB = calB;
N = a / Math.sqrt(1 - e * e * Math.sin(curB) * Math.sin(curB));
calB = Math.atan2(z + N * e * e * Math.sin(curB), Math.sqrt(x * x + y * y));
count++;
}
x = Math.atan2(y, x) * r2d;
y = curB * r2d;
z = z / Math.sin(curB) - N * (1 - e * e);
return xyz;
}