Math 基于法向量的曲面局部插值

Math 基于法向量的曲面局部插值,math,3d,Math,3d,我需要插值一个3D曲面,给定它的点和法向量 给定曲面上的一个点,我需要找到插值计算完成后该点在空间中的位置。我需要能够独立地对每个三角形执行此操作 这就是我想要描述的。我需要曲线/曲面插值后的点位置 如果我在2D中工作: 3D: 我遇到过这篇论文,我想它正好说明了我要找的东西(第2.2节,使用法线插值面片),但数学问题我就不懂了 我试图从中提取的是一组方程,其中包括三角形的点的位置和法线,以及三角形上的点,调整后的点出来(像魔术一样)。这张纸看起来像是在尝试拟合二次曲面,以便匹配您拥有的点和

我需要插值一个3D曲面,给定它的点和法向量

给定曲面上的一个点,我需要找到插值计算完成后该点在空间中的位置。我需要能够独立地对每个三角形执行此操作

这就是我想要描述的。我需要曲线/曲面插值后的点位置

如果我在2D中工作:

3D:

我遇到过这篇论文,我想它正好说明了我要找的东西(第2.2节,使用法线插值面片),但数学问题我就不懂了


我试图从中提取的是一组方程,其中包括三角形的点的位置和法线,以及三角形上的点,调整后的点出来(像魔术一样)。

这张纸看起来像是在尝试拟合二次曲面,以便匹配您拥有的点和法线。生成的曲面由以下公式给出:

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等需要一些工作。您可能需要实现等式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 − η)ζ

完成了。

这张纸看起来像是在尝试拟合一个二次曲面,以便它与您拥有的点和法线相匹配。生成的曲面由以下公式给出:

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等需要一些工作。您可能需要实现等式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 − η)ζ

你的记录已经完成了。

因为我想在网上的某个地方得到这些信息

这是使用OP发布的论文进行的2d插值


其中,1a1b是边界条件,方程4a4b是插值所需向量c的x和y分量

为了记录,因为我想在网上的某个地方得到这些信息

这是使用OP发布的论文进行的2d插值


其中,1a1b是边界条件,方程4a4b是插值所需向量c的x和y分量

您的3D示例似乎受约束。至少,您看到的是每条边的3个立方(或可能的有理立方)插值。这将建议使用(有理)三次贝塞尔三角形,在这种情况下,您将看到10个控制点。数学上优雅的曲面,但比贝塞尔曲线或张量积曲面更复杂。也就是说,它们保留了许多类似的属性,因为它们本质上是一个de'Casteljau构造。我对2d版本感兴趣,您介意分享您的代码吗?您的3D示例似乎受到了限制。至少,您看到的是每条边的3个立方(或可能的有理立方)插值。这将建议使用(有理)三次贝塞尔三角形,在这种情况下,您将看到10个控制点。数学上优雅的曲面,但比贝塞尔曲线或张量积曲面更复杂。这就是说,它们保留了许多类似的属性,因为它们本质上是一个de'Casteljau构造。我对2d版本感兴趣,你介意分享你的代码吗?嘿,我已经开始工作了(用c#for unity写这篇文章,所以有向量类等等),但我正在尝试选择一个合理的策略来查找s和t。我有一个向量,描述了三角形表面上的一个位置,有什么建议吗?谢谢。你可以做的一件事是在每条边上选择中点。然后你可以把这些连接在一起,形成一个中心三角形,周围有三个三角形。其他选项包括使用搜索工具查找质心。还有很多其他候选人在环顾四周时遇到了重心坐标,完成了任务,谢谢。嘿,所以我已经开始工作了(用c#写这篇文章是为了统一,所以有向量类等等),但我正在尝试选择一个合理的策略来寻找s和t。我有一个向量,描述了三角形表面上的一个位置,有什么建议吗?谢谢。你可以做的一件事是在每条边上选择中点。然后你可以把这些连接在一起,形成一个中心三角形,周围有三个三角形。其他选项包括使用搜索工具查找质心。还有很多其他候选人在环顾四周时遇到重心坐标,完成了任务,谢谢。