Files
orisys-sensor-design/docs/xynova-texture-investigation.md
T
2026-09-19 21:02:34 +08:00

3.2 KiB
Raw Blame History

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.