我正在尝试重现通常在Rhino或Autocad等参数化cad程序中找到的3度或4度3D曲线,这些曲线可以使用任意数量的3D点来创建长曲线。我发现three.js有Cubic(degree-3)和Quadratic(degree-4)Bezier曲线可用,但它们分别采用三个和四个向量。我想创建包含10个或更多输入的曲线,而不仅仅是3或4.我还发现three.js有' Path'它允许使用.bezierCurveTo()或.quadraticCurveTo()方法构建混合度段的2D曲线。
所以我的问题: 目前有没有办法构建可以顺利连接的CubicBezierCurve3曲线的长链?理想情况下,使用一个构造函数来获取一个简单的顶点数组?
如果我需要自己实施,最好的起点在哪里?我认为.quadraticCurveTo()方法可以扩展为使用z组件并添加到SplineCurve3?我并非100%清楚曲线阵列如何在“路径”中工作。宾语。
THREE.Path.prototype.quadraticCurveTo = function( aCPx, aCPy, aX, aY ) {
var args = Array.prototype.slice.call( arguments );
var lastargs = this.actions[ this.actions.length - 1 ].args;
var x0 = lastargs[ lastargs.length - 2 ];
var y0 = lastargs[ lastargs.length - 1 ];
var curve = new THREE.QuadraticBezierCurve( new THREE.Vector2( x0, y0 ),
new THREE.Vector2( aCPx, aCPy ),
new THREE.Vector2( aX, aY ) );
this.curves.push( curve );
this.actions.push( { action: THREE.PathActions.QUADRATIC_CURVE_TO, args: args } );
};
感谢您的帮助!
答案 0 :(得分:1)
如果使用高度贝塞尔曲线就可以了,那么可以使用De Casteljau算法实现它。 karatedog的答案中的链接为该算法提供了良好的来源。如果你想坚持使用具有许多控制点的3次多项式曲线,B样条曲线将是一个不错的选择。可以使用Cox de Boor算法实现B样条曲线。你可以在互联网上找到很多参考。 B样条曲线定义需要度,控制点和结矢量。如果你希望你的函数只需要一个3d点数组,你可以设置degree = 3并在内部定义结矢量为
[0,0,0,0,1 /(N-3),2 /(N-3),......,1,1,1,1]。
其中N =控制点数。
例如,
N = 4,结矢量= [0,0,0,0,1,1,1,1],
N = 5,结矢量= [0,0,0,0,1 / 2,1,1,1,1],
N = 6,结矢量= [0,0,0,0,1 / 3,2 / 3,1,1,1,1]。
对于N = 4的情况,B样条曲线与三次贝塞尔曲线基本相同。
答案 1 :(得分:1)
感谢karatedog和fang的深入解答。在搜索有关B样条曲线的更多信息时,我偶然发现了Three.js NURBS这个额外的库,这正是我所需要的。仔细检查这个库中的THREE.NURBSCurve()构造函数后,它就像fang描述的那样实现:带有控制点和节点的数组。结与上述方法类似地定义。我将Fang的答案标记为正确但我想将此链接添加到预先存在的库中,因此任何像我这样的n00b都可以使用它:)
答案 2 :(得分:0)
我建议你实现自己的计算算法,这很容易,学习过程很短,值得花时间投入。查看此页面:http://pomax.github.io/bezierinfo/
它描述了一种方法(语言不可知),您可以使用任意数量的控制点计算Beziér曲线,尽管可以高度优化特定于一定数量的控制点(如立方或二次)的计算。 / p>