【发布时间】:2018-08-01 14:53:25
【问题描述】:
我有三个基本的绘制曲面的函数,第一个是绘制曲面;
def deflected_3d_surface(self, array):
glBegin(GL_QUADS)
for d in range(int(array.shape[0] / 2 - 1)):
glColor4f(1, 1, 1, 1)
glVertex3fv(array[2 * d + 2, :])
glVertex3fv(array[2 * d, :])
glVertex3fv(array[2 * d + 1, :])
glVertex3fv(array[2 * d + 3, :])
glEnd()
第二个绘制该表面的外边缘;
def deflected_3d_edges(self, array2):
glBegin(GL_LINES)
for i in range(array2.shape[0] - 1):
glColor3fv((0, 0, 0))
glVertex3fv(array2[i, :])
glVertex3fv(array2[i + 1, :])
glEnd()
第三个是在那个表面上画线; (注意线顶点和面顶点不一样)
def deflected_3d_inner_edges(self, x_array, y_array, z_array):
glBegin(GL_LINES)
for i in range(x_array.shape[0]):
glColor3fv((0, 0, 0))
glVertex3fv([x_array[i, 0], y_array[i, 0], z_array[i, 0]])
glVertex3fv([x_array[i, 1], y_array[i, 1], z_array[i, 1]])
if x_array.shape[1] != 2:
glVertex3fv([x_array[i, 1], y_array[i, 1], z_array[i, 1]])
glVertex3fv([x_array[i, 2], y_array[i, 2], z_array[i, 2]])
glEnd()
当我按以下顺序调用这些函数时;
`glWidget.deflected_3d_edges(self, self.tf1_edges_array)
glWidget.deflected_3d_edges(self, self.tf2_edges_array)
glWidget.deflected_3d_edges(self, self.bf1_edges_array)
glWidget.deflected_3d_edges(self, self.bf2_edges_array)
glWidget.deflected_3d_inner_edges(self, self.xbcr_, self.ybcr_,
self.zbcr_)
glWidget.deflected_3d_inner_edges(self, self.xwcr_, self.ywcr_,
self.zwcr_)
glWidget.deflected_3d_inner_edges(self, self.xtcr_, self.ytcr_,
self.ztcr_)`
有什么办法可以修复出现在白色表面上的黑线吗?
【问题讨论】:
-
似乎是一个“z-fight”案例。尝试对这些线坐标进行微小的增量,以便它们更接近(或更远)到相机。或者在渲染它们之前更改深度比较函数,
-
解决了,但是当我旋转场景时,我现在看不到另一边的线条。
-
设置Depth offset。在绘制整个几何图形之前执行
glEnable( GL_POLYGON_OFFSET_FILL );glPolygonOffset( 1.0, 1.0 );。当然,您可以为GL_POLYGON_OFFSET_LINEistead 设置负深度偏移。 -
这有帮助,但在某些表面上仍然存在 z-fight。
-
@Atlanta 的默认深度函数是
GL_LESS,改用glDepthFunc(GL_LEQUAL)。