Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > HTML и CSS
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2024, 17:17   #211
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 316
По умолчанию

??? ???
Код:
import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *
import numpy as np
import noise
import os

# Инициализация Pygame
pygame.init()
display = (800, 600)
pygame.display.set_mode(display, DOUBLEBUF | OPENGL)

# Инициализация камеры
gluPerspective(45, (display[0] / display[1]), 0.1, 1000.0)
glTranslatef(0.0, 0.0, -30)
glRotatef(45, 1, 0, 0)  # Повернуть камеру на 45 градусов вокруг оси X

# Генерация шума
def generate_noise_2d(shape, x_offset, z_offset, scale=100.0, octaves=6, persistence=0.5, lacunarity=2.0):
    noise_map = np.zeros(shape)
    for i in range(shape[0]):
        for j in range(shape[1]):
            noise_map[i][j] = noise.pnoise2((i + x_offset) / scale, (j + z_offset) / scale, octaves=octaves,
                                              persistence=persistence, lacunarity=lacunarity, repeatx=1024,
                                              repeaty=1024, base=42)
    return noise_map

# Создание террейна
def create_terrain(width, height, x_offset, z_offset):
    noise_map = generate_noise_2d((width, height), x_offset, z_offset)
    vertices = []
    for i in range(width):
        for j in range(height):
            x = i - width // 2
            z = j - height // 2
            y = noise_map[i][j] * 10
            vertices.append((x, y, z))
    # Добавляем вершины шипов
    for i in range(width):
        for j in range(height):
            if (i + j) % 2 == 0:  # Добавляем шипы через одну клетку
                x = i - width // 2
                z = j - height // 2
                y = noise_map[i][j] * 10 + 5  # Высота шипа
                vertices.append((x, y, z))
    return vertices

# Отрисовка террейна
# Отрисовка террейна
def draw_terrain(vertices, width, height):
    glBegin(GL_TRIANGLES)
    for i in range(width - 1):
        for j in range(height - 1):
            x = i - width // 2
            z = j - height // 2
            y_floor = vertices[i * height + j][1]
            y_ceiling = 10  # Высота потолка

            # Пол
            glVertex3fv(vertices[i * height + j])
            glVertex3fv(vertices[(i + 1) * height + j])
            glVertex3fv(vertices[i * height + j + 1])

            glVertex3fv(vertices[(i + 1) * height + j])
            glVertex3fv(vertices[(i + 1) * height + j + 1])
            glVertex3fv(vertices[i * height + j + 1])

            # Стены
            glVertex3fv((x, y_floor, z))
            glVertex3fv((x + 1, y_floor, z))
            glVertex3fv((x, y_ceiling, z))

            glVertex3fv((x + 1, y_floor, z))
            glVertex3fv((x + 1, y_ceiling, z))
            glVertex3fv((x + 1, y_floor, z + 1))

            glVertex3fv((x, y_floor, z + 1))
            glVertex3fv((x, y_ceiling, z + 1))
            glVertex3fv((x, y_floor, z))

            glVertex3fv((x, y_floor, z))
            glVertex3fv((x, y_ceiling, z))
            glVertex3fv((x + 1, y_floor, z))

            glVertex3fv((x + 1, y_floor, z + 1))
            glVertex3fv((x + 1, y_ceiling, z + 1))
            glVertex3fv((x, y_floor, z + 1))

    glEnd()

# Сохранение в OBJ файл
def save_to_obj(vertices, width, height, filename):
    with open(filename, "w") as f:
        for v in vertices:
            f.write(f"v {v[0]} {v[1]} {v[2]}\n")
        for i in range(width - 1):
            for j in range(height - 1):
                # Пол
                f.write(f"f {i * height + j + 1} {(i + 1) * height + j + 1} {i * height + j + 2}\n")
                f.write(f"f {(i + 1) * height + j + 1} {(i + 1) * height + j + 2} {i * height + j + 2}\n")
                # Стены
                if (i + j) % 2 == 0:  # Добавляем шипы через одну клетку
                    f.write(f"f {i * height + j + 1} {(i + 1) * height + j + 1} {width * height + i * height + j + 1}\n")
                    f.write(f"f {(i + 1) * height + j + 1} {width * height + i * height + j + 1} {width * height + (i + 1) * height + j + 1}\n")
                    f.write(f"f {i * height + j + 1} {width * height + (i + 1) * height + j + 1} {width * height + i * height + j + 1}\n")
                    f.write(f"f {width * height + i * height + j + 1} {width * height + i * height + j + 2} {width * height + (i + 1) * height + j + 1}\n")
                    f.write(f"f {width * height + i * height + j + 2} {width * height + (i + 1) * height + j + 1} {width * height + (i + 1) * height + j + 1}\n")

# Основной цикл
width, height = 20, 20
x_offset = 0
z_offset = 0
clock = pygame.time.Clock()
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_w:
                z_offset += 5
            if event.key == pygame.K_s:
                z_offset -= 5
            if event.key == pygame.K_a:
                x_offset -= 5
            if event.key == pygame.K_d:
                x_offset += 5
            if event.key == pygame.K_r:  # Сохранение на нажатие R
                desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
                filename = os.path.join(desktop_path, "terrain_chunk.obj")
                save_to_obj(create_terrain(width, height, x_offset, z_offset), width, height, filename)
                print(f"Model saved as {filename}")

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    vertices = create_terrain(width, height, x_offset, z_offset)
    draw_terrain(vertices, width, height)
    pygame.display.flip()
    clock.tick(60)
