The hair of stylized characters in games and avatars is built from hair cards: artist-placed ribbons whose geometry is the visible hair, animated by spring bones. Existing image-based methods produce realistic hair or a single fused mesh, while CHARM, the only generator of stylized hair cards, decodes a hairstyle autoregressively as a long sequence of control points. Observing that a card hairstyle is an unordered set of artist-defined primitives, we propose HairDeck, which generates it as one: each card is a single token, and a set diffusion transformer denoises all cards together. From a single image, HairDeck generates the cards and the spring-bone chains that drive them, yielding an animatable asset that exports to ready-to-use downstream formats. On CHARM's own test set, it lowers Chamfer distance by 44% and card-orientation error by more than half while running 33 times faster, and from single images it outperforms CHARM, image-to-3D pipelines and strand-based methods. Project page: https://hyzcluster.github.io/HairDeck
Figures & tables
Figure 2: Overview. Left: a hairstyle is a set of hair cards. Each card, a polyline of control points with width and thickness, becomes one token holding its root position, root normal, card VAE latent z , cross-section type and existence flag. Middle: the set DiT denoises the token set with flow matching, attending across cards and to the condition, a point cloud or an image. Empty slots let the model decide how many cards to generate. Right: the card VAE decodes the tokens into cards, and the chain DiT generates their spring-bone chains.
Figure 3: Network design. Top: the card VAE. The encoder reads the control points of one card with their arc-length fractions ui , plus a learned summary token [CLS] , whose output alone gives the mean and log-variance of the 32-d latent z . The decoder predicts the number of points n and evaluates the card at n uniformly spaced arc-length fractions, modulated by z (adaLN-Zero). Bottom: both DiTs use the same block design (left), modulated by the timestep and the pooled condition. The set DiT predicts the velocity of 192 card token slots without positional embedding, conditioned on a point cloud or an image. The chain DiT does the same for 48 spring-bone chain slots, conditioned on the card tokens sampled by the set DiT (dashed arrow). Empty slots (dashed boxes) have existence −1 , filled ones +1.
Figure 4: Point clouds from CHARM’s test set. CHARM and HairDeck output hair cards, colored per card like the artist ground truth; MeshAnything V2, DeepMesh and BPT output meshes. All results are shown on a fixed head at each character’s placement.
Figure 5: Head frame. (a) The dataset frame scales every character to height 1, so heads differ in size and height; the right character’s ears count toward its height and lower its head. (b) In the head frame, all characters share the face width W and face top O .
Figure 6: Single images: two in-the-wild illustrations (top) and an AI-generated photorealistic portrait (bottom). Insets show the outlined regions with mesh edges. TRELLIS.2 and Hunyuan3D-2.1 take the hair region as input, and TRELLIS.2 outputs a flat plate facing the camera for both illustrations. Each card has its own color.
Figure 7: Hairstyles generated by HairDeck from in-the-wild images. Hair colors are taken from the images for display.
Method
CD ↓
EMD ↓
HD ↓
IoU ↑
Orient. ↓
Time ↓
MeshAnything V2 [ 6 ]
0.0166
0.0182
0.0630
0.671
–
176 s
DeepMesh [ 84 ]
0.0357
0.0381
0.1001
0.530
–
1050 s
BPT [ 66 ]
0.0446
0.0507
0.1063
0.451
–
351 s
CHARM [ 15 ]
0.0117
0.0128
0.0498
0.753
40.0°
33.7 s
Retrieval
0.0119
0.0119
0.0505
0.732
24.8°
–
Card-level AR
0.0078
0.0093
0.0356
0.823
16.6 °
6.91 s
Table 1: Generation from point clouds on CHARM’s 100 test hairstyles, with its protocol; orientation on the original meshes (artist cards meshed from root normals: 7.5°); time per hairstyle. Means leave out 1 DeepMesh and 3 BPT outputs that fail to scan.
Figure 8: Generated spring bones in motion. Left: the generated cards (transparent) with their generated spring-bone chains. Right: a 50° head turn; top row with the chains, bottom row without them. The orange outline marks the hair without spring bones in the same frame.
Test characters
Failure rate ↓
Method
CD ↓
IoU ↑
Test
In the wild
Time ↓
CHARM [ 15 ]
0.0186
0.540
34.2%
50.0%
67.7 s
TRELLIS.2 [ 71 ]
0.0139
0.638
13.2%
77.5%
83.0 s
Hunyuan3D-2.1 [ 77 ]
0.0148
0.638
30.3%
75.0%
60.8 s
DiffLocks [ 42 ] + cards
0.0174
0.592
17.1%
17.5%
15.6 s
HairDeck
0.0089
0.725
3.5%
10.0%
1.33 s
Table 2: Generation from single images: aligned CD and IoU on 76 test characters, failure rates on them and on 40 in-the-wild images ( Sec. 4.1 ), and time per image.
Variant
CD ↓
IoU ↑
Orient. ↓
Turn
HairDeck
0.0066
0.867
16.8°
14.2°
raw control points as tokens
0.0068
0.856
17.1°
21.9°
VAE with index decoding
0.0079
0.823
18.1°
25.3°
w/o root normal
0.0070
0.850
26.4°
13.9°
w/o existence (card-count head)
0.0068
0.859
16.7 °
14.5°
CHARM’s card templates
0.0068
0.856
26.7°
15.8°
Table 3: Ablations on point clouds; each row changes one part of HairDeck (all rows in Tab. 6 ). Raw control points: the card resampled to 64 points by arc length. Turn: largest angle between consecutive segments of a card, median per hairstyle (artist cards: 14.1°).
Figure 9: Interpolation between two test point clouds, inputs A and B: the condition tokens of B are matched to those of A and blended with the weight α under each column, and all samples share the initial noise. Hair colors and head placements are blended for display.
Chains
CD ↓
Rec. ↑
Prec. ↑
Motion ↑
Ampl.
Fit ↑
Procedural
0.504
0.397
0.110
0.538
0.0473
0.832
Retrieval
0.431
0.289
0.285
0.622
0.0157
0.811
Ours, artist cards
0.279
0.625
0.585
0.702
0.0167
0.953
Ours, point cloud
0.319
0.542
0.543
–
–
0.952
Ours, single image
0.407
0.390
0.402
–
–
0.949
Table 4: Spring-bone chains on the 58 test hairstyles with chains, against the artists’ chains (metrics in Sec. 4.5 ; Ampl.: mean per-point motion, 0.0157 W for the artists’ chains). Bottom rows: generated cards; –: not measured.
Appendix figures & tables20 assets
Supplementary material from the paper’s appendix.
Appendix
Figure 11: More point clouds from CHARM’s test set, shown as in Fig. 4 .
Figure 12: Single images, shown as in Fig. 6 with a ground-truth column: four test characters (top) and three in-the-wild illustrations (bottom). TRELLIS.2 [ 71 ] outputs a flat plate facing the camera for the last one.
Figure 13: Six more in-the-wild illustrations, shown as in Fig. 6 . TRELLIS.2 outputs a flat plate facing the camera for five of them.
Figure 14: Two more point clouds from CHARM’s test set, shown as in Fig. 4 , each with a row of back views below it.
Test characters
Failure rate ↓
Method
CD ↓
IoU ↑
Test
In the wild
Time ↓
TRELLIS.2 → CHARM
0.0170
0.554
32.9%
80.0%
119 s
Hunyuan3D-2.1 → CHARM
0.0163
0.573
28.9%
80.0%
96.8 s
TRELLIS.2 → PC model
0.0138
0.621
22.4%
76.7%
85.8 s
Hunyuan3D-2.1 → PC model
0.0143
0.615
29.4%
80.0%
64.2 s
HairDeck
0.0089
0.725
3.5%
10.0%
1.33 s
Appendix
Table 5: Cascades of image-to-3D generators (TRELLIS.2 [ 71 ] and Hunyuan3D-2.1 [ 77 ] ) and point-cloud generators, against HairDeck. “ → ” feeds an image-to-3D output, sampled as a point cloud, to a point-cloud generator; PC model: our point-cloud model. Columns as in Tab. 2 : aligned CD and IoU, failure rates ( Sec. 4.1 ) and time per image.
Variant
CD ↓
IoU ↑
Orient. ↓
Turn
HairDeck
0.0066
0.867
16.8°
14.2°
Card token
raw control points
0.0068
0.856
17.1°
21.9°
PCA, 64 coefficients
0.0078
0.832
17.8°
11.1°
VAE with index decoding
0.0079
0.823
18.1°
25.3°
latent z∈R64
0.0071
0.843
17.2°
13.4°
Appendix
Table 6: All ablations on point clouds; each row changes one part of HairDeck (rows of Tab. 3 : Sec. 4.4 ; card tokens: Appendix C ). CD and IoU on CHARM’s ground truth and Orient. on the original meshes, as in Tab. 1 ; turn: the largest angle between consecutive segments of a card, median per hairstyle (artist cards: 14.1°). Root position inside the latent: the card VAE encodes absolute positions, and the token has no separate root position. Bold: best in each column with an arrow.
Front view
Restyled
Variant
CD ↓
Overlap ↑
Aligned CD ↓
Aligned CD ↓
P ↑
R
Cards
HairDeck
0.0136
0.829
0.0089
0.0096
0.849
0.833
68.9
w/o head frame
0.0189
0.798
0.0089
0.0095
0.736
0.756
69.8
w/o restyled images
0.0135
0.827
0.0090
0.0097
0.781
0.826
86.9
w/o restyled images and style aug.
0.0137
0.827
0.0091
0.0100
0.760
0.790
79.9
Appendix
Table 7: Ablations of the image model on the 76 test characters. Front view: CD before alignment (CHARM’s protocol, so it includes where the hair sits), overlap (IoU) of the reprojected hair with the input’s hair, and aligned CD as in Tab. 2 . Restyled: the front views restyled as in Fig. 20 , with aligned CD, root precision P and recall R as in Sec. 4.1 , and cards per hairstyle (ground truth: 65.1). Style aug.: the synthetic style augmentation of Appendix A ; without it, every sample gets only the light augmentation. Bold: best in each column with an arrow.
Figure 15: Card tokens. A set DiT of the same architecture, trained with each card token of Tab. 6 , generates two test hairstyles from point clouds; insets magnify the same window in each row. Raw control points and the VAE with index decoding give jagged cards, PCA with 64 coefficients gives straighter cards than the artists’, and our latent gives cards as smooth as theirs. Each card has its own color.
Card code
CD ( 10−3 ) ↓
F1 ↑
Exact n↑
Turn
index decoding
4.17
0.411
0.917
25.3°
arc-length decoding
0.98
0.893
0.984
15.6°
+ adaLN
0.91
0.904
0.984
15.8°
+ world-unit loss
0.84
0.920
0.984
13.1°
+ both
0.70
0.942
0.984
13.7°
+ both + uniform targets (ours)
0.70
0.943
0.984
14.3°
Appendix
Table 8: Card VAE design: reconstruction of the cards of CHARM’s 100 test hairstyles, with z∈R32 . Per card, CD is the two-sided point-to-surface distance between the reconstructed and the input card, both meshed with the input card’s root normal, in 10−3 of the character height, and F1 is the F-score of their surface samples at distance 0.001; exact n : share of cards with the right number of control points; turn as in Tab. 6 (artist cards: 14.1°). +: added to arc-length decoding, where z is added to every decoder query; uniform targets: training queries the decoder at n uniformly spaced arc-length fractions, as at test time. Bold: best in each column with an arrow.
Root direction
Along the card
Mean ↓
Median ↓
P2S ( 10−3 ) ↓
Control points placed by the artists
first 3 points
least squares
24.7°
19.7°
1.39
first 3 points
Bishop
16.3°
9.4°
1.24
original mesh
least squares
19.3°
16.9°
1.36
original mesh
constant
11.9°
9.7°
1.28
original mesh
Bishop
7.5 °
5.6 °
1.10
Appendix
Table 9: Width direction and shape of artist cards rebuilt from their control points, on CHARM’s 100 test hairstyles: control points as placed by the artists or quantized by CHARM, the root direction from the first 3 points (their smallest principal axis, as in CHARM’s templates) or from the original mesh, and CHARM’s least squares, a Bishop frame or a constant direction along the card. Mean: orientation error as in Tab. 1 ; median: the same with the median over each hairstyle’s cards; P2S: two-sided point-to-surface distance to the original card mesh, with CHARM’s widths and thicknesses in every row so that only the width direction differs (card VAE: its own). Bold: best above the line.
Method
Width direction
Orient. ↓
Root ↓
CD ↓
CHARM
first 3 points + least squares
40.0°
33.4°
0.0117
CHARM
first 3 points + Bishop
37.5°
33.1°
0.0119
HairDeck
first 3 points + least squares
30.2°
19.4°
0.0067
HairDeck
root normal + Bishop
16.8 °
8.9 °
0.0066
Appendix
Table 10: Width direction of generated cards on CHARM’s 100 test point clouds. Only the width direction used for meshing changes. Orient. and CD: as in Tab. 1 ; root: angle at the root, median over the cards of each hairstyle.
Aligned CD ↓
Root precision ↑
Style
HairDeck
w/o restyle
w/o both
HairDeck
w/o restyle
w/o both
original
0.0089
0.0090
0.0091
0.904
0.895
0.898
gacha
0.0092
0.0092
0.0093
0.859
0.830
0.821
thick paint
0.0098
0.0098
0.0103
0.818
0.700
0.676
semi-real
0.0096
0.0100
0.0102
0.869
0.812
0.784
Appendix
Table 11: Drawing styles on the 76 test characters: the front view (original) and its restyles of Fig. 20 . Aligned CD as in Tab. 2 and root precision as in Sec. 4.1 . w/o restyle: without restyled images; w/o both: also without synthetic style augmentation ( Tab. 7 ). Bold: best model per style.
Figure 16: More hairstyles generated from in-the-wild images. Each cell shows the input (top left), the back view (bottom left) and the front view of the generated hairstyle. Hair colors are taken from the images for display.
Figure 17: More hairstyles generated from in-the-wild images, shown as in Fig. 16 .
Figure 18: More hairstyles generated from in-the-wild images, shown as in Fig. 16 .
Figure 19: More hairstyles generated from in-the-wild images, shown as in Fig. 16 .
Figure 20: Drawing styles. Two test characters, original and restyled by an image-editing model [ 68 ] into the gacha, thick paint and semi-real styles (top row of each), and the hairstyle generated from each image (bottom row). Each character’s hair is shown in one color.
Figure 21: Denoising from a point cloud. For each test point cloud (left), top: the cards decoded from the noisy token set Xt ; bottom: the clean set predicted at that step. Each card keeps its color along the trajectory.
Figure 22: Denoising from an illustration. On each platform, from left to right: the input, the cards decoded from the noisy token set Xt at t=1.0 , 0.7 and 0.4, and the generated hairstyle. Each card keeps its color along the trajectory.
Figure 23: Failure cases on in-the-wild illustrations: the input (top), the matted input (middle) and our output (bottom). The matte keeps props, background, tails, effects, a hat or horns, and they turn into cards. Hair colors are taken from the images for display.