https://github.com/theduardomaciel/cg-opengl
Um simulador minimalista em primeira pessoa para explorar o centro histórico escolhido por minha equipe (Memorial à República)
https://github.com/theduardomaciel/cg-opengl
assimp bullet cg glad glfw glfw3 glm imgui imgui-glfw opengl opengl3
Last synced: 20 days ago
JSON representation
Um simulador minimalista em primeira pessoa para explorar o centro histórico escolhido por minha equipe (Memorial à República)
- Host: GitHub
- URL: https://github.com/theduardomaciel/cg-opengl
- Owner: theduardomaciel
- Created: 2025-09-11T01:51:13.000Z (23 days ago)
- Default Branch: master
- Last Pushed: 2025-09-13T01:11:25.000Z (21 days ago)
- Last Synced: 2025-09-13T02:33:21.260Z (21 days ago)
- Topics: assimp, bullet, cg, glad, glfw, glfw3, glm, imgui, imgui-glfw, opengl, opengl3
- Language: C++
- Homepage:
- Size: 1.69 MB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
## 🚶 Sobre o Projeto
Um simulador minimalista em primeira pessoa para explorar o Memorial à República em Maceió–AL como requisito da disciplina de Computação Gráfica (UFAL, 2025.1).
Construído com OpenGL (3.3+), C++, e CMake.> [!WARNING]
> Alguns arquivos grandes, como modelos OBJ, não estão inclusos no repositório por questões de tamanho.
> Para baixá-los, basta acessar a [pasta no Drive do projeto](https://drive.google.com/drive/folders/1HmuZ-jdn9_bICnKb1MeXOPKZ0eIS5S1N?usp=sharing) e colocar os arquivos na pasta `models/` na raiz do projeto.---
## ⭐ Features
- Janela GLFW + captura de entrada
- Câmera estilo FPS (WASD + olhar com o mouse)
- Alternar captura do cursor (tecla `C`)
- **Sistema robusto de carregamento de modelos OBJ**
- **Renderização 3D com iluminação básica (Phong)**
- **Modelo do centro histórico carregado automaticamente**
- Modo wireframe alternável (Ctrl + W)
- FPS no título da janela + VSync habilitado
- Shaders modernos com suporte a normais e materiais---
## ⚙️ Arquitetura Modular
A aplicação foi pensada para ter um layout de engine simples e extensível:```
include/
core/ -> Application, Window
input/ -> Camera, Input helpers
render/ -> Shader, Mesh, Model, ModelLoader, Renderer (sistema completo de renderização 3D)
physics/ -> PhysicsSystem (stub p/ Bullet)
ui/ -> DebugUI (stub p/ ImGui)
src/
core/, input/, render/, physics/, ui/
models/
structure_v{x}.obj -> Modelo principal do centro histórico
```### Principais conceitos:
- Application: orquestra loop principal (input -> física -> UI -> render).
- Sistemas desacoplados: cada domínio em pasta própria para evolução incremental.
- **Sistema de renderização modular**: Mesh (geometria), Model (transformações), ModelLoader (carregamento OBJ), Renderer (coordenação da renderização)
- **Carregamento robusto de modelos**: Parser completo de arquivos OBJ com suporte a múltiplas meshes, normais automáticas, e otimização de vértices
- **Iluminação Phong**: Shader avançado com componentes ambiente, difusa e especular
- Fácil expansão: adicionar novo módulo = criar headers em `include//` + fontes e registrar no `CMakeLists.txt` (lista `CG_ENGINE_SOURCES`).
- Stubs (PhysicsSystem, DebugUI) permitem integrar Bullet / ImGui sem alterar o loop.### Extensão rápida:
1. Criar arquivos em `include/novo/NovoSistema.h` e `src/novo/NovoSistema.cpp`.
2. Incluir no `CMakeLists.txt` em `CG_ENGINE_SOURCES`.
3. Instanciar em `Application` (campo + init + chamada no loop se necessário).
4. (Opcional) Adicionar dependências externas com `add_subdirectory` ou `find_package`.---
## 🖇️ Estrutura de Dependências
- GLFW: criação de janela e entrada
- GLAD: carregamento de funções OpenGL 3.3 Core
- GLM: matemática (vec/mat/projeção)
- Assimp: carregamento de modelos 3D (formato OBJ)
- Bullet (stub): física básica> [!NOTE]
> Outras libs (ImGui) poderão ser integradas em versões futuras.### Diretórios relevantes
```
external/glfw
external/glm
external/glad (gerador Python)
external/glad-build (código gerado: include + src/glad.c)
```Se o diretório `external/glad-build` não existir (por ex. após um clone limpo), gere o GLAD:
```bash
# Requer Python 3 e acesso à internet para baixar especificações
python -m glad --profile=core --api="gl=3.3" --generator=c --out-path=external/glad-build
```> [!NOTE]
> Certifique-se de que o Python esteja no PATH do sistema.
> No Windows PowerShell, caso falhe: `setx PYTHONPATH external` ou use ambiente virtual; rode alternativamente a partir da raiz: `python external/glad/glad/__main__.py ...`)---
## 🛠️ Setup & Build
### 1. Clonar repositório
```bash
git clone https://github.com/theduardomaciel/cg-opengl.git
cd cg-opengl
```### 2. Adicionar (ou atualizar) submódulos quando necessário
Se ainda não tiver as libs, adicione (ou use `git submodule add` conforme necessidade). Para sincronizar existentes:
```bash
git submodule update --init --recursive
```### 3. (Opcional) Gerar GLAD se ausente
(Ver seção acima.)### 4. Configurar e compilar
#### Linux / macOS
```bash
cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug
cmake --build build -j
```#### Windows (Visual Studio / MSVC)
```powershell
cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug
cmake --build build --config Debug
```
Binário resultante (MSVC): `build/Debug/cg_opengl.exe`#### Windows (MinGW)
```powershell
cmake -S . -B build -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Debug
cmake --build build -j
```
Binário: `build/cg_opengl.exe`### 5. Executar
```bash
./build/cg_opengl # Linux/macOS ou MinGW
./build/Debug/cg_opengl # MSVC
```---
## 🕹️ Controles
* `W / A / S / D` → movimentação no plano (sem voo)
* Mouse → olhar (pitch limitado ±89°)
* `C` → alterna captura do cursor (lock/unlock)
* `Ctrl + W` → alterna modo wireframe/sólido
* `ESC` → sair---
## 👣 Próximos Passos (Roadmap)
1. [x] Carregamento de modelos (sistema OBJ completo implementado)
2. [x] Sistema de iluminação básica (Phong implementado)
3. [x] Carregamento de texturas e materiais
4. [ ] Colisão / física básica (Bullet)
5. [ ] UI de debug (ImGui)
6. [ ] Sistema de materiais avançado com texturas
7. [ ] Altura do terreno / navegação com colisão---
## 🐞 Ferramentas de Debug
* [RenderDoc](https://renderdoc.org) → inspeção de frames
* `glfwSetErrorCallback` → log de erros de contexto
* Compilar com flags de warning altas (já configurado)Para logging extra, adicionar prints ou macro de debug.
## 👥 Equipe
A disciplina foi ministrada pelo Prof. Dr. Marcelo Costa Oliveira ([@oliveiramc](https://github.com/oliveiramc)) e minha equipe foi composta por:- [Eduardo Maciel (@theduardomaciel)](https://github.com/theduardomaciel)
- [Josenilton Ferreira (@914joseph)](https://github.com/914joseph)