MakarovDs вне форума Ответить с цитированием
Старый 25.11.2024, 17:23   #212
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 316
По умолчанию

ВОТ! Об такие шипы можно себе жопу распороть нахер.
Код:
import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *
import numpy as np
import noise
import os

# Инициализация Pygame
pygame.init()
display = (800, 600)
pygame.display.set_mode(display, DOUBLEBUF | OPENGL)

# Инициализация камеры
gluPerspective(45, (display[0] / display[1]), 0.1, 1000.0)
glTranslatef(0.0, 0.0, -30)
glRotatef(45, 1, 0, 0)  # Повернуть камеру на 45 градусов вокруг оси X

# Генерация шума
def generate_noise_2d(shape, x_offset, z_offset, scale=100.0, octaves=6, persistence=0.5, lacunarity=2.0):
    noise_map = np.zeros(shape)
    for i in range(shape[0]):
        for j in range(shape[1]):
            noise_map[i][j] = noise.pnoise2((i + x_offset) / scale, (j + z_offset) / scale, octaves=octaves,
                                              persistence=persistence, lacunarity=lacunarity, repeatx=1024,
                                              repeaty=1024, base=42)
    return noise_map

# Создание террейна
def create_terrain(width, height, x_offset, z_offset):
    noise_map = generate_noise_2d((width, height), x_offset, z_offset)
    vertices = []
    for i in range(width):
        for j in range(height):
            x = i - width // 2
            z = j - height // 2
            y = noise_map[i][j] * 10
            vertices.append((x, y, z))
    # Добавляем вершины шипов
    for i in range(width):
        for j in range(height):
            if (i + j) % 2 == 0:  # Добавляем шипы через одну клетку
                x = i - width // 2
                z = j - height // 2
                y = noise_map[i][j] * 10  # Высота шипа
                vertices.append((x, y, z))  # Основание шипа
                vertices.append((x, y + 5, z))  # Вершина шипа
    return vertices

# Отрисовка террейна
def draw_terrain(vertices, width, height):
    glBegin(GL_TRIANGLES)
    for i in range(width - 1):
        for j in range(height - 1):
            x = i - width // 2
            z = j - height // 2
            y_floor = vertices[i * height + j][1]
            y_ceiling = 10  # Высота потолка

            # Пол
            glVertex3fv(vertices[i * height + j])
            glVertex3fv(vertices[(i + 1) * height + j])
            glVertex3fv(vertices[i * height + j + 1])

            glVertex3fv(vertices[(i + 1) * height + j])
            glVertex3fv(vertices[(i + 1) * height + j + 1])
            glVertex3fv(vertices[i * height + j + 1])

            # Стены
            glVertex3fv((x, y_floor, z))
            glVertex3fv((x + 1, y_floor, z))
            glVertex3fv((x, y_ceiling, z))

            glVertex3fv((x + 1, y_floor, z))
            glVertex3fv((x + 1, y_ceiling, z))
            glVertex3fv((x + 1, y_floor, z + 1))

            glVertex3fv((x, y_floor, z + 1))
            glVertex3fv((x, y_ceiling, z + 1))
            glVertex3fv((x, y_floor, z))

            glVertex3fv((x, y_floor, z))
            glVertex3fv((x, y_ceiling, z))
            glVertex3fv((x + 1, y_floor, z))

            glVertex3fv((x + 1, y_floor, z + 1))
            glVertex3fv((x + 1, y_ceiling, z + 1))
            glVertex3fv((x, y_floor, z + 1))

    glEnd()

# Сохранение в OBJ файл
def save_to_obj(vertices, width, height, filename):
    with open(filename, "w") as f:
        for v in vertices:
            f.write(f"v {v[0]} {v[1]} {v[2]}\n")
        for i in range(width):
            for j in range(height):
                # Пол
                f.write(f"f {i * height + j + 1} {(i + 1) * height + j + 1} {i * height + j + 2}\n")
                f.write(f"f {(i + 1) * height + j + 1} {(i + 1) * height + j + 2} {i * height + j + 2}\n")
                # Шипы
                if (i + j) % 2 == 0:  # Добавляем шипы через одну клетку
                    f.write(f"f {i * height + j + 1} {width * height + i * height + j + 1} {width * height + i * height + j + 2}\n")
                    f.write(f"f {width * height + i * height + j + 1} {width * height + i * height + j + 2} {width * height + (i + 1) * height + j + 1}\n")
                    f.write(f"f {i * height + j + 1} {width * height + (i + 1) * height + j + 1} {width * height + i * height + j + 1}\n")
        f.write(f"f {width * height + i * height + j + 1} {width * height + i * height + j + 2} {width * height + (i + 1) * height + j + 1}\n")
        f.write(f"f {width * height + i * height + j + 2} {width * height + (i + 1) * height + j + 1} {width * height + (i + 1) * height + j + 1}\n")

