我已经尝试了三个小时来搞清楚如何使用Bezier曲线公式、glMap1f和glEvalCoord1f创建一个曲线形状(我基本上想要创建Kirby的右边)。然而,我的进展很少。当我使用glBegin(GL_LINE_STRIP)时,它会跟踪轮廓,但有一个大加号(就像你的x和y轴)。当我尝试使用(GL_POLYGON)时,填充效果很好,但是它连接了4个点并形成了一个菱形。
我找出了问题所在。原来我错误地使用了sizeof(array)
。(具体来说,与下面的代码相应的是,我没有使用i < numCurves
,而是天真地尝试使用i < sizeof(points)
)
因此,我没有画出4-5个点,反而画了192条曲线,导致奇怪的结果。中间的钻石是由于没有连接回起始点。供将来想要这样做的人参考,下面是代码:
错误图片:
错误图片 http://img535.imageshack.us/img535/8207/failfd.png
最终成果:
最终成果 http://img685.imageshack.us/img685/7641/finalsa.png
void drawIrregularPolygon(GLfloat points[][4][3], int numCurves)
// REQUIRES: GLfloat points to be a polygon and center of circle to be current matrix
// EFFECTS: An irregular shape would be drawn
{
for (int i = 0; i < numCurves; i++)
{
glMap1f( GL_MAP1_VERTEX_3, 0.0f, 1.0f, 3, 4, &points[i][0][0] );
glBegin(GL_POLYGON); //replace GL_POLYGON with GL_LINE_STRIP if you need outline
for (int j = 0; j <= TOTAL_SEGMENTS; j++)
glEvalCoord1f((GLfloat) j / TOTAL_SEGMENTS);
glVertex2f(points[0][0][0], points[0][0][1]);
glEnd();
}
}