Search code examples
texture-mappingtriangulationuv-mapping

Finding isocurve from triangulation with known uv at all vertices


I have a 3D triangulated mesh which is similar to a curved piece of paper in that it has a 4 edges and lives in 3-dimensional space. Edges may be different lengths and curve differently, but it could theoretically be continually morphed to look like a piece of paper. A uv coordinate has been assigned to every vertex and the range of u and v is between 0 and 1. Some vertices are obviously on the border. For the bottom border u is in the range [0,1] and v is 0. Top border vertices have u within [0,1] and v = 1. The left and right borders have u = 0 or u = 1 (respectively) with v within [0,1].

Now think about the "isocurve" where u = 0.5. This would be the "line" (or collection of line segments?) from bottom to top of the "middle" of the surface. How would I go about finding that?

Or, let's say I wanted to find the 3D coordinate corresponding to the uv coordinate (0.2,0.7). How would I get there?

I don't want to implement this by putting data through a renderer (OpenGL, etc). I'm sure there must be a standard method. It feels like the inverse of a texture mapping function.


Solution

  • Essentially both of your questions boil down to the same thing: how to convert between UV and XYZ coordinates.

    This is an interpolation problem. Considering a single triangle in your mesh, you know both the UV and XYZ coordinates at the 3 vertices. As such, you have the right amount of data to interpolate X,Y,Z as linear functions of U,V:

    X(U,V) = a0 + a1*U + a2*V
    Y(U,V) = b0 + b1*U + b2*V
    Z(U,V) = c0 + c1*U + c2*V
    

    The problem then becomes how to determine the coefficients ai,bi,ci. This can be done by solving a set of linear equations based on the given vertex data. For example, the X coefficients for a given triangle can be found by solving:

    [X1]   [1 U1 V1]   [a0]
    [X2] = [1 U2 V2] * [a1]
    [X3]   [1 U3 V3]   [a2]
    

    Once you have all of these coefficients for each triangle in the mesh you can then determine an XYZ coordinate for any UV pair:

    1. Locate the triangle that contains the UV point.
    2. Evaluate the X(U,V),Y(U,V),Z(U,V) functions for the given triangle.