[Projeto] Ray Tracing em Java

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++.

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.

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

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

Tem esses também:


Grande Viny,

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

É uma aplicação Java 7, Marky.

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

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.

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:

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?

[quote=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?[/quote]

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.

[quote=ViniGodoy][quote=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?[/quote]

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.[/quote]

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.

[quote=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.[/quote]

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/

[quote=ViniGodoy][quote=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.[/quote]

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/[/quote]

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

[quote=j0nny][quote=ViniGodoy][quote=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.[/quote]

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/[/quote]

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

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.

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.

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.

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:

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