将多个模型上传到Sketchfab
下面是一段用Blender的Python写的代码
import bpy
import os
import subprocess
import time
bpy.data.materials["Material"].use_face_texture = True
customer_id = "john33"
image1 = "orangeskin.jpg" # define image 1 from folder
imagepath1 = "C:\\Users\\mrryan\\Desktop\\models\\materialsjpeg\\"
image2 = "elec.jpg"
imagepath2 = "C:\\Users\\mrryan\\Desktop\\models\\materialsjpeg\\"
#Step 1 go to Edit Mode
bpy.ops.object.editmode_toggle()
#step 2 insert image in the Image Editor
bpy.context.area.type = 'IMAGE_EDITOR'
bpy.ops.uv.smart_project()
bpy.ops.image.open(filepath = image1, directory= imagepath1 ,
files=[{"name":image1, "name":image1}])
#Step 3 back to Object Mode TRY AND CHANGE TITLE TO `CUSTOMER_ID AND FILE`
bpy.ops.object.editmode_toggle()
bpy.data.window_managers["WinMan"].sketchfab.title = "orangetube"
#Step 4 save new.blend
filepath = os.path.join(r"C:\Users\mrryan\Desktop", customer_id + "orangytube.blend")
bpy.ops.wm.save_as_mainfile(filepath = filepath)
toggleedit = bpy.ops.object.editmode_toggle()
#here is the problem!!!!
subprocess.call(["bpy.ops.export.sketchfab()"], shell = True)
#new texture
#Step 1 go to Edit Mode
#step 2 insert image in the Image Editor
bpy.context.area.type = 'IMAGE_EDITOR'
bpy.ops.image.open(filepath= image2, directory= imagepath2,
files= [{"name":image2,"name":image2}])
bpy.ops.uv.smart_project()
#Step 3 back to Object Mode
bpy.ops.object.editmode_toggle()
bpy.data.window_managers["WinMan"].sketchfab.title = "elec-tube"
#Step 4 save new.blend
filepath = os.path.join(r"C:\Users\mrryan\Desktop", customer_id + "elec-tube.blend")
bpy.ops.wm.save_as_mainfile(filepath = filepath)
bpy.ops.export.sketchfab()
这个代码的目的是想通过编程的方式,改变当前选中的物体(这个物体是组合的,但还没有和其他物体合并),让它有不同的材质,改变形状等等。每一个单独的模型组合都会单独上传到Sketchfab,并保存为一个Blender文件。
目前我遇到的问题是,在上传的时候,脚本没有等到第一次上传完成就开始下一步。这就导致出现一个错误提示,让我等当前的上传完成,结果只上传了一个模型。我尝试过使用subprocess.Popen,但没有成功。可能是返回值不对?我该怎么让脚本先上传第一个模型,等上传完成后再继续调整,然后再上传第二个模型呢?
1 个回答
0
我在Sketchfab工作,但对Blender脚本不太熟悉。
现在的问题是,Sketchfab的Blender导出工具使用了一个线程来上传,这意味着在后台还有一个线程在运行,而子进程会返回。
我会尝试用一个新的线程来启动 bpy.ops.export.sketchfab()
,然后使用 join()
,而不是仅仅使用子进程。
以下资源可能会对你有帮助:
- python多线程等待所有线程完成
- https://docs.python.org/2/library/multiprocessing.html
- http://www.blender.org/documentation/blender_python_api_2_62_2/info_gotcha.html#strange-errors-using-threading-module
告诉我们结果如何!