OpenGL和pyglet基础

pyglet微型教程。

我一直在学习使用pyglet编程图形,pyglet是opengl的python绑定。 我注意到,没有任何真正伟大或清晰的教程可以真正解释问题。 大多数教程在添加代码时都没有解释每一行代码负责做什么。 最后一点在缝隙学中特别成问题,因为设置和选项太多了。 还要注意的是,许多设置实际上并不会做很多事情,而只能与其他设置一起使用。

在本教程中,我们将介绍一些基础知识以帮助您入门和一些小怪癖。 最终,我们将在以后的教程中渲染3D对象和结构。 在本教程结束时,我们将制作一个类似于飞机螺旋桨的动画!

在pyglet中进行其他操作之前,我们需要创建一个窗口。 窗口实际上是一个出现在屏幕上的空框:

在下一节中,我们将使用此窗口并覆盖事件方法。 这些事件是在此窗口中发生某件事时触发的功能。 我们将覆盖我们创建的窗口对象上的on_draw函数。 加载窗口时,会在开始时触发一次此事件。 有一些方法可以更新和重绘窗口中的内容,但我们将在后面的文章中介绍。 我们使用装饰器@win.event覆盖此功能,该装饰器内置于我们创建的窗口对象中。 让我们重写该函数,看看会发生什么……

信不信由你,这条线是3D结构! 但是有一些警告。 如果将数字置于z的[-1,1]范围之外,则该顶点将不会出现。 另一个警告是,此z值并不总是在[-1,1]中,但现在是(我知道这有点愚蠢)。 这条线很无聊。 让我们通过将其制作成动画来说明问题; 我们将使线旋转。

它应该输出像转轮一样的动画,如下所示:

让我们稍微解释一下代码。 PointsInCircum方法(我是从堆栈溢出中PointsInCircum )获取以0为中心的圆中的所有点。我们将使用它来生成与直线的圆心相连的点。 我们得到其中的20点并将其转换为numpy数组。 现在,此numpy数组的形状为20×2,其中2个元素按此顺序分别是yx 。 好的,我们如何使窗口连续重绘? 我们使用了pyglet.clock.schedule(update_frame, 1/10)函数调用。 它每1/10秒调用一次update_frame函数,然后也调用on_draw事件(这是在on_draw完成的)。 我们将使用调度程序来递增并抓住圆中的下一个点,并将其存储在名为frame的变量中,然后告诉on_draw绘制当前由frame引用的任何点。 这是update_frame ,因为update_frameon_draw都可以看到frame变量。 每次调用on_draw方法时, glClear(GL_COLOR_BUFFER_BIT)清除“颜色缓冲区”。 那是什么? 这个数组存储您在屏幕上看到的所有彩色像素。 glClear表示清空一个东西,而GL_COLOR_BUFFER_BIT告诉opengl清空哪个东西。 该位实际上是数据结构的索引,该数据结构存储屏幕上所有颜色的列表。

我做了一个双换环,并把这个轮子贴在屏幕上,结果很酷。 刚开始时质量有点差,但在后期将有所提高:

您还可以通过在PointsInCircum:增加n=100来使旋转更加平滑PointsInCircum:

这个动画是非常基本的,如果要真正做到这一点,您可能会使用界面更友好的东西,例如精灵。 以下是一些有关如何制作真实动画的示例。 如果您有兴趣学习有关opengl的知识,则应该查看我的其他文章,其中我将对基础知识进行系列教程。

本微型教程就是这样! 在下一个中,我们将制作3D对象,这样应该会更加有趣。 敬请关注! 如果您喜欢机器学习,游戏和图形,则应订阅我的时事通讯: Generation Machine ! 也可以在Twitter上关注我。 我总是在那里提问,所以请问他们!