前言:
我做了一个随机生成器,可以生成游戏道具,之前是矩形比较好算,随着关卡设计我需要多边形的生成方式。
在矩形内获取随机点:
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/