Projeto de Computação Gráfica 3D usando WebGL puro (sem bibliotecas externas) com iluminação Phong, parser de arquivos OBJ/MTL customizado e sistema completo de áudio.
- Iluminação Phong Completa: Reflexão ambiental, difusa e especular totalmente implementada e comentada
- Mapeamento de Textura: Suporte completo para texturas em objetos 3D
- Billboard Effect: Lua de Majora sempre enfrenta a câmera
- Animação Procedural: Sol/lua em movimento de arco simulando nascer e pôr do sol
- Parser OBJ/MTL Customizado: Carregamento de modelos 3D sem bibliotecas externas
- Suporte a vértices, normais e coordenadas de textura
- Triangulação automática de polígonos
- Carregamento automático de texturas via MTL
- Primitivas 3D: Cubos, planos, cilindros, discos, colinas, paredes
- Personagem Estilo Minecraft: Mario com animação por estados
- Controles FPS:
WASD: Movimento da câmeraMouse: Olhar ao redor (pointer lock)Espaço: Pulo do Mario (próximo ao cano)M: Mute/Unmute do áudio
- Física Simples:
- Colisão com o chão (Y ≥ 0.5)
- Colisão cilíndrica com o cano
- AudioManager Completo: Gerenciador de áudio robusto
- Música de fundo com loop
- Efeitos sonoros com sobreposição
- Controle de volume em 3 níveis (master, music, sfx)
- Sistema de mute/unmute
- Fade in/out
- Carregamento assíncrono
Trabalho2-CG/
├── index.html # HTML principal com shaders GLSL
├── main.js # Loop de renderização e lógica
├── style.css # Estilos CSS
├── PROJECT_STRUCTURE.md # Documentação detalhada do projeto ⭐
│
├── math/
│ └── Matrix.js # Operações de matriz 3D
│
├── geometry/
│ ├── Geometry.js # Primitivas 3D (cubo, plano, cilindro, etc)
│ ├── OBJLoader.js # Parser OBJ/MTL customizado
│ └── MinecraftCharacter.js # Geometria do Mario
│
├── texture/
│ ├── Texture.js # Carregamento de texturas
│ └── assets/ # Arquivos de imagem
│
└── audio/
├── AudioManager.js # Gerenciador de áudio
└── assets/ # Arquivos de som (adicione aqui!)
├── README.md # Guia para adicionar áudios
├── music/ # Músicas de fundo (.mp3, .ogg)
└── sfx/ # Efeitos sonoros (.wav, .ogg)
📖 Para documentação completa da arquitetura, veja PROJECT_STRUCTURE.md
# Opção 1: Python
python3 -m http.server 8000
# Opção 2: Node.js
npx serve
# Opção 3: VS Code Live Server
# Instale a extensão "Live Server" e clique em "Go Live"http://localhost:8000
- Clique no canvas para travar o mouse (pointer lock)
- Use
WASDpara mover - Mouse para olhar ao redor
Mpara mute/unmute- Aproxime-se do cano e pressione
Espaçopara ver Mario pular
Coloque seus arquivos de áudio em ./audio/assets/:
audio/assets/
├── music/
│ └── background.mp3
└── sfx/
├── jump.wav
└── coin.wav
Descomente e edite o código em main.js (função init()):
// Carregar sons
await audioManager.loadMultiple([
{ name: 'bgMusic', url: './audio/assets/music/background.mp3', type: 'music' },
{ name: 'jump', url: './audio/assets/sfx/jump.wav', type: 'sfx' }
]);
// Tocar música de fundo
audioManager.playMusic('bgMusic', 0.5, true);Adicione nos eventos do jogo:
// Em updateMarioAnimation() quando Mario pular:
if (marioState === MARIO_STATE.JUMPING && audioManager) {
audioManager.playSFX('jump');
}audioManager.setMasterVolume(0.7); // Volume geral
audioManager.setMusicVolume(0.5); // Volume da música
audioManager.setSFXVolume(1.0); // Volume dos efeitos
audioManager.toggleMute(); // Mute on/off
audioManager.fadeOutMusic(2000); // Fade out em 2 segundos📖 Veja ./audio/assets/README.md para mais detalhes
// REFLEXÃO AMBIENTAL (30%)
vec3 ambient = AMBIENT_STRENGTH * lightColor;
// REFLEXÃO DIFUSA (Lambert)
float diff = max(dot(norm, lightDir), 0.0);
vec3 diffuse = diff * lightColor;
// REFLEXÃO ESPECULAR (Phong, shininess=32)
vec3 reflectDir = reflect(-lightDir, norm);
float spec = pow(max(dot(viewDir, reflectDir), 0.0), SHININESS);
vec3 specular = SPECULAR_STRENGTH * spec * lightColor;
// Resultado final
vec3 result = (ambient + diffuse + specular) * objectColor;- Sem bibliotecas externas (three.js, etc)
- Parsing de vértices (
v), texturas (vt), normais (vn), faces (f) - Conversão de índices OBJ (base 1) → WebGL (base 0)
- Triangulação automática de polígonos (quad → 2 triângulos)
- Carregamento automático de texturas via arquivo MTL
Lua sempre enfrenta a câmera:
const dx = cameraPos[0] - sunX;
const dz = cameraPos[2] - sunZ;
const angleToCamera = Math.atan2(dx, dz);
modelViewMatrix = Matrix.multiply(modelViewMatrix, Matrix.rotateY(-angleToCamera));sunAngle += SUN_SPEED;
sunX = Math.cos(sunAngle) * SUN_RADIUS; // Movimento horizontal
sunY = Math.abs(Math.sin(sunAngle)) * SUN_HEIGHT + 5; // Arco para cimaEste projeto demonstra:
- ✅ Pipeline gráfico WebGL completo
- ✅ Transformações 3D com matrizes
- ✅ Iluminação Phong (ambient + diffuse + specular)
- ✅ Mapeamento de textura
- ✅ Parsing de arquivos 3D (OBJ/MTL)
- ✅ Detecção de colisão simples
- ✅ Animação procedural e por estados
- ✅ Câmera em primeira pessoa (FPS)
- ✅ Sistema de gerenciamento de recursos
- ✅ Arquitetura modular e documentada
- Textures.com - Texturas gratuitas
- OpenGameArt - Assets para jogos
- Freesound - Efeitos sonoros CC
- OpenGameArt Audio - Música e SFX
- Zapsplat - SFX gratuitos
- WebGL 1.0: API gráfica 3D
- GLSL ES 1.0: Linguagem de shaders
- JavaScript ES6+: Lógica do programa
- HTML5 Canvas: Elemento de renderização
- HTML5 Audio API: Reprodução de áudio
- Sem Bibliotecas 3D: O parser OBJ foi escrito completamente do zero
- Iluminação Documentada: Cada componente Phong está claramente comentado no código
- Coordenadas Corrigidas: Textura V invertida nos cubos para orientação correta
- Sombras em tempo real
- Múltiplas fontes de luz
- Skybox
- Partículas (estrelas, poeira)
- Mais animações do Mario
- Interface de UI para controles
Matheus
Projeto desenvolvido para a disciplina de Computação Gráfica
Este projeto é de código aberto para fins educacionais.
- 📖 Documentação Completa (PROJECT_STRUCTURE.md)
- 🔊 Guia de Áudio (audio/assets/README.md)
- WebGL Fundamentals
- GLSL Reference
- OBJ Format Specification
⭐ Se este projeto foi útil, considere dar uma estrela!
🎮 Divirta-se explorando o mundo 3D!