CONCEPT ART | ILLUSTRATION

Veronica gallego


(function () { const GALLERY_ID = "gallery01"; /* ============================== SETTINGS ============================== */ const TARGET_ROW_HEIGHT = 380; /* Space between images */ const GAP = 16; /* Don't stretch tiny final rows */ const STRETCH_LAST_ROW = false; /* ============================== FIND GALLERY ============================== */ function getGallery() { return document.getElementById(GALLERY_ID); } /* ============================== GET IMAGES ============================== */ function getImages(gallery) { const items = gallery.querySelectorAll( ".inner > ul > li" ); return Array.from(items) .map(function (item) { const img = item.querySelector("img"); if (!img) return null; const width = img.naturalWidth || 1; const height = img.naturalHeight || 1; return { item: item, img: img, ratio: width / height }; }) .filter(Boolean); } /* ============================== CREATE ROWS ============================== */ function buildRows(images, galleryWidth) { const rows = []; let currentRow = []; let currentRatio = 0; images.forEach(function (image, index) { currentRow.push(image); currentRatio += image.ratio; const gapWidth = GAP * (currentRow.length - 1); const availableWidth = galleryWidth - gapWidth; const estimatedHeight = availableWidth / currentRatio; if ( estimatedHeight <= TARGET_ROW_HEIGHT && currentRow.length > 1 ) { rows.push({ images: currentRow, last: false }); currentRow = []; currentRatio = 0; } if ( index === images.length - 1 && currentRow.length ) { rows.push({ images: currentRow, last: true }); } }); return rows; } /* ============================== APPLY ROW ============================== */ function applyRow(row, galleryWidth) { const images = row.images; const totalRatio = images.reduce(function (sum, image) { return sum + image.ratio; }, 0); const totalGap = GAP * (images.length - 1); /* * Calculate exact row height. */ let rowHeight = (galleryWidth - totalGap) / totalRatio; /* * Don't make a tiny final row huge. */ if ( row.last && !STRETCH_LAST_ROW && images.length < 3 ) { rowHeight = Math.min( rowHeight, TARGET_ROW_HEIGHT ); } /* * Set image widths. */ images.forEach(function (image) { const width = image.ratio * rowHeight; image.item.style.width = width + "px"; image.item.style.height = rowHeight + "px"; /* Remove any old Carrd spacing */ image.item.style.margin = "0"; }); /* * Correct tiny rounding differences. */ if ( !row.last || STRETCH_LAST_ROW ) { const usedWidth = images.reduce(function (sum, image) { return sum + (image.ratio * rowHeight); }, 0) + totalGap; const difference = galleryWidth - usedWidth; if (Math.abs(difference) > 0.1) { const adjustment = difference / images.length; images.forEach(function (image) { const currentWidth = image.ratio * rowHeight; image.item.style.width = ( currentWidth + adjustment ) + "px"; }); } } } /* ============================== BUILD ============================== */ function buildGallery() { const gallery = getGallery(); if (!gallery) return; const list = gallery.querySelector( ".inner > ul" ); if (!list) return; const galleryWidth = list.clientWidth; if (!galleryWidth) return; const images = getImages(gallery); if (!images.length) return; const rows = buildRows( images, galleryWidth ); rows.forEach(function (row) { applyRow( row, galleryWidth ); }); } /* ============================== WAIT FOR IMAGES ============================== */ function initialize() { const gallery = getGallery(); if (!gallery) return; const images = gallery.querySelectorAll("img"); let remaining = images.length; if (!remaining) { buildGallery(); return; } images.forEach(function (img) { if (img.complete) { remaining--; if (remaining === 0) { buildGallery(); } } else { img.addEventListener( "load", function () { remaining--; if (remaining === 0) { buildGallery(); } }, { once: true } ); } }); } /* ============================== RESPONSIVE ============================== */ let resizeTimer; window.addEventListener( "resize", function () { clearTimeout(resizeTimer); resizeTimer = setTimeout( buildGallery, 150 ); } ); /* ============================== START ============================== */ if ( document.readyState === "loading" ) { document.addEventListener( "DOMContentLoaded", initialize ); } else { initialize(); } })();

[ Some of the illustrations lead to links in the caption containing the full project or progress images! ]

