如何保存渲染对象图像?新手脚本实现单对象渲染存图与FBX导出
解决选中对象单独导出FBX并渲染为同名PNG的问题
嘿,作为脚本新手能写出这样的核心逻辑已经很棒了!你的代码目前有两个小问题导致渲染结果不符合预期:一是渲染输出文件名写死成了固定值,每次循环都会覆盖之前的图片;二是遍历的是场景里所有几何体,而不是你选中的对象集合。
下面是修改后的完整脚本,我会逐个说明关键改动:
-- 先获取当前选中的对象集合,确保只处理你手动选中的内容 selectedObjs = selection as array -- 遍历每个选中的对象 for obj in selectedObjs do ( -- 单独选中当前对象(确保导出和渲染只针对这一个) select obj -- 处理FBX导出的路径与文件名 exportDir = pathConfig.GetDir #Export fbxFileName = obj.name + ".fbx" fbxFilePath = (exportDir + "/" + fbxFileName) -- 导出当前对象为FBX文件 exportFile fbxFilePath #noPrompt selectedOnly:true using:FBXEXP -- 处理渲染输出的路径与文件名(用对象名命名PNG) renderFileName = obj.name + ".png" renderFilePath = (exportDir + "/" + renderFileName) -- 渲染当前选中对象,输出为同名PNG render renderType:#selected outputFile:renderFilePath frame:1 )
关键改动拆解:
- 锁定处理范围:用
selection as array获取你选中的对象集合,替换原代码的geometry,这样就不会误处理场景里没选中的几何体了 - 动态生成文件名:把固定的
"testRender.png"改成obj.name + ".png",每个对象的渲染图都会用自己的名字保存,再也不会被覆盖 - 拆分路径逻辑:把FBX和渲染的路径分开处理,逻辑更清晰,后续要改保存位置也更方便
- 明确渲染帧:保留
frame:1确保渲染第一帧,避免出现意外的帧渲染问题
可选优化建议(适合进阶):
- 清理非法文件名:如果对象名称包含
/ \ : * ? " < > |这些系统不允许的字符,会导致保存失败,可以加一段代码替换:-- 替换所有非法字符为下划线 cleanName = replaceString obj.name "/" "_" cleanName = replaceString cleanName "\\" "_" cleanName = replaceString cleanName ":" "_" cleanName = replaceString cleanName "*" "_" cleanName = replaceString cleanName "?" "_" cleanName = replaceString cleanName "\"" "_" cleanName = replaceString cleanName "<" "_" cleanName = replaceString cleanName ">" "_" cleanName = replaceString cleanName "|" "_" -- 之后用cleanName代替obj.name生成文件名 - 确保导出目录存在:如果默认导出目录还没创建,脚本会报错,可以提前检查并创建:
exportDir = pathConfig.GetDir #Export if doesDirectoryExist exportDir == false do makeDir exportDir - 关闭渲染窗口:如果不想每次渲染都弹出窗口,可以给
render命令加个参数:render renderType:#selected outputFile:renderFilePath frame:1 showRenderWindow:false
这样修改后,你选中的每个对象都会被单独导出为FBX,同时生成一张以对象名称命名的PNG渲染图,全部保存在3ds Max的默认导出目录里~
内容的提问来源于stack exchange,提问作者Van C
相关产品推荐
相关产品推荐

