Генерация трубы в 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 шт):

Автор решения: warmBy

Вопрос решён, мне нужно было поменять первый и третий круг местами, а так же немного подправить углы с помощью PI

→ Ссылка