Siôn
Siôn

Reputation: 174

Local interpolation of surfaces using normal vectors

I need to interpolate a 3D surface given it's points and normal vectors.

Given a point on it's surface, I need to find where that point would be in space once the interpolation has been accounted for. I need to be able to do this for each triangle in isolation.

Here's what I'm trying to describe. I need the position of the point once the curve / surface has been interpolated.

If I was working in 2D: before / after interpolation in 2D

3D: enter image description here

I've come across this paper "Simple local interpolation of surfaces using normal vectors - Takashi Nagata" which I think demonstrates exactly what I'm looking for (section 2.2. Interpolation of a patch using normals), but the math is just beyond me.

What I'm trying to extract from it is a set of equations where the position and normals of the points comprising the triangle go in, as well as the point on the triangle, and the adjusted point comes out (like magic).

Upvotes: 1

Views: 1770

Answers (2)

rraallvv
rraallvv

Reputation: 2933

For the records, and because I wanted to have this information somewhere on the web.

This is the 2d interpolation using the paper posted by the OP.

enter image description here

enter image description here

Where 1a and 1b are the boundary conditions, and the equations 4a and 4b are the x and y components of the vector c needed for the interpolation.

Upvotes: 2

Salix alba
Salix alba

Reputation: 7824

The paper looks like its trying to fit a quadratic surface so that it matches the points and normals you have. The resulting surface is given by

p(s,t) = c00 + c10 s + c01 t + c11 s t + c20 s^2 + c02 t^2

where s,t are the two variables, c00 etc are all vectors with three coordinates. s,t are chosen so at s=0,t=0 its your first point, s=1, t=0 is your second point and s=1,t=1 is your third point. Assuming we can find the various c00's you can pick some values of s,t in the triangle to give a middle point, s=2/3, t=1/3 might be a find candidate.

Find c00 etc will take some work. You probably need to implement eqn 15, which gives a curvature, as a function

vec3 c(vec3 D,vec3 n0,vec3 n1) {
    vec3 v = (n0 + n1)/2;         // 12a
    vec3 dv = (n0 - n1)/2;        // 12b
    double d = D.dot(v);          // 13a 
    double dd = D.dot(dv);        // 13b
    double c = n0.dot(n0 - 2*dv); // 14a
    double dc = n0.dot(dv);       // 14b
    vec3 res;
    if( c == -1 || c==1 )
        res = vec3.zeroVector;
    else
        res = dd / (1-dc) * v + d / dc * dv;
    return res;
}

assuming you have a vec3 class which can do basic vector operators.

With that defined, use 35, 36 to define the starting vectors and normals. Use 39 to define differences between pairs of points d1, d2, d3 and curvatures c1, c2, c3. The use eq 44

x(η, ζ ) = x00(1 − η) + x10(η − ζ ) + x11ζ
     − c1(1 − η)(η − ζ ) − c2(η − ζ )ζ − c3(1 − η)ζ

and your done.

Upvotes: 3

Related Questions