我正在编写一个使用 OpenGL 的 GLU 扩展进行渲染的 NURBS 类,但我刚刚意识到我不知道如何设置控制点权重。它不在红皮书或 GLU 文档中,网络也没有提及太多。GLU 的 NURBS 实现是否可能不包含此功能?如果是这样,我很惊讶他们居然把它称为 NURBS 而不仅仅是 B 样条。
编辑:将“结权重”更改为“控制点权重”。
您在 NURBS 术语中陈述的问题是您想要一条有理曲线而不是非有理曲线。
查看我们拥有的gluNurbsCurve原型:
void gluNurbsCurve(GLUnurbsObj *nobj, // NURBS object
GLint nknots, // number of knots
GLfloat *knot, // knot values
GLint stride, // stride
GLfloat *ctlarray, // control points array
GLint order, // order of data
GLenum type) // data type
其中一个参数是*knot
,但是它不是权重数组。glu 处理结重量的方式有点混乱,你可以在这里阅读。
ctlarray 和 last 参数是您感兴趣的参数。最后一个参数 type 是二维求值器类型之一。通常,您可以分别将 GL_MAP2_VERTEX_3 用于非有理控制点或 GL_MAP2_VERTEX_4 用于有理控制点。
有关详细信息,请参阅红皮书。