You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用gluNewQuadric出现"invalid value"错误的技术求助

解决GLU Disk "invalid value" 错误的方案

嗨,我看了你的代码,问题其实和你猜测的gluNewQuadric指针范围问题没关系,核心出在gluDisk的参数设置上~

错误原因

GLU的gluDisk函数对最后两个参数有明确的有效性要求:

  • slices:围绕Z轴的圆周细分次数,必须是大于等于3的正整数——毕竟至少要3个分段才能形成封闭的圆周
  • loops:同心环的数量,虽然允许最小值为1,但当内半径为0时,结合slices=1的设置,完全无法生成有效的圆盘几何,GLU会直接判定参数无效并抛出"invalid value"错误

你代码里的调用是:

gluDisk(quadrica, 0.0, 5.0, 1, 1);

这里slices=1是触发错误的关键——一个分段根本构不成圆盘的圆周,GLU会直接拒绝这种参数。

修复后的代码

把slices和loops改成合理的数值即可,比如slices=20(足够平滑的圆周)、loops=5(多层同心环),至少保证slices>=3:

#include <stdio.h>
#include <stdlib.h>
#include <GL/glut.h>
#ifndef CALLBACK
#define CALLBACK
#endif
void CALLBACK erro(GLenum coderro) {
    const GLubyte *estring;
    estring=gluErrorString(coderro);
    fprintf(stderr, "Erro de quadrica: %s\n", estring);
    exit(0);
}
void tela () {
    GLUquadric *quadrica;
    glClearColor(1.0, 1.0, 1.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-30.0, 30.0, -30.0, 30.0, 1, 100);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslated(0.0, 0.0, -20.0);
    glColor3f(1.0, 0.0, 0.0);
    quadrica=gluNewQuadric();
    gluQuadricCallback(quadrica, GLU_ERROR, erro);
    gluQuadricDrawStyle(quadrica, GLU_FILL);
    // 修改为符合要求的参数值
    gluDisk(quadrica, 0.0, 5.0, 20, 5);
    glFlush();
}
int main (int argc, char **argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB );
    glutInitWindowSize(500, 500);
    glutCreateWindow("Tesselacao");
    glutDisplayFunc(tela);
    glutMainLoop();
}

额外提示

  • 你可以根据需求调整slices和loops的数值:数值越大圆盘越平滑,但会略微降低渲染性能
  • 如果需要实心圆盘(内半径为0),loops=1是允许的,但一定要保证slices>=3
  • 后续遇到GLU相关错误时,优先对照函数的参数规范检查,大部分这类错误都是参数不符合要求导致的

内容的提问来源于stack exchange,提问作者Cícero Augusto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:45:14