Esse repositório contém a implementação do PP2 relacionado a Ray Tracing e o trabalho em substituição à prova referente a WebGL.
O trabalho consiste em utilizar o Ray Tracing para visualização de três imagens:
- Imagem padrão
- Imagem com movimentação de objetos
- Imagem com movimentação de câmera
-
As imagens são geradas por meio da execução no terminal do arquivo
main.cc
por meio dos seguintes comandos em sequência:- Para compilar o arquivo:
g++ main.cc -o raytracer
- Para rodar o executável gerado no passo anterior e gerar como saída a imagem no arquivo
final_scene.ppm
:
./raytracer > final_scene.ppm
- Transforma a imagem em PNG utilizando o ImageMagick (instalação descrita abaixo!)
convert final_scene.ppm final_scene.png
- Acesse o site oficial do ImageMagick.
- Baixe o instalador adequado para sua versão do Windows.
- Execute o instalador e siga as instruções para finalizar a instalação.
- Após a instalação, adicione o caminho do ImageMagick à variável de ambiente
Path
, caso não tenha sido feito automaticamente.
No terminal, use os seguintes comandos (dependendo da distribuição):
- Ubuntu/Debian:
sudo apt update sudo apt install imagemagick
-
Primeiro, instale o Homebrew, se ainda não tiver.
-
Depois, execute o seguinte comando no terminal:
brew install imagemagick
Agora, você poderá utilizar o comando convert
para converter arquivos .ppm
para .png
ou outros formatos.
As imagens de saída geradas para essa etapa apresenta objetos relacionados ao jogo Minecraft, desenvolvido pela Mojang, contendo assim uma árvore, um baú, uma enderpearl e uma fireball. Além disso, são realizados alguns movimentos na imagem sendo um deles na câmera e outro na mudança do posicionamento entre dois objetos, sendo eles a enderpearl e a fireball.
O World Coordinate System (WCS) para este projeto é descrito pelas coordenadas fornecidas em relação a uma origem global (0, 0, 0)
com três eixos principais:
- Eixo X: Define a largura (esquerda-direita).
- Eixo Y: Define a altura (baixo-cima).
- Eixo Z: Define a profundidade (frente-trás).
A posição e o tamanho de cada objeto na cena são especificados usando esse sistema de coordenadas. As câmeras e os objetos no espaço compartilham o mesmo referencial, permitindo a criação de cenas coerentes e realistas.
Na Cena 1, uma série de cubos e objetos são posicionados dentro de uma formação 3x3. Os blocos de terra, esferas, e outros objetos são definidos usando o sistema de coordenadas mundiais.
-
Blocos de Terra (Formação 3x3):
- Cada bloco de terra é posicionado usando um loop aninhado, calculando as posições
(x, y, z)
com base no índice da linha (row
) e da coluna (col
). - O tamanho do cubo é definido pela variável
cubo_size
, e há um pequeno espaçamento entre os cubos (cubo_spacing
).
- Cada bloco de terra é posicionado usando um loop aninhado, calculando as posições
-
Enderpearl:
- Localizada no canto superior esquerdo da formação de cubos, a posição da esfera é
(0.5, cubo_size + 0.5, 0.5)
. A altura é ajustada para que a esfera fique logo acima de um dos blocos de terra.
- Localizada no canto superior esquerdo da formação de cubos, a posição da esfera é
-
Fireball:
- Localizada no canto inferior direito, com posição
(2.5, cubo_size + 0.5, 2.5)
, a esfera da Fireball também é posicionada logo acima de um bloco de terra, seguindo o mesmo princípio da Enderpearl.
- Localizada no canto inferior direito, com posição
-
Baú:
- O baú é posicionado no canto superior direito da formação. As coordenadas usadas são calculadas para que ele se alinhe com os cubos já existentes:
(2 * (cubo_size + cubo_spacing), cubo_size, 0)
.
- O baú é posicionado no canto superior direito da formação. As coordenadas usadas são calculadas para que ele se alinhe com os cubos já existentes:
-
Árvore:
- A árvore é posicionada no canto inferior esquerdo da formação, e os troncos e folhas são cuidadosamente centralizados em relação ao bloco de terra com a posição de base da árvore sendo
(0.5 * cubo_size, cubo_size, 2.5 * (cubo_size + cubo_spacing))
.
- A árvore é posicionada no canto inferior esquerdo da formação, e os troncos e folhas são cuidadosamente centralizados em relação ao bloco de terra com a posição de base da árvore sendo
-
Fonte de Luz:
- Uma esfera emissiva simulando uma fonte de luz é posicionada fora da formação de cubos, com coordenadas
(5, 5, -5)
, criando uma iluminação que incide da direita.
- Uma esfera emissiva simulando uma fonte de luz é posicionada fora da formação de cubos, com coordenadas
-
Câmera:
- A câmera está posicionada em
(6, 6, 8)
e está orientada para o ponto central da formação de cubos em(1.5, 1, 1.5)
, com uma orientação de cima para baixo definida porvup = vec3(0, 1, 0)
.
- A câmera está posicionada em
Na Cena 2, objetos foram reposicionados, como a inversão das esferas (Enderpearl e Fireball).
-
Enderpearl:
- Movida para o canto superior direito, com a nova posição
(2.5, cubo_size + 0.5, 2.5)
.
- Movida para o canto superior direito, com a nova posição
-
Fireball:
- Agora posicionada no canto inferior esquerdo, com a nova posição
(0.5, cubo_size + 0.5, 0.5)
.
- Agora posicionada no canto inferior esquerdo, com a nova posição
-
Baú e Blocos de Terra:
- Mantêm-se nas mesmas posições da Cena 1.
Na Cena 3, a maior alteração foi no posicionamento da câmera:
- Câmera:
- A câmera foi reposicionada e agora tem uma nova orientação para capturar a cena de outro ângulo. As coordenadas da câmera podem variar, mas o princípio de posicionamento segue o WCS, com
lookfrom
elookat
redefinidos para focar em diferentes partes da formação de cubos.
- A câmera foi reposicionada e agora tem uma nova orientação para capturar a cena de outro ângulo. As coordenadas da câmera podem variar, mas o princípio de posicionamento segue o WCS, com
Em suma, foi explorado ferramentas de manipulação dentro do WCS permitindo controlar com precisão o posicionamento de objetos em uma cena 3D. Nas cenas apresentadas, os objetos (cubos, esferas, e outros) são posicionados em relação aos eixos X, Y, e Z com base em loops e cálculos de espaçamento, o que garante alinhamento e organização. As câmeras são configuradas para capturar a cena a partir de diferentes pontos de vista, e as fontes de luz são posicionadas para criar uma iluminação adequada, respeitando o sistema de coordenadas global.
Esse trabalho visa, por meio de uma implementação em WebGL, mostrar na tela do usuário 2 objetos 3D com texturas, sendo dois cubos com textura de madeira, em que tem-se movimentos independentes e uma iluminação variável de acordo com o movimento realizado pelo objeto.
- Para executar o trabalho WebGL, é necessário carregar o arquivo
main.html
, que é composto pelas importações das bibliotecas utilizadas e pelo canvas inicializando o WebGL, utilizando algum tipo de servidor local. Recomendamos a extensão Live Server do Visual Studio Code (VSCode). O Live Server permite iniciar um servidor local para visualizar páginas HTML dinamicamente.
- Abra o VSCode.
- Vá até a aba de extensões (ícone de quadrado à esquerda ou pressione
Ctrl+Shift+X
). - Procure por Live Server na barra de pesquisa.
- Clique em Instalar na extensão desenvolvida por Ritwick Dey.
- Após instalar, abra o arquivo
main.html
no VSCode. - Clique com o botão direito no editor e selecione Open with Live Server ou clique no ícone de Go Live no canto inferior direito do VSCode.
- O navegador abrirá automaticamente com a visualização do seu arquivo HTML, refletindo qualquer alteração realizada.
- O arquivo
main.js
contém a lógica de renderização e animação dos objetos. - Os arquivos
.obj
correspondem aos objetos que são mostrados na tela do usuário. - Desse modo, o resultado desse trabalho pode ser visualizado por meio do GIF abaixo.
Shirley, P. (2016). Ray Tracing in One Weekend. Disponível em: https://raytracing.github.io/books/RayTracingInOneWeekend.html
Shirley, P. (2016). Ray Tracing: The Next Week. Disponível em: https://raytracing.github.io/books/RayTracingTheNextWeek.html
GitHub. Ray Tracing in One Weekend Series Books (Repositório). Disponível em: https://github.com/RayTracing/raytracing.github.io
McGuire, G. (2020). WebGL 2 Fundamentals. Disponível em: https://webgl2fundamentals.org/
🚀 | Desenvolvido por @guisantoxxx's, @mateusmatsuo, @PedroGCorreia e @Rafael-Mori-2022