def _get_cylinder(self, start, end, radius): texture = vp.Texture( vp.Pigment('color', [1 / 255. * e for e in (0, 125, 255)])) c1 = vp.Sphere(start, radius, texture) c2 = vp.Sphere(end, radius, texture) c3 = vp.Cylinder(start, end, radius, texture) return vp.Union(c1, c2, c3)
def _get_cylinder(self, start, end, radius): color = (40 / 255., 40 / 255., 40 / 255.) texture = vp.Texture(vp.Pigment('color', color), vp.Finish("ambient", color, "diffuse", 0.0) ) c1 = vp.Sphere(start, radius, texture) c2 = vp.Sphere(end, radius, texture) c3 = vp.Cylinder(start, end, radius, texture) return vp.Union(c1, c2, c3)
def __init__(self, scale): segments = [] texture = vp.Texture( vp.Pigment('color', [1 / 255. * e for e in (40, 40, 40)])) for i in range(1, 1000): rands = numpy.random.normal(0, .03 * scale, 3) sphere = vp.Sphere(rands, 0.01, texture) segments.append(sphere) self.body = vp.Union() self.body.args = segments
list.append(self.foundation) # for block in self.blocks: # list.append(block) if __name__ == "__main__": camera = vapory.Camera('orthographic', 'angle', 50, 'location', [5.0, 6.0, 5.0], 'look_at', [0.0, 1.0, 0.0]) sun = vapory.LightSource([1500, 2500, 2500], 'color', 1) sky = vapory.Sphere([0, 0, 0], 1, 'hollow', vapory.Texture( vapory.Pigment( 'gradient', [0, 1, 0], vapory.ColorMap([0, 'color', 'White'], [1, 'color', 'White']), 'quick_color', 'White'), vapory.Finish('ambient', 1, 'diffuse', 0)), 'scale', 10000) ground = vapory.Box( [-2, 0, -2], [2, -0.05, 2], vapory.Texture( vapory.Pigment('color', [1.1 * e for e in [0.40, 0.45, 0.85]])), vapory.Finish('phong', 0.1)) objects = [sun, sky, ground] Foundation().add_objects(objects) scene = vapory.Scene(camera, objects,
def geometry_to_povray(appearance, geometry, object, transform, properties): if get_property_yes(properties, [geometry, object], "hide"): return [] #analyze appearance tex = get_property(properties, [geometry, object], 'texture') if tex is None: tex_params = [] #pigment pigment = get_property(properties, [geometry, object], 'pigment') if pigment is None: transmit = 1. - appearance.getColor()[3] pigment = vp.Pigment(*[ 'color', list(appearance.getColor())[0:3], 'transmit', get_property(properties, [geometry, object], 'ambient', transmit) ]) tex_params.append(pigment) #finish finish = get_property(properties, [geometry, object], 'finish') if finish is None: finish=vp.Finish(*['ambient',get_property(properties,[geometry,object],'ambient',0.2), \ 'diffuse',get_property(properties,[geometry,object],'diffuse',0.7), \ 'phong',get_property(properties,[geometry,object],'phong',1.), \ 'phong_size',get_property(properties,[geometry,object],'phong_size',50)]) tex_params.append(finish) #normal normal = get_property(properties, [geometry, object], 'normal') if normal is not None: tex_params.append(normal) #texture tex = vp.Texture(*tex_params) #create geometry ret = [] if transform is None: transform = geometry.getCurrentTransform() else: transform = se3.mul(transform, geometry.getCurrentTransform()) if geometry.type() == "GeometricPrimitive": prim = geometry.getGeometricPrimitive() if get_property_yes(properties, [prim, geometry, object], "hide"): return ret if prim.type == "Point": rad = get_property(properties, [prim, geometry, object], "radius") if rad is not None: mesh_param = [se3.apply(transform, prim.properties[0:3]), rad] mesh_param.append(tex) mesh = vp.Sphere(*mesh_param) ret.append(mesh) elif prim.type == "Sphere": mesh_param = [ se3.apply(transform, prim.properties[0:3]), prim.properties[3] ] mesh_param.append(tex) mesh = vp.Sphere(*mesh_param) ret.append(mesh) elif prim.type == "Segment": rad = get_property(properties, [prim, geometry, object], "radius") if rad is not None: mesh_param = [ se3.apply(transform, prim.properties[0:3]), se3.apply(transform, prim.properties[3:6]), rad ] mesh_param.append(tex) mesh = vp.Cylinder(*mesh_param) ret.append(mesh) elif prim.type == "AABB": mesh_param = [ se3.apply(transform, prim.properties[0:3]), se3.apply(transform, prim.properties[3:6]) ] mesh_param.append(tex) mesh = vp.Box(*mesh_param) ret.append(mesh) elif geometry.type() == "Group": for idElem in range(geometry.numElements()): elem = geometry.getElement(idElem) elem.getCurrentTransform() ret += geometry_to_povray(appearance=appearance, geometry=elem, object=object, transform=transform, properties=properties) elif geometry.type() == "TriangleMesh": tm = geometry.getTriangleMesh() if get_property_yes(properties, [geometry, object], "smooth"): vss = [ se3.apply(transform, tuple(tm.vertices[i * 3:i * 3 + 3])) for i in range(len(tm.vertices) // 3) ] iss = [ tuple(tm.indices[i * 3:i * 3 + 3]) for i in range(len(tm.indices) // 3) ] mesh_param = [ vp.VertexVectors(*([len(vss)] + vss)), vp.FaceIndices(*([len(iss)] + iss)) ] mesh_param.append(tex) mesh = vp.Mesh2(*mesh_param) else: vss = [ se3.apply(transform, tuple(tm.vertices[i * 3:i * 3 + 3])) for i in range(len(tm.vertices) // 3) ] iss = [ tuple(tm.indices[i * 3:i * 3 + 3]) for i in range(len(tm.indices) // 3) ] mesh_param = [ vp.Triangle(vss[it[0]], vss[it[1]], vss[it[2]]) for it in iss ] mesh_param.append(tex) mesh = vp.Mesh(*mesh_param) ret.append(mesh) elif geometry.type() == "VolumeGrid": from skimage import measure import numpy as np grid = geometry.getVolumeGrid() volume = np.reshape(np.array(list(grid.values)), tuple(grid.dims)) spacing = [ (b - a) / d for a, b, d in zip(grid.bbox[0:3], grid.bbox[3:6], grid.dims[0:3]) ] vss, iss, nss, _ = measure.marching_cubes_lewiner(volume, level=0., spacing=spacing) vss += np.expand_dims(np.array(grid.bbox[0:3]).T, 0) vss = [vss[it, :].tolist() for it in range(vss.shape[0])] iss = [iss[it, :].tolist() for it in range(iss.shape[0])] nss = [nss[it, :].tolist() for it in range(nss.shape[0])] mesh_param = [ vp.VertexVectors(*([len(vss)] + vss)), vp.NormalVectors(*([len(nss)] + nss)), vp.FaceIndices(*([len(iss)] + iss)) ] mesh_param.append(tex) mesh = vp.Mesh2(*mesh_param) ret.append(mesh) elif geometry.type() == "PointCloud": cloud_param = [] cloud = geometry.getPointCloud() rad = get_property(properties, [cloud, geometry, object], "radius") for id in range(len(cloud.vertices) // 3): cloud_param.append( vp.Sphere(cloud.vertices[id * 3:id * 3 + 3], rad)) cloud_param.append(tex) mesh = vp.Union(*cloud_param) ret.append(mesh) else: print("Geometry (name=%s) type: %s not supported!" % (object.getName(), geometry.type())) return ret
def _get_cylinder(self, start, end, radius, texture): c1 = vp.Sphere(start, radius, texture) c2 = vp.Sphere(end, radius, texture) c3 = vp.Cylinder(start, end, radius, texture) return vp.Union(c1, c2, c3)
def trav(start, branch, r, objects, t, iter): end = branch[0] # print(end[3]) # print(start, end) cylinder = vp.Cone( [start[0], start[2], start[1]], end[3], [end[0], end[2], end[1]], end[3], vp.Texture(vp.Pigment('color', [0.7 / 255. * e for e in [98, 78, 44]])), vp.Finish('ambient', [0.7 / 255. * e for e in [98, 78, 44]], "diffuse", 0.1)) top = vp.Sphere( [end[0], end[2], end[1]], end[3], vp.Texture(vp.Pigment('color', [.7 / 255. * e for e in [98, 78, 44]])), vp.Finish('ambient', [0.7 / 255. * e for e in [98, 78, 44]], "diffuse", 0.1)) for i in range(0, int(t * 450)): (dx, dy, dz) = Vector3D.fromAngles( random.randint(0, 180), random.randint(0, 360), t * random.randint(0, 5) / (5. * (iter + 2) if iter != 0 else 1000)) # dx = random.randint(-5, 5) / 30. # dy = random.randint(-5, 5) / 30. # dz = random.randint(-5, 5) / 30. dr = random.randint(-5, 5) / 30. dg = random.randint(-5, 5) / 30. db = random.randint(-5, 5) / 30. ddx = random.randint(1, 10) / 10000. ddy = random.randint(0, 10) / 10000. ddz = random.randint(0, 10) / 10000. color = (random.randint(40, 180), random.randint(120, 250), random.randint(0, 50)) leave = vp.Cylinder( [end[0] + dx, end[2] + dy, end[1] + dz], [end[0] + dx + ddx, end[2] + dy + ddy, end[1] + dz + ddz], .01 + random.randint(0, 10) / 1000., vp.Texture(vp.Pigment('color', [2 / 255. * e for e in color])), vp.Finish('phong', 1)) objects.append( leave.add_args(["scale", [2, 2, 2], "translate", [0, 0.58, 0]])) for i in range(0, int(random.randint(0, 10) / 5)): (dx, dy, dz) = Vector3D.fromAngles( random.randint(90, 180), random.randint(0, 360), t * random.randint(4, 4) / (5 * (iter + 2) if iter != 0 else 1000)) color = (random.randint(190, 250), random.randint(40, 80), random.randint(40, 80)) fruit = vp.Sphere([end[0] + dx, end[2] + dz, end[1] + dy], 0.04, vp.Texture( vp.Pigment('color', [2 / 255. * e for e in color]))) #objects.append(fruit.add_args(["scale", [2, 2, 2], "translate", [0, 0.58, 0]])) objects.append( cylinder.add_args(["scale", [2, 2, 2], "translate", [0, 0.58, 0]])) objects.append( top.add_args(["scale", [2, 2, 2], "translate", [0, 0.58, 0]])) for branch in branch[1:]: trav(end, branch, r - (0.005 if r != 0.05 else 0.02), objects, t, iter + 1)
def get_rounded_cylinder(self, start, end, radius, texture): cylinder = vapory.Cylinder(start, end, radius, texture) tip_1 = vapory.Sphere(start, radius, texture) tip_2 = vapory.Sphere(end, radius, texture) return vapory.Union(cylinder, tip_1, tip_2)
def __init__(self, dict_of_angles, crossarm=False, falda=False): width = 0.07 right_pelvis = [width, 0, 0] left_pelvis = [-width, 0, 0] rad = (dict_of_angles["torso"]) * math.pi / 180. neck = [1.5 * width, 0 - 0.6 * math.cos(rad), 0.6 * math.sin(rad)] right_shoulder = [1.5 * width, neck[1], neck[2]] left_shoulder = [- 1.5 * width, neck[1], neck[2]] self.left_shoulder = left_shoulder right_knee = self.get_point(right_pelvis, dict_of_angles["thigh_1"], 0, .5) right_foot = self.get_point(right_knee, dict_of_angles["shin_1"], 0, .5) left_knee = self.get_point(left_pelvis, dict_of_angles["thigh_2"], 0, .5) left_foot = self.get_point(left_knee, dict_of_angles["shin_2"], 0, .5) left_elbow = self.get_point(left_shoulder, dict_of_angles["upper_arm1"], 0, .4) left_elbow = (left_elbow[0] - 0.04, left_elbow[1], left_elbow[2]) left_hand = self.get_point(left_elbow, dict_of_angles["lower_arm1"], 0, .4) right_elbow = self.get_point(right_shoulder, dict_of_angles["upper_arm2"], -0, .4) right_elbow = (right_elbow[0] + 0.04, right_elbow[1], right_elbow[2]) right_hand = self.get_point(right_elbow, dict_of_angles["lower_arm2"], -0, .4) if crossarm: left_hand = (-left_hand[0], left_hand[1], left_hand[2]) self.left_hand = left_hand self.right_hand = right_hand texture = vapory.Texture(vapory.Pigment('color', [0.0 * e for e in [0.20, 0.20, 0.20]]), vapory.Finish('phong', 0.0)) deg = (dict_of_angles["torso"]) self.torso = vapory.Box([-width, 0, -width / 2], [width, 0.6, width / 2], texture, "rotate", [-deg - 180, 0, 0], "translate", [0, 0, 0]) self.lower_left_leg = self.get_rounded_cylinder(left_knee, left_foot, 0.07 / 2, texture) self.upper_left_leg = self.get_rounded_cylinder(left_pelvis, left_knee, 0.07 / 2, texture) self.lower_right_leg = self.get_rounded_cylinder(right_knee, right_foot, 0.07 / 2, texture) self.upper_right_leg = self.get_rounded_cylinder(right_pelvis, right_knee, 0.07 / 2, texture) self.hip = self.get_rounded_cylinder(left_pelvis, right_pelvis, 0.07 / 2, texture) self.left_flank = self.get_rounded_cylinder([-width, 0, 0], [-width, neck[1], neck[2]], 0.07 / 2, texture) self.right_flank = self.get_rounded_cylinder([width, 0, 0], [width, neck[1], neck[2]], 0.07 / 2, texture) self.shoulder = self.get_rounded_cylinder(left_shoulder, right_shoulder, width / 2, texture) self.upper_left_arm = self.get_rounded_cylinder(left_shoulder, left_elbow, width / 2, texture) self.lower_left_arm = self.get_rounded_cylinder(left_elbow, left_hand, width / 2, texture) self.upper_right_arm = self.get_rounded_cylinder(right_shoulder, right_elbow, width / 2, texture) self.lower_right_arm = self.get_rounded_cylinder(right_elbow, right_hand, width / 2, texture) rad = (dict_of_angles["head"]) * math.pi / 180. self.head = vapory.Sphere( [0, neck[1] - (0.35 / 2 + width) * math.cos(rad), neck[2] + (0.35 / 2 + width) * math.sin(rad)], 0.35 / 2, texture) self.body = vapory.Union(self.torso, self.lower_left_leg, self.upper_left_leg, self.lower_right_leg, self.upper_right_leg, self.hip, self.left_flank, self.right_flank, self.shoulder, self.upper_left_arm, self.lower_left_arm, self.upper_right_arm, self.lower_right_arm, self.head) if (falda): falda = vapory.Triangle(left_pelvis, left_knee, right_knee, texture) self.body.args.append(falda) p1 = [0, neck[1] - (2.72 - 2.96), neck[2] + 1.57 - 1.74] p2 = [0, neck[1] - (3.17 - 2.96), neck[2] + 1.60 - 1.74] p3 = [0, neck[1] - (2.72 - 2.96), neck[2] + 1.68 - 1.74] hair = vapory.Triangle(p1, p2, p3, texture) hair = hair.add_args(["rotate", [0 * 180. / math.pi * rad, 0, 0]]) self.body.args.append(hair) p1 = [0, neck[1] - (3.01 - 2.96), neck[2] + 1.62 - 1.74] p2 = [0, neck[1] - (3.26 - 2.96), neck[2] + 1.59 - 1.74] p3 = [0, neck[1] - (3.26 - 2.96), neck[2] + 1.54 - 1.74] hair = vapory.Triangle(p1, p2, p3, texture) hair = hair.add_args(["rotate", [0 * 180. / math.pi * rad, 0, 0]]) self.body.args.append(hair) p1 = [0, neck[1] - (3.26 - 2.96), neck[2] + (1.59 + 1.54) / 2. - 1.74] hair = vapory.Sphere(p1, 0.025, texture) hair = hair.add_args(["rotate", [0 * 180. / math.pi * rad, 0, 0]]) self.body.args.append(hair) # self.body = self.body.add_args(["scale", [0.5, 0.5, 0.5]]) pos = dict_of_angles["pos"] self.body = self.body.add_args(["translate", [0, pos[1], pos[0]]])
def _get_cylinder(self, start, end, radius): c1 = vp.Sphere(start, radius, vp.Texture("Brass_Metal")) c2 = vp.Sphere(end, radius, vp.Texture("Brass_Metal")) c3 = vp.Cylinder(start, end, radius, vp.Texture("Brass_Metal")) return vp.Union(c1, c2, c3)
def _get_cylinder(self, p1, p2, radius, color) -> vapory.Cylinder: return vapory.Sphere(p1, p2, radius, vapory.Texture(vapory.Pigment('color', [1. / 255. * e for e in color])), vapory.Finish("ambient", 0.1, "diffuse", 0.6))
def _get_sphere(self, point, radius, color) -> vapory.Sphere: return vapory.Sphere(point, radius, vapory.Texture(vapory.Pigment('color', [1. / 255. * e for e in color])), vapory.Finish("ambient", 0.1, "diffuse", 0.6))
def _get_sphere(self, point, radius, color) -> vp.Sphere: return vp.Sphere( point, radius, vp.Texture(vp.Pigment('color', [1 / 255. * e for e in color])), vp.Finish("ambient", 1.0, "diffuse", 0.0))