c# 运行批处理文件以进行搅拌机导出的进程被暂停

Posted

技术标签:

【中文标题】c# 运行批处理文件以进行搅拌机导出的进程被暂停【英文标题】:c# process that running a batch file for blender exporting gets paused 【发布时间】:2017-12-20 12:04:26 【问题描述】:

希望有人能帮我解决这个问题。

情况:

我需要将一个动画从搅拌机导出为一个序列,它必须在 c# 应用程序中触发。我正在使用带有 python 脚本的 blenders obj exporter,它与这个 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 Files\Blender Foundation\Blender\blender.exe" "C:\Users\holgk\Documents\Some Folders\Test.blend" --background --python "C:\Program Files\Blender Foundation\Blender\convert_blend_to_obj.py" -- "C:\Users\holgk\Documents\Some Folders\Test.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 shell 时,一切正常。对于每一帧,都会创建一个 obj 文件。但是当我使用我的 c# 应用程序时,cmd 行是打开的,blender 开始执行,并且对于第一帧大约 250 帧中的 12 帧,一切正常,然后什么也没发生,应用程序仍在等待退出,但没有新的 obj文件已创建。

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

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

【问题讨论】:

【参考方案1】:

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

您似乎没有发现错误,并且搅拌机永远不会被终止,所以它会继续运行。

首先,你应该将你的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脚本成功,因为即使使用 sys.exit(1) 搅拌机也会终止带有成功消息。

添加类似这样的内容,将您的错误消息写入您以后可以读取的文件(或者您的 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())

如果这对您进一步解开谜团有帮助,请告诉我

【讨论】:

以上是关于c# 运行批处理文件以进行搅拌机导出的进程被暂停的主要内容,如果未能解决你的问题,请参考以下文章

从搅拌机导出动画以与 Assimp 一起使用

Threejs 搅拌器导出器以错误的格式导出

从 .blend 文件导出对象到 Unity,对象被翻转

如何将搅拌机中的所有动作(动画)导出到文件。 FBX?

如何从 vtk 中提取纹理以用于搅拌机?

带有骨骼动画(搅拌机导出)的模型在三个.js 中动画不正确