top of page
Create Your First Project
Start adding your projects to your portfolio. Click on "Manage Projects" to get started


Haelin
Date
Jan 28
Haelin is a first-person simulation that lets players observe and interact with Haelin, an imaginary creature inspired by Korean and East Asian mythology. The goal of Haelin is to bridge cultural mythology with digital art and gaming interactivity. Players are able to observe Haelin as he moves and interact with him through actions like feeding and petting. They can immerse themselves into the virtual environment that features Gyeongbokgung palace, the largest and most iconic of the Five Grand Palaces built during Korea’s Joseon Dynasty.


HaelinDemo


Concept sketch of Haelin


Creating face of Haelin
I made references to Hahoe mask, a Korean traditional mask that was used in plays to express dynamic emotions.


Small gap between front feet and legs
I found this mistake I made and filled the hole by boolean differencing the feet, recreating feet (I wanted to make improvements on the design), and connecting them back to the legs without any gaps.


Haetae inspired body patterns (1)
I added some Haetae-inspired patterns to Haelin's body.


Haetae inspired body patterns (2)
I added the patterns to the lower back as well.


A collar and a bell
I created mesh for a collar and a bell.


Base mesh of Haelin
This is the final base mesh of Haelin before I began retopologizing.


Retopology process
I started retopologizing starting from the head


Issue with retopology
After using several different planes for retopology, I realized the plane I used for retopologizing the top of the head had different normals. Therefore, I couldn't merge vertices on the head and those near the eye without applying modifiers. Hence, I decided to merge the vertices after applying the modifiers.


Retopology result
This is the final result of the retopology.


UV unwrap
After marking seams, I unwrapped the UV map.


Normal map
I baked the normal map and applied it to the UV map.


Issues found (1)
Issue: There were too many grey areas that indicated something went wrong with the UV mapping and baking process.
Solution: Some parts of the mesh had normals with incorrect face orientations, so I used the "Recalculate Outside" function to correct them.
Solution: Some parts of the mesh had normals with incorrect face orientations, so I used the "Recalculate Outside" function to correct them.


Issues found (2)
Issue: some of the vertices weren't merged properly so there were some weird faces.
Solution: Merge by Distance" function to easily merge the overlapping vertices.
Solution: Merge by Distance" function to easily merge the overlapping vertices.


Issues found (3)
Issue: Some grey areas were showing up on the mesh.
Solution: I increased the value of "extrusion" under "Bake" and "Selected to Active" to cover up the grey area.
Solution: I increased the value of "extrusion" under "Bake" and "Selected to Active" to cover up the grey area.


Issues found (4)
Issue: The rectangular faces of the low-poly mesh I created were showing on top of the normal map texture.
Solution: I used "Shade Smooth" on the low-poly mesh.
Solution: I used "Shade Smooth" on the low-poly mesh.


Issues found (5-1)
The details of the feet were not visible on the baked normal map. So I made additional seams around the ankles, unwrapped the UV map again, enlarged the feet's UV map, then baked normal map onto it again.


Issues found (5-2)
After making the changes, the details showed up successfully.


Bell
I created a color shader node for the bell and added metalic texture to it.


Collar design (1)
I created this design by importing the UV map of the collar to Photoshop. The Korean traditional patterns I used for the collar design are made by Korea Cultural Information Service. They can be used freely. Sports and Tourism. They can be used by artists https://www.culture.go.kr/tradition/designPatternView.do?seq=610&did=52012&reffer=shape
https://www.culture.go.kr/tradition/designPatternView.do?seq=330&did=22630&reffer=shape
https://www.culture.go.kr/tradition/designPatternView.do?seq=330&did=22630&reffer=shape


Collar design (2)


Texture paint result (1)


Texture paint result (2)


Texture paint result (3)


Texture paint result (4)


Rigging with Rigify


Issue with weight painting (1)
There were two vertices that wouldn't move along with the rest of the front leg, even though its vertex weight was set to 1. In weight painting, all vertex weights must total 100%, so if a vertex is assigned to multiple bones, the weights are shared and normalized. I solved the problem by removing weight for all bones except for frontleg.001.


Issue with weight painting (2)
The horn mesh breaked in a weird way after I removed weight and tried to rig it. The horn used to move along the ear with automatic weight assignment, and I didn’t want that to happen. So I went into weight paint mode and colored the horn area with weight 0.0 and strength 1.0. I made sure the entire surface of the horn has a weight of 0. However, when I tried to animate the ear, some parts of the horn moved along with it and distorted the shape.
I was able to resolve this issue by assigning the horn to the head bone, as it can’t just have 0 weights with every bone.
I was able to resolve this issue by assigning the horn to the head bone, as it can’t just have 0 weights with every bone.


Animating walking cycle


Issue with maintaining hierarchy in Unity
The eyes and collars were parented to the armature of the body, and they moved perfectly well as I intended in Blender. However, when I exported them to Unity, they were no longer moving along with their parent (armature).
I took months to find the following solution:
1. Parent the Eyes to the Armature.
2. Assign Vertices to the Correct Bone Group.
I took months to find the following solution:
1. Parent the Eyes to the Armature.
2. Assign Vertices to the Correct Bone Group.


Issue with eye gradient moving along with the animated eye bone
To lock a gradient texture to a rolling/moving eye, I
1. Created an Empty (called GradientReference)
2. Added a "Child Of" Constraint
3. Disabled Rotation Influence
4. Clicked "Set Inverse"
5. Used Object Coordinates in Shader
1. Created an Empty (called GradientReference)
2. Added a "Child Of" Constraint
3. Disabled Rotation Influence
4. Clicked "Set Inverse"
5. Used Object Coordinates in Shader


Animation Demo


Unity demo with keyboard inputs


Gyeongbokgung Palace's base mesh


Gyeongbokgung Palace's texture


Gyeongbokgung Palace (Front)


Gyeongbokgung Palace (Right)


Gyeongbokgung Palace (Left)


Grass texture


Rendered grass


Palace, grass, sky, and Haelin all together


Hand motion detection using Gemini Mediapipe


Setting up first person using Mixamo (1)


Setting up first person using Mixamo (2)


Help icon


Information icon


Backstory
bottom of page