# Основной цикл
width, height = 20, 20
x_offset = 0
z_offset = 0
clock = pygame.time.Clock()
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_w:
                z_offset += 5
            if event.key == pygame.K_s:
                z_offset -= 5
            if event.key == pygame.K_a:
                x_offset -= 5
            if event.key == pygame.K_d:
                x_offset += 5
            if event.key == pygame.K_r:  # Сохранение на нажатие R
                desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
                filename = os.path.join(desktop_path, "terrain_chunk.obj")
                save_to_obj(create_terrain(width, height, x_offset, z_offset), width, height, filename)
                print(f"Model saved as {filename}")

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    vertices = create_terrain(width, height, x_offset, z_offset)
    draw_terrain(vertices, width, height)
    pygame.display.flip()
    clock.tick(60)

теперь получится сделать уровень 606:
https://www.youtube.com/watch?v=nDy9KMHcrjw&t=659s

Последний раз редактировалось MakarovDs; 26.11.2024 в 12:32.
MakarovDs вне форума Ответить с цитированием
Старый 26.11.2024, 14:48   #213
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 316
По умолчанию

Процедурный генератор пола с мусором:
Код:
import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *
import numpy as np
import noise
import os
import sys
# Инициализация Pygame
pygame.init()
display = (800, 600)
pygame.display.set_mode(display, DOUBLEBUF | OPENGL)

# Инициализация камеры
gluPerspective(45, (display[0] / display[1]), 0.1, 1000.0)
glTranslatef(0.0, 0.0, -30)
glRotatef(45, 1, 0, 0)  # Повернуть камеру на 45 градусов вокруг оси X

# Генерация шума
def generate_noise_2d(shape, x_offset, z_offset, scale=100.0, octaves=6, persistence=0.5, lacunarity=2.0):
    noise_map = np.zeros(shape)
    for i in range(shape[0]):
        for j in range(shape[1]):
            noise_map[i][j] = noise.pnoise2((i + x_offset) / scale, (j + z_offset) / scale, octaves=octaves,
                                              persistence=persistence, lacunarity=lacunarity, repeatx=1024,
                                              repeaty=1024, base=42)
    return noise_map

# Создание террейна
def create_terrain(width, height, x_offset, z_offset):
    noise_map = generate_noise_2d((width, height), x_offset, z_offset)
    vertices = []
    for i in range(width):
        for j in range(height):
            x = i - width // 2
            z = j - height // 2
            y = noise_map[i][j] * 10
            vertices.append((x, y, z))
    return vertices

# Отрисовка террейна
def draw_terrain(vertices, width, height):
    glBegin(GL_TRIANGLES)
    for i in range(width - 1):
        for j in range(height - 1):
            glVertex3fv(vertices[i * height + j])
            glVertex3fv(vertices[(i + 1) * height + j])
            glVertex3fv(vertices[i * height + j + 1])

            glVertex3fv(vertices[(i + 1) * height + j])
            glVertex3fv(vertices[(i + 1) * height + j + 1])
            glVertex3fv(vertices[i * height + j + 1])
    glEnd()

# Отрисовка комнаты
def draw_room(width, height, depth):
    glBegin(GL_QUADS)
    # Пол
    glVertex3fv((-width/2, 0, -depth/2))
    glVertex3fv((width/2, 0, -depth/2))
    glVertex3fv((width/2, 0, depth/2))
    glVertex3fv((-width/2, 0, depth/2))

    # Потолок
    glVertex3fv((-width/2, height, -depth/2))
    glVertex3fv((width/2, height, -depth/2))
    glVertex3fv((width/2, height, depth/2))
    glVertex3fv((-width/2, height, depth/2))

    # Стены
    glVertex3fv((-width/2, 0, -depth/2))
    glVertex3fv((-width/2, height, -depth/2))
    glVertex3fv((-width/2, height, depth/2))
    glVertex3fv((-width/2, 0, depth/2))

    glVertex3fv((width/2, 0, -depth/2))
    glVertex3fv((width/2, height, -depth/2))
    glVertex3fv((width/2, height, depth/2))
    glVertex3fv((width/2, 0, depth/2))

    glVertex3fv((-width/2, 0, -depth/2))
    glVertex3fv((width/2, 0, -depth/2))
    glVertex3fv((width/2, height, -depth/2))
    glVertex3fv((-width/2, height, -depth/2))

    glVertex3fv((-width/2, 0, depth/2))
    glVertex3fv((width/2, 0, depth/2))
    glVertex3fv((width/2, height, depth/2))
    glVertex3fv((-width/2, height, depth/2))
    glEnd()
    
# Сохранение в OBJ файл
def save_to_obj(vertices, faces, filename):
    with open(filename, "w") as f:
        for v in vertices:
            f.write(f"v {v[0]} {v[1]} {v[2]}\n")
        for face in faces:
            f.write(f"f {face[0] + 1} {face[1] + 1} {face[2] + 1}\n")

