运行用于 Blender 导出的批处理文件的 C# 过程将暂停



我希望有人可以帮助我解决这个问题。

情况:

我需要从 blender 导出动画作为序列,它必须在 c# 应用程序中是跳跳虎。我正在使用带有 python 脚本的 blenders obj 导出器,该脚本与此 blender wiki 中的示例几乎相同: https://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts/Import-Export/Wavefront_OBJ

这是我写的python脚本:

import bpy
import sys
argv = sys.argv
argv = argv[argv.index("--") + 1:] # get all args after "--"
obj_out = argv[0]
bpy.ops.export_scene.obj(filepath=obj_out, axis_forward='-Z', axis_up='Y', use_animation=1, keep_vertex_order=1, use_normals=1, use_materials=0)

除此之外,我还编写了以下批处理文件:

"C:Program FilesBlender FoundationBlenderblender.exe" "C:UsersholgkDocumentsSome FoldersTest.blend" --background --python "C:Program FilesBlender FoundationBlenderconvert_blend_to_obj.py" -- "C:UsersholgkDocumentsSome FoldersTest.obj"

我的 c# 代码如下所示:

using System;
using System.Diagnostics;
namespace BlenderToObjs
{
class Program
{
static void Main(string[] args)
{
ProcessStartInfo processInfo;
Process process;
processInfo = new ProcessStartInfo("cmd.exe", "/c "" + @"C:blender_export_to_obj.bat" + """);
processInfo.CreateNoWindow = false;
processInfo.UseShellExecute = false;
processInfo.RedirectStandardError = true;
processInfo.RedirectStandardOutput = true;
process = Process.Start(processInfo);
process.WaitForExit();
}
}
}

当我使用窗口 cmd 外壳时,一切都可以正常工作。对于每一帧,都会创建一个 obj 文件。但是当我使用我的 c# 应用程序时,cmd 行打开,blender 开始执行,对于大约 12 帧中的 250 帧,一切都正常工作,然后什么也没发生,应用程序仍在等待退出,但没有创建新的 obj 文件。

在我编写批处理文件之前,我尝试使用该 python 脚本直接作为进程运行 blender,我遇到了同样的问题,但它开始了,但在导出几帧后"暂停"/"停滞"。

我猜这与我的 c# 进程代码有关(因为在 cmd shell 中运行确实有效(,但我不知道我做错了什么。

可能是您的搅拌机在此过程中冻结或 obj 导出失败?

似乎您没有发现错误,Blender永远不会被终止,因此它只是继续运行。

首先,你应该将你的 Python 代码包装到 try 中,除了块:

import bpy
import sys
def main():
try:
# Do stuff
argv = sys.argv
argv = argv[argv.index("--") + 1:] # get all args after "--"
obj_out = argv[0]
bpy.ops.export_scene.obj(filepath=obj_out, axis_forward='-Z', axis_up='Y', use_animation=1, keep_vertex_order=1, use_normals=1, use_materials=0)
O.wm.quit_blender()
except:
# you could write your error file here
# exit blender
sys.exit(1)
O.wm.quit_blender()
main()

这里的问题是你不能用一个指示 python 脚本成功的退出代码退出 Blender(还,或者我从来没有弄清楚过(,因为即使使用 sys.exit(1(,Blender也会以成功消息终止。

添加类似内容的内容,将错误消息写入稍后可以读取(或 C# 代码可以读取(的文件

log.error('Failed to bake light map textures', exc_info=True)
if 'ERROR_FILE' in os.environ:
with open(os.environ['ERROR_FILE'], 'w') as file:
file.write(traceback.format_exc())

让我知道这是否有助于您进一步解决这个谜团