🐾
NutriPaw — Render Automation Pipeline
Blender Headless · CalmPaw 150g · Batch Render
Cycles CUDA GPU 256 samples OIDN Denoising
Pipeline de Ejecución
Paso 1
⚙️
Render Engine
Cycles + GPU
Paso 2
📐
Resolución
2000×2000 RGBA
Paso 3
💡
Iluminación
3-Point + HDRI
Paso 4
🎨
Materiales PBR
Principled BSDF
Paso 5
📸
Batch Cameras
4 ángulos
Paso 6
🎬
Turntable MP4
36 frames → ffmpeg
🎥
4
Cámaras de Producto
🖼️
40
Imágenes Totales
~4m
Tiempo por Frame
🏎️
RTX 4090
GPU de Renderizado
Configuración de Render nutripaw_calmpaw.blend
Motor
CYCLES
Dispositivo
GPU / CUDA
Muestras
256
Denoising
OIDN ✓
Resolución
2000×2000
Color Mode
RGBA
Formato
PNG + JPEG
Fondo Transparente
film_transparent
Script Principal nutripaw_render.py
🐍 nutripaw_render.py
import bpy, os, math from mathutils import Vector # ── Render Engine Setup ────────────────── scene = bpy.context.scene scene.render.engine = 'CYCLES' cycles = scene.cycles cycles.samples = 256 cycles.use_denoising = True cycles.denoiser = 'OPENIMAGEDENOISE' cycles.device = 'GPU' prefs = bpy.context.preferences.addons['cycles'].preferences prefs.compute_device_type = 'CUDA' prefs.get_devices() for dev in prefs.devices: dev.use = True # ── Output Settings ────────────────────── r = scene.render r.resolution_x = r.resolution_y = 2000 r.image_settings.file_format = 'PNG' r.image_settings.color_mode = 'RGBA' r.film_transparent = True # ── Materials PBR ──────────────────────── def pbr(name, color, metallic=0, roughness=0.5): mat = bpy.data.materials.new(name) mat.use_nodes = True bsdf = mat.node_tree.nodes.get("Principled BSDF") bsdf.inputs['Base Color'].default_value = (*color, 1) bsdf.inputs['Metallic'].default_value = metallic bsdf.inputs['Roughness'].default_value = roughness return mat bote = bpy.data.objects["Bote_CalmPaw"] bote.data.materials[0] = pbr("Bote_Blanco", (0.95,0.95,0.95), roughness=0.6) bote.data.materials[1] = pbr("Tapa_Dorada", (0.9,0.75,0.3), metallic=1.0, roughness=0.15) # ── Batch Cameras ──────────────────────── OUTPUT = "/renders/nutripaw/" os.makedirs(OUTPUT, exist_ok=True) cameras = [o for o in bpy.data.objects if o.type=='CAMERA'] for cam in cameras: scene.camera = cam r.filepath = os.path.join(OUTPUT, f"{cam.name}.png") bpy.ops.render.render(write_still=True)
Cámaras de Producto 4 shots
Cámara Ángulo Focal f-stop Estado
cam_front Frontal 0° 50mm f/2.8 ✓ Done
cam_34 3/4 Vista 45° 50mm f/2.8 ✓ Done
cam_side Lateral 90° 85mm f/4.0 ✓ Done
cam_top Cenital 90°↓ 35mm f/8.0 ⏳ Queue
Setup de Iluminación 3-Point HDRI + Area Lights
🫙
☀️
Key Light
800W
💙
Fill Light
200W
🔆
Rim Light
400W
Key: Area 800W superior-izq Fill: Area 200W lateral derecho Rim: Area 400W trasero HDRI: studio_small_03_4k.hdr
Materiales PBR — Principled BSDF CalmPaw 150g
Bote_Blanco
Cuerpo principal · Plástico mate
Metallic 0%
Roughness 60%
Tapa_Dorada
Tapón metálico · Aluminio anodizado
Metallic 100%
Roughness 15%
Etiqueta_Verde
Etiqueta papel · Print PBR
Metallic 0%
Roughness 80%
Turntable 360° — 36 Frames 24fps → MP4
🫙
001
🫙
002
🫙
003
🫙
004
🫙
005
🫙
006
🫙
007
🫙
008
🫙
009
🫙
010
🫙
011
🫙
012
🫙
013
🫙
014
🫙
015
🫙
016
🫙
017
🫙
018
🫙
019
🫙
020
🫙
021
🫙
022
🫙
023
🫙
024
025
026
027
028
029
030
031
032
033
034
035
036
Progreso: 24/36 frames (66%)
$ ffmpeg -framerate 24 -i frame_%03d.png \ -c:v libx264 -pix_fmt yuv420p \ -crf 18 -preset slow \ turntable_final.mp4
Árbol de Salida /renders/nutripaw/
📁
/renders/nutripaw/
📄
nutripaw_render.py
4.2 KB
📁
product_shots/
┃ 🖼️
cam_front.png
8.4 MB
┃ 🖼️
cam_34.png
8.1 MB
┃ 🖼️
cam_side.png
7.9 MB
┃ 🖼️
cam_top.png
⏳ pending
📁
turntable/
┃ 🖼️
frame_001.png … frame_024.png
~192 MB
┃ 🎬
turntable_final.mp4
⏳ pending
Comando CLI (headless):
$ blender calmpaw.blend \ --background \ --python nutripaw_render.py $ blender calmpaw.blend \ --background \ --render-frame 1..36 \ --render-output turntable/frame_