# Основной цикл
clock = pygame.time.Clock()
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_r:  # Сохранение на нажатие R
                desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
                filename = os.path.join(desktop_path, "scene.obj")
                vertices = create_terrain(100, 100, 0, 0)
                terrain_faces = []
                for i in range(100 - 1):
                    for j in range(100 - 1):
                        terrain_faces.append([i * 100 + j, (i + 1) * 100 + j, i * 100 + j + 1])
                        terrain_faces.append([(i + 1) * 100 + j, (i + 1) * 100 + j + 1, i * 100 + j + 1])
                room_vertices = [
    [-50, 0, -50],
    [50, 0, -50],
    [50, 0, 50],
    [-50, 0, 50],
    [-50, 50, -50],
    [50, 50, -50],
    [50, 50, 50],
    [-50, 50, 50]
               ]
                room_faces = [
    [0, 1, 2],  # пол
    [0, 2, 3],
    [4, 5, 6],  # потолок
    [4, 6, 7],
    [0, 1, 5],  # стена 1
    [0, 5, 4],
    [1, 2, 6],  # стена 2
    [1, 6, 5],
    [2, 3, 7],  # стена 3
    [2, 7, 6],
    [3, 0, 4],  # стена 4
    [3, 4, 7]
                ]
                all_vertices = vertices + room_vertices
                all_faces = terrain_faces + [[x + len(vertices) for x in face] for face in room_faces]
                save_to_obj(all_vertices, all_faces, filename)
                print(f"Model saved as {filename}")

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glLoadIdentity()
    gluPerspective(45, (display[0] / display[1]), 0.1, 1000.0)
    glTranslatef(0.0, 0.0, -30)
    glRotatef(45, 1, 0, 0)  # Повернуть камеру на 45 градусов вокруг оси X

    # Отрисовка террейна
    vertices = create_terrain(100, 100, 0, 0)
    draw_terrain(vertices, 100, 100)

    # Отрисовка комнаты
    draw_room(100, 50, 100)

    pygame.display.flip()
    clock.tick(60)
MakarovDs вне форума Ответить с цитированием
Старый 26.11.2024, 16:27   #214
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 316
По умолчанию

Комната с холмистым полом

Код:
import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *
import numpy as np
import noise
import os
import sys
# Инициализация Pygame
pygame.init()
display = (800, 600)
pygame.display.set_mode(display, DOUBLEBUF | OPENGL)

# Инициализация камеры
gluPerspective(45, (display[0] / display[1]), 0.1, 1000.0)
glTranslatef(0.0, 0.0, -30)
glRotatef(45, 1, 0, 0)  # Повернуть камеру на 45 градусов вокруг оси X

# Генерация шума
def generate_noise_2d(shape, x_offset, z_offset, scale=100.0, octaves=6, persistence=0.5, lacunarity=2.0):
    noise_map = np.zeros(shape)
    for i in range(shape[0]):
        for j in range(shape[1]):
            noise_map[i][j] = noise.pnoise2((i + x_offset) / scale, (j + z_offset) / scale, octaves=octaves,
                                              persistence=persistence, lacunarity=lacunarity, repeatx=1024,
                                              repeaty=1024, base=42)
    return noise_map

# Создание террейна
def create_terrain(width, height, x_offset, z_offset):
    noise_map = generate_noise_2d((width, height), x_offset, z_offset)
    vertices = []
    for i in range(width):
        for j in range(height):
            x = i - width // 2
            z = j - height // 2
            y = noise_map[i][j] * 10
            vertices.append((x, y, z))
    return vertices

# Отрисовка террейна
def draw_terrain(vertices, width, height):
    glBegin(GL_TRIANGLES)
    for i in range(width - 1):
        for j in range(height - 1):
            glVertex3fv(vertices[i * height + j])
            glVertex3fv(vertices[(i + 1) * height + j])
            glVertex3fv(vertices[i * height + j + 1])

            glVertex3fv(vertices[(i + 1) * height + j])
            glVertex3fv(vertices[(i + 1) * height + j + 1])
            glVertex3fv(vertices[i * height + j + 1])
    glEnd()

# Отрисовка комнаты
def draw_room(width, height, depth):
    glBegin(GL_QUADS)
    # Потолок
    glVertex3fv((-width/2, height, -depth/2))
    glVertex3fv((width/2, height, -depth/2))
    glVertex3fv((width/2, height, depth/2))
    glVertex3fv((-width/2, height, depth/2))

    # Стены
    glVertex3fv((-width/2, 0, -depth/2))
    glVertex3fv((-width/2, height, -depth/2))
    glVertex3fv((-width/2, height, depth/2))
    glVertex3fv((-width/2, 0, depth/2))

    glVertex3fv((width/2, 0, -depth/2))
    glVertex3fv((width/2, height, -depth/2))
    glVertex3fv((width/2, height, depth/2))
    glVertex3fv((width/2, 0, depth/2))

    glVertex3fv((-width/2, 0, -depth/2))
    glVertex3fv((width/2, 0, -depth/2))
    glVertex3fv((width/2, height, -depth/2))
    glVertex3fv((-width/2, height, -depth/2))

    glVertex3fv((-width/2, 0, depth/2))
    glVertex3fv((width/2, 0, depth/2))
    glVertex3fv((width/2, height, depth/2))
    glVertex3fv((-width/2, height, depth/2))
    glEnd()
    
