fixed xynova texture generation problem

This commit is contained in:
ykcheungab
2026-09-19 21:02:34 +08:00
parent 55bab861c3
commit 71c2a29ccb
15 changed files with 663118 additions and 63 deletions
+67
View File
@@ -0,0 +1,67 @@
# Xynova camera-projected patch investigation
## Intended pattern
The requested squares are defined in the image seen by `cam_sensor`, not in the
flat compute PNG or in physical surface distances. The current 1000×1000 camera
and 80×80 grid define nominal 12.5×12.5 camera-pixel cells. Silhouette and occlusion
boundaries may clip those cells.
Changing PNG width/height or forcing UV shapes to squares is not a correction of
the camera pattern. An independent raycast using Blender loop triangles, a BVH,
and triangle barycentric UV interpolation measured the following centre-region
steps (camera samples (0.5,0.5), (0.5125,0.5), (0.5,0.5125)):
| UV layout | Horizontal step in texture pixels | Vertical step | Ratio |
|---|---:|---:|---:|
| compute | 59.3465 | 50.7074 | 1.17037 |
| produce | 106.1594 | 90.2955 | 1.17569 |
These are local mapped edge lengths, not axis-aligned bounding boxes. They show
that camera-square elements can legitimately look rectangular in the flat UV
artwork. Curved surfaces also make the distortion position-dependent.
## Confirmed interpolation defect
The investigated blend contains 4,818 triangles and 16 quads with no modifiers.
A valid quad does not need to be removed or manually triangulated to be usable.
However, the original `get_uv_from_face()` always selected a polygon's first
three vertices, even for a ray hitting the other tessellated half of a quad. It
also formed barycentric weights from unsigned triangle areas, which are not a
valid containment-aware extrapolation outside that first triangle.
At an actual tessellated triangle centre on compute polygon 4826:
- Correct UV: approximately `(0.0480605, 0.2511341)`.
- Original generator UV: approximately `(-0.0245351, 0.3876915)`.
The error is hundreds of output pixels and can leave the tile. The original
periodic-wrapping heuristic can then relocate the bad polygon into another part
of the texture. Another tested compute polygon (2876) produced a UV error of
approximately 0.1471, mostly in V.
## Separate seam-construction weakness
The original generator connected independently raycast camera-cell corners into
one UV polygon (or their convex hull near the silhouette). That loses the face
and UV-chart identity of each sample. A cell spanning a UV seam cannot generally
be represented by one polygon connecting all its samples. A UV-span threshold
or a final raster mask can hide some symptoms, but neither repairs the mapping
and a raster-only mask leaves incorrect SVG/PDF geometry.
The approved correction uses triangle-local camera-cell intersections, keeps
separate UV fragments across seams, and applies perspective-correct interpolation.
Verification must check the vector fragments against the actual UV triangles and
check their reprojection against the camera grid, not merely inspect the PNG.
## Source preservation baseline
Source: `sensors/finger-xynova/r01/source/geometry.blend`
SHA-256 recorded before implementation:
`574e1e4501db224e025a0b44327afa53726d71a25c36aa8c36d8c45a6f0317b2`
The blend was already modified relative to Git HEAD when this investigation
started. That user modification must be preserved. No camera configuration,
mesh editing, UV re-unwrapping, staging, or commits are part of this repair.