OpenGL with PyOpenGL Python and PyGame p.2 - Coloring Surfaces

时间:2021-04-13 18:15:09

OpenGL with PyOpenGL Python and PyGame p.2 - Coloring Surfaces

Coloring Surfaces as well as understand some of the basic OpenGL code




In this PyOpenGL tutorial series for OpenGL with Python 3, we're going to discuss how you can color things, specifically surfaces. The way we color surfaces in OpenGL is by first notifying OpenGL that is what we're going to do. After that, we inform OpenGL where this "surface" to be colored is. In our case, each surface is between the connection of four vertices. Other than that, and one new OpenGL function, you're done!

So, first we need some colors to choose from. OpenGL wants you to specify colors in an RGB format, but OpenGL expects it to be between 0 and 1, where 1 is the "strongest."

For example, a nice solid green would be: (0,1,0), which translates to 0 red, 1 green, 0 blue, or no red, full green, no blue.

Now let's go ahead and define a tuple of color tuples:

colors = (
    (1,0,0),
    (0,1,0),
    (0,0,1),
    (0,1,0),
    (1,1,1),
    (0,1,1),
    (1,0,0),
    (0,1,0),
    (0,0,1),
    (1,0,0),
    (1,1,1),
    (0,1,1),
    )

We wont use all of these yet, and we'll modify these colors likely later.

Next, we need to add the new coloring code into our Cube() function.

The current Cube() function looks like:

def Cube():
    glBegin(GL_LINES)
    for edge in edges:
        for vertex in edge:
            glVertex3fv(verticies[vertex])
    glEnd()

Now, we want to add the following to this function:

    glBegin(GL_QUADS)
    for surface in surfaces:
        x = 0
        for vertex in surface:
            x+=1
            glColor3fv(colors[x])
            glVertex3fv(verticies[vertex])
    glEnd()

So here you see the typical glBegin, only this time we have (GL_QUADS) as the constant. Then, for each surface (a collection of vertices) in the surfaces tuple, then for each vertex in that list of four vertices, we want to us glColor3fv, which is what will color the object we're creating here, then we use glVertex3fv, just like we had before!

The only other thing here is a crude counter, which adds 1 to the x value, which allows us to create a bit of a multi-colored cube.

Now our Cube() function looks like this:

def Cube():
    glBegin(GL_QUADS)
    for surface in surfaces:
        x = 0
        for vertex in surface:
            x+=1
            glColor3fv(colors[x])
            glVertex3fv(verticies[vertex])
    glEnd()

    glBegin(GL_LINES)
    for edge in edges:
        for vertex in edge:
            glVertex3fv(verticies[vertex])
    glEnd()

Awesome, that's it. Now you have:

OpenGL with PyOpenGL Python and PyGame p.2 - Coloring Surfaces

#!/usr/bin/python
# -*- coding:utf-8 -*-  
import pygame
from pygame.locals import *


from OpenGL.GL import *
from OpenGL.GLU import *


verticies = (
    (1, -1, -1),
    (1, 1, -1),
    (-1, 1, -1),
    (-1, -1, -1),
    (1, -1, 1),
    (1, 1, 1),
    (-1, -1, 1),
    (-1, 1, 1)
    )


edges = (
    (0,1),
    (0,3),
    (0,4),
    (2,1),
    (2,3),
    (2,7),
    (6,3),
    (6,4),
    (6,7),
    (5,1),
    (5,4),
    (5,7)
    )
surfaces = (
    
    (0,1,5,4),  #创建平面时平面的顺序不一定要相临,但是每个面的顶点一定要按顺时针或者逆时针写
    (5,4,6,7),
    (6,7,2,3),
    (2,7,5,1),
    (0,1,2,3),
    (0,3,6,4)
)
colors = (
    (1,0,0),
    (0,1,0),
    (0,0,1),
    (1,1,0),
    (1,0,1),
    (1,1,1),
    (1,0,0),
    (0,1,0),
    (0,0,1),
    (1,0,0),
    (1,1,1),
    (0,1,1),
    )


def Cube():
    glBegin(GL_QUADS)
    x = 0
    for surface in surfaces:
        x+=1
        for vertex in surface:
            
            glColor3fv(colors[x])
            glVertex3fv(verticies[vertex])
    glEnd()
    glBegin(GL_LINES)
    for edge in edges:
        for vertex in edge:
            glVertex3fv(verticies[vertex])
    glEnd()




def main():
    pygame.init()                              #pygame的一些初始化不用管
    display = (800,600)
    pygame.display.set_mode(display, DOUBLEBUF|OPENGL)


    gluPerspective(45,(display[0]/display[1]), 0.5, 50.0)
    #参数1是我们看显示物体的远近
    #参数2是物体显示的长宽比,和窗口长宽比相同就行
    #参数3和4是z轴近和远的裁剪面的距离,但是还是不太明白要这干啥
    glTranslatef(0.0,0.0, -5) #Z轴就是我们眼睛到屏幕方向的轴,负是远,正是近,其实就是让物体相对与屏幕在XYZ各方向移动几个距离


    glRotatef(360, 1, 1, 1)   #360是让他转360度,它最终回到原来初始位置


    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:   #退出事件响应
                pygame.quit()
                quit()


        #glRotatef(0.05, 1, 1, 1)  
        #参数1是每次旋转的度数是多少, 
        #参数2是x, y and z的一个坐标,表示从(0,0,0)点到(x,y,z)这条线为轴进行旋转
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) #用来删除就得画面,清空画布
        Cube()                                           #创建模型
        pygame.display.flip()                            #显示画面
        pygame.time.wait(10)                             #10ms刷新一次  




main()