# Сохранение в OBJ файл
def save_to_obj(vertices, faces, filename):
    with open(filename, "w") as f:
        for v in vertices:
            f.write(f"v {v[0]} {v[1]} {v[2]}\n")
        for face in faces:
            f.write(f"f {face[0] + 1} {face[1] + 1} {face[2] + 1}\n")

clock = pygame.time.Clock()
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_r:  # Сохранение на нажатие R
                desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
                filename = os.path.join(desktop_path, "scene.obj")
                vertices = create_terrain(100, 100, 0, 0)
                terrain_faces = []
                for i in range(100 - 1):
                    for j in range(100 - 1):
                        terrain_faces.append([i * 100 + j, (i + 1) * 100 + j, i * 100 + j + 1])
                        terrain_faces.append([(i + 1) * 100 + j, (i + 1) * 100 + j + 1, i * 100 + j + 1])
                room_vertices = [
    [-50, -5, -50],
    [50, -5, -50],
    [50, -5, 50],
    [-50, -5, 50],
    [-50, 50, -50],
    [50, 50, -50],
    [50, 50, 50],
    [-50, 50, 50]
               ]
                room_faces = [
    [4, 5, 6],  # потолок
    [4, 6, 7],
    [0, 1, 5],  # стена 1
    [0, 5, 4],
    [1, 2, 6],  # стена 2
    [1, 6, 5],
    [2, 3, 7],  # стена 3
    [2, 7, 6],
    [3, 0, 4],  # стена 4
    [3, 4, 7]
                ]
                all_vertices = vertices + room_vertices
                all_faces = terrain_faces + [[x + len(vertices) for x in face] for face in room_faces]
                save_to_obj(all_vertices, all_faces, filename)
                print(f"Model saved as {filename}")

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glLoadIdentity()
    gluPerspective(45, (display[0] / display[1]), 0.1, 1000.0)
    glTranslatef(0.0, 0.0, -30)
    glRotatef(45, 1, 0, 0)  # Повернуть камеру на 45 градусов вокруг оси X

    # Отрисовка террейна
    vertices = create_terrain(100, 100, 0, 0)
    draw_terrain(vertices, 100, 100)

    # Отрисовка комнаты
    draw_room(100, 50, 100)

    pygame.display.flip()
    clock.tick(60)

Последний раз редактировалось MakarovDs; 26.11.2024 в 16:30.
MakarovDs вне форума Ответить с цитированием
Старый 27.11.2024, 18:57   #215
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 316
По умолчанию

Странный куб
Код:
import numpy as np
import trimesh
import matplotlib.pyplot as plt
import os

def create_hole(position, size):
    """Создает куб в форме отверстия"""
    hole = trimesh.creation.box(extents=size)
    hole.apply_translation(position)
    return hole

def generate_cube_with_holes():
    # Создание куба
    cube = trimesh.creation.box(extents=(2, 2, 2))
    
    # Размеры отверстия
    hole_size = [1.0, 1.0, 0.2]  # 1.0x1.0 для каждой грани и 0.2 глубина

    # Определяем позиции для отверстий
    hole_positions = [
        [0, 0, -1 + hole_size[2]/2],  # нижняя грань
        [0, 0, 1 - hole_size[2]/2],   # верхняя грань
        [-1 + hole_size[0]/2, 0, 0],  # левая грань
        [1 - hole_size[0]/2, 0, 0],   # правая грань
        [0, -1 + hole_size[1]/2, 0],  # задняя грань
        [0, 1 - hole_size[1]/2, 0]    # передняя грань
    ]
    
    # Создание и вычитание отверстий
    for pos in hole_positions:
        hole = create_hole(pos, hole_size)
        cube = cube.difference(hole)

    return cube

# Генерация куба с отверстиями
mesh = generate_cube_with_holes()

# Сохранение куба в OBJ файл
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
filename = os.path.join(desktop_path, "cube_with_holes.obj")
mesh.export(filename)
print(f"Model saved as {filename}")

# Визуализация
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(mesh.vertices[:, 0], mesh.vertices[:, 1], mesh.vertices[:, 2], color='r', alpha=0.5)
plt.show()
MakarovDs вне форума Ответить с цитированием
Старый 27.11.2024, 19:01   #216
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 316
По умолчанию

Странный куб 2
Код:
import numpy as np
import trimesh
import matplotlib.pyplot as plt
import os

def create_hole(position, size):
    """Создаёт куб в форме отверстия."""
    hole = trimesh.creation.box(extents=size)
    hole.apply_translation(position)
    return hole

