def stolon2d(g, v, turtle): scale= 1./5 cyl = pgl.Cylinder(0.01,0.5) cyl2 = pgl.Cylinder(0.01,0.2) cyl3 = pgl.Cylinder(0.01,0.2) cyl = pgl.AxisRotated(axis=(0,1,0), angle= radians(30.), geometry= cyl) cyl2 = pgl.AxisRotated(axis=(0,1,0), angle= -radians(120.), geometry= cyl2) cyl3 = pgl.AxisRotated(axis=(0,1,0), angle= -radians(180.), geometry= cyl3) cyl2= pgl.Translated((0.26,0,0.45),cyl2) cyl3= pgl.Translated((0.26,0,0.45),cyl3) sto= pgl.Group([cyl,cyl2,cyl3]) turtle.customGeometry(sto)
def cones(obj, **kwds): X_attr = kwds.get('X_attr', 'X') Y_attr = kwds.get('Y_attr', 'Y') pos_dist = kwds.get('dist', 'Distance') pos_az = kwds.get('az', 'Azimuth') circ_attr = kwds.get('circ_attr', 'Circonference') height_attr = kwds.get('height_attr', 'Haut') botHoup_attr = kwds.get('botHoup', 'BaseHoup') radiusHoup_prefix = kwds.get('radiusHoup_prefix', 'r_houp') radiusHoup = kwds.get('radiusHoup', None) wood = kwds.get('wood', True) rgb = kwds.get('rgb', None) spec_name = kwds.get('spec_name', 'houppier_mat') if not obj.__dict__.has_key("posX") and not obj.__dict__.has_key("posY"): try: r = obj.__dict__[pos_dist] a = obj.__dict__[pos_az] obj.posX = r * cos(radians(forest2geomAZ(a))) obj.posY = r * sin(radians(forest2geomAZ(a))) except KeyError: obj.posX = obj.__dict__[X_attr] obj.posY = obj.__dict__[Y_attr] ht = 100 * (obj.__dict__[height_attr] - obj.__dict__[botHoup_attr]) rd_kz = [k for k in obj.__dict__.keys() if radiusHoup_prefix in k] radii = [obj.__dict__[k] for k in rd_kz] if radiusHoup: if radiusHoup == 'Max': cone_radius = 1.0 * max(radii) else: cone_radius = obj.__dict__[radiusHoup] else: cone_radius = 1.0 * sum(radii) / len(radii) #cone_radius = ht/2. h = pgl.Translated( pgl.Vector3(obj.posX, obj.posY, obj.__dict__[botHoup_attr] * 100), pgl.Cone(cone_radius, ht, 1, 12)) tr = pgl.Translated( pgl.Vector3(obj.posX, obj.posY, 0), pgl.Cylinder(obj.__dict__[circ_attr] / (2 * pi), obj.__dict__[botHoup_attr] * 100 + ht * 0.1)) if rgb == None: s_h = pgl.Shape(h, stand_material(spec_name=spec_name)) else: r, g, b = rgb s_h = pgl.Shape(h, stand_material(r, g, b, spec_name)) s_tr = pgl.Shape( tr, stand_material(spec_name="trunk_mat"), ) # s_h.id*10 ) if wood: return (s_h, s_tr) else: return (s_h, )
def frame(matrix, scene, color=1): """ Add a frame to the scene. The frame is represented by the matrix. :param color: allow to distinguish between to identical frames. """ if color == 1: r = pgl.Material(pgl.Color3(*(255, 0, 0))) g = pgl.Material(pgl.Color3(*(0, 255, 0))) b = pgl.Material(pgl.Color3(*(0, 0, 255))) else: r = pgl.Material(pgl.Color3(*(255, 0, 255))) g = pgl.Material(pgl.Color3(*(255, 255, 0))) b = pgl.Material(pgl.Color3(*(0, 0, 0))) cylinder = pgl.Cylinder(radius=0.005, height=1) #x = pgl.AxisRotated(Vector3(0,1,0), radians(90), cylinder) #y = pgl.AxisRotated(Vector3(1,0,0), radians(-90), cylinder) z = cylinder #geom_x = transform4(matrix, x) #scene.add(pgl.Shape(geom_x, r)) #geom_y = transform4(matrix, y) #scene.add(pgl.Shape(geom_y, g)) geom_z = transform4(matrix, z) scene.add(pgl.Shape(geom_z, b))
def Cylinder(self, radius=1., height=1., bottom_open=False, top_open=False, color=None, **kwds): if color: self._current_turtle.color = self.color(color) # radius, height = float(radius)*10, float(height)*10 radius, height = float(radius), float(height) solid = not(bool(bottom_open) and bool(top_open)) return (pgl.Cylinder(radius=radius, height=height, solid=solid), pgl.Matrix4.translation(Vector3(0, 0, height)))
def Cylinder(self, radius=1., length=1., base_open=False, top_open=False, **kwds): # radius, height = float(radius)*10, float(height)*10 radius, length = float(radius), float(length) solid = not (bool(base_open) and bool(top_open)) return (pgl.Cylinder(radius, length, solid), pgl.Matrix4.translation(Vector3(0, 0, length)))
def arrow(x,y,z,length,az=0, el=0, radius=None, color=color(255,255,255),id=0): if radius==None: radius=length*0.05 rad_az = math.radians(az) rad_el = math.pi/2 - math.radians(el) v = pgl.Vector3( x, y, z ) c = pgl.Cylinder(radius, length*0.8, 10) con =pgl.Translated(pgl.Vector3(0,0,length*0.7), pgl.Cone(2*radius, length*0.3)) arr = pgl.Group([c,con]) dir_arr = pgl.EulerRotated(rad_az,rad_el,0,arr) tr_dir_arr = pgl.Translated(v,dir_arr) return pgl.Shape(tr_dir_arr, color, id)
def _mesh(self, length, diameter_base, diameter_top): if self.seed is not None or classic: solid = True slices = 3 diameter = diameter_base stem = pgl.Tapered(diameter_base / 2., diameter_top / 2., pgl.Cylinder(1., length, solid, slices)) stem.apply(self.tessel) mesh = self.tessel.triangulation else: mesh = slim_cylinder(length, diameter_base / 2., diameter_top / 2.) return mesh
def StemElement_mesh(length, diameter_base, diameter_top, classic=False): """ Compute mesh for a stem element - classic indicates """ if classic: solid = True diameter = diameter_base slices = 6 # 6 is the minimal number of slices for a correct computation of star (percentage error lower than 5) stem = pgl.Tapered(diameter_base / 2., diameter_top / 2., pgl.Cylinder(1., length, solid, slices)) tessel = pgl.Tesselator() stem.apply(tessel) mesh = tessel.triangulation else: mesh = slim_cylinder(length, diameter_base / 2., diameter_top / 2.) return mesh
def simple_tree(height=2, crown_radius=1, n_leaves=500, leaf_area=0.1, inner=True): """return a simple tree scene""" leaves = random_leaves(n_leaves=n_leaves, leaf_area=leaf_area, crown_radius=crown_radius, crown_center=(0, 0, height), inner=inner) trunk = pgl.Cylinder(0.1, height) green = pgl.Material(pgl.Color3(0, 150, 0)) brown = pgl.Material(pgl.Color3(100, 60, 10)) scene = pgl.Scene() scene.add(pgl.Shape(trunk, brown)) for leaf in leaves: scene.add(pgl.Shape(leaf, green)) return scene
def tapCyl(x,y,z,radius,height, color=color(46,27,21)): v = pgl.Vector3( x, y, z ) c = pgl.Cylinder(radius, height, 10) tc = pgl.Tapered(1.0,0.7,c) tr = pgl.Translated(v,tc) return pgl.Shape(tr,color)
def f(turtle): height = turtle.length radius = turtle.diameter /2. color = turtle.color return (pgl.Cylinder(radius=radius, height=height), pgl.Matrix4.translation(Vector3(0, 0, height)))
def Cylinder(self, radius=1., height=1., bottom_open=False, top_open=False, **kwds): # radius, height = float(radius)*10, float(height)*10 radius, height = float(radius), float(height) solid = not(bool(bottom_open) and bool(top_open)) return (pgl.Cylinder(radius=radius, height=height, solid=solid), pgl.Matrix4.translation(Vector3(0, 0, height)))
def asymetric_swung(obj, **kwds): X_attr = kwds.get('X_attr', 'X') Y_attr = kwds.get('Y_attr', 'Y') Z_attr = kwds.get('Z_attr', None) pos_dist = kwds.get('dist', 'Distance') pos_az = kwds.get('az', 'Azimuth') circ_attr = kwds.get('circ_attr', 'Circonference') height_attr = kwds.get('height_attr', 'Haut') botHoup_attr = kwds.get('botHoup', 'BaseHoup') radiusHoup_prefix = kwds.get('radiusHoup_prefix', 'r_houp') azimuthHoup_prefix = kwds.get('azimuthHoup_prefix', 'a_houp') midCrown = kwds.get('midCrown', 0.8) wood = kwds.get('wood', True) rgb = kwds.get('rgb', None) spec_name = kwds.get('spec_name', 'houppier_mat') rd_kz = [k for k in obj.__dict__.keys() if radiusHoup_prefix in k] rd_kz.sort() az_kz = [k for k in obj.__dict__.keys() if azimuthHoup_prefix in k] az_kz.sort() if len(rd_kz) != len(az_kz): print obj.__dict__[X_attr], obj.__dict__[Y_attr] assert (len(rd_kz) == len(az_kz) and "directional canopy length and azimuth are not the same size") houppier = [(obj.__dict__[rd_kz[i]], houppier2geomAZ(obj.__dict__[az_kz[i]])) for i in range(len(rd_kz))] houppier.sort(cmp=lambda x, y: cmp(x[1], y[1])) if not obj.__dict__.has_key("posX") and not obj.__dict__.has_key("posY"): try: r = obj.__dict__[pos_dist] a = obj.__dict__[pos_az] obj.posX = r * cos(radians(forest2geomAZ(a))) obj.posY = r * sin(radians(forest2geomAZ(a))) except KeyError: obj.posX = obj.__dict__[X_attr] obj.posY = obj.__dict__[Y_attr] if Z_attr == None: obj.posZ = 0 else: obj.posZ = obj.__dict__[Z_attr] mc = float(midCrown) radii = list(houppier) ht = 100 * (obj.__dict__[height_attr] - obj.__dict__[botHoup_attr]) h = pgl.Translated( pgl.Vector3(obj.posX, obj.posY, obj.__dict__[botHoup_attr] * 100 + obj.posZ), createSwung(ht * mc, ht, radii)) tr = pgl.Translated( pgl.Vector3(obj.posX, obj.posY, obj.posZ), pgl.Cylinder(obj.__dict__[circ_attr] / (2 * pi), obj.__dict__[botHoup_attr] * 100 + ht * 0.1)) if rgb == None: s_h = pgl.Shape(h, stand_material(spec_name=spec_name)) else: r, g, b = rgb s_h = pgl.Shape(h, stand_material(r, g, b, spec_name)) s_tr = pgl.Shape( tr, stand_material(spec_name="trunk_mat"), ) # s_h.id*10 ) if wood: return (s_h, s_tr) else: return (s_h, )
:author: szymon stoma, frederic boudon, david da silva """ import openalea.plantgl.all as pgl import material __docformat__ = "restructuredtext en" ASHAPE3D_STANDARD_AXIS = pgl.Vector3.OZ ASHAPE3D_STANDARD_ROLL = 0. ASHAPE3D_STANDARD_POS = pgl.Vector3.ORIGIN ASHAPE3D_STANDARD_MATERIAL = material.white ASHAPE3D_STANDARD_SCALE = pgl.Vector3(1, 1, 1) # save memory with primitive types related ACYLINDER_PRIMITIVE = pgl.Cylinder() ACYLINDER_PRIMITIVE.name = "ACylinderPrimitive" ACYLINDER_STANDARD_RADIUS = 1. ACYLINDER_STANDARD_HEIGHT = 1. ACYLINDER_STANDARD_AXIS = ASHAPE3D_STANDARD_AXIS ASPHERE_PRIMITIVE = pgl.Sphere() ASPHERE_PRIMITIVE.name = "ASpherePrimitive" ASPHERE_STANDARD_RADIUS = 1. AARROW_STANDARD_AXIS = ASHAPE3D_STANDARD_AXIS AARROW_STANDARD_RADIUS = 1. AARROW_STANDARD_HEIGHT = 1. AARROW_SHAFT_PROPORTION = 0.7 AARROW_HEAD_PROPORTION = 1.5
def test_texture(): fname = '../share/plantgl/pixmap/geomviewer.png' t = pgl.ImageTexture(fname) t.baseColor = (255, 0, 0, 0) sh = pgl.Shape(pgl.Cylinder(), t, 2) jsonconversion(sh)