官方链接:
https://doc.babylonjs.com/features/featuresDeepDive/scene/floating_origin
https://forum.babylonjs.com/t/why-doesnt-babylonjs-use-rendering-relative-to-eye-to-solve-the-loss-of-precision/29532/7
https://playground.babylonjs.com/#SUMKNE#41
博主想在babylonjs中使用EPSG:3857坐标系,直接渲染。但是发现大坐标下会出现无法渲染的问题,随查找原因。
因为GPU内支持32位float数,所以例如星际旅行等超大场景的vector3渲染时,会出现精度损失造成的变形、无法渲染等问题。
常用解决方法:
- 浮动原点;
- 相对坐标;
- 使用onBeforeActiveMeshesEvaluationObservable等动态修改坐标位置;参考:https://playground.babylonjs.com/#SUMKNE#41
博主测试结果
如果使用浮动原点这种方案,在mesh个数超过6W个时,渲染帧率仅为正常模式的50%左右,如果在大场景中会导致卡顿。
博主的场景中mesh格式都比较大,所以没有选择浮动原点方案。
博主实现了一个工具类,定义了一个偏移坐标,保证渲染时的流畅度。
希望babylonsjs在后续的版本升级中,能在框架中加入这个功能。
GisVectorUtils.ts{
static virtualZero = Vector3(1,2,3)
function toGisVector3(x:Vector3):Vector3{
}
function toVector3(x:Vector3):Vector3
function toGisVector2(x:Vector2):Vector2
function toVector2(x:Vector2):Vector2
}