Pergunta

Estou trabalhando em um aplicativo que precisa renderizar rapidamente cenas 3D simples no servidor e depois retorná-las como JPEG via HTTP.Basicamente, quero poder simplesmente incluir uma cena 3D dinâmica em uma página HTML, fazendo algo como:

<img src="http://www.myserver.com/renderimage?scene=1&x=123&y=123&z=123">

Minha dúvida é sobre quais tecnologias usar para fazer a renderização.Em um aplicativo de desktop, eu usaria naturalmente o DirectX, mas temo que possa não ser ideal para um aplicativo do lado do servidor que criaria imagens para dezenas ou até centenas de usuários em conjunto.Alguém tem alguma experiência com isto?Existe uma API 3D (de preferência disponível gratuitamente) que seria ideal para esta aplicação?É melhor escrever um renderizador de software do zero?

Minhas principais preocupações sobre o uso de DirectX ou OpenGL é se ele funcionará bem em um ambiente de servidor virtualizado e se faz sentido com hardware de servidor típico (sobre o qual tenho pouco controle).

Foi útil?

Solução

O RealityServer por imagens mentais foi projetado para fazer exatamente o que é descrito aqui.Mais detalhes estão disponíveis na página do produto (incluindo uma Developer Edition para download).

Documentos do RealityServer

Outras dicas

Eu diria que sua melhor aposta é ter um aplicativo Direct3D/OpenGL rodando no servidor (sem parar).Em seguida, faça com que a página do servidor envie uma solicitação ao aplicativo de renderização e faça com que o aplicativo de renderização envie um jpg/png/qualquer coisa de volta.

  • Se o Direct3D/OpenGL for muito lento para renderizar a cena no hardware, qualquer solução de software será pior
  • Ao manter o aplicativo de renderização em execução, você evita a sobrecarga de criação/destruição de texturas, backbuffers, buffers de vértice, etc.Você poderia potencialmente renderizar uma cena simples centenas de vezes por segundo.

No entanto, muitos servidores não possuem placas gráficas.Direct3D é praticamente inútil em software (há um dispositivo emulado da Ms, mas só é bom para testar efeitos), nunca tentei OpenGL em software.

Você poderia agrupar o Pov-ray (aqui usando POSIX e a compilação do Windows).Exemplo PHP:

<?php
chdir("/tmp");
@unlink("demo.png");
system("~janus/.wine/drive_c/POV-Ray-v3.7-RC6/bin/pvengine-sse2.exe /render demo.pov /exit");
header("Content-type: image/png");
fpassthru($f = fopen("demo.png","r"));
fclose($f);
?>

demo.pov disponível aqui.

Você poderia usar uma linguagem de modelo como Jinja2 para inserir suas próprias coordenadas de câmera.

Não tanto uma API, mas sim um renderizador; Povray?Também parece existir uma http interface...

Você também pode olhar para Java3D (https://java3d.dev.java.net/), o que seria uma solução elegante se a arquitetura do seu servidor já fosse baseada em Java.

Eu também recomendo tentar usar uma solução de renderização somente de software, se possível - tentar lidar com uma série de processos de servidor que estão fazendo demandas simultâneas no hardware de renderização 3D parece muito trabalhoso.

Yafaray (http://www.yafaray.org/) pode ser uma boa primeira escolha a ser considerada para renderização 3D geral.É razoavelmente rápido e os resultados parecem ótimos.Ele pode ser usado em outro software, por ex.o modelador 3D do Blender.A licença é LPGL.

Se o software do lado do servidor for escrito em Python e a cena 3D desejada for uma visualização de dados científicos, consulte o MayaVi2 http://mayavi.sourceforge.net/, ou se não, dê uma olhada em http://www.vrplumber.com/py3d.py

Aqueles que sugerem o popular POV-Ray precisam perceber que não é uma biblioteca ou qualquer tipo de entidade que oferece uma API.O processo do lado do servidor precisaria escrever um arquivo de cena de texto, executar um novo processo para executar o POV-Ray com as opções corretas e obter o arquivo de imagem resultante.Se isso for fácil de configurar para um aplicativo específico e se você tiver mais experiência com POV-Ray do que com outros renderizadores, vá em frente!

A renderização no lado do servidor só faz sentido se a cena consistir em um grande número de objetos, de modo que o download do conjunto de dados para o cliente para renderização do cliente seja muito lento e não se espera que a renderização seja em tempo real.A renderização do lado do cliente não é muito difícil se você usar algo como jogl juntamente com o download progressivo de cenas (ou seja,baixar objetos de primeiro plano e renderizar e, em seguida, baixar objetos de forma incremental com base na distância do ponto de vista e renderizar novamente).

Se você realmente deseja fazer a renderização no lado do servidor, você pode querer separar a parte do servidor web e a parte de renderização em dois computadores, cada um configurado de maneira ideal para sua tarefa (o renderizador possui placa OpenGL, HD mínimo e RAM suficiente, o servidor possui muitos discos rápidos, muita memória RAM, backups e sem OpenGL).Duvido muito que você consiga renderizar hardware em um servidor virtualizado, pois o servidor provavelmente não possui GPU.

Confira wgpu.net.

Eu acho que é muito útil.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top