рисовать два объекта, используя openGL одновременно

0

У меня есть несколько функций:

  1. drawGrid() ->, который рисует сетку на земле;
  2. drawAxes() ->, который представляет собой оси с использованием gluCylinder
  3. Стрелки() ->, которые используются в drawAxes для рисования конусов в виде стрелок;

Я не могу понять, почему я не могу назвать drawGrid и drawAxes в одно и то же время; в этом случае вывод похож на эту ссылку: http://www.4shared.com/photo/8YTsc17s/wrong.html

если я прокомментирую drawGrid(), я могу видеть топоры в порядке; но я хочу нарисовать их одновременно; http://www.4shared.com/photo/KI3DER-5/Axis.html

это коды, которые я использовал:

1. drawGrid

void Golsa::drawGrid(float size, float step)
{
    // disable lighting
    glDisable(GL_LIGHTING);

    glBegin(GL_LINES);

    glColor3f(0.3f, 0.3f, 0.3f);
    for(float i=step; i <= size; i+= step)
    {
        glVertex3f(-size, 0,  i);   // lines parallel to X-axis
        glVertex3f( size, 0,  i);
        glVertex3f(-size, 0, -i);   // lines parallel to X-axis
        glVertex3f( size, 0, -i);

        glVertex3f( i, 0, -size);   // lines parallel to Z-axis
        glVertex3f( i, 0,  size);
        glVertex3f(-i, 0, -size);   // lines parallel to Z-axis
        glVertex3f(-i, 0,  size);
    }

}

2. drawAxes:

void Golsa:: drawAxes(double length)

{
    glPushMatrix();
    glTranslatef(-length,0,0);
    Arrow(0,0,0, 2*length,0,0,0.2);
    glPopMatrix();

    glPushMatrix();
    glTranslatef(0,-length,0);
    Arrow(0,0,0, 0,2*length,0,0.2);
    glPopMatrix();

    glPushMatrix();
    glTranslatef(0,0,-length);
    Arrow(0,0,0, 0,0,2*length,0.2);
    glPopMatrix();
}

3. Стрелка

void Golsa::Arrow(GLdouble x1,GLdouble y1,GLdouble z1,GLdouble x2,GLdouble y2,GLdouble z2,GLdouble D)
{
  double x=x2-x1;
  double y=y2-y1;
  double z=z2-z1;
  double L=sqrt(x*x+y*y+z*z);

    GLUquadricObj *quadObj;
    GLUquadric* cyl = gluNewQuadric();
    GLUquadric* cy2 = gluNewQuadric();
    GLUquadric* cy3 = gluNewQuadric();
    glPushMatrix ();

      glTranslated(x1,y1,z1);

      if((x!=0.)||(y!=0.)) {
        glRotated(atan2(y,x)/RADPERDEG,0.,0.,1.);
        glRotated(atan2(sqrt(x*x+y*y),z)/RADPERDEG,0.,1.,0.);
      } else if (z<0){
        glRotated(180,1.,0.,0.);
      }

    //glTranslatef(0,0,L-4*D);

      gluQuadricDrawStyle(cyl, GLU_FILL);
      gluQuadricNormals(cyl, GLU_SMOOTH);

      glTranslatef(0,0,0);
      glColor3f(1,1,1);
      gluQuadricDrawStyle(cyl, GLU_FILL);
      //gluQuadricNormals(cyl, GLU_SMOOTH);
      gluCylinder(cyl, 0.1, 0.1,4.0, 12,1);

      //glColor3f (1,1,1); 
      glColor3f(1,1,1);
      glTranslatef(0.0,0.0,4);
      glColor3f(1,1,1);
      gluQuadricNormals(cyl, GLU_SMOOTH);
      gluCylinder(cy2, 0.2, 0,0.4, 12,1);
      gluDeleteQuadric(cyl);

    glPopMatrix();
}

эта функция вызывает другие:

void Golsa::drawSub()
{
    float  Xangle, Yangle, Zangle;
    float Xposition, Yposition, Zposition;
    /*Mat    rvec1i = Mat(3,1,CV_64FC1,Scalar::all(0));
    Mat  tvec1i = Mat(3,1,CV_64FC1,Scalar::all(0));*/
    // set bottom viewport (perspective)
    glViewport(0, 0, windowWidth, windowHeight);
    glScissor(0, 0, windowWidth, windowHeight);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(FOV_Y, windowWidth/(windowHeight/2.0f), 1, 1000);

    // switch to modelview matrix
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    // clear buffer
    glClearColor(bgColor[0], bgColor[1], bgColor[2], bgColor[3]);   // background color
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

    glPushMatrix();

    // First, transform the camera (viewing matrix) from world space to eye space
    glTranslatef(0, 0, -cameraDistance);
    glRotatef(cameraAngleX, 1, 0, 0); // pitch
    glRotatef(cameraAngleY, 0, 1, 0); // heading

    // draw grid

    drawGrid(10, 1);


    FindingCameraPosition(Xposition,Yposition,Zposition,Xangle,Yangle,Zangle);

    glPopMatrix();

}

  • 1
    1. Вам не хватает glEnd() в drawGrid() . 2. Неправильный ли вывод зависит от относительного порядка вызовов drawGrid() и drawAxes() ? 3. Покажите код, который также вызывает эти функции (есть ли, glMatrixMode() вызовы glMatrixMode() ?).
  • 0
    1. Да, это верно! 2. Понятия не имею! 3. Я редактировал код :)
Показать ещё 1 комментарий
Теги:
opengl
windows-7-x64
visual-studio-2010

1 ответ

2
Лучший ответ

Превращение моего комментария в ответ.

drawGrid() имеет вызов glBegin(), но не соответствующий вызов glEnd().

  • 0
    в продолжение, могу я задать другой вопрос? Я столкнулся с другой проблемой
  • 1
    @GolSa Предполагая, что добавление glEnd() решило проблему, о которой вы спрашивали здесь, а ваш другой вопрос - другая проблема (хотя и с той же программой), лучше задать новый вопрос переполнения стека. Если этот вопрос может предоставить полезный контекст, вы можете сослаться на него из нового. Но попробуйте сделать новый автономным.

Ещё вопросы

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