使用法向量对表面进行局部插值

时间:2014-08-16 18:37:54

标签: math 3d

我需要在给定点和法线向量的情况下插入3D表面。

考虑到它的表面上的一个点,我需要在插入插值后找到该点在空间中的位置。我需要能够孤立地为每个三角形做到这一点。

这是我想要描述的内容。一旦曲线/曲面被插值,我就需要点的位置。

如果我在2D工作: before / after interpolation in 2D

3D: enter image description here

我已经看到了这篇论文"Simple local interpolation of surfaces using normal vectors - Takashi Nagata",我认为这正是我正在寻找的内容(第2.2节。使用法线插入补丁),但数学就超出了我的范围。

我想要从中提取的是一组方程式,其中包含三角形的点的位置和法线进入,以及三角形上的点,并且调整后的点出来(像魔法一样)

2 个答案:

答案 0 :(得分:3)

这篇论文看起来像是试图拟合二次曲面,以便它与你所拥有的点和法线相匹配。结果表面由

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

其中s,t是两个变量,c00等是具有三个坐标的所有向量。选择s,t,所以在s = 0,t = 0时它是你的第一个点,s = 1,t = 0是你的第二个点,s = 1,t = 1是你的第三个点。假设我们可以找到各种c00,你可以在三角形中选择一些s,t值给出一个中间点,s = 2/3,t = 1/3可能是一个找到候选者。

查找c00等将需要一些工作。您可能需要实现eqn 15,它提供曲率,作为函数

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;
}

假设你有一个可以做基本向量运算符的vec3类。

根据定义,使用35,36定义起始向量和法线。使用39来定义点对d1,d2,d3和曲率c1,c2,c3之间的差异。使用方程44

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

并完成了。

答案 1 :(得分:2)

对于记录,因为我想在网络上的某个地方提供这些信息。

这是使用OP发布的纸张的2d插值。

enter image description here

enter image description here

1a 1b 是边界条件,方程 4a 4b 是x和插值所需的向量 c 的y分量。