def generate_cube_with_connected_holes():
    # Создание основного куба
    cube = trimesh.creation.box(extents=(2, 2, 2))

    # Размеры отверстий
    hole_size = [1.0, 1.0, 0.2]  # Отверстие 1.0x1.0 и глубина 0.2
    channel_size = [0.2, 0.2, 2.0]  # Канал, который соединяет отверстия

    # Определяем позиции для отверстий
    hole_positions = [
        [0, 0, -1 + hole_size[2] / 2],  # нижняя грань
        [0, 0, 1 - hole_size[2] / 2],   # верхняя грань
        [-1 + hole_size[0] / 2, 0, 0],  # левая грань
        [1 - hole_size[0] / 2, 0, 0],   # правая грань
        [0, -1 + hole_size[1] / 2, 0],  # задняя грань
        [0, 1 - hole_size[1] / 2, 0]    # передняя грань
    ]

    # Вычитание отверстий из куба
    for pos in hole_positions:
        hole = create_hole(pos, hole_size)
        cube = cube.difference(hole)

    # Определяем позиции для каналов, чтобы соединить отверстия
    channel_positions = [
        [0, 0, -0.1],  # канал между верхним и нижним отверстиями
        [0, 0, 0],     # центральный канал
        [-1 + hole_size[0] / 2, 0, 0],  # канал соединения через левую грань
        [1 - hole_size[0] / 2, 0, 0],   # канал соединения через правую грань
        [0, -1 + hole_size[1] / 2, 0],  # канал соединения через заднюю грань
        [0, 1 - hole_size[1] / 2, 0]    # канал соединения через переднюю грань
    ]

    # Создание каналов
    for pos in channel_positions:
        channel = create_hole(pos, channel_size)
        cube = cube.difference(channel)

    return cube

# Генерация куба с соединёнными отверстиями
mesh = generate_cube_with_connected_holes()

# Сохранение куба в OBJ файл
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
filename = os.path.join(desktop_path, "cube_with_connected_holes.obj")
mesh.export(filename)
print(f"Model saved as {filename}")

# Визуализация
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(mesh.vertices[:, 0], mesh.vertices[:, 1], mesh.vertices[:, 2], color='r', alpha=0.5)
ax.set_title("Cube with Connected Holes")
plt.show()
MakarovDs вне форума Ответить с цитированием
Старый 27.11.2024, 21:00   #217
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 316
По умолчанию

Куб с четырьмя столбами
Код:
import numpy as np
import trimesh
import matplotlib.pyplot as plt
import os

def create_hole(position, size):
    """Создает куб в форме отверстия"""
    hole = trimesh.creation.box(extents=size)
    hole.apply_translation(position)
    return hole

def generate_cube_with_holes():
    # Создание куба
    cube = trimesh.creation.box(extents=(2, 2, 2))

    # Размеры отверстия
    hole_size_z = [1.0, 1.0, 2.0]  # Столбы вдоль оси Z
    hole_size_x = [2.0, 1.0, 1.0]  # Столбы вдоль оси X

    # Определяем позиции для столбов по Z
    hole_positions_z = [
        [0, 0, -1 + hole_size_z[2]/2],  # столб вниз
        [0, 0, 1 - hole_size_z[2]/2],   # столб вверх
    ]

    # Определяем позиции для столбов по X
    hole_positions_x = [
        [-1 + hole_size_x[0]/2, 0, 0],  # столб слева
        [1 - hole_size_x[0]/2, 0, 0],   # столб справа
    ]

    # Создание и вычитание столбов по оси Z
    for pos in hole_positions_z:
        hole = create_hole(pos, hole_size_z)
        cube = cube.difference(hole)

    # Создание и вычитание столбов по оси X
    for pos in hole_positions_x:
        hole = create_hole(pos, hole_size_x)
        cube = cube.difference(hole)

    return cube

# Генерация куба с отверстиями
mesh = generate_cube_with_holes()

# Сохранение куба в OBJ файл
desktop_path = os.path.expanduser("~")
filename = os.path.join(desktop_path, "Desktop", "cube_with_holes.obj")
mesh.export(filename)
print(f"Model saved as {filename}")

# Визуализация
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(mesh.vertices[:, 0], mesh.vertices[:, 1], mesh.vertices[:, 2], color='r', alpha=0.5)
plt.show()
MakarovDs вне форума Ответить с цитированием
Старый 27.11.2024, 21:05   #218
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 316
По умолчанию

ВО!!! Теперь это со всеми сторонами дырок:
Код:
import numpy as np
import trimesh
import matplotlib.pyplot as plt
import os

def create_hole(position, size):
    """Создает куб в форме отверстия"""
    hole = trimesh.creation.box(extents=size)
    hole.apply_translation(position)
    return hole

def generate_cube_with_holes():
    # Создание куба
    cube = trimesh.creation.box(extents=(2, 2, 2))

    # Размеры отверстия для столбов
    hole_size = [1.0, 1.0, 2.0]  # Столбы вдоль оси Z
    hole_size_x = [2.0, 1.0, 1.0]  # Столбы вдоль оси X
    hole_size_y = [1.0, 2.0, 1.0]  # Столбы вдоль оси Y

    # Определяем позиции для столбов по оси Z
    hole_positions_z = [
        [0, 0, -1],  # столб вниз
        [0, 0, 1],   # столб вверх
        [0, 0, 0],   # центральный столб вдоль Z
        [0, 0, 0],    # центральный по Z (заменить для правильного вертикального вычитания)
    ]

    # Определяем позиции для столбов по оси X
    hole_positions_x = [
        [-1, 0, 0],  # столб слева
        [1, 0, 0],   # столб справа
        [0, 0, 0],   # центральный столб вдоль X
        [0, 0, 0],    # замена для центрального вычитания
    ]

    # Определяем позиции для столбов по оси Y
    hole_positions_y = [
        [0, -1, 0],  # столб сзади
        [0, 1, 0],   # столб спереди
        [0, 0, 0],   # центральный столб вдоль Y
        [0, 0, 0],    # замена для центрального вычитания
    ]

    # Создание и вычитание столбов по оси Z
    for pos in hole_positions_z:
        hole = create_hole(pos, hole_size)
        cube = cube.difference(hole)

    # Создание и вычитание столбов по оси X
    for pos in hole_positions_x:
        hole = create_hole(pos, hole_size_x)
        cube = cube.difference(hole)

    # Создание и вычитание столбов по оси Y
    for pos in hole_positions_y:
        hole = create_hole(pos, hole_size_y)
        cube = cube.difference(hole)

    return cube