(function () { const GALLERY_ID = "gallery01"; /* ============================== SETTINGS ============================== */ const TARGET_ROW_HEIGHT = 380; /* Space between images */ const GAP = 16; /* Don't stretch tiny final rows */ const STRETCH_LAST_ROW = false; /* ============================== FIND GALLERY ============================== */ function getGallery() { return document.getElementById(GALLERY_ID); } /* ============================== GET IMAGES ============================== */ function getImages(gallery) { const items = gallery.querySelectorAll( ".inner > ul > li" ); return Array.from(items) .map(function (item) { const img = item.querySelector("img"); if (!img) return null; const width = img.naturalWidth || 1; const height = img.naturalHeight || 1; return { item: item, img: img, ratio: width / height }; }) .filter(Boolean); } /* ============================== CREATE ROWS ============================== */ function buildRows(images, galleryWidth) { const rows = []; let currentRow = []; let currentRatio = 0; images.forEach(function (image, index) { currentRow.push(image); currentRatio += image.ratio; const gapWidth = GAP * (currentRow.length - 1); const availableWidth = galleryWidth - gapWidth; const estimatedHeight = availableWidth / currentRatio; if ( estimatedHeight <= TARGET_ROW_HEIGHT && currentRow.length > 1 ) { rows.push({ images: currentRow, last: false }); currentRow = []; currentRatio = 0; } if ( index === images.length - 1 && currentRow.length ) { rows.push({ images: currentRow, last: true }); } }); return rows; } /* ============================== APPLY ROW ============================== */ function applyRow(row, galleryWidth) { const images = row.images; const totalRatio = images.reduce(function (sum, image) { return sum + image.ratio; }, 0); const totalGap = GAP * (images.length - 1); /* * Calculate exact row height. */ let rowHeight = (galleryWidth - totalGap) / totalRatio; /* * Don't make a tiny final row huge. */ if ( row.last && !STRETCH_LAST_ROW && images.length < 3 ) { rowHeight = Math.min( rowHeight, TARGET_ROW_HEIGHT ); } /* * Set image widths. */ images.forEach(function (image) { const width = image.ratio * rowHeight; image.item.style.width = width + "px"; image.item.style.height = rowHeight + "px"; /* Remove any old Carrd spacing */ image.item.style.margin = "0"; }); /* * Correct tiny rounding differences. */ if ( !row.last || STRETCH_LAST_ROW ) { const usedWidth = images.reduce(function (sum, image) { return sum + (image.ratio * rowHeight); }, 0) + totalGap; const difference = galleryWidth - usedWidth; if (Math.abs(difference) > 0.1) { const adjustment = difference / images.length; images.forEach(function (image) { const currentWidth = image.ratio * rowHeight; image.item.style.width = ( currentWidth + adjustment ) + "px"; }); } } } /* ============================== BUILD ============================== */ function buildGallery() { const gallery = getGallery(); if (!gallery) return; const list = gallery.querySelector( ".inner > ul" ); if (!list) return; const galleryWidth = list.clientWidth; if (!galleryWidth) return; const images = getImages(gallery); if (!images.length) return; const rows = buildRows( images, galleryWidth ); rows.forEach(function (row) { applyRow( row, galleryWidth ); }); } /* ============================== WAIT FOR IMAGES ============================== */ function initialize() { const gallery = getGallery(); if (!gallery) return; const images = gallery.querySelectorAll("img"); let remaining = images.length; if (!remaining) { buildGallery(); return; } images.forEach(function (img) { if (img.complete) { remaining--; if (remaining === 0) { buildGallery(); } } else { img.addEventListener( "load", function () { remaining--; if (remaining === 0) { buildGallery(); } }, { once: true } ); } }); } /* ============================== RESPONSIVE ============================== */ let resizeTimer; window.addEventListener( "resize", function () { clearTimeout(resizeTimer); resizeTimer = setTimeout( buildGallery, 150 ); } ); /* ============================== START ============================== */ if ( document.readyState === "loading" ) { document.addEventListener( "DOMContentLoaded", initialize ); } else { initialize(); } })();

SAM

WACKY RACES

Concept of a new Wacky Races character for a hypothetical special episode.
She is an energetic gardener who works in collaboration with Beems, the beekeeper of the garden that would later race with her.
SYNOPSIS
While tearing through the countryside, the Wacky Racers leave a trail of chaos in Sam and Beems' beloved garden. Furious, Sam teams up with Beems and challenges the racers to an unexpected showdown: if Sam and Beems win, the racers must promise never to barrel through their garden again. Will nature triumph over nitro?

SAND SCAMPER

PERSONAL GAME PROJECT

Sand Scamper was my first game where I was in charge of all aspects (programming and art). It was made in Game Maker as a final class assignment in Game Development and Graphics.
The game is a 2D platformer created from a character concept prompt of a young thief. The gameplay itself is minimal, moving and jumping to avoid enemies and reach the end of the level. There are two levels, a start screen, and an end screen for the game.
Below you can see the full gameplay, screenshots, and the technical art in terms of UI, animations, assets, and character concepts!

Gameplay

MORTE EN TROMP L'OEIL

DETECTIVE NARRATIVE

