# 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.