【问题标题】:Generating country-shaped geometry on the surface of a sphere in Godot在 Godot 中的球体表面上生成国家形状的几何图形
【发布时间】:2020-03-28 17:48:19
【问题描述】:

我目前正在 Godot 中开发一款游戏,该游戏涉及在地球上渲染国家。我以前对 Godot 的经验很少,但过去曾尝试过。

我正在使用来自 Natural Earth 的this data 作为国家边界,并已成功使用线网格将其显示在地球上。数据最初是 shapefile 格式,但我使用 mapshaper.org 将其转换为 GeoJSON。

Picture

数据基本上归结为以纬度和经度给出的点列表,然后我将其转换为 3d 点并使用 SurfaceTool 创建了一个网格。

但是,我无法为网格生成实际表面。首先,我无法找到一个内置函数来根据这些数据生成三角形网格。我研究了许多解决方案,包括使用内置的 Mesh.PRIMITIVE_TRIANGLE_FAN 格式,该格式不适用于凹形。

我研究过三角剖分算法,例如 delaunay 三角剖分,但实施起来收效甚微。

我目前的计划是使用 2d 数据(x,y = 经度,纬度)生成三角形网格,并将其投影到球体表面。为了生成曲面,我会将球体本身的顶点包含在网格中 (example)。

我想知道如何根据这些数据构建三角形网格。本质上,我需要一个可以做以下事情的算法:

  1. 从凹多边形(国家边界)创建三角形网格
  2. 将网格连接到该多边形内的一系列点
  3. 允许多边形内的孔(用于湖泊等)

Here 是我正在寻找的结果示例。

再说一次,我对 Godot 还是很陌生,我可能把事情复杂化了。如果有更简单的方法可以在地球上呈现国家/地区,请告诉我。

这是我当前的代码:

extends Node

export var radius = 1
export var path = "res://data/countries.json"

func coords(uv):
    return (uv - Vector2(0.5, 0.5)) * 360

func uv(coords):
    return (coords / 360) + Vector2(0.5, 0.5)

func sphere(coords, r):
    var angles = coords / 180 * 3.14159
    return Vector3(
        r * cos(angles.y) * sin(angles.x),
        r * sin(angles.y),
        r * cos(angles.y) * cos(angles.x)
    )

func generate_mesh(c):
    var mesh = MeshInstance.new()
    var material = SpatialMaterial.new()
    material.albedo_color = Color(randf(), randf(), randf(), 1.0)

    var st = SurfaceTool.new()
    st.begin(Mesh.PRIMITIVE_LINE_STRIP)

    for h in c:
        var k = sphere(h, radius)
        st.add_normal(k / radius)
        st.add_uv(uv(h))
        st.add_vertex(k)

    st.index()
    mesh.mesh = st.commit()
    mesh.set_material_override(material)
    return mesh

func load_data():
    var file = File.new()
    file.open(path, file.READ)
    var data = JSON.parse(file.get_as_text()).result
    file.close()

    for feature in data.features:
        var geometry = feature.geometry
        var properties = feature.properties

        if geometry.type == "Polygon":
            for body in geometry.coordinates:
                var coordinates = []
                for coordinate in body:
                    coordinates.append(Vector2(coordinate[0], coordinate[1]))
                add_child(generate_mesh(coordinates))
        if geometry.type == "MultiPolygon":
            for polygon in geometry.coordinates:
                for body in polygon:
                    var coordinates = []
                    for coordinate in body:
                        coordinates.append(Vector2(coordinate[0], coordinate[1]))
                    add_child(generate_mesh(coordinates))

func _ready():
    load_data()

【问题讨论】:

  • 我正在解决同样的问题。到目前为止,我最接近的是将 GeoJSON 细分为足够小的单元格(例如使用 QGIS),然后再将其导入我的项目......好奇是否有人会发布更好的方法!

标签: mesh triangulation geography godot


【解决方案1】:

如何使用Geometry.triangulate_polygon() 方法对多边形进行三角剖分:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 2014-09-03
    • 2011-03-11
    • 2010-10-12
    • 2018-04-17
    相关资源
    最近更新 更多