[Projeto] Ray Tracing em Java

20 respostas
V

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.

V

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

V

Tem esses também:


M

Grande Viny,

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

V

É uma aplicação Java 7, Marky.

D

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

V

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.

V

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:

J

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?

V

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.

J

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.

V

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/

J

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.

J

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.

V

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.

V

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.

V

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:

V

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):

V

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