You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

使用说明

  1. 运行脚本后,点击时间轴的播放按钮,即可实时接收Processing传来的序号,自动切换平面的位移纹理
  2. 需要导出动画序列时,注释掉实时串口的回调绑定,启用导出专用的回调配置,设置好渲染的帧范围、输出路径后直接渲染动画即可,纹理会自动按1-20的顺序循环切换

注意事项

  • 如果运行时提示找不到serial模块,需要先在Blender自带的Python环境中安装pyserial库,安装命令为Blender安装目录下的python.exe -m pip install pyserial
  • 如果图片更新后位移效果没有变化,检查位移修改器的「强度」参数是否设置为非0值

内容的提问来源于stack exchange,提问作者Katrina Galea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 11:48:04