-
1 Archivos adjunto(s)
Bake de normal maps mediante script
Estoy intentando bakear de forma automática los Normal Maps de un Mesh de alta resolución a uno de baja resolución. En la escena tengo 4 Mesh de alta y 4 de baja. Si selecciono manualmente el Mesh high después el Low y ejecuto este código. El Normal Map se bakea correctamente.
Si se ejecuta correctamente seleccionando manualmente, no entiendo por qué dentro del script, seleccionando los Mesh automáticamente no funciona. Un saludo a todos y gracias por vuestra ayuda y tiempo.
-- IMÁGENES ADJUNTAS --
https://foro3d.com/attachment.php?attachmentid=225502
-
Bake de normal maps mediante script
¿Y cada plano low, ya tiene creada, la textura de imagen y desplegado el UV correspondiente?
Por cierto, el Blend que has subido no lleva las texturas Tif empaquetadas.
-
1 Archivos adjunto(s)
Bake de normal maps mediante script
Fichero con texturas.
Si cada plano tiene sus UV desplegadas, con su imagen asignada.
Este es el error que da en la consola:
Error: Circular reference in texture stack
Traceback (most recent call last):
File I:\catalunyaMetOrtoPru\demOrto\1\bakeNormals_03.bl end\Text, line 23, in
<module>
File H:\software\Blender\Blender-2.79-77dccbf-win64\Blender-2.79.0-git.77dccb
f-Windows64\2.79\scripts\modules\bpy\ops, py, line 189, in __call__
ret = op_call(self, idname_py(), None, kw)
RuntimeError: Error: Circular reference in texture stack.
Error: Python script fail, look in the console for now.
-- IMÁGENES ADJUNTAS --
https://foro3d.com/attachment.php?attachmentid=225504
-
1 Archivos adjunto(s)
Bake de normal maps mediante script
Buenas, las dos ultimas líneas de código no deben ir indentadas tu las tienes puestas dentro del for, pégalas al principio sin identificación para qué no las ejecute el for, te pongo una captura. Saludos.
Archivo adjunto 225508
-- IMÁGENES ADJUNTAS --
https://foro3d.com/attachment.php?attachmentid=225508
-
Bake de normal maps mediante script
Cita:
RuntimeError: Error: Circular reference in texture stack.
Yo no entiendo casi nada de Python, pero el error ese que pone de referencia circular, se refiere a qué cuando hace el Bake, la textura debe estar desactivada para qué no se cree un especie de repetición.
-
Bake de normal maps mediante script
Gracias a los dos ma;ana lo pruebo y comento.
-
Bake de normal maps mediante script
Juani si saco esas líneas del for solo me aplicara el bake en la ultima pareja de high y low seleccionada, y yo quiero que lo aplique en todos los pares de high y low.
Si parece que el error es por eso Solimán.
Me centro en ese error para ver si lo soluciono.
Gracias a los dos por vuestro tiempo y ayuda.
-
Bake de normal maps mediante script
Borro las texturas que he utilizado para crear los mesh, los materiales creados por defecto.
Creo una textura para las UV para cada mesh Low Poly.
Ejecuto un script que los seleccione por nombre.
Pero solo me hace el bake del ultimo mesh.
?
Si selecciono manualmente el Hig y después el low y ejecuto este código funciona correctamente:
Import bpy, os
bpy, context, scene, render, bake_type = NoRMALS\nbpy, context, scene, render, use_bake_selected_to_active = True
bpy, ops, object, bake_image().
Pero a la qué los selecciono con el script.parece que no es lo mismo seleccionar desde script que hacerlo desde el entorno gráfico. Un saludo.
-
1 Archivos adjunto(s)
Bake de normal maps mediante script
Miré a ver cual de los objetos en el script era el activo y siempre me salía el 260-105, entonces lo que hecho ha sido declarar la escena y decir cual de los objetos seleccionados tiene que ser el activo, total 2 líneas de código que me han vuelto loco, pero FUNCIONA.
Archivo adjunto 225561
-- IMÁGENES ADJUNTAS --
https://foro3d.com/attachment.php?attachmentid=225561
-
Bake de normal maps mediante script
Gracias Juani esta noche lo pruebo.
Mil gracias.
-
Bake de normal maps mediante script
Funciona.
Gracias Juani mañana siguiré dándole caña al script y lo colgare para qué se pueda generar el mapa de normales de los ficheros de alturas del terreno.
-
1 Archivos adjunto(s)
Bake de normal maps mediante script
Ahora el script importa un mesh en alta otro en baja bakea la textura en el de baja borra todos los mesh.
Genera un mesh de una calidad media y crea una textura.
Tengo que conseguir que las texturas del bake se guarden en disco duro y se apliquen al material del mes de calidad media.
Le estoy dando vueltas a como guardar la imagen del normal con el mismo nombre que el mesh de calidad media, y aplicarlo al material que tiene.
Juani sabes cómo se indica guardar en disco las texturas del normal map.
estoy dándole cabezazos con.
bpy, ops, object, bake(type=COMBINED, pass_filter=set(), filepath=, width=512, height=512, margin=16, use_selected_to_active=False, cage_extrusión=0, cage_object=, normal_space=TANGENT, normal_r=POS_X, normal_g=POS_Y, normal_b=POS_Z, save_mode=INTERNAL, use_clear=False, use_cage=False, use_split_materials=False, use_automatic_name=False, uv_layer=).
Pero no logro hacerlo. Un saludo a todos y gracias por vuestro tiempo y ayuda.
Enlace con los ficheros necesarios para probar el script:
https://mega.nz/#F.T9520AQC.SdiHFxm4yPTeRrQwxmWcw
Import bpy, os
bpy, context, scene, render, bake_type = NoRMALS\nbpy, context, scene, render, use_bake_selected_to_active = True
folder = I:/catalunyaMetOrtoPru/demOrto/1/
for f in os, listdir(folder):
pathFiles = folder + f
basename, ext = os, path, splitext(f)
if pathFiles, find(\_Dem, tif) >= 1:
bpy, ops, importgis, georaster(importMode = DEM_RAW, filepath = pathFiles, rastCRS = EPSG:3857)
bpy, ops, tesselation, delaunay()
objetos_escena = bpy, data, objects
for objeto in objetos_escena:
objeto, select = False
for objeto in objetos_escena:
if objeto, name == basename:
objeto, select = True
bpy, ops, object, delete()
for objeto in objetos_escena:
if objeto, name, startswith(TIN):
nameHighDem = basename + High
objeto, name = nameHighDem
bpy, ops, importgis, georaster(importMode = PLANE, filepath = pathFiles, rastCRS = EPSG:3857)
objetos_escena = bpy, data, objects
for objeto in objetos_escena:
if objeto, name == basename:
nameLowDem = basename + Low
objeto, name = nameLowDem
escena = bpy, context, scene
objetos_escena = bpy, data, objects
bpy, ops, object, select_all(False)
objetos_dict = {}
for objeto in objetos_escena:
if objeto, type ==MESH:
objeto, select = False
nombre = objeto, name
values = nombre, split(\_)
if values[0] in objetos_dict.keys():
objetos_dict[values[0].append(objeto)
else:
objetos_dict[values[0] = [objeto].
For key in objetos_dict.keys():
list = objetos_dict[key]
bpy, ops, object, select_all(False)
list[0].select = True
list[1].select = True
escena, objects, active = list[1]
bpy, ops, object, bake_image()
bpy, ops, object, select_all(False)
list[0].select = True
bpy, ops, object, delete()
list[1].select = True
bpy, ops, object, delete()
for f in os, listdir(folder):
path = folder + f
basename, ext = os, path, splitext(f)
if path, find(\_Dem, tif) >= 1:
bpy, ops, importgis, georaster(importMode = DEM, filepath = path, rastCRS = EPSG:3857, fillNodata=True)
objeto = bpy, data, objects[basename]
objeto, select = True
bpy, context, scene, objects, active = objeto
bpy, ops, object, modifier_apply(apply_as=DATA, modifier=DEM)
bpy, ops, object, modifier_apply(apply_as=DATA, modifier=DEM.001)
if path, find(\_Orto.jpg) >= 1:
img = bpy, data, images, load(path)
cTex = bpy, data, textures, new(ColorTex, type = IMAGE)
cTex.image = img
materialSimple = bpy, data, materials, new(basename)
objeto, data, materials, append(materialSimple)
materialSimple, specular_color = (0,0,0)
materialSimple, specular_intensity = 0
mtex = materialSimple, texture_slots, add()
mtex.texture = cTex.
-- IMÁGENES ADJUNTAS --
https://foro3d.com/attachment.php?attachmentid=225566
-
Bake de normal maps mediante script
Hola, estás usando módulos de Python para moverte por los archivos, porqué? Incluso usas métodos de la api de Blender combinados con Python puro. Podrías decir exactamente que quieres hacer? Los archivos que tienes en mega son imágenes, que quieres usarlas con el normal map ya hecho y guardarlo en disco o guardar las imágenes del bake en disco para usarlas después como textura de las imágenes jpg? Podrías explicar con más detalle lo que exactamente quieres hacer? No soy un experto, pero podría echarte una mano en esto a la vez que aprendo, no suelo usar archivos externos y siempre he querido hacerlo, pero no he encontrado para que, ahora si tiene sentido el poder hacerlo.
-
Bake de normal maps mediante script
-
Bake de normal maps mediante script
Hasta ahora, los blend que ha puesto, son para Blender render.
-
Bake de normal maps mediante script
Gracias por vuestra ayuda e interés. La intención del script es generar un modelo 3d de un terreno de alta resolución, guardar el mapa de normales, generar un modelo 3d del terreno de baja resolución, aplicar una textura a este modelo y el mapa de normales. Primero instalaremos el addon BlenderGis para poder trabajar con imágenes en formato geotif.
-
Bake de normal maps mediante script
En principio es para Blender internal.
Si quieres hcerlo para Cycles, por mi bien.
El resultado del script sera para poder trabajar en Unity 3D.
Y se que con el material de Blender internal Unity3D trabaja bien.
Gracias por vuestro interés y ayuda.
-
Bake de normal maps mediante script
Cualquier duda en mí explicación Juani me comentas ya ves que mi código es muy feote.
Gracias por tu ayuda.
-
Bake de normal maps mediante script
He limpiado el código:
Ahora queda crear un material para cada mesh y asignar la textura del diffuse/color y la textura al Geometry/normal
import bpy, os.
Bpy, context, scene, render, bake_type = NoRMALS\nbpy, context, scene, render, use_bake_selected_to_active = True.
Folder = I:/catalunyaMetOrtoPru/demOrto/1/
for f in os, listdir(folder):
pathFiles = folder + f
basename, ext = os, path, splitext(f)
if pathFiles, find(\_Dem, tif) >= 1:
bpy, ops, importgis, georaster(importMode = DEM_RAW, filepath = pathFiles, rastCRS = EPSG:3857)
bpy, ops, tesselation, delaunay()
bpy, ops, object, select_all(False)
bpy, context, scene, objects, active = bpy, data, objects[basename]
bpy, data, objects[basename].select = True
bpy, ops, object, delete()
bpy, context, scene, objects, active = bpy, data, objects[TIN]
bpy, data, objects[TIN].select = True
bpy, data, objects[TIN].name = basename + High
bpy, ops, object, select_all(False)
bpy, ops, importgis, georaster(importMode = PLANE, filepath = pathFiles, rastCRS = EPSG:3857)
bpy, ops, object, select_all(False)
bpy, context, scene, objects, active = bpy, data, objects[basename]
bpy, data, objects[basename].select = True
bpy, data, objects[basename].name = basename + Low
bpy, ops, object, select_all(False)
bpy, data, objects[basename + High].select = True
bpy, context, scene, objects, active = bpy, data, objects[basename + Low]
bpy, data, objects[basename + Low].select = True
bpy, ops, object, bake_image()
bpy, ops, object, select_all(False)
#Borrar todos los materiales
#objetos = bpy, data, objects
#slots_material = objeto, material_slots
#for slot in slots_material:
#slot, material = None
bpy, data, objects[basename + High].select = True
bpy, ops, object, delete()
bpy, data, objects[basename + Low].select = True
bpy, ops, object, delete()
bpy, ops, importgis, georaster(importMode = DEM, filepath = pathFiles, rastCRS = EPSG:3857, fillNodata=True)
#bpy, context, object, modifiers[DEM].levels = 4
#bpy, context, object, modifiers[DEM].render_levels = 4
bpy, context, scene, objects, active = bpy, data, objects[basename]
bpy, data, objects[basename].select = True
bpy, ops, object, modifier_apply(apply_as=DATA, modifier=DEM)
bpy, ops, object, modifier_apply(apply_as=DATA, modifier=DEM.001).
-
Bake de normal maps mediante script
Buenas Toni Logar, ya entiendo porque daba algunos errores de nodos, por eso preguntaba si era en Cycles, y porque usabas métodos de Python que yo no encontraba en la api de Blender, seria por la forma de funcionar del addon. ¿Las imágenes que usas las puedes usar en vez de (*.jpg) en png? Si fuese así se pueden empacar en Blender internamente, se crearia una carpeta automáticamente en el mismo directorio de Blender y luego se cojerian de aquí, pero de esta forma solo admite el formato png. Si no puedes usar png, se tendría qué hacer de otra forma, pero con unpack es bastante fácil.
-
Bake de normal maps mediante script
Gracias por tu ayuda Juani.
Las imágenes (*.jpg) si que puedo pasarlas a (*.png) sin problemas, pero las imágenes tif es necesario que sean en este formato para qué conserven la georeferenciacción.
Pero esta prueba es con 4 ficheros.
La cuestión es poder hacer una prueba grande de unos 4722 ficheros y en este caso supongo que, empaquetar las imágenes generara un fichero blend enorme.
Pero mañana colgare las imágenes en formato (*.png) y lanzare una prueba.
Ahora lo que no logro solucionar es borrar o darle un nombre descriptivo al material que se genera al bakear el normal.
Y asignar el normal al material que le asigno al mesh final. Un saludo y gracias por tu ayuda.
Aquí dejo el enlace con las imágenes tif (*.jpg) y png.
https://mega.nz/#F.T9520AQC.SdiHFxm4yPTeRrQwxmWcw.
La intención del sccrip, es que cualquiera pueda generar un modelo 3D de un terreno, con el formato geotif, una textura del mismo corte del geotif y que se genere con un mesh lowpoly con el normal map de alta resolución.
El usuario podrá descargar estos formatos de diferentes paginas:
MODELOS DIGITALES DE ELEVACIONES
http://centrodedescargas, cnig.es/Ce...rgas/index.jsp.
ORTOFOTOS
http://centrodedescargas, cnig.es/CentroDescargas/index.jsp.
http://www.icc.cat/vissir3/
-
1 Archivos adjunto(s)
Bake de normal maps mediante script
Un saludo.
¿Cómo se puede borrar materiales no asignados a ningún objeto mediante script en Python?
Dejo un blend con el que estoy probando.
Gracias por vuestro tiempo.
-- IMÁGENES ADJUNTAS --
https://foro3d.com/attachment.php?attachmentid=225595
-
1 Archivos adjunto(s)
Bake de normal maps mediante script
Cita:
Iniciado por
tonilogar
Un saludo.
¿Cómo se puede borrar materiales no asignados a ningún objeto mediante script en Python?
Dejo un blend con el que estoy probando.
Gracias por vuestro tiempo.
Has puesto el texto vacío.
Archivo adjunto 225596
-- IMÁGENES ADJUNTAS --
https://foro3d.com/attachment.php?attachmentid=225596
-
Bake de normal maps mediante script
En cuanto a borrar materiales Melendez hizo un script ya hace tiempo, que a lo mejor os puede servir.
https://github.com/zebus3d/varios_Bl...ager_addon, py.
Sale en el panel de la izquierda con la pestaña MISC.
-
Bake de normal maps mediante script
Cita:
Iniciado por
Soliman
Es el blend de ejemplo con los materiales, para probar.
Sin código, no se hacerlo.
Gracias Solimán.
-
1 Archivos adjunto(s)
Bake de normal maps mediante script
Buenas échale un vistazo al video a ver si te puede cuadrar, el pack con Python se hace en una carpeta de texturas que crea Blender en el mismo directorio desde dónde lo abrimos. Realmente no está en el archivo Blender, si enviamos el archivo a alguien no se verán las texturas porque no tendrá la carpeta qué hemos creado para nosotros.
Lo que yo creo que pasaría es que le generaría al usuario 4.000, archivos que habría que eliminar, seguramente cuando terminemos de hacer las imágenes que queramos, no se échale un vistazo y me dices si te puede servir. Voy a ver cómo se podría hacer a buffer como ctrolC y ctroV, a lo mejor es más práctico.
https://youtu.be/3WpPqVG__7E
Edito:
Se me olvidaba dejarte el blend con los scripts.
-- IMÁGENES ADJUNTAS --
https://foro3d.com/attachment.php?attachmentid=225599
-
Bake de normal maps mediante script
Gracias por tu tiempo y ayuda Juani, ma;ana me lo miro con calma.
-
1 Archivos adjunto(s)
Bake de normal maps mediante script
Te pongo un blend para borrar los materiales con el método users, esto lo que hace es decirte cuantos usuarios usan ese tipo de datos, como lo tenemos en material nos dirá cuantos objetos(usuarios), usan ese material, la pega es que un material sin asignar tiene el valor 1 y un material asignado a un objeto también tiene el valor 1, como en el for decimos que elimine todos los materiales que tengan 1 usuario, tenemos que pulsar la letra F al lado del material para todos los materiales que estén siendo usados por un solo objeto para qué Blender le de el valor 2 y no nos lo borre. Si queremos crear con Python un material en un objeto y que luego no sea borrado si más adelante queremos borrar materiales, en el mismo script podemos definir que tenga el valor 2 como si pulsamos la F. Me explico fatal, échale un vistazo.
-- IMÁGENES ADJUNTAS --
https://foro3d.com/attachment.php?attachmentid=225600
-
1 Archivos adjunto(s)
Bake de normal maps mediante script
Muchas gracias a todos por vuestra ayuda.
Mil gracias Juani sin tu ayuda, no creo que estuviera acabado el script.
Dejo un blend con el resultado final.
Seguro que puedes optimizar y limpiar el código.
La cuestión es que yo lo utilizo para después exportarlo como formato FBX a Unity 3D.
Con el script obtengo un mesh de cada imagen de elevación del terreno, exporto a formato fbx.
Después copio las texturas del mapa diffuse/color y las del NormalMap junto al fichero FBX en el directorio de Unity 3D.
El fichero *.fbx detecta la textura y el mapa de desplazamiento del material.
Ahora, estoy dándole al coco, y como tu comentabas Juani.
Estaría bien poder empaquetar todo en el fichero blend para poder seguir trabajando en Blender.
Por si alguien quiere utilizar el script y seguir trabajando en Blender, para él propósito que se le ocurra.
Animación videojuegos vr etc.
Te agradecería me dijeras la mejor opción, para poder empaquetar el fichero blend con sus texturas y que el usuario pueda trabajar más cómodamente.
Creo que he logrado modificar el script y de esta manera empaquetar todas las texturas.
Te agradecería me dijeras estoy en lo cierto Juanai. Gracias por tu ayuda y tiempo Juani.
-- IMÁGENES ADJUNTAS --
https://foro3d.com/attachment.php?attachmentid=225605
-
Bake de normal maps mediante script
Pensaba qué ya tendría suficiente con el script.
Pero ahora me doy cuenta que con la nueva versión de Unity se puede trabajar directamente con ficheros *.blend y mientras trabajas en el fichero blend los resultados se actualizan en el proyecto de Unity 3D.
La mala suerte es que Unity no asigna las texturas a los materiales y tienes que seleccionarlas manualmente.
En un proyecto con pocos materiales es viable, pero en una prueba de la generación del modelo 3D de toda España no es muy practico.
¿Se os ocurre alguna solución?
Un saludo y gracias por vuestro tiempo y ayuda.
-
Bake de normal maps mediante script
Buenas, las texturas están bien empacadas, pero habrá que modificar el script para que cuando lo ejecutemos, primero desempaque las texturas a un directorio local y luego se siga ejecutando el código para que está coja las texturas de la carpeta ya creada con ellas. Por cierto, el relieve que simula el mapa de normales no lo noto, se encarga de esto el addon es que no lo he instalado. El script funciona bien, solo que da el error lógico de que no encuentra las texturas porque la ruta que tú pones es la tuya.
-
Bake de normal maps mediante script
Gracias Juani.
En principio el script crea una carpeta textures dentro del directorio donde se encuentra el fichero blend, genera el mapa de normales y lo guarda en el directorio textures.
El lunes colgare un video de cómo funciona el script y un enlace con Blender y el addon Blendergis instalado con texturas para que lo pruebes sin problemas.
Y toca el código como tu veas que es más conveniente.
Te lo quería mandar ahora, pero estoy con un pc con Linux y el script no funciona.
Una de las cosas que seria conveniente es que el mapa de normales se pueda guardar en un directorio asignado por el usuario y no en el directorio textures que se crea por defecto, como el script
trabaja ahora te obliga a trabajar con el *.blend guardado porque si no el script no sabe dónde crear el directorio textures.
Gracias por tu tiempo y ayuda Juani.
-
Bake de normal maps mediante script
Dejo un fichero (*.zip) con una versión de Blender portable para Windows 64, con el addon BlenderGis instalado.
El resultado del script con 226 imágenes, el fichero blend empaquetado con sus meshs y materiales y el bake del normalMap. Gracias por tu ayuda Juani.
El problema qué tiene el script es que. Hasta qué no llega al final del listado no muestra nada y si peta por alguna razón se puede perder el trabajo realizado.
¿Es posible que cada 10 ficheros? Por ejemplo.colocar un autosave para ir guardando poco a poco?
Mañana intentare colgar un manual de cómo utilizarlo.
https://mega.nz/#.SlwmkQSb.C8QToSR_TtCiRrNvVfgEw0CsXq6o-OIKtR9o7ix0mQ.