我正在使用OpenGL在python中创建一个分形引擎。我实质上是创建一个表示分形的字符串,然后遍历该字符串并将其解析为一系列的点,在这些点之间绘制线。由于分形的性质,在绘制分形并获得最小和最大X和Y值之后,我才知道分形所占的大小。但是,这样做会增加运行时间。我试图重构代码以完成此步骤,但是在尝试使用glOrtho方法刷新窗口并为分形缩放时遇到障碍。代码本质上是这样的:
def setup():
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glLoadIdentity()
Declared current state variables, curr_x, curr_y, etc
for i in range(len(current_state)): #current_state is the fractal string
term = current_state[i]
old_x = curr_x
old_y = curr_y
if term == 'f' or term == '!':
curr_x, curr_y = f_const(curr_x, curr_y, curr_angle, curr_gen)
drawLine([old_x, old_y, curr_x, curr_y])
if term == '+':
curr_angle = turn_right(curr_angle)
if term == '-':
curr_angle = turn_left(curr_angle)
etc...
if curr_x > x_max:
x_max = curr_x
if curr_x < x_min:
x_min = curr_x
if curr_y > y_max:
y_max = curr_y
if curr_y < y_min:
y_min = curr_y
refresh2d()
glutSwapBuffers()
def refresh2d():
global x_min, x_max, y_min, y_max
glViewport(0, 0, WIDTH, HEIGHT)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho(x_min, x_max, y_min, y_max, 0.0, 1.0)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
def drawLine(points):
glBegin(GL_LINES)
glVertex2f(points[0], points[1])
glVertex2f(points[2], points[3])
glEnd()
实际上,它无法正确绘制。如果将refresh2d()调用移至for循环上方,并硬编码最小值和最大值,则可以使用,但是当调用位于底部时,它直到我以某种方式更改窗口(例如将其最大化)时才调整大小。如果我要问的是可能的,并且任何人有任何建议,那将很棒。
答案 0 :(得分:1)
如果我要问的话是可能的
不,不是。至少不在这个水平上。 OpenGL只是一个渲染API。它不管理场景或对象。它被设计为状态机,您可以在其中设置/更改某些状态变量的操作以及受之前设置的状态影响的绘制调用。>
glOrtho
所做的全部工作就是修改矩阵。通过将其应用于所有顶点位置,可以在绘制调用期间使用该矩阵-但是更改矩阵不会以任何方式修改帧缓冲区中的内容。它只会影响随后的绘制调用。
但是,您不必完全重新分析分形。您也可以只将实际的顶点数据存储在Vertex Buffer Object (VBO)中,然后使用不同的矩阵简单地重绘。
请注意,您使用的GL已经有十多年的历史了,它们已经完全过期和不推荐使用。现代核心配置文件GL中没有内置矩阵堆栈,也没有固定功能的流水线。您将必须编写自己的着色器,并为变换添加自己的参数(并获得所有这些步骤的完全自由)。因此,如果您真的想在2019年编写新的GL代码,我只能建议您学习(已经有十年的历史了)使用核心配置文件的“现代”方式...