前言:
我做了一个随机生成器,可以生成游戏道具,之前是矩形比较好算,随着关卡设计我需要多边形的生成方式。
在矩形内获取随机点:
func generateRandomCoordinateInRect(pos,size):"""根据范围生成随机坐标"""var rect_min = posvar rect_max = pos + sizevar 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() / 3var x = randi() % n * 3var 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/