Projeto para a disciplina de Computação Gráfica utilizando a biblioteca ABCg.
- Matheus Silvério Oliveira - 11201720810
- Sonny Yassuaki R. Ganiko - 21050913
As funções descritas abaixo foram criadas para à Atividade 3 ou foram alteradas em relação a Atividade 2, as demais funções não listadas neste capítulo permaneceram inalteradas ou sofreram correções mínimas.
A função Window::createSpaceship()
é responsável por carregar e configurar o modelo 3D da nave espacial (spaceship) no ambiente do jogo. Ela carrega as texturas difusa e normal, o modelo 3D em si e configura os parâmetros de material necessários para a renderização.
- Carregamento do Modelo:
- Utiliza a classe
Model
para carregar o modelo 3D da nave espacial a partir de um arquivo obj. - Configura o Vertex Array Object (VAO) associado ao modelo.
- Utiliza a classe
- Carregamento das Texturas:
- Carrega a textura difusa da nave espacial a partir de um arquivo de imagem (jpg).
- Carrega a textura normal da nave espacial a partir de um arquivo de mapa normal (png).
- Configuração dos Materiais:
- Obtém os coeficientes de reflectância (Ka, Kd, Ks) e a intensidade especular (shininess) associados ao modelo no arquivo mtl correspondente.
- Posicionamento Inicial:
- Define a posição inicial da nave espacial no ambiente.
A função Window::createAsteroid()
é responsável por carregar e configurar o modelo 3D de um asteroide no ambiente do jogo. Ela carrega a textura do céu (skybox), a textura difusa do asteroide, o modelo 3D em si e configura os parâmetros necessários para a renderização.
- Carregamento do Modelo:
- Utiliza a classe
Model
para carregar o modelo 3D do asteroide a partir de um arquivo obj. - Configura o Vertex Array Object (VAO) associado ao modelo.
- Utiliza a classe
-
Carregamento da Textura do Céu (Skybox):
- Carrega a textura do céu (skybox) a partir de um diretório contendo as imagens correspondentes aos seis lados.
-
Carregamento da Textura Difusa do Asteroide:
- Carrega a textura difusa (albedo) do asteroide a partir de um arquivo de imagem (jpg).
A função Window::createSkybox()
é responsável por criar e configurar o céu (skybox) no ambiente do jogo. Ela compila e vincula os shaders específicos para o céu, gera um Vertex Buffer Object (VBO) contendo as posições dos vértices do skybox e configura o Vertex Array Object (VAO) associado ao skybox.
- Programa do Skybox:
- Compila e vincula shaders vertex e fragment específicos para o skybox.
- Usa a classe
abcg::createOpenGLProgram
para gerar o programa do skybox.
-
Geração do VBO:
- Gera um VBO para armazenar as posições dos vértices do skybox.
- Preenche o VBO com as posições predefinidas do skybox.
-
Vinculação do VAO:
- Gera um VAO para armazenar o estado de configuração do VBO.
- Vincula o VAO atual.
- Vincula o VBO ao VAO.
- Configura o atributo de posição do shader.
A função Window::onCreate()
é chamada durante a inicialização da janela do OpenGL. Ela configura o ambiente gráfico, compila shaders, cria modelos e configura a câmera. Além disso, a função chama outras funções especializadas para criar elementos específicos do jogo, como a espaçonave, asteroides, estrelas e o céu (skybox).
-
Limpeza de Buffer:
- Define a cor de limpeza do buffer de cor para preto.
- Ativa o teste de profundidade.
-
Compilação e Vinculação de Shaders:
- Compila e vincula shaders vertex e fragment para normal mapping.
- Utiliza a classe
abcg::createOpenGLProgram
para gerar o programa.
-
Espaçonave (Spaceship):
- Chama a função
createSpaceship()
para carregar e configurar a modelagem 3D da espaçonave. - Configura materiais (Ka, Kd, Ks, brilho) da espaçonave.
- Chama a função
-
Asteroides:
- Chama a função
createAsteroid()
para carregar e configurar a modelagem 3D de asteroides. - Configura texturas e materiais dos asteroides.
- Chama a função
-
Skybox:
- Chama a função
createSkybox()
para criar e configurar o céu (skybox).
- Chama a função
- Matriz de Visualização (View Matrix):
- Configura a matriz de visualização usando a função
glm::lookAt
para definir a posição da câmera (eye), o ponto de visão (at) e a direção "para cima" (up).
- Configura a matriz de visualização usando a função
-
Rotação Inicial da Espaçonave:
- Configura a rotação inicial da espaçonave.
-
Configuração Inicial das Estrelas:
- Chama a função
randomizeStar
para inicializar as posições e orientações iniciais das estrelas.
- Chama a função
A função Window::renderSkybox()
é responsável por renderizar o céu (skybox) na cena. Ela configura e utiliza shaders específicos para renderização do skybox, aplicando uma textura de mapa de cubo para criar um ambiente imersivo ao redor da cena principal.
-
Uso do Programa do Skybox:
- Ativa o programa do skybox usando
abcg::glUseProgram(m_skyProgram)
.
- Ativa o programa do skybox usando
-
Localização de Uniformes:
- Obtém as localizações das variáveis uniformes no programa do skybox, incluindo as matrizes
viewMatrix
,projMatrix
e a textura do mapa de cubo (skyTex
). viewMatrixLoc
: Localização da matriz de visualização.projMatrixLoc
: Localização da matriz de projeção.skyTexLoc
: Localização da textura do mapa de cubo.
- Obtém as localizações das variáveis uniformes no programa do skybox, incluindo as matrizes
-
Configuração das Matrizes de Visualização e Projeção:
- Configura uma matriz
projView
(100.0f) para a matriz de visualização. - Atualiza as variáveis uniformes
viewMatrix
eprojMatrix
com as matrizes de visualização e projeção.
- Configura uma matriz
-
Vinculação e Ativação de Texturas:
- Ativa a textura do mapa de cubo, que foi carregada previamente durante a inicialização.
- A textura é vinculada à unidade de textura GL_TEXTURE0.
-
Renderização do Skybox:
- Habilita o teste de profundidade e a face traseira do skybox.
- Configura a função de teste de profundidade para
GL_LEQUAL
. - Desenha os triângulos do skybox usando
abcg::glDrawArrays(GL_TRIANGLES, 0, m_skyPositions.size())
. - Restaura a função de teste de profundidade para
GL_LESS
após a renderização.
-
Desativação de Atributos e Programa:
- Desabilita a matriz de atributos do VAO do skybox.
- Desativa o programa do skybox usando
abcg::glUseProgram(0)
.
A função Window::onPaint()
é chamada para realizar a renderização principal da cena. Nesta função, objetos 3D, como a nave espacial, asteroides e o skybox, são renderizados usando shaders e técnicas de iluminação.
-
Limpeza de Buffers:
- Limpa os buffers de cor e profundidade usando
abcg::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
.
- Limpa os buffers de cor e profundidade usando
-
Configuração do Viewport:
- Configura a visualização usando
abcg::glViewport(0, 0, m_viewportSize.x, m_viewportSize.y)
.
- Configura a visualização usando
-
Uso do Programa Principal:
- Ativa o programa principal da aplicação usando
abcg::glUseProgram(m_program)
.
- Ativa o programa principal da aplicação usando
- Obtenção de Localizações Uniformes:
- Obtém as localizações das variáveis uniformes necessárias para a renderização do modelo 3D.
- Localizações incluem matrizes de visão (
viewMatrix
), projeção (projMatrix
), modelo (modelMatrix
) e normal (normalMatrix
). - Localizações de texturas e modos de mapeamento também são obtidas.
- Configuração de Iluminação e Materiais:
- Configura as propriedades de iluminação e materiais, incluindo a direção da luz (
lightDirWorldSpace
), intensidades de luz ambiente (Ia
), difusa (Id
) e especular (Is
), e coeficientes de material (Ka
,Kd
,Ks
). - Define a rugosidade do material (
shininess
).
- Configura as propriedades de iluminação e materiais, incluindo a direção da luz (
- Renderização da Nave Espacial:
- Configura a matriz de modelo para a nave espacial.
- Aplica as transformações de translação, escala e rotação.
- Renderiza a nave espacial usando
m_additionalModel.render()
.
- Renderização dos Asteroides:
- Para cada asteroide na lista, calcula a matriz de modelo e renderiza o asteroide usando
m_model.render()
.
- Para cada asteroide na lista, calcula a matriz de modelo e renderiza o asteroide usando
- Renderização do Skybox:
- Chama a função
renderSkybox()
para renderizar o skybox.
- Chama a função
- Limpeza e Desativação:
- Desativa o programa principal usando
abcg::glUseProgram(0)
.
- Desativa o programa principal usando
A função Window::onPaintUI()
é responsável por renderizar a interface gráfica do usuário (GUI) durante o processo de pintura. Ela utiliza a biblioteca ImGui para criar elementos interativos, como sliders e janelas de configuração, que permitem ao usuário ajustar parâmetros em tempo real.
- Controles de Luz:
- Utiliza sliders de cores para ajustar as propriedades de luz ambiente (
Ia
), difusa (Id
), e especular (Is
). - Os controles permitem ao usuário interagir diretamente com as propriedades de luz.
- Utiliza sliders de cores para ajustar as propriedades de luz ambiente (
-
Seleção de Projeção:
- Oferece uma caixa de combinação para escolher entre projeção perspectiva e ortográfica (
Perspective
eOrthographic
). - Atualiza a matriz de projeção com base na escolha do usuário.
- Oferece uma caixa de combinação para escolher entre projeção perspectiva e ortográfica (
-
Ajuste do Campo de Visão (FOV):
- Se a projeção perspectiva estiver selecionada, exibe um slider para ajustar o campo de visão (
FOV
) em graus. - Atualiza a matriz de projeção conforme o usuário ajusta o slider.
- Se a projeção perspectiva estiver selecionada, exibe um slider para ajustar o campo de visão (
A função Window::onDestroy()
é responsável por liberar os recursos alocados durante a execução do programa, garantindo uma limpeza adequada e prevenindo vazamentos de memória.
m_model.destroy()
: Libera os recursos associados ao modelo principal (asteroide). Isso inclui buffers, texturas e objetos de array de vértices (VAO).m_additionalModel.destroy()
: Libera os recursos associados ao modelo adicional (espaçonave). Semelhante ao modelo principal, isso inclui buffers, texturas e VAO.
abcg::glDeleteProgram(m_skyProgram)
: Deleta o programa OpenGL associado à renderização da Skybox. Isso inclui os shaders de vértice e fragmento.abcg::glDeleteBuffers(1, &m_skyVBO)
: Deleta o buffer de vértices (VBO) usado para armazenar as posições da Skybox.abcg::glDeleteVertexArrays(1, &m_skyVAO)
: Deleta o objeto de array de vértices (VAO) associado à Skybox.
abcg::glDeleteProgram(m_program)
: Deleta o programa OpenGL associado à renderização principal. Isso inclui os shaders de vértice e fragmento.
Somente as funções que sofreram alterações ou foram adicionadas para a atividade atual serão documentadas, as demais funções seguem a documentação da Atividade 02.
A função Model::computeNormals()
é responsável por calcular as normais dos vértices do modelo com base nas normais das faces.
for (auto &vertex : m_vertices)
: Itera sobre todos os vértices do modelo.vertex.normal = glm::vec3(0.0f);
: Inicializa as normais dos vértices com vetores nulos.
for (auto const offset : iter::range(0UL, m_indices.size(), 3UL))
: Itera sobre os índices do modelo em incrementos de 3, representando triângulos.auto &a{m_vertices.at(m_indices.at(offset + 0))};
: Obtém o primeiro vértice do triângulo.auto &b{m_vertices.at(m_indices.at(offset + 1))};
: Obtém o segundo vértice do triângulo.auto &c{m_vertices.at(m_indices.at(offset + 2))};
: Obtém o terceiro vértice do triângulo.auto const edge1{b.position - a.position};
: Calcula o vetor da aresta 1.auto const edge2{c.position - b.position};
: Calcula o vetor da aresta 2.auto const normal{glm::cross(edge1, edge2)};
: Calcula a normal da face usando o produto vetorial das arestas.a.normal += normal;
,b.normal += normal;
,c.normal += normal;
: Acumula as normais nas estruturas de vértices correspondentes.
for (auto &vertex : m_vertices)
: Itera sobre todos os vértices do modelo.vertex.normal = glm::normalize(vertex.normal);
: Normaliza as normais dos vértices.
m_hasNormals = true;
: Atualiza a flagm_hasNormals
para indicar que o modelo agora possui informações de normais.
A função Model::loadCubeTexture
é responsável por carregar uma textura de cubemap no modelo.
m_cubeTexture = abcg::loadOpenGLCubemap({.paths = {path + "posx.jpg", path + "negx.jpg", path + "posy.jpg", path + "negy.jpg", path + "posz.jpg", path + "negz.jpg"}});
: Carrega uma nova textura de cubemap usando a funçãoabcg::loadOpenGLCubemap
. Os caminhos das seis imagens são construídos com base no caminho fornecido, e os identificadores da textura resultantes são armazenados emm_cubeTexture
.
- A função presume que as imagens do cubemap estão nomeadas seguindo a convenção de nomenclatura padrão, com sufixos indicando as direções dos eixos: "posx" (positivo x), "negx" (negativo x), "posy" (positivo y), "negy" (negativo y), "posz" (positivo z) e "negz" (negativo z).
- A função é projetada para ser utilizada em conjunto com modelos que requerem um cubemap para efeitos visuais ou de iluminação específicos.
A função Model::loadDiffuseTexture
é responsável por carregar uma textura difusa (textura de cor) para o modelo.
m_diffuseTexture = abcg::loadOpenGLTexture({.path = path});
: Carrega uma nova textura difusa usando a funçãoabcg::loadOpenGLTexture
. O identificador da textura resultante é armazenado emm_diffuseTexture
.
A função Model::loadNormalTexture
é responsável por carregar uma textura normal para o modelo.
m_normalTexture = abcg::loadOpenGLTexture({.path = path});
: Carrega uma nova textura normal usando a funçãoabcg::loadOpenGLTexture
. O identificador da textura resultante é armazenado emm_normalTexture
.
A função Model::loadObj
é responsável por carregar um modelo 3D no formato OBJ, incluindo suas informações de vértices, índices, normais, coordenadas de textura e materiais associados.
-
auto const basePath{std::filesystem::path{path}.parent_path().string() + "/"};
: Calcula o caminho base para o arquivo do modelo, que será usado como o caminho para os arquivos de materiais (MTL). -
tinyobj::ObjReaderConfig readerConfig;
: Configuração do leitor de arquivo OBJ.readerConfig.mtl_search_path = basePath;
: Define o caminho de pesquisa para arquivos de materiais.
-
tinyobj::ObjReader reader;
: Objeto de leitura do arquivo OBJ. -
if (!reader.ParseFromFile(path.data(), readerConfig)) { ... }
: Analisa o arquivo OBJ especificado usando o leitor configurado. Lança uma exceção se a análise falhar. -
auto const &attrib{reader.GetAttrib()};
: Obtém os atributos do modelo (vértices, normais, coordenadas de textura). -
auto const &shapes{reader.GetShapes()};
: Obtém as formas do modelo. -
auto const &materials{reader.GetMaterials()};
: Obtém os materiais do modelo. -
Limpa as listas de vértices e índices do modelo (
m_vertices
em_indices
). -
Inicializa o indicador de presença de normais e coordenadas de textura como falso (
m_hasNormals
em_hasTexCoords
). -
Um loop sobre as formas e índices é realizado para extrair as informações do modelo.
-
Um mapa
hash
é utilizado para armazenar vértices únicos e seus índices correspondentes. -
As propriedades do primeiro material, se disponíveis, são usadas para definir propriedades do modelo, como coeficientes de reflexão e textura difusa.
-
Se o modelo deve ser padronizado (
standardize
é verdadeiro), a funçãoModel::standardize
é chamada para ajustar a escala e centralizar o modelo na origem. -
Se o modelo não possui informações de normais, a função
Model::computeNormals
é chamada para calcular as normais dos vértices. -
Finalmente, a função
Model::createBuffers
é chamada para criar os buffers de vértices e índices utilizados para renderizar o modelo.
- Essa função utiliza a biblioteca TinyObjLoader para analisar arquivos OBJ e extrair informações sobre o modelo.
- As informações de material do primeiro material são usadas para definir as propriedades do modelo, se disponíveis.
- A função também suporta o carregamento de texturas difusas associadas aos materiais do modelo.
O projeto, desenvolvido utilizando a estrutura leve em C++ chamada ABCg, é um simulador espacial em 3D. Nele, uma nave espacial navega pelo espaço sideral evitando asteroides que se aproximam. A nave tem a capacidade de se mover para a direita, esquerda, acelerar, dar ré e ajustar seu zoom (Setas, WASD e scroll do mouse), oferecendo uma experiência interativa e imersiva. Desenvolvido para a disciplina de Computação Gráfica da UFABC, o projeto utiliza as capacidades do OpenGL para criar uma aplicação em WebAssembly.
A função Window::onEvent
é responsável por lidar com eventos do teclado e do mouse e direciona para a rotação e movimentação da nave espacial.
- Teclas de Direção (Setas e 'W', 'A', 'S', 'D'):
- O código trata as teclas de seta (cima, baixo, esquerda, direita) e as teclas 'W', 'A', 'S' e 'D' como comandos de entrada do jogador.
- Dependendo da tecla pressionada, a função ajusta a rotação, a inclinação da nave espacial e outros parâmetros, controlando sua direção e movimento.
- Mouse:
- A função monitora a posição do mouse e a rolagem da roda do mouse.
- A rolagem da roda do mouse é usada para controlar o nível de zoom da visualização.
- A posição do mouse é capturada para fins de interação do jogador.
- A função atualiza várias variáveis, como ângulo de rotação, rotação e zoom, com base nos eventos do teclado e do mouse.
- Os valores são limitados dentro de faixas específicas para garantir que permaneçam dentro de limites aceitáveis durante o jogo.
- O zoom é feito através da manipulação dos eixos da câmera LookAt.
A função Window::onCreate()
é responsável por inicializar e configurar diversos elementos essenciais ao iniciar a janela de renderização. Isso inclui a definição da cor de fundo, configurações de profundidade, carregamento de modelos 3D, configuração da câmera e preparação dos elementos do jogo.
- Asteroides:
- Carrega o modelo de asteroides (asteroid.obj) para a visualização no jogo.
- Prepara o Vertex Array Object (VAO) associado ao programa OpenGL.
- Nave Espacial (Starship):
- Carrega o modelo da nave espacial (starship.obj) para a visualização no jogo.
- Configura o Vertex Array Object (VAO) associado ao programa OpenGL.
- Define a posição inicial da nave espacial.
- Posição e Orientação da Câmera:
- Configura a câmera para posicionar-se em (0, 0.035, 0.01) e apontar na direção negativa do eixo Z.
- Define o vetor "up" para garantir a orientação correta da câmera.
- Inicialização da Rotação da Nave Espacial:
- Define a rotação inicial da nave espacial como 0 graus, armazenada em radianos.
- Configura a rotação para a direção (1.0, 1.0, 1.0) nos eixos x, y e z.
- Configuração Inicial das Estrelas:
- Para cada estrela na coleção de estrelas (m_stars), a função randomizeStar() é chamada para inicializar suas propriedades.
A função Window::randomizeStar(Star &star)
é responsável por gerar posições e eixos de rotação aleatórios para as estrelas no jogo. Ela utiliza distribuições uniformes para criar uma variedade de posições e eixos de rotação a fim de aumentar a diversidade visual das estrelas no espaço.
- Posição Aleatória no Espaço Tridimensional:
- Gera aleatoriamente as coordenadas (x, y, z) dentro dos intervalos específicos:
- x e y no intervalo [-20, 20)
- z no intervalo [-100, 0)
- Define a posição da estrela com base nas coordenadas geradas.
- Gera aleatoriamente as coordenadas (x, y, z) dentro dos intervalos específicos:
- Eixo de Rotação Aleatório:
- Utiliza a função
glm::sphericalRand(1.0f)
para gerar um vetor de rotação aleatório. - Define o eixo de rotação da estrela para o vetor resultante, permitindo uma variedade de orientações no espaço.
- Utiliza a função
A função Window::onUpdate()
é responsável por atualizar o estado do ambiente e o movimento das estrelas no jogo. Esta função executa a lógica para a nave espacial, a movimentação das estrelas, e as verificações para reposicionamento e realocação das estrelas no espaço tridimensional.
- Definição da Orientação da Nave:
- Define o eixo de rotação da nave espacial com base nas variáveis de rotação (starship_rotation).
- Configuração da Matriz de Visualização (View Matrix):
- Atualiza a matriz de visualização para a câmera com base em variáveis de zoom e posição.
- Movimentação e Verificações das Estrelas:
- Itera sobre cada estrela e atualiza sua posição ao longo do eixo z com base no tempo.
- Responde aos inputs do jogador, ajustando a posição das estrelas de acordo com a direção desejada.
- Verifica se as estrelas ultrapassam certos limites no espaço (eixo z e x), realocando-as para garantir que permaneçam visíveis.
- Gerenciamento de Posicionamento das Estrelas:
- Se uma estrela ultrapassa a posição da câmera, é reposicionada aleatoriamente e movida de volta para a posição inicial.
- Se uma estrela ultrapassa os limites laterais do espaço, é reposicionada aleatoriamente e movida para a extremidade oposta.
A função Window::onPaint()
é responsável por renderizar os elementos do ambiente, incluindo a nave espacial e as estrelas. Esta função configura as variáveis uniformes dos shaders, aplica transformações nos modelos e efetua o processo de renderização dos objetos 3D.
- Limpeza do Buffer Gráfico:
- Limpa o buffer de cor e o buffer de profundidade para preparar o contexto gráfico para o desenho dos objetos.
- Ativação do Programa do Shader:
- Habilita o uso do programa de shader para realizar as renderizações.
- Definição das Matrizes de Visualização e Projeção:
- Define as matrizes de visualização (viewMatrix) e projeção (projMatrix) no programa de shader para definir a câmera e a perspectiva.
- Renderização do Modelo da Nave:
- Aplica as transformações necessárias (escala, translação, rotação) no modelo da nave espacial e o renderiza.
- Renderização das Estrelas:
- Itera sobre cada estrela, aplica transformações individuais (escala, translação, rotação) e renderiza cada uma no ambiente.
- Desativação do Programa do Shader:
- Finaliza o uso do programa de shader após a renderização dos objetos.
A função Window::onPaintUI()
é responsável por renderizar a interface do usuário (UI) e gerenciar as configurações gráficas relacionadas à projeção do ambiente do jogo.
- Seleção da Projeção (Perspectiva ou Ortográfica):
- Cria um combo box para selecionar entre projeção perspectiva e ortográfica.
- Atualiza a matriz de projeção com base na escolha do usuário.
- Exibe um slider para ajustar o campo de visão (FOV) no caso da projeção perspectiva.
A função Window::onResize()
é chamada quando a janela do aplicativo é redimensionada. Ela atualiza o tamanho do viewport, que é essencial para garantir que a cena seja renderizada corretamente após a mudança de tamanho da janela.
A função Window::onDestroy()
é chamada quando o aplicativo está sendo encerrado. Ela é responsável por liberar recursos, como os programas de shader e os modelos 3D.
A classe GameData
representa a estrutura de dados para controlar e armazenar informações de movimentação da nave.
- m_input: Um objeto
std::bitset
que armazena as informações de entrada do jogo. Especificamente, são registrados os comandos de direcionais (esquerda, direita, cima, baixo) juntamente com um comando adicional não especificado.
- enum class Input { Right, Left, Down, Up }: Uma enumeração que representa os diferentes tipos de comandos de entrada. Esses comandos incluem movimento para a direita, esquerda, para baixo e para cima.
- A classe GameData é utilizada para manter um registro dos comandos de entrada recebidos durante a execução do jogo.
- O std::bitset é usado para armazenar informações booleanas de forma compacta, permitindo o registro de diferentes tipos de entrada.
A classe é utilizada para a renderização de objetos 3D.
- createBuffers(): Esta função cria e configura os buffers de vértices e índices para armazenar e renderizar modelos 3D.
- loadObj(std::string_view path, bool standardize): Carrega um modelo 3D a partir de um arquivo no formato .obj, convertendo suas informações em vértices e índices. O parâmetro
standardize
normaliza o modelo para caber dentro do intervalo [-1, 1]. - render(int numTriangles): Renderiza o modelo 3D. O parâmetro
numTriangles
define a quantidade de triângulos a serem desenhados. - setupVAO(GLuint program): Configura o Vertex Array Object (VAO) para o modelo, especificando os atributos dos vértices.
- standardize(): Normaliza o modelo para caber dentro do intervalo [-1, 1] em todas as dimensões.
- destroy(): Limpa os buffers e o VAO alocados para o modelo, realizando a limpeza de memória e recursos utilizados.
- A leitura de arquivos .obj é feita utilizando a biblioteca
tinyobj
para obter as informações do modelo. - Os vértices e índices são armazenados em buffers apropriados utilizando funções de baixo nível do OpenGL (GL_ELEMENT_ARRAY_BUFFER e GL_ARRAY_BUFFER).
- As funções
setupVAO
erender
são usadas para configurar a renderização dos modelos dentro de um contexto OpenGL. - A função
standardize
garante que os modelos renderizados se ajustem a um espaço padronizado para facilitar a renderização e manipulação.
O código apresentado inicializa e gerencia a janela de visualização.
- abcg::Application: Inicializa a aplicação e gere o ciclo de vida do programa.
- Window: Classe responsável por configurar e controlar as definições da janela de visualização.
- Inicialização da Aplicação: Inicia a aplicação e cria a janela de visualização por meio da classe
Window
. - Configurações da Janela: Define as configurações da janela, como largura, altura, título e configurações específicas do OpenGL, como o número de amostras.
- Execução do Aplicativo: Inicia a execução do aplicativo gráfico por meio do método
run()
da classeabcg::Application
.
- Nave espacial: https://www.cgtrader.com/free-3d-models/space/spaceship/free-scifi-fighter
- Asteroide: https://free3d.com/3d-model/low-poly-rock-4631.html
- Imagem de fundo: https://unblast.com/10-free-space-background-images-jpg/
- Imagem para Cubemap: https://jaxry.github.io/panorama-to-cubemap/