[Projeto] Ray Tracing em Java

20 respostas
ViniGodoy

Oi pessoal.

Estava querendo desenvolver uma engine de RayTracing em Java desde o momento que um amigo me indicou um excelente tutorial do FlipCode. Esse domingo, tomei coragem e resolvi implementar.

Este é o screenshot do resultado:

Essa aplicação usa apenas Java2D básico. Na verdade, apenas a função drawLine para desenhar um único pixel.
A imagem é gerada pixel-a-pixel.

Quem quiser conhecer o código fonte, está no meu GitHub:

Quem só quiser baixar o .jar para ver rodando na máquina, está aqui:
https://github.com/ViniGodoy/raytracer/raw/master/out/artifacts/raytracer/raytracer.jar

Cheguei apenas a segunda parte do tutorial, pretendo desenvolver o resto no futuro.
A boa notícia é que em Java ficou muitíssimo mais rápido do que o original em C++.

20 Respostas

J

E o arquivo das formas geometricas? Não são meshs geradas de algum programa 3d?

**Edit, olhei o código fonte lá. São apenas pontos num espaço 3d sem muitas firulas. Ficou muito bom. E o tutorial é explêndido.

ViniGodoy

Como são círculos e planos, não precisei de nenhum arquivo de mesh. Os dois são facilmente descritos matematicamente.

J

O tal do raytracing sempre foi algo que me chamava a atenção. Esse aqui na minha opinião é um dos grandes.

http://www.luxrender.net/en_GB/index

ViniGodoy

Tem esses também:


Marky.Vasconcelos

Grande Viny,

Deu erro aqui no ubuntu mas irei testar de casa o render, pela foto já estou impressionado.

ViniGodoy

É uma aplicação Java 7, Marky.

Danielrricci

Opa Vini! Este tutorial está aqui no guj ou no pontov?

ViniGodoy

Não tem tutorial, não. Pelo menos ainda. Somente esse que indiquei, que não é meu.

Quero me aprofundar na técnica antes de escrever. Incluir translucidez, texturas, otimizações, efeitos de lentes, etc.

Eu falo sobre raytracing nas minhas aulas de cg. E fazia algum tempo que queria escrever um em Java.

ViniGodoy

Além de uma grande refatoração no código feita na semana passada, adicionei a refração da luz aos materiais do ray tracer, o que permite a construção de materiais translúcidos:

j0nny

Muito legal o projeto Viny.
Estou fazendo meu TCC para visualização de arquivos DICOM no Android, e no final do projeto umas das metas é implementar ray tracing. Você acha que teria algum problema de performance usar sua lib no Android?

ViniGodoy

j0nny:
Muito legal o projeto Viny.
Estou fazendo meu TCC para visualização de arquivos DICOM no Android, e no final do projeto umas das metas é implementar ray tracing. Você acha que teria algum problema de performance usar sua lib no Android?

Com certeza. RayTracing não é uma técnica de real time (a menos claro, que usassemos o OpenCL efetivamente, o que não faço em minha implementação). Mesmo sem a transparência, vai ficar pesadinho. Mas vc pode baixar os códigos e testar.

Você já tem o leitor DICOM para Java? Estou trabalhando atualmente com imageamento médico, gostaria de saber mais sobre seu projeto. Mas hoje faço em C++ mesmo, usando QT. Numa dessas te ajudo com seu projeto.

j0nny

ViniGodoy:
j0nny:
Muito legal o projeto Viny.
Estou fazendo meu TCC para visualização de arquivos DICOM no Android, e no final do projeto umas das metas é implementar ray tracing. Você acha que teria algum problema de performance usar sua lib no Android?

Com certeza. RayTracing não é uma técnica de real time. Mesmo sem a transparência, vai ficar pesadinho. Mas vc pode baixar os códigos e testar.

Você já tem o leitor DICOM para Java? Estou trabalhando atualmente com imageamento médico, gostaria de saber mais sobre seu projeto. Mas hoje faço em C++ mesmo, usando QT.