# Генерация куба с отверстиями
mesh = generate_cube_with_holes()

# Сохранение куба в OBJ файл
desktop_path = os.path.expanduser("~")
filename = os.path.join(desktop_path, "Desktop", "cube_with_holes.obj")
mesh.export(filename)
print(f"Model saved as {filename}")

# Визуализация
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(mesh.vertices[:, 0], mesh.vertices[:, 1], mesh.vertices[:, 2], color='r', alpha=0.5)
plt.show()
MakarovDs вне форума Ответить с цитированием
Старый 27.11.2024, 21:17   #219
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 316
По умолчанию

Гиперкуб с острыми гранями прелюдия
Код:
import numpy as np
import trimesh
import matplotlib.pyplot as plt
import os

def create_hole(position, size):
    """Создает куб в форме отверстия"""
    hole = trimesh.creation.box(extents=size)
    hole.apply_translation(position)
    return hole

def generate_cube_with_holes():
    # Создание куба
    cube = trimesh.creation.box(extents=(2, 2, 2))

    # Размеры отверстия для столбов
    hole_size = [1.0, 1.0, 2.0]  # Столбы вдоль оси Z
    hole_size_x = [2.0, 1.0, 1.0]  # Столбы вдоль оси X
    hole_size_y = [1.0, 2.0, 1.0]  # Столбы вдоль оси Y

    # Определяем позиции для столбов по оси Z
    hole_positions_z = [
        [0, 0, -1],  # столб вниз
        [0, 0, 1],   # столб вверх
        [0, 0, 0],   # центральный столб вдоль Z
    ]

    # Определяем позиции для столбов по оси X
    hole_positions_x = [
        [-1, 0, 0],  # столб слева
        [1, 0, 0],   # столб справа
        [0, 0, 0],   # центральный столб вдоль X
    ]

    # Определяем позиции для столбов по оси Y
    hole_positions_y = [
        [0, -1, 0],  # столб сзади
        [0, 1, 0],   # столб спереди
        [0, 0, 0],   # центральный столб вдоль Y
    ]

    # Создание и вычитание столбов по оси Z
    for pos in hole_positions_z:
        hole = create_hole(pos, hole_size)
        cube = cube.difference(hole)

    # Создание и вычитание столбов по оси X
    for pos in hole_positions_x:
        hole = create_hole(pos, hole_size_x)
        cube = cube.difference(hole)

    # Создание и вычитание столбов по оси Y
    for pos in hole_positions_y:
        hole = create_hole(pos, hole_size_y)
        cube = cube.difference(hole)

    # Удаление угловых вершин
    corner_vertices = np.array([
        [-1, -1, -1],
        [-1, -1,  1],
        [-1,  1, -1],
        [-1,  1,  1],
        [ 1, -1, -1],
        [ 1, -1,  1],
        [ 1,  1, -1],
        [ 1,  1,  1],
    ])

    # Находим индексы угловых вершин в массиве вершин куба
    keep_indices = []
    for index, vertex in enumerate(cube.vertices):
        if not any(np.all(vertex == corner) for corner in corner_vertices):
            keep_indices.append(index)

    # Создаем новый массив вершин без угловых вершин
    new_vertices = cube.vertices[keep_indices]

    # Создаем новый массив граней, связывая старые индексы с новыми
    old_to_new_index = {old_index: new_index for new_index, old_index in enumerate(keep_indices)}
    new_faces = []
    for face in cube.faces:
        if all(vertex in old_to_new_index for vertex in face):
            new_face = [old_to_new_index[vertex] for vertex in face]
            new_faces.append(new_face)

    # Создаем новый объект Trimesh
    new_mesh = trimesh.Trimesh(vertices=new_vertices, faces=new_faces)

    return new_mesh

# Генерация куба с отверстиями и без угловых вершин
mesh = generate_cube_with_holes()

# Сохранение куба в OBJ файл
desktop_path = os.path.expanduser("~")
filename = os.path.join(desktop_path, "Desktop", "cube_with_holes_no_corners.obj")
mesh.export(filename)
print(f"Model saved as {filename}")

# Визуализация
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(mesh.vertices[:, 0], mesh.vertices[:, 1], mesh.vertices[:, 2], color='r', alpha=0.5)
plt.show()
MakarovDs вне форума Ответить с цитированием
Старый 27.11.2024, 21:36   #220
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 316
По умолчанию

