Функция rect.clip в Pygame в 3D - PullRequest
1 голос
/ 10 мая 2019

Explain (Представьте, что картинка в 3D)

Я создал объект Cuboid, который хранит все координаты углов в кубоиде, точно так же, как прямоугольный объект Pygame,Мне нужен перекрывающийся объем двух вышеупомянутых кубоидов, чтобы затем сделать из него новый кубоидный объект (серый прямоугольник на рисунке, опять же, представьте, что он в 3D).

Существует ли для этого общая алгебраическая формула или мне нужно создать метод для каждого конкретного случая?

Я использую систему координат Пиглетс, то есть, рост вверх положителен yдвижение вправо положительно х, а движение вперед положительно z.

Кубоид Класс:

def __init__(self, pos, width, height, depth):
    self.pos = pos

    self.width = width
    self.height = height
    self.depth = depth

    self.Update()

def Update(self):
    self.size = (self.width, self.height, self.depth)

    self.topleft_front = (self.pos[0], self.pos[1] + self.height, -self.pos[2])
    self.topright_front = (self.pos[0] + self.width, self.pos[1] + self.height, -self.pos[2])
    self.bottomleft_front = (self.pos[0], self.pos[1], -self.pos[2])
    self.bottomright_front = (self.pos[0] + self.width, self.pos[1], -self.pos[2])

    self.topleft_back = (self.pos[0], self.pos[1] + self.height, -self.pos[2] - self.depth)
    self.topright_back = (self.pos[0] + self.width, self.pos[1] + self.height, -self.pos[2] - self.depth)
    self.bottomleft_back = (self.pos[0], self.pos[1], -self.pos[2] - self.depth)
    self.bottomright_back = (self.pos[0] + self.width, self.pos[1], -self.pos[2] - self.depth)

    self.center = (self.pos[0] + self.width / 2, self.pos[1] + self.height / 2, -self.pos[2] - self.depth / 2)

def collidecube(self, cube):
    if (self.pos[0] < cube.pos[0] + cube.width) and (
    self.pos[0] + self.width > cube.pos[0]) and (
    self.pos[1] < cube.pos[1] + cube.height) and (
    self.pos[1] + self.height > cube.pos[1]) and (
    self.pos[2] < cube.pos[2] + cube.depth) and (
    self.pos[2] + self.depth > cube.pos[2]):
        return True

    else:
        return False

def Clip(self, cube):
    if self.collidecube(cube):
        pass

1 Ответ

1 голос
/ 10 мая 2019

Эту проблему можно уменьшить, чтобы найти перекрывающийся диапазон двух диапазонов.

например. диапазон [a0, a1] ^ [b0, b1] = [c0, c1]

a0                  a1
  x----------------x
            x-----------------x
          b0                   b1

            x======x
          c0        c1

Если a0 меньше a1 и b0 меньше b1, тогда

c0 = max(a0, b0)
c1 = min(a1, b1) 

если c1 меньше c0, то диапазоны не пересекаются. Этот алгоритм может быть применен ко всем 3 измерениям.

Если достаточно проверить, пересекаются ли диапазоны, то условие:

isect = a0 < b1 and b0 < a1  

Обратите внимание: если b0 больше a1 или b1 меньше a0, перекрывающийся диапазон отсутствует.

...