Figure 1: Grid
We created a plane in the previous tutorial. Now we will inherit that class to create a grid, at a later stage we will add snap to grid functionality.The new grid class will take three parameters: a centre point, a spacing value and a size value. We will set the size value to be the size of the viewport and will set a default spacing between the lines.The new methods for the class are below:
- The gridspacing method shifts the lines by the amount specified in the spacing parameter until the maximum size has been reached.
- The draw method draws lines to make up the grid. On every tenth line it changes the colour to a darker line.
Future tutorials will deal with snap to grid functionality and auto calculating based on the zoom level, but for now we have something to work with.
import math from point import createpoint from plane import createplanesimple class creategrid: display_color = (0.6, 0.6, 0.6) large_grid = 10 small_grid = 2.5 def __init__(self, p1, spacing=1.5, size=65): self.plane = createplanesimple(p1, size * 2) self.p1 = createpoint(p1) self.normal = createpoint((0, 1, 0)) self.size = size self.small_grid = spacing self.large_grid = spacing * 10 def grid_spacing(self): #work out how many times the grid units fit inside our grid size and make it a whole number size = math.ceil(self.size / self.small_grid) * self.small_grid #adjust x by size so we can draw the lines x = self.p1.x - size #loop from start until our lines are greater than our max size while x < (self.p1.x + size): x += self.small_grid yield x def draw(self): self.plane.draw() glColor3f(*self.display_color) glBegin(GL_LINES) for item in self.grid_spacing(): #coordinate modulus large_grid (returns 0 if there is no remaineder), so lets draw a different colour line if (item % self.large_grid) == 0: glColor3f(0.4, 0.4, 0.4) else: glColor3f(*self.display_color) glVertex3f(item, self.p1.y - self.size, self.p1.z) glVertex3f(item, self.p1.y + self.size, self.p1.z) glVertex3f(self.p1.x - self.size, item, self.p1.z) glVertex3f(self.p1.x + self.size, item, self.p1.z) glEnd()