Гиперкуб с острыми гранями
Код:
import numpy as np
import trimesh
import matplotlib.pyplot as plt
import os

def create_hole(position, size):
    """Создает куб в форме отверстия"""
    hole = trimesh.creation.box(extents=size)
    hole.apply_translation(position)
    return hole

def generate_cube_with_holes():
    # Создание куба
    cube = trimesh.creation.box(extents=(2, 2, 2))

    # Размеры отверстия для столбов
    hole_size = [1.0, 1.0, 2.0]  # Размеры столба вдоль оси Z
    hole_size_x = [2.0, 1.0, 1.0]  # Размеры столба вдоль оси X
    hole_size_y = [1.0, 2.0, 1.0]  # Размеры столба вдоль оси Y

    # Определяем позиции для столбов по оси Z
    hole_positions_z = [
        [0, 0, -1],  # столб вниз
        [0, 0, 1],   # столб вверх
        [0, 0, 0],   # центральный столб вдоль Z
    ]

    # Определяем позиции для столбов по оси X
    hole_positions_x = [
        [-1, 0, 0],  # столб слева
        [1, 0, 0],   # столб справа
        [0, 0, 0],   # центральный столб вдоль X
    ]

    # Определяем позиции для столбов по оси Y
    hole_positions_y = [
        [0, -1, 0],  # столб сзади
        [0, 1, 0],   # столб спереди
        [0, 0, 0],   # центральный столб вдоль Y
    ]

    # Создание и вычитание столбов по оси Z
    for pos in hole_positions_z:
        hole = create_hole(pos, hole_size)
        cube = cube.difference(hole)

    # Создание и вычитание столбов по оси X
    for pos in hole_positions_x:
        hole = create_hole(pos, hole_size_x)
        cube = cube.difference(hole)

    # Создание и вычитание столбов по оси Y
    for pos in hole_positions_y:
        hole = create_hole(pos, hole_size_y)
        cube = cube.difference(hole)

    # Удаление угловых вершин
    corner_vertices = np.array([
        [-1, -1, -1],
        [-1, -1,  1],
        [-1,  1, -1],
        [-1,  1,  1],
        [ 1, -1, -1],
        [ 1, -1,  1],
        [ 1,  1, -1],
        [ 1,  1,  1],
    ])

    # Находим индексы угловых вершин в массиве вершин куба
    keep_indices = []
    for index, vertex in enumerate(cube.vertices):
        if not any(np.all(vertex == corner) for corner in corner_vertices):
            keep_indices.append(index)

    # Создаем новый массив вершин без угловых вершин
    new_vertices = cube.vertices[keep_indices]

    # Создаем новый массив граней, связывая старые индексы с новыми
    old_to_new_index = {old_index: new_index for new_index, old_index in enumerate(keep_indices)}
    new_faces = []
    for face in cube.faces:
        if all(vertex in old_to_new_index for vertex in face):
            new_face = [old_to_new_index[vertex] for vertex in face]
            new_faces.append(new_face)

    # Создаем новый объект Trimesh
    new_mesh = trimesh.Trimesh(vertices=new_vertices, faces=new_faces)

    return new_mesh

def array_mesh(mesh, count, spacing):
    """Создает массив от данного меша в трех направлениях (x, y, z)"""
    instances = []
     
    for x in range(-count, count + 1):
        for y in range(-count, count + 1):
            for z in range(-count, count + 1):
                # Создаем смещение для копии
                translation = np.array([x * spacing, y * spacing, z * spacing])
                instance = mesh.copy()
                # Применяем смещение
                instance.apply_translation(translation)
                instances.append(instance)

    # Союз всех экземпляров в один Trimesh
    combined_mesh = trimesh.util.concatenate(instances)
    return combined_mesh

# Генерация куба с отверстиями и без угловых вершин
mesh = generate_cube_with_holes()

# Создание массива из куба
count = 5  # Количество копий в каждую сторону
spacing = 2  # Расстояние между экземплярами (чтобы не пересекались)
arrayed_mesh = array_mesh(mesh, count, spacing)

# Сохранение объекта в OBJ файл
desktop_path = os.path.expanduser("~")
filename = os.path.join(desktop_path, "Desktop", "arrayed_cubes.obj")
arrayed_mesh.export(filename)
print(f"Model saved as {filename}")

# Визуализация
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(arrayed_mesh.vertices[:, 0], arrayed_mesh.vertices[:, 1], arrayed_mesh.vertices[:, 2], color='r', alpha=0.5)
plt.show()
MakarovDs вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите с генератором слов Мой повелитель Общие вопросы C/C++ 6 27.02.2016 23:46
Зарубежные микроконтроллеры с встроенным ШИМ-генератором MyLastHit Компьютерное железо 6 22.10.2013 14:33
написание генератора фракталов Жюлиа kyzmich2370 Visual C++ 1 06.11.2012 09:57
Помогите с генератором чисел на Pascal vadmaruschak Помощь студентам 6 13.09.2009 17:06
Игры фракталов на VB Kail Свободное общение 1 29.05.2009 09:30