OpenGL:如何绘制比8更高的贝塞尔曲线?

时间:2010-04-24 18:04:03

标签: opengl graphics bezier curve

我正在尝试使用OpenGL评估器绘制高阶Bezier曲线:

glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 30, &points[0][0]);

glMapGrid1f(30, 0, 1);
glEvalMesh1(GL_LINE, 0, 30);

glBegin(GL_LINE_STRIP);
for (int i = 0; i <= 30; i++) 
  glEvalCoord1f((GLfloat) i/30.0);
glEnd();

当点数超过8时,曲线消失。如何使用评估器绘制更高阶的贝塞尔曲线?

2 个答案:

答案 0 :(得分:1)

见论文:

  

Watkins和Worsey,Degree reduction of Bézier curves.   计算机辅助设计。 20(7),1988年9月,398-405。

他们所做的是将贝塞尔曲线转换为切比雪夫多项式形式,因此多项式的最后一项对形状的影响最小,删除最后一项,并将其转换回贝塞尔曲线形式。如果这会产生太多错误,则Bézier会被细分,然后再次运行该过程。

这使得将高阶曲线向下转换为立方Bézier非常容易,系统可以有效地进行原生渲染。我已经将这种方法用于几种不同的情况,并且效果很好。但有一点需要注意;本文中的矩阵方程有一些错别字。参见:

  彼得森,J。,Letter to the Editor,加元,23(6),1991年8月,第460页

用于修正的方程式。不幸的是, CAD 是一个老派的学术期刊,因此论文不方便在线。你需要在某个地方将它们从图书馆中挖出来,或者支付罚款以便从Elsevier那里获得它们。

答案 1 :(得分:0)

您是否有机会得到GL_MAX_EVAL_ORDER错误?贝塞尔曲线在高度变得不稳定。如果您的OpenGL实现刚刚放弃,我不会感到惊讶。

您可以将glGet与GL_MAX_EVAL_ORDER一起使用,以查看您的实现最大值。如果你需要更高的东西,你可以随时自己动手,这也不算太糟糕。