特别是,我需要一种方法来表示通过一组已知3D点的曲线/样条曲线,以及通过细分/插值在曲线/样条曲线上找到其他点的方法。
例如,如果我有一组点P0到PN,我想找到P0和P1之间的100个点,这些点位于通过P0和P1的样条曲线上。
我看到Java3D的KBRotPosScaleSplinePathInterpolator执行这样的计算,但它与该API的场景图模型相关联,我看不到如何返回我需要的值。
答案 0 :(得分:4)
你正在寻找像Catmull Rom spline这样的东西。实际情况是数学不是all that hard to deal with(一些向量矩阵乘法)。我的建议是你只需在代码中实现你真正需要的样条曲线。
定义样条曲线的点是 称为“控制点”。其中一个 Catmull-Rom样条的特征是 指定的曲线将通过 通过所有控制点 - 所有类型都不是这样 花键。
计算曲线上的一个点,两个 在所需的两侧各点 需要点,如图所示 剩下。该点由a指定 值t表示的部分 两个最近的距离 控制点。
但是,您应该知道,如果Catmull-Rom样条在需要转弯时太靠近,那么它们会在控制点处产生很少的环路。
观察上面的图像,假设p1和p3在p2下面彼此相邻(基本上压缩了图片的右侧)。 Catmull-Rom样条可能会从p0下降,像现在一样通过p1,从p2的右侧上升并从右向左穿过它,从左侧向左下方并从左向右穿过P3。
这是样条构造的结果。
这有点像使用相当僵硬的柔性管道(就像我在水槽下面)。为了获得一个很长的连接点,我必须添加一个循环。
答案 1 :(得分:3)
对于那些在曲线背后挣扎的人来说,你可能会发现this很有用,特别是下面的图片。这个想法很简单:
让 t 从0.0循环到1.0。
对于灰色集合中的每对点,计算一个点在它们之间的一小部分(使用t)。这些点以绿色显示。
对于绿色集中的每对点,计算一个点在它们之间的一小部分(使用t)。此点显示在黑色。
中对于 t 的不同值,黑点将是曲线上的不同线。
第二张图像显示了使用额外点和额外插值水平重复的相同过程。
我发现这比我找到的任何其他选项更容易理解,实现和扩展到3维。
approximating a curve using linear interpolation http://bimixual.org/AnimationLibrary/Bezier_2_big.gif approximating a curve using linear interpolation http://bimixual.org/AnimationLibrary/Bezier_3_big.gif
答案 2 :(得分:2)
我对线性插值有很好的理解,但我发现很难掌握样条数学的复杂性。这就是为什么我正在寻找某种类型的库,它可以提供一个抽象来隐藏困难的数学。以下功能证明足以满足我的需求。这基于http://www.mvps.org/directx/articles/catmull/处的等式,但幸运的是,您无需了解其工作原理。请记住,与线性插值不同,您只需要两个点开始,Catmull-Rom样条插值在任一端使用一个额外的点。因此,如果您希望样条曲线通过10个点,则需要12个。
此函数演示了一维中的Catmull-Rom样条插值。 (对于2维或3维,只需重复使用Y或Z值。)此函数将在p1和p2之间的样条上给出一个点,其中t是两者之间距离的比例。
public class SplineTest {
// Catmull-Rom spline interpolation function
public static double q(double t, double p0, double p1, double p2, double p3) {
return 0.5 * ((2 * p1) + (-p0 + p2) * t
+ (2 * p0 - 5 * p1 + 4 * p2 - p3) * (t * t) + (-p0 + 3 * p1 - 3
* p2 + p3)
* (t * t * t));
}
public static void main(String[] args) {
double t = 0.0;
while (t <= 1.0) {
System.out.println(q(t, 5, 10, 20, 10));
t += 0.1;
}
}
}
该程序输出:
10.0
10.887500000000001
12.0
13.2625
14.6
15.9375
17.2
18.3125
19.2
19.7875
20.000000000000004
答案 3 :(得分:1)
我所知道的没有内置库。 Source
答案 4 :(得分:1)
答案 5 :(得分:0)
我还没有尝试过,但很可能会很快尝试用随机点输入生成3D表面网格:toxiclib作为Spline3d工具
答案 6 :(得分:0)
我刚刚尝试过libGDX,Apache License http://github.com/libgtx/libgtx
它包含一个BSpline类,易于使用。
https://github.com/Graphics3D/ect/blob/master/src/main/java/courbes_bsplines/TestGDXBSpline.java