Known pigment surrounds an unpainted patch on a folded paper surface; the paper itself remains intact
A missing paint source is not a hole in the mesh. This teaching surface keeps its shape while colour ownership changes.

Give painting the surface it has to fit

A character can look finished from the front and still have an unpainted underside, a smeared nose or a highlight that stays stuck when the scene light moves. Those defects look related in the final render, but changing the image model is not the right response to all of them.

We separate the shape from its appearance. An existing mesh supplies the surface; the selected character still supplies the intended colours and markings. The current MV-Adapter path renders normals and positions from that mesh. Normals say which way each patch faces. Positions say where it belongs on the body.

The model receives those aligned controls and proposes six paint views: four around the body, one above and one below. These are fixed cameras. The generated images are typically 768 pixels across, while the assembled texture atlas is 4096. A larger atlas has room for more samples; it does not invent an unseen stripe.

These are different images from the four-view reference packs used for reconstruction. The mesh already exists, and the geometry controls now tell painting which surface each camera must fit.

A surface gives painting something to fit

Geometry controls fix the surface and camera. The image model proposes appearance. Projection and finishing decide how those proposals become a texture.

Generate the paint views

Generate the paint viewsRender normals and positions at six fixed cameras, then generate six appearance views from those controls and the identity still.Mesh + stillNormalsPositionsPaint viewsSix cameras

Assemble the surface colour

Assemble the surface colourProject with a source-view ownership policy, fill valid surface texels with no accepted source, level seams and pad texture margins.ProjectionView ownerFill unownedtexelsLevel seamsPad margins

The generated front owns the facial region as a unit. Empty atlas background is not a missing surface sample.

Source-traced MV-Adapter path at the recorded app revision. The six view cameras are fixed; adaptive camera planning was separate labelling research.
Back to contents

Decide which view owns each face

Projection turns an image pixel into surface colour by using the recorded camera. A face seen nearly edge-on offers fewer useful pixels. A hidden face has no visible evidence from that camera. Even a visible patch can lose its source when the ownership policy rejects that view.

We keep the generated front responsible for the facial region as a unit. Combining one eye from a side view with a muzzle from the front can splice together drawings that disagree. A coherent owner is a useful constraint, although it cannot make a bad generated face correct.

The bake records ownership separately from colour. That lets us ask whether a dark pixel is intended paint or whether the surface has no accepted source. We also keep a surface-occupancy mask: unused background in the flat atlas is not a hole to fill.

Back to contents

Find the surface with no colour source

A texel is one pixel in the texture. The coverage check first asks whether it represents a real point on the mesh, then whether any view owns it. Only the valid, unowned surface samples need the fallback. Filling every black atlas pixel would confuse empty layout space with missing paint.

A retained fox study counted 71,414 valid surface texels without an owner, including recessed and unseen areas. That historical count identifies the problem; the little paper example below explains the method. It is not a replay of that fox result.

The distinction also gives us a useful debugging question. Does the patch exist in geometry? Does it have texture space? Does it have an accepted image source? We answer those before asking a model to redraw anything.

Back to contents

Fill along the body, across the UV seam

UVs lay a curved surface out in a flat image. Cutting that layout into islands helps pack it, but breaks the relationship between image proximity and surface proximity. Two adjacent body samples may sit on opposite sides of the atlas; an unrelated patch may sit one pixel away.

The fallback follows a graph of neighbours on the surface, including connections across UV seams. Known colour stays fixed while the solver finds a smooth continuation through the missing region. In the little model below, each unknown sample settles at the average of its surface neighbours. Repeated updates carry the two boundary colours across the gap.

On the six-sample strip below, the endpoints are 0.2 and 0.8. Equal neighbour weights give the four missing samples 0.32, 0.44, 0.56 and 0.68. Moving island B changes where we store those samples, not which points touch on the body. Recolouring the nearby triangle should have no effect.

This is inferred colour. A stripe that disappears behind an arm cannot be recovered from a smooth average. If a disconnected component has no known boundary at all, the teaching solver refuses to pretend it has evidence. A new reference, an artist decision or an explicitly different fallback is needed.

Move the UVs. Keep the surface neighbours.

Four samples on this sheet have no paint source. Fill them, then move the atlas island or recolour its nearby triangle. Those atlas changes must not change the colour inferred along the sheet.

One continuous paper strip has two square-marked known samples and four middle samples. Below, atlas islands A and B separate at the same surface seam; a nearby triangle is a different component.One continuous surfaceTwo islands in the UV atlasABDashed link: same surface edge
Surface and atlas
More controls

Four colour samples inferred from the two known boundaries. Inferred scalar samples: 0.32, 0.44, 0.56, 0.68.

