Exemplo n.º 1
0
 def draw_landscape_mesh(self):
     _format = GeomVertexFormat.get_v3n3cp()
     self.landscape_vdata = GeomVertexData('terrain', _format,
                                           Geom.UHStatic)
     self.landscape_vdata.setNumRows(self.n_points**2)
     vertex = GeomVertexWriter(self.landscape_vdata, 'vertex')
     normal = GeomVertexWriter(self.landscape_vdata, 'normal')
     color = GeomVertexWriter(self.landscape_vdata, 'color')
     for j in range(self.n_points):
         for i in range(self.n_points):
             # Terrain Vertices
             vertex.addData3f(self.x[j][i], self.y[j][i], self.lz[j][i])
             # Terrain Colors
             if self.lz[j][i] < 2:
                 color.addData4f(0.3, 0.2, 0.1, 1)
             elif self.lz[j][i] < 5:
                 color.addData4f(0.8, 0.8, 0.4, 1)
             elif self.lz[j][i] < 50:
                 color.addData4f(0, 0.5, 0, 1)
             elif self.lz[j][i] < 70:
                 color.addData4f(0, 0.3, 0, 1)
             elif self.lz[j][i] < 80:
                 color.addData4f(0.7, 0.7, 0.7, 1)
             else:
                 color.addData4f(0.8, 1, 1, 1)
             # Terrain Normals
             if self.lz[j][i] != 0:
                 n = np.array([self.x[j][i], self.y[j][i], self.lz[j][i]])
             else:
                 n = np.array([self.x[j][i], self.y[j][i], 1e-12])
             norm = n / np.linalg.norm(n)
             normal.addData3f(norm[0], norm[1], norm[2])
     # Terrain Primitive
     prim = GeomTriangles(Geom.UHStatic)
     for j in range(self.n_points):
         for i in range(self.n_points):
             if j != self.n_points - 1 and i != self.n_points - 1:
                 prim.add_vertices(j * (self.n_points) + i,
                                   j * (self.n_points) + (i + 1),
                                   (j + 1) * (self.n_points) + i)
                 prim.add_vertices(j * (self.n_points) + (i + 1),
                                   (j + 1) * (self.n_points) + (i + 1),
                                   (j + 1) * (self.n_points) + i)
     geom = Geom(self.landscape_vdata)
     prim.closePrimitive()
     geom.addPrimitive(prim)
     node = GeomNode('gnode')
     node.addGeom(geom)
     landscape_nodePath = render.attachNewNode(node)
     landscape_nodePath.setPos(-50, -50, 0)
     landscape_nodePath.setAntialias(AntialiasAttrib.MAuto)
     return landscape_nodePath
Exemplo n.º 2
0
    def draw_water_mesh(self):
        _format = GeomVertexFormat.get_v3n3cp()
        self.water_vdata = GeomVertexData('water', _format, Geom.UHDynamic)
        self.water_vdata.setNumRows((self.n_points // self.details)**2)
        vertex = GeomVertexWriter(self.water_vdata, 'vertex')
        normal = GeomVertexWriter(self.water_vdata, 'normal')
        color = GeomVertexWriter(self.water_vdata, 'color')

        for j in range(0, self.n_points, self.details):
            for i in range(0, self.n_points, self.details):
                if j == self.n_points - self.details:
                    j = self.n_points - 1
                if i == self.n_points - self.details:
                    i = self.n_points - 1
                # Water Vertices
                vertex.addData3f(self.x[j][i], self.y[j][i], self.wz[j][i])
                # Water Color
                color.addData4f(0.3, 0.3, 1, 0.8)
                # water Normals
                n = np.array([self.x[j][i], self.y[j][i], self.wz[j][i]])
                norm = n / np.linalg.norm(n)
                normal.addData3f(norm[0], norm[1], norm[2])
        # Water Primitive
        prim = GeomTriangles(Geom.UHDynamic)
        for j in range(self.n_points // self.details):
            for i in range(self.n_points // self.details):
                if j != (self.n_points // self.details) - 1 and i != (
                        self.n_points // self.details) - 1:
                    prim.add_vertices(
                        j * (self.n_points // self.details) + i,
                        j * (self.n_points // self.details) + (i + 1),
                        (j + 1) * (self.n_points // self.details) + i)
                    prim.add_vertices(
                        j * (self.n_points // self.details) + (i + 1),
                        (j + 1) * (self.n_points // self.details) + (i + 1),
                        (j + 1) * (self.n_points // self.details) + i)
        geom = Geom(self.water_vdata)
        prim.closePrimitive()
        geom.addPrimitive(prim)
        node = GeomNode('gnode')
        node.addGeom(geom)
        water_nodePath = render.attachNewNode(node)
        water_nodePath.setTransparency(TransparencyAttrib.MAlpha)
        water_nodePath.setAntialias(AntialiasAttrib.MAuto)
        water_nodePath.setPos(-50, -50, 0)

        # Border
        self.water_border_vdata = GeomVertexData('water_border', _format,
                                                 Geom.UHDynamic)
        self.water_border_vdata.setNumRows(8)
        vertex = GeomVertexWriter(self.water_border_vdata, 'vertex')
        normal = GeomVertexRewriter(self.water_border_vdata, 'normal')
        color = GeomVertexWriter(self.water_border_vdata, 'color')
        for i in [0, 99]:
            for j in range(1, -1, -1):
                # Borders Vertices
                vertex.addData3f(i, 0, j)
                # Borders Colors
                color.addData4f(0.3, 0.3, 1, 0.8)
                # Borders Normals
                n = np.array([i, 0, 1e-12 if j == 0 else 1])
                norm = n / np.linalg.norm(n)
                normal.addData3f(norm[0], norm[1], norm[2])
        for i in [99, 0]:
            for j in range(1, -1, -1):
                vertex.addData3f(i, 99, j)
                color.addData4f(0.3, 0.3, 1, 0.8)
                n = np.array([i, 99, 1e-12 if j == 0 else 1])
                norm = n / np.linalg.norm(n)
                normal.addData3f(norm[0], norm[1], norm[2])
        # Borders Primitive
        prim = GeomTriangles(Geom.UHDynamic)
        for i in range(0, 8, 2):
            prim.add_vertices(i, i+1 if i+1 < 8 else i+1-8, \
                i+2 if i+2 < 8 else i+2-8)
            prim.add_vertices(i+2 if i+2 < 8 else i+2-8, \
                i+1 if i+1 < 8 else i+1-8, i+3 if i+3 < 8 else i+3-8)
        geom = Geom(self.water_border_vdata)
        geom.addPrimitive(prim)
        node = GeomNode('gnode')
        node.addGeom(geom)
        water_border_nodePath = render.attachNewNode(node)
        water_border_nodePath.setTransparency(TransparencyAttrib.MAlpha)
        water_border_nodePath.setAntialias(AntialiasAttrib.MAuto)
        water_border_nodePath.setPos(-50, -50, 0)