Blender实时切换平面纹理方法咨询 旧版Python脚本无法运行求助
Blender 2.8+ 实时切换位移纹理适配方案
前置准备
- 确认平面已添加位移修改器,且为平面的第一个修改器(如果位置不对可自行修改代码中修改器的索引值)
- 确认串口端口号、波特率和Processing侧配置完全一致
- 确认1.png~20.png与当前Blender工程文件存放在同一文件夹下
适配新API的可运行代码
import bpy import serial import os # 配置参数 SERIAL_PORT = "COM11" SERIAL_BAUD = 9600 TEXTURE_NAME = "Textura" # 和你工程里的纹理名称保持一致 PLANE_OBJ_NAME = "Plane" MAX_IMG_NUM = 20 # 初始化串口 try: myPort = serial.Serial(SERIAL_PORT, SERIAL_BAUD, timeout=1) myPort.flushInput() except Exception as e: print(f"串口打开失败:{e}") raise # 获取工程所在目录,自动拼接图片路径 blend_dir = os.path.dirname(bpy.data.filepath) # 获取已有纹理,不存在则新建 if TEXTURE_NAME in bpy.data.textures: texture = bpy.data.textures[TEXTURE_NAME] else: texture = bpy.data.textures.new(name=TEXTURE_NAME, type='IMAGE') # 获取平面对象和位移修改器 plane = bpy.data.objects[PLANE_OBJ_NAME] modifier = plane.modifiers[0] modifier.texture = texture # 实时更新回调函数 def update_texture(scene): if myPort.in_waiting > 0: # 读取串口传来的序号,取模实现1-20循环 y = ord(myPort.read(size=1)) % MAX_IMG_NUM img_num = y if y !=0 else MAX_IMG_NUM img_name = f"{img_num}.png" img_path = os.path.join(blend_dir, img_name) # 加载或刷新图片 if img_name in bpy.data.images: img = bpy.data.images[img_name] img.reload() else: if os.path.exists(img_path): img = bpy.data.images.load(img_path) else: print(f"图片{img_path}不存在") return texture.image = img # 强制刷新视图 for area in bpy.context.screen.areas: if area.type == 'VIEW_3D': area.tag_redraw() # 绑定帧更新回调,每帧检查串口数据更新纹理 bpy.app.handlers.frame_change_pre.append(update_texture) # ------------------- 导出动画专用配置(不需要实时串口的话用这段)------------------- # 如果不需要实时串口,要直接导出1-20循环的动画,替换上面的update_texture函数即可 # def update_texture_render(scene): # img_num = scene.frame_current % MAX_IMG_NUM # img_num = img_num if img_num !=0 else MAX_IMG_NUM # img_name = f"{img_num}.png" # img_path = os.path.join(blend_dir, img_name) # if img_name in bpy.data.images: # img = bpy.data.images[img_name] # img.reload() # else: # if os.path.exists(img_path): # img = bpy.data.images.load(img_path) # else: # return # texture.image = img # bpy.app.handlers.frame_change_pre.append(update_texture_render)
使用说明
- 运行脚本后,点击时间轴的播放按钮,即可实时接收Processing传来的序号,自动切换平面的位移纹理
- 需要导出动画序列时,注释掉实时串口的回调绑定,启用导出专用的回调配置,设置好渲染的帧范围、输出路径后直接渲染动画即可,纹理会自动按1-20的顺序循环切换
注意事项
- 如果运行时提示找不到serial模块,需要先在Blender自带的Python环境中安装pyserial库,安装命令为
Blender安装目录下的python.exe -m pip install pyserial - 如果图片更新后位移效果没有变化,检查位移修改器的「强度」参数是否设置为非0值
内容的提问来源于stack exchange,提问作者Katrina Galea
相关产品推荐
相关产品推荐

