java 解析三维模型,最大最小坐标,java解析tileset.json文件

本文介绍了如何解析三维模型中的tileset.json文件,关注于计算模型范围、坐标系统的理解,以及从WGS84坐标到经纬度的转换方法。重点讨论了GltfUpAxis、geometricError等关键字段的作用和3DTiles规范的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模型文件
模型文件如上图

一需求

要解析三维模型, 只需要解析其中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;
}

3D Tiles 规范学习笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值