Advertisement
Guest User

Untitled

a guest
Dec 16th, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.95 KB | None | 0 0
  1. import bpy
  2. import math
  3. import random
  4.  
  5. ##################################################################################
  6. ########                       Funcion Arboles                            ########
  7. ##################################################################################
  8.  
  9. def Crear_Bosque(nx_Arboles = 4,posX_Arbol = 0,posY_Arbol = 0,numeroHojasPorRama = 20,numeroInterseccionesRamas = 4,distanciaEntreRamas = 4,alturaRamas = 10,grosorRamas = 0.4,escalaHojas = 0.4,separacionEntreHojas = 2,escalaArbol = 0.1):
  10.    
  11.     def Crear_Cilindros(posX_1, posY_1, posZ_1, posX_2, posY_2, posZ_2, radio):
  12.         distanciasX = posX_2 - posX_1
  13.         distanciasY = posY_2 - posY_1
  14.         distanciasZ = posZ_2 - posZ_1    
  15.         altura = math.sqrt(distanciasX**2 + distanciasY**2 + distanciasZ**2)
  16.         bpy.ops.mesh.primitive_cylinder_add(
  17.             radius = radio,
  18.             depth = altura,
  19.             location = (distanciasX/2 + posX_1, distanciasY/2 + posY_1, distanciasZ/2 + posZ_1)  
  20.         )  
  21.         bpy.context.object.name = "rama"
  22.         rotar_Y = math.acos(distanciasZ/altura)
  23.         rotar_Z = math.atan2(distanciasY, distanciasX)
  24.         bpy.context.object.rotation_euler[1] = rotar_Y
  25.         bpy.context.object.rotation_euler[2] = rotar_Z                            
  26.         activeObject = bpy.context.active_object
  27.         mat = bpy.data.materials.new(name="MaterialRama")
  28.         activeObject.data.materials.append(mat)
  29.         bpy.context.object.active_material.diffuse_color = (0.650, 0.268, 0.121)              
  30.         for i in range(1,numeroHojasPorRama,1):
  31.             posXHoja = random.uniform(-separacionEntreHojas,separacionEntreHojas)
  32.             posYHoja = random.uniform(-separacionEntreHojas,separacionEntreHojas)
  33.             posZHoja = random.uniform(-separacionEntreHojas+separacionEntreHojas,separacionEntreHojas+separacionEntreHojas)
  34.             bpy.ops.mesh.primitive_plane_add(
  35.              
  36.                 location = (posXHoja + distanciasX/2 + posX_1, posYHoja + distanciasY/2 + posY_1, posZHoja + distanciasZ/2 + posZ_1)
  37.             )
  38.             bpy.context.object.name = "ramahoja"
  39.             bpy.context.object.scale = (escalaHojas,escalaHojas,escalaHojas)
  40.             rotar_Y = math.acos(distanciasZ/altura)
  41.             rotar_Z = math.atan2(distanciasY, distanciasX)
  42.             bpy.context.object.rotation_euler[1] = rotar_Y+i
  43.             bpy.context.object.rotation_euler[2] = rotar_Z+i                                        
  44.             activeObject2 = bpy.context.active_object
  45.             mat2 = bpy.data.materials.new(name="MaterialHoja")
  46.             activeObject2.data.materials.append(mat2)
  47.             bpy.context.object.active_material.diffuse_color = (0, 1, 0)
  48.  
  49.     def Crear_Ramas(Pos_XYZ, intersecciones = 1):
  50.         if intersecciones > numeroInterseccionesRamas:
  51.             return 0
  52.         x,y,z = Pos_XYZ
  53.         X_random = x + random.uniform(-distanciaEntreRamas, distanciaEntreRamas)
  54.         Y_random = y + random.uniform(-distanciaEntreRamas, distanciaEntreRamas)
  55.         Z_random = z + random.uniform(0, alturaRamas/math.sqrt(intersecciones))
  56.         Crear_Cilindros(x,y,z,X_random, Y_random, Z_random, radio = grosorRamas/math.sqrt(intersecciones))      
  57.         if random.random() < 1:
  58.             Crear_Ramas((X_random, Y_random, Z_random), intersecciones = intersecciones + 1)      
  59.         Crear_Ramas((X_random, Y_random, Z_random), intersecciones = intersecciones + 1)  
  60.        
  61.     def Join_Ramas():
  62.         for ob in bpy.context.scene.objects:
  63.             if ob.name != 'arbol' and ob.name.lower().startswith("r"):
  64.                 ob.select = True
  65.                 bpy.context.scene.objects.active = ob  
  66.             else:
  67.                 ob.select = False          
  68.         bpy.ops.object.join()
  69.        
  70.     def Crear_Arbol(PosX,PosY,PosZ,ScalaX,ScalaY,ScalaZ):
  71.         Crear_Ramas((0,0,0))
  72.         Join_Ramas()
  73.         bpy.context.active_object.scale = ( ScalaX, ScalaX, ScalaX )
  74.         bpy.context.active_object.location = ( 0, 0, 0 )
  75.         bpy.context.scene.objects.active.select = False
  76.         bpy.context.object.name = "arbol"
  77.         bpy.context.active_object.location = ( PosX, PosY, PosZ )
  78.  
  79.     #Bucle para crear nx_Arboles aleatorios o no, comentar las lineas indicadas en caso de que se quieran colocar en posiciones concretas
  80.     for i in range(0,nx_Arboles,1):
  81.         posX_Arbol = random.uniform(-5,5)       #comentar para no usar posiciones aleatorias
  82.         posY_Arbol= random.uniform(-5,5)        #comentar para no usar posiciones aleatorias  
  83.         Crear_Arbol(posX_Arbol,posY_Arbol,0,escalaArbol,escalaArbol,escalaArbol)
  84.        
  85. ##################################################################################
  86. ########                    Crear Bosque de Arboles                       ########
  87. ##################################################################################
  88. #Indicaciones:
  89. #
  90. # -No es necesario indicar todos los parametros al llamar a la funcion Crear_Bosque, solo los que se desean variar
  91. # -No es recomendable indicar un valor muy alto tanto a nx_Arboles, como a numeroHojasPorRama, como a numeroInterseccionesRamas,
  92. #   ya que podia tardar minutos en salir el arbol...Eso si, te saldrá un buen arbol!! XD
  93.  
  94. #Ejemplo de uso: Crear_Bosque(nx_Arboles = 3,posX_Arbol = 100,posY_Arbol = 200,numeroHojasPorRama = 30,etc);
  95.  
  96. #Parametros de la funcion por defecto para una mayor rapidez en spawn de arboles
  97. #
  98. #   nx_Arboles = 4
  99. #   posX_Arbol = 0
  100. #   posY_Arbol = 0
  101. #   numeroHojasPorRama = 20                  
  102. #   numeroInterseccionesRamas = 4
  103. #   distanciaEntreRamas = 4
  104. #   alturaRamas = 10
  105. #   grosorRamas = 0.4
  106. #   escalaHojas = 0.4
  107. #   separacionEntreHojas = 2
  108. #   escalaArbol = 0.1
  109.  
  110. #Creacion de 4 arboles, posicion de momento random, para determinar una posicion concreta comentar lineas 86 y 87 y indicar los parametros
  111. Crear_Bosque(nx_Arboles = 4,numeroHojasPorRama = 20,numeroInterseccionesRamas = 4);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement