在戈多的球体表面上生成国家形状的几何图形



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

我正在使用来自自然地球的数据作为国家边界,并成功地使用线网格将其显示在地球上。数据最初是形状文件格式,但我使用 mapshaper.org 将其转换为 GeoJSON。

图片

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

但是,我在为网格生成实际表面时遇到问题。首先,我找不到内置函数来从这些数据生成三角形网格。我已经研究了许多解决方案,包括使用内置的Mesh.PRIMITIVE_TRIANGLE_FAN格式,它不适用于凹形。

我研究过三角测量算法,如delaunay 三角测量,但实现它们收效甚微。

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

我想知道如何从这些数据构建三角形网格。本质上,我需要一个可以执行以下操作的算法:

  1. 从凹面创建三角形网格(国家/地区边界(
  2. 将网格连接到此多边形中的一系列点
  3. 允许在面内设置孔洞(用于湖泊等(

这是我正在寻找的结果的一个例子。

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

这是我当前的代码:

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()

使用 Geometry.triangulate_polygon(( 方法对多边形进行三角测量怎么样:

相关内容

  • 没有找到相关文章

最新更新