Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import bpy
- import math
- import random
- ##################################################################################
- ######## Funcion Arboles ########
- ##################################################################################
- 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):
- def Crear_Cilindros(posX_1, posY_1, posZ_1, posX_2, posY_2, posZ_2, radio):
- distanciasX = posX_2 - posX_1
- distanciasY = posY_2 - posY_1
- distanciasZ = posZ_2 - posZ_1
- altura = math.sqrt(distanciasX**2 + distanciasY**2 + distanciasZ**2)
- bpy.ops.mesh.primitive_cylinder_add(
- radius = radio,
- depth = altura,
- location = (distanciasX/2 + posX_1, distanciasY/2 + posY_1, distanciasZ/2 + posZ_1)
- )
- bpy.context.object.name = "rama"
- rotar_Y = math.acos(distanciasZ/altura)
- rotar_Z = math.atan2(distanciasY, distanciasX)
- bpy.context.object.rotation_euler[1] = rotar_Y
- bpy.context.object.rotation_euler[2] = rotar_Z
- activeObject = bpy.context.active_object
- mat = bpy.data.materials.new(name="MaterialRama")
- activeObject.data.materials.append(mat)
- bpy.context.object.active_material.diffuse_color = (0.650, 0.268, 0.121)
- for i in range(1,numeroHojasPorRama,1):
- posXHoja = random.uniform(-separacionEntreHojas,separacionEntreHojas)
- posYHoja = random.uniform(-separacionEntreHojas,separacionEntreHojas)
- posZHoja = random.uniform(-separacionEntreHojas+separacionEntreHojas,separacionEntreHojas+separacionEntreHojas)
- bpy.ops.mesh.primitive_plane_add(
- location = (posXHoja + distanciasX/2 + posX_1, posYHoja + distanciasY/2 + posY_1, posZHoja + distanciasZ/2 + posZ_1)
- )
- bpy.context.object.name = "ramahoja"
- bpy.context.object.scale = (escalaHojas,escalaHojas,escalaHojas)
- rotar_Y = math.acos(distanciasZ/altura)
- rotar_Z = math.atan2(distanciasY, distanciasX)
- bpy.context.object.rotation_euler[1] = rotar_Y+i
- bpy.context.object.rotation_euler[2] = rotar_Z+i
- activeObject2 = bpy.context.active_object
- mat2 = bpy.data.materials.new(name="MaterialHoja")
- activeObject2.data.materials.append(mat2)
- bpy.context.object.active_material.diffuse_color = (0, 1, 0)
- def Crear_Ramas(Pos_XYZ, intersecciones = 1):
- if intersecciones > numeroInterseccionesRamas:
- return 0
- x,y,z = Pos_XYZ
- X_random = x + random.uniform(-distanciaEntreRamas, distanciaEntreRamas)
- Y_random = y + random.uniform(-distanciaEntreRamas, distanciaEntreRamas)
- Z_random = z + random.uniform(0, alturaRamas/math.sqrt(intersecciones))
- Crear_Cilindros(x,y,z,X_random, Y_random, Z_random, radio = grosorRamas/math.sqrt(intersecciones))
- if random.random() < 1:
- Crear_Ramas((X_random, Y_random, Z_random), intersecciones = intersecciones + 1)
- Crear_Ramas((X_random, Y_random, Z_random), intersecciones = intersecciones + 1)
- def Join_Ramas():
- for ob in bpy.context.scene.objects:
- if ob.name != 'arbol' and ob.name.lower().startswith("r"):
- ob.select = True
- bpy.context.scene.objects.active = ob
- else:
- ob.select = False
- bpy.ops.object.join()
- def Crear_Arbol(PosX,PosY,PosZ,ScalaX,ScalaY,ScalaZ):
- Crear_Ramas((0,0,0))
- Join_Ramas()
- bpy.context.active_object.scale = ( ScalaX, ScalaX, ScalaX )
- bpy.context.active_object.location = ( 0, 0, 0 )
- bpy.context.scene.objects.active.select = False
- bpy.context.object.name = "arbol"
- bpy.context.active_object.location = ( PosX, PosY, PosZ )
- #Bucle para crear nx_Arboles aleatorios o no, comentar las lineas indicadas en caso de que se quieran colocar en posiciones concretas
- for i in range(0,nx_Arboles,1):
- posX_Arbol = random.uniform(-5,5) #comentar para no usar posiciones aleatorias
- posY_Arbol= random.uniform(-5,5) #comentar para no usar posiciones aleatorias
- Crear_Arbol(posX_Arbol,posY_Arbol,0,escalaArbol,escalaArbol,escalaArbol)
- ##################################################################################
- ######## Crear Bosque de Arboles ########
- ##################################################################################
- #Indicaciones:
- #
- # -No es necesario indicar todos los parametros al llamar a la funcion Crear_Bosque, solo los que se desean variar
- # -No es recomendable indicar un valor muy alto tanto a nx_Arboles, como a numeroHojasPorRama, como a numeroInterseccionesRamas,
- # ya que podia tardar minutos en salir el arbol...Eso si, te saldrá un buen arbol!! XD
- #Ejemplo de uso: Crear_Bosque(nx_Arboles = 3,posX_Arbol = 100,posY_Arbol = 200,numeroHojasPorRama = 30,etc);
- #Parametros de la funcion por defecto para una mayor rapidez en spawn de arboles
- #
- # 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
- #Creacion de 4 arboles, posicion de momento random, para determinar una posicion concreta comentar lineas 86 y 87 y indicar los parametros
- Crear_Bosque(nx_Arboles = 4,numeroHojasPorRama = 20,numeroInterseccionesRamas = 4);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement