Порядок вершины для рисования четырехугольника - PullRequest
0 голосов
/ 21 сентября 2019

Мне нужно нарисовать n плоскостей в трехмерном пространстве.Квадраты - это плоскости, созданные из двух точек, и с помощью алгоритма я получаю 4 вершины для рисования четырехугольника.У меня проблема в том, что порядок вершин влияет на результат, очевидно.Вот что я имею в виду: Wrong Но когда плоскость горизонтальная, а не вертикальная: right

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

# self.planos = [('A', (500, 500, 10), (-500, 500, 10), (-500, -500, 10), (500, -500, 10))] for horizontal
# self.planos = [('A', (-500, 10, 500), (500, 10, 500), (-500, 10, -500), (500, 10, -500))] for vertical
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
glDepthMask(GL_FALSE)
glBegin(GL_QUADS)
glColor(0.5, 0.5, 0.1, 0.5)
for i in range(len(self.planos)):
    glVertex(self.planos[i][1][0], self.planos[i][1][2], self.planos[i][1][1])
    glVertex(self.planos[i][2][0], self.planos[i][2][2], self.planos[i][2][1])
    glVertex(self.planos[i][3][0], self.planos[i][3][2], self.planos[i][3][1])
    glVertex(self.planos[i][4][0], self.planos[i][4][2], self.planos[i][4][1])
glEnd()
glDepthMask(GL_TRUE)
glDisable(GL_BLEND)

Код пересечения для получения четырех вершин для рисования плоскостей:

In init method:
#Vertices of the cube
self.v = (Point3D(500, 500, 500), Point3D(-500, 500, 500), Point3D(-500, -500, 500),
          Point3D(500, -500, 500), Point3D(500, 500, -500), Point3D(-500, 500, -500),
          Point3D(-500, -500, -500), Point3D(500, -500, -500))
# Edges of the cube
self.a = (Segment3D(self.v[0], self.v[1]), Segment3D(self.v[1], self.v[2]),
          Segment3D(self.v[2], self.v[3]), Segment3D(self.v[3], self.v[0]),
          Segment3D(self.v[0], self.v[4]), Segment3D(self.v[1], self.v[5]),
          Segment3D(self.v[2], self.v[6]), Segment3D(self.v[3], self.v[7]),
          Segment3D(self.v[4], self.v[5]), Segment3D(self.v[5], self.v[6]),
          Segment3D(self.v[6], self.v[7]), Segment3D(self.v[7], self.v[4]))
# Algorithm for getting 4 points
def plano_limites(self, point1, point2, point3):
    plano = Plane(Point3D(point1), Point3D(point2), Point3D(point3))
    good = []
    for i in range(12):
        a = intersection(plano, self.a[i]) # Sympy intersection
        if a:
            good.append(a[0])
    return good

1 Ответ

1 голос
/ 22 сентября 2019

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

Для сортировки ваших вершин вам понадобится нормальная n плоскости и центроид c всех вершин.v_i:

c = 1/(number of vertices) * (v_1 + v_2 + v3 + ...)

Затем нам нужна система координат, ось z которой является нормалью.Для этого мы можем просто определить произвольный вектор направления d и определить x = normalize(cross(d, normal)), y = cross(normal, x).Для случаев, когда d совпадает с normal, нам нужен альтернативный d.

Затем мы можем вычислить репрезентативный угол любой вершины в этой системе координат:

angle_i = atan2(dot(x, v_i - c), dot(y, v_i - c))

Сортировка по этому углу и все готово.

...