Paintwalker
I made a 3D coloring book as my thesis at RCAD. This was a solo project, and all art in the game was made by me (except the Unreal mannequin), and non-linear blending was handled by Mixbox.
I made a 3D coloring book as my thesis at RCAD. This was a solo project, and all art in the game was made by me (except the Unreal mannequin), and non-linear blending was handled by Mixbox.
To make sure everything could be paintable I made my own pipeline coordinating between a master material, meshes, tools, and blueprints for each object in the game.
Work included:
Blueprints: Made a painting mechanic with additional features such as undo history, masking, autofill, and lighting.
Look: Iterated on a cohesive and unique visual style.
Materials: Designed a master material with painting in mind + additional materials to facilitate the painting itself.
3D assets: Modeled game ready assets with UVs and vertex colors supporting painting.
Pipeline and tools: Created a pipeline to prepare meshes to work with painting after importing into engine. Made blueprint and tools to process and store additional mesh-specific painting information.
Goal: I wanted to split meshes into different sections.
Considerations:
Blueprint accessible, so the game could tell what section was being used, if the current painted mesh actually had that section, and communicate with materials to paint them.
Material accessible, so the paint could visibly be masked out.
Avoid defining sections by using multiple materials or meshes.
Solution: Every paintable mesh has a blueprint that stores a Section Data struct.
Outcome: Players can paint and autofill by specific section, and I have an in-editor way to color everything for the intro cinematic.
Goal: Estimate how much of the map gets painted for the completion bar.
Problem: Sounds easy- look at the texture and check how many pixels have been painted, right? Unfortunately, the blueprint nodes that do this- “Read Render Target” are far too slow to be used in game.
Solution: Instead I made an approximation of colors in blueprint. Each actor has an array (map labeled by section) of locations. When the player draws the game tracks how many locations were overlapped, and use the section's SurfaceArea to approximate how many square meters have been covered.
Outcome: I created a good enough, fast estimate of how much the player had painted the level.
Problem: …But wait! How did I set those arrays?
Solution: While Unreal has a 3d widget toggle on public location variables, I found it more convenient to place the points on the actor in Maya/Blender so I could copy/paste, mirror, and snap points to surface. These points were locators/empties with the prefix “SOCKET_” and named according to section.
Unreal’s mesh importer turns these points into sockets on the mesh, and I wrote a blueprint function to convert this information into the map of SectionData and array of locations. Afterwards, the sockets can be removed from the mesh.
Outcome: I made a convinent way to measure how much of a mesh was painted and what its list of sections was.
FOR MORE TEXT- visit my non-Google website and see the same page but with more words. https://catherinewang.art/paintwalker.php
edit: This page here was used to quickly concept how I wanted to reformat the corresponding page on my portfolio website. The webpage above basically resembles this one now, but I'll leave this page up because why not? Check out my game!