Bootstrap

Godot在多边形内随机获取点

前言:

我做了一个随机生成器,可以生成游戏道具,之前是矩形比较好算,随着关卡设计我需要多边形的生成方式。

在矩形内获取随机点:

func generateRandomCoordinateInRect(pos,size):
	"""根据范围生成随机坐标"""
	var rect_min = pos
	var rect_max = pos + size
	var x = rand_range(rect_min.x, rect_max.x)
	var y = rand_range(rect_min.y, rect_max.y)
	var randomCoordinate = Vector2(x, y)
	return randomCoordinate

在Polygon2D内获取随机点:

# 区域内获取随机点
func getRandomPoint():
	var triangles = Geometry.triangulate_polygon(self.polygon)
	var n = triangles.size() / 3
	var x = randi() % n * 3
	var p0 = self.polygon[triangles[x]]
	var p1 = self.polygon[triangles[x+1]]
	var p2 = self.polygon[triangles[x+2]]
	var p3 = lerp(p0,p1,rand_range(0, 1))
	var p4 = lerp(p2,p3,rand_range(0, 1))
	return p4

原理:

首先获取多边形所有的点,然后转换为三角形索引数组

随机获取一个三角形,并在三角形内随机获取点,方法如下:

在AB上随机抽取一个点,命名为D,然后再在CD上随机抽取一个点

代码中p0,p1,p2是三角形的ABC三个点

 

参考链接:

https://www.jianshu.com/p/36fa431311ac

https://www.reddit.com/r/godot/comments/mqp29g/how_do_i_get_a_random_position_inside_a_collision/

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;