68 lines
3.2 KiB
Markdown
68 lines
3.2 KiB
Markdown
# 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.
|