如何继续循环遍历 GLfloat Points

How to continue looping through GLfloat Points

我在画简单的图时遇到了问题。

我不确定这里的问题是什么,但我有一些要点:

GLfloat ctrlpoints[13][3] = {
        {0.1, 0.1, 0.0},
        {0.7, 0.1, 0.0},
        {0.9, 0.1, 0.0},
        {0.9, 0.3, 0.0},
        {0.7, 0.3, 0.0},
        {0.6, 0.3, 0.0},
        {0.55, 0.25, 0.0},
        {0.5, 0.2, 0.0},
        {0.2, 0.2, 0.0},
        {0.12, 0.2, 0.0},
        {0.1, 0.3, 0.0},
        {0.07, 0.2, 0.0},
        {0.1, 0.1, 0.0} };

我希望代码中的所有点都连接起来,但它在第 6 组点后停止。

我的其余代码:

void init(void)
{
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glShadeModel(GL_FLAT);
    glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 5, &ctrlpoints[0][0]);
    glEnable(GL_MAP1_VERTEX_3);
}

void display(void)
{
    int i;
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 1.0, 1.0);
    glBegin(GL_LINE_STRIP);
    for (i = 0; i <= 30; i++)
        glEvalCoord1f((GLfloat)i / 30.0);
    glEnd();
    glPointSize(0.5);
    glColor3f(1.0, 1.0, 0.0);
    glBegin(GL_POINTS);
    for (i = 0; i < 12; i++)
        glVertex3fv(&ctrlpoints[i][0]);
    glEnd();
    glFlush();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(500, 500);
    glutInitWindowPosition(100, 100);
    glutCreateWindow(argv[0]);
    init();
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
}

基于the documentationglMap1f的第5个参数是点数。您将其设置为 5,这就是用于评估的控制点数。您应该将其替换为 13,或使用 sizeof 自动计算该数字:

int npoints = sizeof(ctrlpoints)/sizeof(ctrlpoints[0]);
glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, npoints, &ctrlpoints[0][0]);

这不是你要问的,但在这个循环中你渲染的点数(12)也比你声明的点数(13)少:

for (i = 0; i < 12; i++)

您应该类似地使用 npoints 来获得正确的数字。像这样的魔术常量之所以不好,正是因为它们会导致此类错误。