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

SQ2 Raytracer - Physically-Based Rendering Engine

For SQ2, I implemented a complete raytracing engine from scratch that simulates realistic lighting, shadows, and reflections. This project demonstrates the fundamental principles of physically-based rendering by tracing rays through a virtual scene to compute realistic lighting interactions.

Key Features

  • Ray-Sphere Intersection: Accurate mathematical computation for sphere collisions
  • Ray-Plane Intersection: Efficient plane intersection detection
  • Phong Illumination Model: Realistic lighting with ambient, diffuse, and specular components
  • Shadow Rays: Proper shadow computation by testing light visibility
  • Reflections: Recursive ray tracing for mirror-like surfaces
  • Camera System: Perspective camera with configurable field of view
  • Scene File Parsing: Dynamic scene loading from text files

Technical Implementation

The raytracer was built using C++ with custom implementations for:

  • Ray Generation: Computing primary rays through each pixel
  • Intersection Testing: Finding the closest intersection along each ray
  • Lighting Calculation: Applying the Phong reflectance model
  • Recursive Reflection: Handling multiple bounces for reflective materials
  • Shadow Testing: Efficiently determining if points are in shadow

Scene Description Language

The raytracer supports a custom scene file format that defines:

  • Materials: Diffuse, ambient, specular colors with shininess and reflectivity
  • Spheres: Position and radius with assigned materials
  • Planes: Point-normal definition with material properties
  • Lights: Position and color properties for multiple light sources
// Example of ray-sphere intersection bool Sphere::intersectWithRay(const Ray& RAY, IntersectionData& intersectionData) { const glm::vec3 oc = RAY.getOrigin() - _center; const float a = glm::dot(RAY.getDirection(), RAY.getDirection()); const float b = 2.0f * glm::dot(oc, RAY.getDirection()); const float c = glm::dot(oc, oc) - (_radius * _radius); const float discriminant = b * b - 4.0f * a * c; if (discriminant >= 0) { // Compute intersection point and surface normal return true; } return false; }

Controls

  • R: Raytrace the current scene
  • S: Save raytraced image to PPM file
  • Mouse Drag: Rotate camera in preview mode
  • Scroll: Zoom camera in/out in preview mode
  • WASD: Move camera in preview mode

FP New Kids on the Block Vampire Survivors-Style Game

For the Final Project, our team "The Metals" created a Vampire Survivors-style game where players move through an environment, defeat enemies, and avoid damage to achieve the highest score. This project demonstrates advanced graphics techniques including texturing, shading, lighting, and Bézier curves for smooth surfaces and animations.

Key Features

  • Vampire Survivors-style gameplay with enemy waves and scoring system
  • Advanced texturing and shading for realistic materials
  • Dynamic lighting system for atmospheric effects
  • Bézier curves for smooth terrain surfaces and animations
  • Particle system for enemy movement and effects
  • Time-slowing mechanic with collectible clock items
  • Interactive camera with zoom and rotation controls

Technical Implementation

The game was built using C++ with OpenGL and features several advanced graphics techniques:

  • Bézier curve implementation for terrain generation and smooth surfaces
  • Particle system for managing enemy movement patterns
  • Phong shading with multiple light sources
  • Texture mapping for detailed environmental visuals
  • Real-time collision detection for attacks and enemy interactions
  • Camera system with interactive controls

Controls

  • WASD / Arrow Keys: Move character and rotate
  • Right Shift: Attack in front of character
  • Mouse Drag: Move camera view
  • Shift + Mouse Drag: Zoom in/out
  • Q / ESC: Exit game

Team Information

  • Team Name: New Kids on the Block
  • Development Time: Approximately 12 collective hours
  • Lab Helpfulness: 8/10 - A4 provided a solid foundation for enemy swarm mechanics
  • Fun Factor: 7/10 - Enjoyable implementation with some challenging aspects

A4 The Modelers Hero Adventure - Advanced 3D World with Camera Animation

For Project 4, our guild "The Modelers" created an advanced 3D adventure game featuring a fully realized world with terrain, buildings, multiple heroes, and a sophisticated camera animation system. This project demonstrates advanced OpenGL techniques including procedural terrain generation, character animation, and pre-recorded camera paths.

Video demonstration showing the camera animation system and world exploration

Key Features

  • Procedurally generated terrain with Perlin noise
  • Multiple hero characters with unique models and animations
  • Camera animation system with pre-recorded fly-through paths
  • Companion dog that follows the active hero with realistic animations
  • Environment props including archways, boulders, fences, and crystals
  • Multiple camera perspectives and minimap system
  • Advanced lighting with directional, point, and spot lights

Technical Implementation

The project was built using C++ with OpenGL and features a custom engine architecture. Key technical achievements include:

  • Frame-based camera animation system with configurable FPS
  • Hierarchical character modeling for complex hero animations
  • Real-time terrain height calculation and normal generation
  • Multi-pass rendering for main view and minimap
  • Phong shading with material properties and multiple light sources

Controls

  • WASD: Move and turn current hero
  • F1-F3: Switch between different heroes
  • 1-5: Switch minimap camera views
  • F6-F9: Control camera animation system
  • R: Reload shaders
  • T/Y: Toggle debug modes

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); }

A3 Hero Adventure - 3D Character with Multiple Camera Views

For Assignment 3, I created a 3D adventure game featuring a customizable hero character that navigates through a city environment. The program implements Phong illumination with Gouraud shading and features multiple camera views including an arcball camera and four minimap perspectives.

Key Features

  • Customizable 3D hero character with animated arms and legs
  • City environment with buildings and trees
  • Arcball camera with mouse controls for main view
  • Four minimap camera views (1-4 keys)
  • Phong illumination model with Gouraud shading
  • Hero movement with WASD controls

Controls

  • WASD: Move and turn hero
  • Mouse Drag/Scroll: Control arcball camera
  • 1-4 Keys: Switch minimap camera views
  • R: Reload shaders
  • Q/ESC: Quit program

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