Então, como é para Android, estou usando Java mesmo. Por enquanto estou usando a lib dcm4che (http://www.dcm4che.org/), já consegui os dados do paciente e tal, mas estou com bastante dificuldades em extraitr os dados das imagens em si para fazer a visualização.

ViniGodoy

j0nny:

Então, como é para Android, estou usando Java mesmo. Por enquanto estou usando a lib dcm4che (http://www.dcm4che.org/), já consegui os dados do paciente e tal, mas estou com bastante dificuldades em extraitr os dados das imagens em si para fazer a visualização.

Eu vou usar a DICOM sdl, mas para ser sincero, comecei o projeto na semana passada e ainda estou tomando pé.
https://code.google.com/p/dicomsdl/

j0nny

ViniGodoy:
j0nny:

Então, como é para Android, estou usando Java mesmo. Por enquanto estou usando a lib dcm4che (http://www.dcm4che.org/), já consegui os dados do paciente e tal, mas estou com bastante dificuldades em extraitr os dados das imagens em si para fazer a visualização.

Eu vou usar a DICOM sdl, mas para ser sincero, comecei o projeto na semana passada e ainda estou tomando pé.
https://code.google.com/p/dicomsdl/

Também comecei faz duas semanas, e travei nessa fase de leitar dos pixels e preciso exibir usando OpenGL.

j0nny

j0nny:
ViniGodoy:
j0nny:

Então, como é para Android, estou usando Java mesmo. Por enquanto estou usando a lib dcm4che (http://www.dcm4che.org/), já consegui os dados do paciente e tal, mas estou com bastante dificuldades em extraitr os dados das imagens em si para fazer a visualização.

Eu vou usar a DICOM sdl, mas para ser sincero, comecei o projeto na semana passada e ainda estou tomando pé.
https://code.google.com/p/dicomsdl/

Também comecei faz duas semanas, e travei nessa fase de leitar dos pixels e preciso exibir usando OpenGL.

Apenas a título de curiosidade, consegui pegar meu array de bytes e gerar um bitmap no Android pra exibir minhas fatias do arquivo DICOM, usando para leitura a lib DCM4CHE, agora entro na fase de usar o OpenGL.

ViniGodoy

Estou pensando em continuar esse projeto, mas estou na dúvida se sigo em frente com Java ou troco para C++.
O grande problema é a falta de sobrecarga de operadores em Java.

Essa falta torna a programação de aplicações matemáticas como essa insuportavelmente verbosas e pouco legíveis.

Uma pena que não programem esse tipo de feature para futuras versões do Java.

ViniGodoy

Resolvi continuar com o Java. Fiz um reset das classes, e comecei numa nova arquitetura, muito mais flexível, robusta, e com uma matemática mais elegante e correta. Ainda não implementei reflexos, sombras e nem translucidez, mas o projeto já conta com super sampling (anti-aliasing - com vários algoritmos), imagem em perspectiva com a câmera ajustável, iluminação direcional e ponto baseadas em BRDFs.

Eis o primeiro screenshot mais interessante:

Outros screenshots podem ser encontrados no site do projeto.

ViniGodoy

Outra foto do projeto, agora com profundidade de campo, sombras e brilho especular:

A título de comparação, a image com o foco no fundo:

ViniGodoy

Para quem está acompanhando o projeto por aqui, aqui vai um link recente. Adicionei possibilidade de fazer trace de outros objetos, além de a possibilidade de realizar sobre eles transformações lineares (girar, mover, esticar, etc):

ViniGodoy

Acabei de atualizar o código do meu ray tracer para o Java 8:

Só o que mudou por enquanto foi a classe SampleFrame, que fazia uso de listeners e Runnables. E realmente a sintaxe do lambda ajudou a reduzir MUITO a verbosidade do código: https://github.com/ViniGodoy/raytracer/blob/master/src/br/com/vinigodoy/raytracer/gui/SampleFrame.java

Criado 2 de junho de 2013
Ultima resposta 23 de mar. de 2014
Respostas 20
Participantes 5