diff options
| author | yum <yum.food.vr@gmail.com> | 2025-12-06 19:09:42 -0800 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2025-12-06 19:10:03 -0800 |
| commit | 036919d692fda532bfba508f77ea9dba37d5c4f9 (patch) | |
| tree | ce12c65635cda34f4a71de690fa33cbff98fbc33 /vertex_deformation.slang | |
| parent | 0663fa9713e1fc44395401a96f60aca7a947bdbb (diff) | |
begin work on "un-tube" feature
essentially the inverse of the sheet -> tube transform.
Diffstat (limited to 'vertex_deformation.slang')
| -rw-r--r-- | vertex_deformation.slang | 39 |
1 files changed, 37 insertions, 2 deletions
diff --git a/vertex_deformation.slang b/vertex_deformation.slang index 047f7d7..577b0d2 100644 --- a/vertex_deformation.slang +++ b/vertex_deformation.slang @@ -84,7 +84,7 @@ float3x3 inverse(float3x3 m, float det) { return inv; } -// Takes map a 2x2 quad on the xy plane to a tube. The circular cross section +// Maps a 2x2 quad on the xy plane to a tube. The circular cross section // is on the xz plane. [Differentiable] public float3 plane_to_tube(float3 xyz, no_diff float t) { @@ -93,7 +93,8 @@ public float3 plane_to_tube(float3 xyz, no_diff float t) { float z0 = xyz.z; float theta = x0 * PI; - float phi = z0 * PI; + + // Equivalent to (1 / (|t| + eps)) * sign(t) float radius = 1.0f / (dabs(t) + 1e-4f) * sign(t); float x = sin(theta / radius) * (radius * PI_RCP - z0); @@ -114,6 +115,40 @@ public void plane_to_tube_undeform_normal(float3 xyz, inout float3 normal, R3R3_UNDEFORM_NORMAL_AND_TANGENT(normal, tangent); } +// Maps a tube with circular cross section on the xz plane to a quad on the xy +// plane. +[Differentiable] +public float3 tube_to_plane(float3 xyz, no_diff float t) { + float x0 = xyz.x; + float y0 = xyz.y; + float z0 = xyz.z; + + float theta = atan2(z0, x0) - PI; + float r = length(float2(x0, z0)); + x0 = r * cos(theta); + z0 = r * sin(theta); + + // Equivalent to (1 / (|t| + eps)) * sign(t) + float radius = 1.0f / (dabs(t) + 1e-4f) * sign(t); + + float x = sin(theta / radius) * (radius * PI_RCP - z0); + float z = (1.0f - cos(theta / radius)) * (radius * PI_RCP) + cos(theta / radius) * z0; + + return float3(x, y0, z); +} + +public void tube_to_plane_normal(inout float3 xyz, inout float3 normal, + inout float3 tangent, float t) { + R3R3_NORMALS(xyz, normal, tangent, tube_to_plane, t); +} + +public void tube_to_plane_undeform_normal(float3 xyz, inout float3 normal, + inout float3 tangent, float t) { + R3R3_DECLARE_BASIS_VECTORS(xyz); + R3R3_AUTODIFF_BASIS_VECTORS(tube_to_plane, t); + R3R3_UNDEFORM_NORMAL_AND_TANGENT(normal, tangent); +} + [Differentiable] public float3 seal(float3 xyz, no_diff float A, no_diff float k, no_diff float t) { float x = xyz.x; |
