def setup_func(): sc = pgl.Scene() sc += pgl.Shape(pgl.Box(1, 1, 1), red, id=1) sc += pgl.Shape(pgl.Translated(4, 4, 6, pgl.Sphere(1)), blue, id=2) sc += pgl.Shape(pgl.Translated(2, 3, -3, pgl.Cone(1, 2)), green, id=3) sc += pgl.Shape(pgl.Translated(-8, 3, -2, pgl.Box(4, 2, 0.5)), blue, id=4) sc += pgl.Shape(pgl.Translated( -4, -2, 5, pgl.EulerRotated(3.14, 2.7, 0, pgl.Cone(2, 5))), green, id=5) sc += pgl.Shape(pgl.Translated(4, -3, -3, pgl.Sphere(2)), red, id=6) return sc
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 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 cone( x,y,z, color=color( 30,10,140 ) ): v = pgl.Vector3( x, y, z ) d = pgl.Cone( 0.4, 0.4 ) tr = pgl.Translated( v,d ) return pgl.Shape( tr, color )
def Cone(self, radius=1., height=1., bottom_open=False, **kwds): # TODO: Implement bottom_open (bool) radius, height = float(radius), float(height) solid = not bottom_open return (pgl.Cone(radius=radius, height=height, solid=solid), pgl.Matrix4.translation(Vector3(0, 0, height)))
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 ACONE_PRIMITIVE = pgl.Cone() ACONE_PRIMITIVE.name = "AConePrimitive" class AShape3D(object): """Basic shape used to wrap all <2 axis objects. Internally all the visual object are characterised by 3 transformation components: * scaling, * rotation, * translation. The order of applying these operations: scaling, rotation, translation. This component is enough to express the position of many one-axis symetry objects. For more complex objects, the manual ingeration into component might be required (or different strategy should be developed).