【问题标题】:OpenGL NURBS surfacesOpenGL NURBS 曲面
【发布时间】:2018-12-26 15:33:59
【问题描述】:

我正在实现 NURBS 曲面。我想要的只是在每次鼠标点击时 Y 轴上都有减量,所以看起来有太阳或其他行星的重量。

#include <stdlib.h>
#include <glut.h>
int  PI = 3.145;
int y = 0;

我在这里尝试做同样的事情,但输出没有变化

void myMouse(int button, int state, int x, int y) {
    if (state == GLUT_LEFT_BUTTON && GLUT_DOWN) {
        y++;
    }
    glutPostRedisplay();
}

代码在这里继续

GLfloat ctrlpoints[4][4][3] = {
    {{-3.5, 1.0, -4.5},  {-0.5, 1.0,-4.5 }, {0.5, 1.0, -4.5 },   {3.5, 1.0,-4.5}},
    {{-3.5, 1.0, -0.5},  {-0.5, -2.0 - y,-0.5 }, {0.5, -2.0 - y, -0.5 }, {3.5, 1.0,-0.5}},
    {{-3.5, 1.0,  0.5},  {-0.5, 1.0, 0.5 }, {0.5, 1.0,  0.5 },   {3.5, 1.0, 0.5}},
    {{-3.5, 1.0,  4.5},  {-0.5, 1.0, 4.5 }, {0.5, 1.0,  4.5 },   {3.5, 1.0, 4.5}} 
};

void Sun() {
    glPushMatrix();
    glTranslatef(0, 1, 0);
    glRotatef(2*PI, 1, 0, 0);
    glutSolidSphere(0.5, 20, 20);
    glPopMatrix();
}

void display(void)
{
    int i, j;

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(0.0, 1.0, 1.0);
    glPushMatrix();
    glRotatef(45.0, 1.0, 1.0, 1.0);
    for (j = 0; j <= 30; j++) {
        glBegin(GL_LINE_STRIP);
        for (i = 0; i <= 100; i++)
            glEvalCoord2f((GLfloat)i / 100.0, (GLfloat)j / 30.0);
        glEnd();
        glBegin(GL_LINE_STRIP);
        for (i = 0; i <= 100; i++)
            glEvalCoord2f((GLfloat)j / 30.0, (GLfloat)i / 100.0);
        glEnd();
    }
    glPopMatrix();

    glPushMatrix();
    glColor3f(1, 1, 0);
    Sun();
    glPopMatrix();
    glFlush();
}

void init(void)
{
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &ctrlpoints[0][0][0]);
    glEnable(GL_MAP2_VERTEX_3);
    glMapGrid2f(20, 0.0, 1.0, 20, 0.0, 1.0);
    glEnable(GL_DEPTH_TEST);
    glShadeModel(GL_FLAT);
}

void reshape(int w, int h)
{
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if (w <= h)
        glOrtho(-5.0, 5.0, -5.0*(GLfloat)h / (GLfloat)w, 5.0*(GLfloat)h / (GLfloat)w, -5.0, 5.0);
    else
        glOrtho(-5.0*(GLfloat)w / (GLfloat)h, 5.0*(GLfloat)w / (GLfloat)h, -5.0, 5.0, -5.0, 5.0);
     glMatrixMode(GL_MODELVIEW);
     glLoadIdentity();
}

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);
    glutReshapeFunc(reshape);
    glutMouseFunc(myMouse);
    Sun();
    glutMainLoop();
    return 0;
}

这是我当前对该代码的硬编码输出,我希望每次单击鼠标按钮时都在 y 轴上递减:

【问题讨论】:

    标签: c++ opengl glut nurbs


    【解决方案1】:

    ctrlpoints 是一个全局变量。一旦它被初始化,它只能通过赋值来改变。变量y没有神奇的动态依赖。

    您必须通过分配更改ctrlpoints 的字段。修改ctrlpoints的内容后,需要重新定义二维求值器。

    当按下鼠标左键时,正确的条件是button == GLUT_LEFT_BUTTON &amp;&amp; state == GLUT_DOWN

    注意由于ymyMouse(int button, int state, int x, int y)的函数签名中的形式参数的名称,y ++(在myMouse内)不会改变全局变量y的值,但它将更改参数y 的值。

    添加函数initMap并更改函数myMouseinit如下:

    void initMap(void)
    {
        glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &ctrlpoints[0][0][0]);
        glEnable(GL_MAP2_VERTEX_3);
        glMapGrid2f(20, 0.0, 1.0, 20, 0.0, 1.0);
    }
    
    void myMouse(int button, int state, int px, int py)
    {
        if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
        {
            ctrlpoints[1][1][1] -= 1.0f;
            ctrlpoints[1][2][1] -= 1.0f;
        }
        initMap();
        glutPostRedisplay();
    }
    
    void init(void)
    { 
        //glClearColor(1.0, 1.0, 1.0, 0.0);
        glEnable(GL_DEPTH_TEST);
        glShadeModel(GL_FLAT);
        initMap();
    } 
    

    预览:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-09
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多