One surface strip, six samples and uniform neighbour weights. Squares mark known colour; the four middle circles are inferred only after fill. A and B are UV islands of that same strip; the triangle is unrelated. This scalar teaching model cannot recover a hidden stripe or reproduce the full painter.

Why this little strip blends linearly
function fillStrip(left, right = 0.8) {
  return Array.from({ length: 6 }, (_, i) =>
    left + (right - left) * i / 5
  );
}

On this equally spaced chain, the harmonic solution is a straight blend between fixed endpoints. The live figure checks that result with the shared neighbour-averaging solver. General surface graphs need their actual connectivity and boundary conditions.

Back to contents

Give the nose enough texture space

Another mouse defect looked like a painting failure: several painters smeared the nose. Part of the head had very little atlas area for the surface it represented. A detailed generated view still loses detail when many surface points collapse into a few texture pixels.

The retained UV repair re-unwrapped one island. Under that study’s density test, starved faces fell from 3,670, covering 2.54% of the whole mesh’s area, to zero. The separate 8.2% figure used head area as its denominator. Keeping the denominator beside the result prevents a much larger-looking claim.

That was an allocation repair, not a new appearance source. Increasing atlas size can help a correctly allocated surface; it cannot reliably compensate for one tiny island receiving almost none of that space.

Back to contents

Inspect the paint under a different light

A generated view can include a convincing highlight that the bake treats as colour. Move the scene light and the pale mark remains. Painted strand detail can cause a similar double description when a later groom adds its own fibres.

The Cleanbot detail below shows the symptom clearly. The left uses procedural enamel; the right uses MV-Adapter paint, with the same code-built additions. Pale smears stay in the painted shell. This is a historical r5 comparison, not a corrected output or a contest between two mesh models.

The current paint path also fits orientation-dependent light across the generated views, then aligns material colours to the still before baking. The source records a gecko test where the fitted light pointed toward the pale belly and the patterned back came out lighter. A naturally darker back and lighter belly can resemble a lighting gradient. Removing the unwanted light therefore needs a separate check that the character’s real colour survived.

Cleanbot shell with smooth procedural enamel on the left and pale smears in generated paint on the right
Retained October 13 r5 hybrid detail: procedural material left, MV-Adapter paint right, with the same code-built parts. The pale marks illustrate baked appearance. This is not the later r6 design, a raw mesh comparison or a repaired result.
Back to contents

An extra camera solves a different part of the problem

We also investigated choosing a camera from the gaps. In separate labelling research, candidate cameras were scored by the area of entirely unlabelled segments they could expose. Another clear view of an already-covered cheek added no new coverage.

On one retained chipmunk test, adding a planned fourth view reduced blind segment area from 2.614% to zero. That was a small two-subject investigation; the default stayed unchanged. Seeing every segment did not establish that every part name was right.

The diagram shows the visibility question only. This work was not an adaptive paint-repair loop: the current painter still generates its six fixed views. Choosing a new camera, generating compatible appearance and admitting its colour would each need a checked handoff.

A flat paper surface and an upright fold remain intact. Camera A sits to the left. Three solid lines from the camera stop at the fold; dashed continuations reach three samples on the far patch, which is marked unseen.camera Aunseen patch

An upright fold blocks the camera

Camera A cannot see the marked patch behind the fold. Its solid sight lines stop at the occluder; dashed lines show where the hidden samples would lie.

The identical flat surface, upright fold and three marked samples. Camera B sits to the right of the fold. Three unobstructed lines reach the same patch, now marked visible.camera Bvisible patch

A different camera sees the same patch

Camera B moves to the other side. Its three sight lines reach the same sample points. The surface, fold and marked patch have not moved, and no new geometry has been created.

Generic visibility teaching based on the separate semantic-labelling research: moving a camera can expose an existing patch without changing the mesh. The dashed continuation shows a blocked line of sight, not a generated image or a successful paint repair. The current painter generates six fixed guided views; it does not run this adaptive camera-planning loop.
Back to contents

Check coverage, continuity and character separately

A smoother texture is not automatically a better character. One historical cleanup study improved seam continuity while moving the mouse face further from the reference. Those previews were held for face work. A coverage metric had improved while the thing we cared about had worsened.

Keep those inspections separate: missing geometry needs shape work; poor UV allocation needs layout work; an ownerless surface needs a source or an explicit fill; a missing part name needs semantic evidence. The same black or blurred area can lead to very different next actions.

The reference article explains how we prepare the visual evidence. The model comparison explains what arrives from reconstruction. Painting carries that design onto a known surface, with the inferred portions and remaining uncertainties kept visible.

Back to contents