Генерация трубы в Godot
Я генерирую пещеры для моего проекта в Godot, для генерации пещер изначально нужно сделать кривую, а потом сделать "трубу" на основе этой кривой, с последним у меня возникли проблемы
func generateCave() -> ArrayMesh:
var data: Array = []
var vertices: Array = []
var rad: float = radius / 32
var circle: Array = [
Vector3(0, rad, 0),
Vector3(rad, 0, 0),
Vector3(0, -rad, 0),
Vector3(-rad, 0, 0)
]
var circlesTemp: Array[Array] = [[], []]
var circles: Array[Array] = []
for n: int in range(subdivideCount):
var newCircle: Array = []
for i: int in range(circle.size()):
newCircle.append_array([
circle[i],
((circle[i] + circle[(i + 1) % circle.size()]) * 0.5).normalized() * rad
])
circle = newCircle
for i: int in range(curve.size()):
if i == 0:
var diff: Vector3 = curve[i + 1] - curve[i]
var angle: Vector2 = Vector2(
-atan2(diff.y, diff.z),
-atan2(diff.x, diff.z)
)
circles.append(
circle.map(
func(point: Vector3) -> Vector3:
return rotatePoint(point, angle) + curve[i]
)
)
elif i == curve.size() - 1:
var diff: Vector3 = curve[i - 1] - curve[i]
var angle: Vector2 = Vector2(
-atan2(diff.y, diff.z),
-atan2(diff.x, diff.z)
)
circles.append(
circle.map(
func(point: Vector3) -> Vector3:
return rotatePoint(point, angle) + curve[i]
)
)
else:
var diff: Array[Vector3] = [
curve[i + 1] - curve[i],
curve[i - 1] - curve[i]
]
var angle: Array[Vector2] = [
Vector2(
-atan2(diff[0].y, diff[0].z),
-atan2(diff[0].x, diff[0].z)
),
Vector2(
-atan2(diff[1].y, diff[1].z),
-atan2(diff[1].x, diff[1].z)
)
]
var temp: Array[Array] = []
temp.append(
circle.map(
func(point: Vector3) -> Vector3:
return rotatePoint(point, angle[0])
)
)
temp.append(
circle.map(
func(point: Vector3) -> Vector3:
return rotatePoint(point, angle[1])
)
)
circles.append_array([
temp[0].map(
func(point: Vector3) -> Vector3:
return point + (curve[i] - curve[i + 1]) * 0.8 + curve[i + 1]
),
range(circle.size()).map(
func(id: int) -> Vector3:
return ((temp[0][id] + temp[1][id]) * 0.5).normalized() * rad + curve[i]
),
temp[1].map(
func(point: Vector3) -> Vector3:
return point + (curve[i] - curve[i - 1]) * 0.8 + curve[i - 1]
)
])
for j: int in range(circles.size()):
if j == (circles.size() - 1):
break
for i: int in range(circles[j].size()):
vertices.append_array([
circles[j + 1][i],
circles[j][(i + 1) % circles[j].size()],
circles[j][i],
circles[j][(i + 1) % circles[j].size()],
circles[j + 1][i],
circles[j + 1][(i + 1) % circles[j + 1].size()]
])
for n: int in range(subdivideCount):
vertices = subdivide(vertices)
data.resize(Mesh.ARRAY_MAX)
data[Mesh.ARRAY_VERTEX] = PackedVector3Array(vertices)
var mesh: ArrayMesh = ArrayMesh.new()
mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, data)
mesh.surface_set_material(0, material)
return mesh
У меня получается примерно это:
Проще говоря, у меня проблемы с вращением кругов, которые я добавляю к каждой точке кривой Я добавлял к разным углам по x и y PI, чтобы повернуть на 180°, чтобы починить, но как только я чинил одно, ломалось другое, я уже не знаю что мне делать, может кто-то подскажет?
Входные данные: curve = [Vector3(10, -8.7, -10), Vector3(0, 0, 0), Vector3(-7.9, 1.4, 10), Vector3(-10, 0, 20)] radius = 100.0
Ответы (1 шт):
Вопрос решён, мне нужно было поменять первый и третий круг местами, а так же немного подправить углы с помощью PI