![](/img/trans.png)
[英]Mapping a texture onto a quad with OpenGL 4, Python, and vertex shaders
[英]Order of vertex for drawing quad
我需要在 3D 空間中繪制 n 個平面。 四邊形是從兩點創建的平面,使用算法我得到 4 個頂點來繪制四邊形。 我遇到的問題是頂點的順序顯然會影響結果。 這就是我的意思: 但是當平面是水平而不是垂直時:
我可以想象兩種可能的解決方案。 使用三角形並將它們組合或正確排序頂點。 我不知道如何做第二個想法。 我嘗試過使用三角形,但我遇到了同樣的問題。
# 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
首先,請注意您的交集可能會導致多於或少於四個頂點。 但由於該區域始終是凸面的,您可以簡單地用三角扇來繪制它。
要對頂點進行排序,您需要平面的法線n
和所有頂點v_i
的質心c
:
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))
按這個角度排序,你就完成了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.