Concept created for a hypothetical French detective novel/graphic novel. The plot elements were generated as per project instructions. The detective is investigting a murder in a museum that was falsely disguised as a suicide by one of the cleaning ladies.
The project includes turnaround sketches for the two main characters, a spread illustration of a key point of the story, and a graphic book cover design for the novel.

CLIFFSIDE TOWN

COLONIAL SETTLEMENT

Isometric to immersive view of a settlement under Spanish colonial and Mission Revival influences in architecture.
It explores the possibility of a cliffside community and means of survival, specifically for water supply.

UNDERGROUND BOXING RING

SPACE REIMAGINED

Concept for an underground boxing ring laid out based on a real space. It is an exploration of mood and camera placement.

THE MINOTAUR CEREMONY

CULT NARRATIVE

Keyframe illustration, character design, and storyboard/animatic project for a narrative surrounding a cult leader feeding its followers off of a minotaur's soul essence, all represented by glowing circles.

The Storyboard and animatic follow the narrative before the ceremony in the illustration takes placeSYNOPSIS
A cult member meets the leader to announce the preparations are ready, but he looks nervous. The leader reassures him and formally welcomes him to the cult.

THE GREAT BLUE HERON

FIELD NOTES

Scientific illustration based on the visual appeal of field notes to act as an informational poster about the great blue herons.

LATE NIGHT DRIVE THRU

MATTE ILLUSTRATION

Imagined under the theme "Sci Fi Fast Food Drive Thru"

THE HERBALIST

FANTASY GAME CONCEPT

Visual development project for a medieval fantasy indie game (in development), including banner illustration, character concept art, environment concept art, and 3D environment.
The project was made under a deadline for gallery exhibition purposes.

MARTA GREAVES

HOPETOWN FAN CONCEPT

Marta Greaves is a hypothetical character concept for Hopetown, an RPG currently being developed by Longdue Games.
This fan exploration follows the mining motifs of the world and a take on a potential character for it.
This concept includes turns for the character, a 2d concept for a potential 3d model, and a dialogue bust illustration.

hello hello!_____

ABOUT ME

VERONICA GALLEGO

Hi! I am a Cuban artist based in North Carolina.
I graduated with a Bachelor of Fine Arts degree with a concentration in Illustration at the University of North Carolina in Charlotte.
My specialization is in Concept Art and Illustration for the entertainment industry, and I have a a background as a 3D Texture Artist in video games. My passion lies in world-building and storytelling through visual design and stylization.You can see more of my work in the platforms above!
I am commonly known in social media platforms as pirypong.


SKILLS

Concept Art
Character Design
Environment design
Prop Design
Illustration
Texture Painting


SOFTWARE

Clip Studio Paint
Photoshop
Substance Painter
Blender

WORK

CONCEPT ARTIST AND ILLUSTRATOR AT SOUL ATLAS
Remote
April 2026 – Present
• Assist in the production of promotional illustrations
• Create concepts and illustrations for the Grimhald graphic novel
• Collaborate with other creatives to establish visual unity within the IP
• Discuss issues, progress, and design solutions for the work of peers


COMMISSIONS

INDIVIDUAL COMMISSION WORKS
Remote
October 2020 – Present
• Create tailored works for individual clients
• Work in the areas of illustration, animation, character design, character sheets, and character pin ups per request
• Meet deadlines and work revisions with new and recurring clients


INTERNSHIPS

VIDEO GAME ARTIST AT UNSCROLLED
Remote
September 2022 – September 2023
• Worked as the main texture artist for 3D characters
• Created a step-by-step guide to aid texture artists with the software, workflow, and style of the game
• Animated small 2D props with Grease Pencil in Blender
• Collaborated with concept artists, 3D modelers, and other experts in the industry
• Discussed issues, progress, and design recommendations with the Art Team Leads
• Provided alternatives to final products within the Art Director's vision


SELECTED EXHIBITIONS

SENIOR EXHIBTION
University of North Carolina at Charlotte, NC
Spring 2025
57TH ANNUAL JURIED STUDENT EXHIBITION
University of North Carolina at Charlotte, NC
Spring 2025
56TH ANNUAL JURIED STUDENT EXHIBITION
University of North Carolina at Charlotte, NC
Spring 2024
SOLO SHOW
South Piedmont Community College, NC
Spring 2023


EDUCATION

BACHELORS, UNIVERSITY OF NORTH CAROLINA AT CHARLOTTE, NC
August 2023 – May 2025
ASSOCIATE OF FINE ARTS, SOUTH PIEDMONT COMMUNITY COLLEGE, NC
August 2023 – May 2025

hello hello!_____-

CONTACT ME

VERONICA GALLEGO