OpenGL: нарисовать 2 цилиндра

0

Я пытаюсь нарисовать два цилиндра, оба заполнены с той же текстурой, но мне удалось нарисовать только первый, вот моя функция рисования:

void display(void)
{
    // Projection plane
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    //a->draw(mouseY);
    //draw first cylinder WORKING
    glPushMatrix();
        glRotatef(mouseY, 0, 0, 1); 
        quadratic = gluNewQuadric();
        gluQuadricNormals(quadratic, GLU_SMOOTH);
        gluQuadricTexture(quadratic, GL_TRUE);
        glMatrixMode(GL_TEXTURE);
            glLoadIdentity();
            glRotatef(90,0,0,1);
            glTranslatef(0,-1.0,0);
        glMatrixMode(GL_PROJECTION);
        gluCylinder(quadratic,fh_cyl,fh_cyl,fw_cyl,50,1000);
        if(!exec) //used only one time to get a visible cylinder
        {
            glTranslatef(fX_cylpos,fY_cylpos,0);
            glRotatef(90, 0.0, 1, 0.0); //rotate object 90° on Y axis
            glRotatef(fangle_cyl, 1.0, 0.0, 0.0); //0° = vertical / 90° = horizontal
            exec=true;
        }
    glPopMatrix();
    glPushMatrix();
        //draw second cylinder NOT WORKING
        glRotatef(mouseY, 0, 0, 1);
        quadratic2 = gluNewQuadric();
        gluQuadricNormals(quadratic2, GLU_SMOOTH);
        gluQuadricTexture(quadratic2, GL_TRUE);
        gluCylinder(quadratic2,fh_cyl,fh_cyl,fw_cyl,50,1000);
        if(!exec2) 
        {
            glTranslatef(fX_cylpos+200,fY_cylpos,0);
            glRotatef(90, 0.0, 1, 0.0); //rotate object 90° on Y axis
            glRotatef(fangle_cyl, 1.0, 0.0, 0.0);  //0° = vertical / 90° = horizontal      
            exec2=true;
        }
    glPopMatrix();
   //b->draw(mouseY);
   glutSwapBuffers();
}

И это функция reshape:

void reshape(int w, int h)
{
   glViewport (0, 0, (GLsizei) w, (GLsizei) h);
   glLoadIdentity();
   glMatrixMode(GL_PROJECTION);
   //glOrtho(-1000.0, 1000.0*(screen_h/screen_w), -1000.0, 1000.0*(screen_h/screen_w), 1000.0, -110.0);
   glOrtho(fOrtoXinit, fOrtoXend, fOrtoYinit, fOrtoYend , 1000, -1000.0);
   glMatrixMode(GL_MODELVIEW);
}

Код в выражении if используется для того, чтобы нарисовать цилиндр вертикально, как показано на рисунке ниже, и он поворачивается с помощью мыши вдоль оси x для прокрутки чисел: предварительный просмотр

Благодаря Reto Koradi ответ мне удалось сделать 2 цилиндра, между тем у меня все еще есть две проблемы: 1. Я не знаю, что мне нужно изменить, чтобы поставить цилиндр рядом с другим; 2. Я думаю, что мое решение нарисовать вертикальный цилиндр, используя инструкцию if не является хорошим способом...

Вот отредактированный код:

if(!exec) //basically IF is not used anymore
{
    glTranslatef(fX_cylpos,fY_cylpos,0);
    glRotatef(90, 0.0, 1, 0.0); //rotate object 90° on Y axis
    glRotatef(fangle_cyl, 1.0, 0.0, 0.0); //0° = vertical / 90° = horizontal
    //exec=true;
}
gluCylinder(quadratic,fh_cyl,fh_cyl,fw_cyl,50,1000);            
glPopMatrix();

glPushMatrix();
//draw second cylinder NOT WORKING
glRotatef(mouseY, 0, 0, 1);
quadratic2 = gluNewQuadric();
gluQuadricNormals(quadratic2, GLU_SMOOTH);
gluQuadricTexture(quadratic2, GL_TRUE);
if(!exec2) 
{
    glTranslatef(fX_cylpos+200,fY_cylpos,20);
    glRotatef(90, 0.0, 1, 0.0); //rotate object 90° on Y axis
    glRotatef(fangle_cyl, 1.0, 0.0, 0.0);  //0° = vertical / 90° = horizontal      
    exec2=true;
}
gluCylinder(quadratic2,fh_cyl,fh_cyl,fw_cyl,50,1000);

glPopMatrix();

Это результат после перемещения цилиндров немного с предварительным просмотром мыши

  • 0
    Может быть, я что-то упускаю, но похоже, что вы рисуете два цилиндра с одинаковыми преобразованиями и размерами. Почему вы ожидаете увидеть два разных цилиндра, если дважды нарисуете одно и то же?
  • 0
    Я использую gltranslatef с другим положением x для второго, и если я отключаю первый, второй рисуется именно там, где я хочу ...
Показать ещё 1 комментарий
Теги:
opengl

1 ответ

0

Это опечатка?

    gluQuadricTexture(quadratic2, GL_TRUE);
    gluCylinder(quadratic,fh_cyl,fh_cyl,fw_cyl,50,1000);

->

    gluQuadricTexture(quadratic2, GL_TRUE);
    gluCylinder(quadratic2,fh_cyl,fh_cyl,fw_cyl,50,1000);
  • 0
    Спасибо за ответ, но да, это только опечатка, и даже исправление не дает видимых изменений

Ещё вопросы

Сообщество Overcoder
Наверх
Меню