CSCI 441 - Computer Graphics

Fall 2025

|     Home   |   Tasks  |   Leaders  |   Schedule  |   FAQ  |   Resources    |
Gromage

Welcome to my computer graphics journey! Here you'll find my work from CSCI 441 - Computer Graphics at Colorado School of Mines.

Gromage

SQ1 Nicolas Cage Battle

For the SQ1 project, I created "Nicolas Cage Battle," a thrilling 2D game where players control a colored sphere hero to defeat Nicolas Cage before he defeats them. This project demonstrates advanced game mechanics, collision detection, and interactive elements.

Game Features

Nicolas Cage Battle includes:

  • Character Selection: Choose from multiple character colors before starting the game
  • Dual Attack Patterns: Nicolas Cage uses both direct shots and circular spread attacks
  • Health System: Player has 5 health points, Nicolas Cage has 50 health points
  • Score Tracking: Earn 10 points per hit on Nicolas Cage, plus 1000 bonus points for victory
  • Particle Effects: Visual feedback for hits and explosions
  • Health Bars: Visual representation of remaining health for both characters

Controls

  • WASD: Move your character (Up, Left, Down, Right)
  • Mouse: Aim your attacks
  • Left Mouse Click: Shoot projectiles at Nicolas Cage
  • SPACE: Start game from main menu
  • LEFT/RIGHT Arrow Keys: Select character color
  • ENTER: Confirm color selection and start battle
  • R: Restart after game over or victory
  • ESC: Exit the game at any time

Technical Implementation

The game was built using CMake with GLFW and OpenGL libraries. Key technical components include:

  • Real-time collision detection between projectiles and characters
  • Sprite rendering for Nicolas Cage's image
  • Particle system for visual effects
  • State management for menu, gameplay, and end states
  • Input handling for both keyboard and mouse controls
// Example of projectile collision detection if (checkCollision(playerProjectile, cagePosition)) { cageHealth--; playerScore += 10; spawnHitParticles(cagePosition); }

A2 Interactive Hero Character

For Assignment 2, I created an interactive 2D hero character using OpenGL/GLFW. The hero features hierarchical modeling, constant animation, and responds to both keyboard and mouse input.

Implementation Details

My hero character features:

  • Hierarchical Modeling: Body parts are drawn relative to their parent components (e.g., eyes relative to head, head relative to body)
  • Constant Animation: The character's arms wave up and down continuously
  • Keyboard Controls: WASD keys move the character around the screen with wrap-around behavior
  • Mouse Interaction: The character's head follows the mouse cursor, creating a "looking at mouse" effect
  • Combined Interactions: Holding Shift while moving increases movement speed

The implementation uses GLFW for window management and input handling, with OpenGL primitives for rendering. The hierarchical transformations are managed using glm::translate and glm::rotate to position body parts correctly.

// Example of hierarchical transformation for the head glm::mat4 headTransform = glm::translate(glm::mat4(1.0f), bodyPosition); headTransform = glm::translate(headTransform, glm::vec3(0.0f, 0.3f, 0.0f)); headTransform = glm::rotate(headTransform, headRotationAngle, glm::vec3(0.0f, 0.0f, 1.0f)); // Draw head and its components using headTransform

L00A Triforce

For our first lab assignment, we created the iconic Triforce symbol from The Legend of Zelda series using basic OpenGL primitives. This project helped us understand coordinate systems and basic shape rendering.

Implementation Details

I used GL_TRIANGLES to create the three triangular pieces of the Triforce. Each triangle was positioned carefully to form the iconic overlapping pattern. The gold color was achieved using specific RGB values to match the classic appearance.

// Drawing one triangle of the Triforce glBegin(GL_TRIANGLES); glColor3f(0.96f, 0.82f, 0.08f); // Gold color glVertex2f(0.0f, 0.5f); glVertex2f(-0.5f, -0.5f); glVertex2f(0.5f, -0.5f); glEnd();

L00B House Scene

In this lab, we created a 2D scene featuring a house. This project helped us understand how to compose more complex scenes from simple geometric primitives and practice coordinate positioning.

Implementation Details

I used a combination of GL_QUADS for the main structure and roof, and GL_TRIANGLES for the roof details. The scene demonstrates proper use of coordinate systems to position elements relative to each other. Different colors were used to distinguish the various components of the house.

L02 3D World

This lab introduced us to 3D rendering concepts. We created a simple 3D world with basic objects, practicing 3D transformations and perspective projection.

Implementation Details

I implemented 3D transformations including translation, rotation, and scaling to position objects in the world. The perspective projection was set up to create a sense of depth. This lab helped me understand the differences between 2D and 3D rendering approaches in OpenGL.

// Setting up perspective projection glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f, (GLfloat)width/(GLfloat)height, 0.1f, 100.0f); glMatrixMode(GL_MODELVIEW);
Mines Crest
Gromage's Graphics Portfolio