【问题标题】:OpenGL: How to draw Bezier curve of degree higher then 8?OpenGL:如何绘制高于8度的贝塞尔曲线?
【发布时间】:2010-04-24 18:04:02
【问题描述】:

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

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时,曲线消失。如何使用评估器绘制高阶贝塞尔曲线?

【问题讨论】:

  • 您最好的选择可能是一次绘制一个部分并近似曲线。
  • 所以OpenGL禁止绘制高度曲线?

标签: opengl graphics bezier curve


【解决方案1】:

见论文:

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

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

这使得将高阶曲线转换为三次贝塞尔曲线变得非常容易,系统可以在本地高效地渲染。我已经在几种不同的情况下使用了这种方法,并且效果很好。不过有一个警告;论文中的矩阵方程有一些错别字。见:

Peterson, J., Letter to the Editor, CAD, 23(6), August 1991, p.460

对于修正后的方程。不幸的是,CAD 是一本老派的学术期刊,因此这些论文不能方便地在线发布。您需要将它们从某个地方的图书馆中挖掘出来,或者支付罚款才能从 Elsevier 获取它们。

【讨论】:

    【解决方案2】:

    您是否有可能收到 GL_MAX_EVAL_ORDER 错误?贝塞尔曲线高度不稳定。如果您的 OpenGL 实现放弃了,我不会感到惊讶。

    您可以将 glGet 与 GL_MAX_EVAL_ORDER 一起使用,以查看您的实现的最大值。如果你需要更高的东西,你总是可以自己动手,这还不错。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-26
      • 2015-12-30
      • 1970-01-01
      • 2014-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多