Conception:
http://groups.csail.mit.edu/graphics/classes/6.837/F04/lectures/16_curves_surfaces.pdf
Explain what is Bezier, B-spline(=uniform cubic BSpline, 是rational的), NURBS(=Non-Uniform Rational BSpline). 直观地,只考虑4个顶点的,order = 4,degree = order -1 = 3,Bezier curve是插值头尾两个控制点的,而且每递增3个新控制点才新产生一段curve,之后两端curve的接缝点只是几何坐标值相等,但是切向tangent却不连续;相比之下,Bspline curve并不插值首位两个顶点,每递增1个新控制点就产生一段curve,前后两端curve连续并且切向一直。
Q(t) = GBT(t) = Geometry(4*1 vector of four control points) * Spline Basic (4*4 matrix) * Power Basic([t^3, t^2, t, 0]).
它很绚的作业在http://groups.csail.mit.edu/graphics/classes/6.837/F04/assignments/assignment8/
OpenGL FAQ, 19.010 How can I use OpenGL evaluators to create a B-spline surface?
OpenGL evaluators use a Bezier basis. To render a surface using any other basis, such as B-spline, you must convert your control points to a Bezier basis. The OpenGL Programming Guide, Chapter 12, lists a number of reference books that cover the math behind these conversions.
首先,OpenGL/glu使用的evaluater是直接提供Bezier curve/NURBS的支持,但是B-spline就没有啦。结果是,B-spline curve都要转成Bezier curve来画啦。可以参考E.Angel's curves.c这例子。
E. Angel, Interactive Computer Graphics , A Top-Down Approach with OpenGL, Third Edition Addison-Wesley Longman, 2003. 这书上有一个curves.c的可运行例子,可以画Bezier,b-spline 以及interpolation curve,不错的。OpenGL虽然内部只支持Bezier但是由于b-spline与Bezier相互间可以转换,因此,用户给出b-spline控制点要画cure时候,我们就求要画同样一段curve用Bezier控制点的话这些Bezier控制点的坐标是什么呢?求出这些Bezier控制点坐标之后,这段curve就可以用OpenGL的evaluater来画了。E.Angel's curves.c例子就是利用了同一段curve可以用Bezier控制点来得到,也可以用b-spline控制点来得到。
http://www.itee.uq.edu.au/~comp4201/Curves6.pdf
这个ppt(curve and surface in OpenGL)里面不是介绍曲线的数学表达式,而是实际上怎样用
glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &newcpts[0][0]);
glMapGrid1f(30, 0.0, 1.0);
glEvalMesh1(GL_LINE, 0, 30);这些具体画curve的函数.
http://www.dgp.toronto.edu/~hertzman/stroke/
里面的代码是在painterly rendering papers to draw brush strokes in OpenGL,除了画Bezier和Bspline curve之后还有一些NPR的资料以及siggraph 02的course note。
Google Code, search Bspline.
没有评论:
发表评论