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
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)