fanvanzh / 3dtiles

The fastest tools for 3dtiles convert in the world!
Apache License 2.0
1.94k stars 592 forks source link

B3dm和原始OSGB仍然存在位置偏差,约3~5cm #258

Open HengyuSama opened 1 year ago

HengyuSama commented 1 year ago

我已经使用#249重新编译了这个项目,但是转换得到的B3dm和原始OSGB始终存在一定偏差,约3~5cm。 如果不使用#249重新编译,xyz的坐标偏移可以达到20cm。 使用cesiumlab转换同一份数据,转换得到的B3dm和原始OSGB精度可以做到完全一致。

我在metadata.xml上面已经把高度设置成0了,排除了高度的影响。

EPSG:32650 197293.000,2560643.000,0.000

还有什么办法能解决这个3~5cm的偏差吗?

您有没有一份数据,转换后OSGB和B3dm的坐标可以完全对齐呢?我想知道项目的精度上限是多少。

best wishes! 感谢您这么好的项目。

fanvanzh commented 1 year ago

首先感谢 @Steelwall2014 在 #249 的代码贡献。

Steelwall2014 的解决思路是先计算 box 的 transform, 然后对 box 内的顶点逐一应用 transform。

如果针对 geometry的每个顶点先转 ECEF ,再转 ENU,是否精度会更好一点呢

Steelwall2014 commented 1 year ago

首先感谢 @Steelwall2014 在 #249 的代码贡献。

Steelwall2014 的解决思路是先计算 box 的 transform, 然后对 box 内的顶点逐一应用 transform。

如果针对 geometry的每个顶点先转 ECEF ,再转 ENU,是否精度会更好一点呢

对顶点逐一进行转换是我一开始选用的方法,但是发现这样的话纹理会被扭曲,因为变换后顶点之间的相对位置可能会有细微的变化,而纹理坐标却没有修改。所以我后来选择对瓦片整体进行变换

Steelwall2014 commented 1 year ago

也许你可以试试在box中多取几个点来拟合出一个更好的变换矩阵,现在只取了box的8个顶点

Steelwall2014 commented 1 year ago

相关代码在src/osgb23dtile.cpp的124行附近

fanvanzh commented 1 year ago

就是说逐顶点转换位置贴合效果会更好,但是纹理效果有损失。

另外误差和投影计算用的库是否有关系? 用 proj-4978 是否精度更好一点?

HengyuSama commented 1 year ago

我不认为是顶点转换带来的问题,按照Steelwall2014多顶点拟合方法,离中心点越远,修正效果越好。我是直接在模型中心点SRSOrigin 就出现了2-3cm的误差。

IKangXu commented 1 year ago

是不是因为在飞模型的时候没有打像控点导致的。

HengyuSama commented 1 year ago

我不认为是顶点转换带来的问题,按照Steelwall2014多顶点拟合方法,离中心点越远,修正效果越好。我是直接在模型中心点SRSOrigin 就出现了2-3cm的误差。

这里说的是转换前的OSGB与转换后的B3dm存在一定的偏差