【问题标题】:Blender 3D render Java servlet interfaceBlender 3D 渲染 Java servlet 接口
【发布时间】:2012-11-20 23:07:44
【问题描述】:

我需要在服务器中进行 3D 渲染静止图像。我被告知 Java servlet 会这样做。我正在研究它以获得快速原型并且被卡住了。

我应该如何在 Java 中调用 Blender?

import java.io.*;
import javax.servlet.http.*;

@WebServlet("/HelloworldInServlet")
public class HelloworldInServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //Run Blender on server (localhost for now)
        // I need something here??
    }
}

【问题讨论】:

    标签: java servlets render blender


    【解决方案1】:

    我能想到的最简单的解决方案如下:

    public class RenderSceneServlet extends HttpServlet {
        protected void doGet(HttServletRequest request, HttpServletResponse response) {
            String outputFile = "/path/to/output-file";
    
            // execute command to render a frame from scene.blend
            Runtime runtime = Runtime.getRuntime();
            Process exec = runtime.exec("blender -b scene.blend -o " + outputFile + " -F JPEG -x 1 -f 1");
    
            // wait for blender to finish
            exec.waitFor();
    
            // serve the rendered file
            File file = new File(outputFile);
            byte[] bytes = FileUtils.readFileToByteArray(file);
            response.setContentLength(bytes.length);
            response.setContentType("image/jpeg");
            response.getOutputStream().write(bytes);
        }
    }
    

    你应该记住几件事:

    • outputFile 使用替代名称,否则并发请求每次都会覆盖该文件。
    • FileUtils 是 apache commons-io 中的一个类
    • 我对搅拌机不是很熟悉,所以命令行“blender -b scene.blend -o [...]”可能需要额外注意。

    【讨论】:

    • 在 byte[] bytes = FileUtils.readFileToByteArray(file);我得到 java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils。我在构建路径和类路径中有 .jar。一些研究告诉我,运行时和编译类路径可能不同。我该怎么解决??
    • @nelmMNT 要么将 commons-io jar 放在你的 servlet 容器 (=server) 的 lib 文件夹中,要么将它放在你的应用程序中 WEB-INF/lib
    • @stackoverflow.com/users/804521/yevgeniy 我成功了。谢谢。现在我想使用 request.getParameter("scene") 来选择要渲染的 3D 场景。可能有 5 个输入参数。因此,将所有内容放在 URL 中可能会造成负担(GET)。我怎样才能用 POST 发送它?我研究只是为了找到
      。我应该在我的 HTML 中硬编码吗?提前致谢。
    • 请使用谷歌在handling form data in servlet上查找教程。如果您的参数是“简单”值,例如整数或短字符串,您可能应该坚持使用 GET。使用 GET,您可以提供类似 your-host/HelloworldInServlet?scene=foo.blend&output=foo.jpg 的链接,并且您不需要表单或 javascript 来调用您的 servlet。
    • 简单的 GET 方法有效。谢谢。所以我假设,当我将 Java 代码放入服务器时,它会同时处理许多客户端请求。在需要许可证的服务器中运行的软件怎么样?是否会生成 Java 线程并为百万用户运行一个软件?
    猜你喜欢
    • 2011-07-08
    • 2011-07-09
    • 1970-01-01
    • 2016-12-20
    • 2016-05-24
    • 2017-04-16
    • 1970-01-01
    • 2018-07-07
    • 2016-06-27
    相关资源
    最近更新 更多