Как отобразить / нарисовать объект .ply в OpenGL? - PullRequest
1 голос
/ 26 сентября 2010

Я пытаюсь заставить OpenGL нарисовать фигуру, которую я загружаю с OPENFILENAME. Сейчас у меня есть следующее: я могу отображать комментарии, вершину, количество граней и т. Д., Но не могу нарисовать фигуру и не знаю, как это сделать. Я могу нарисовать другие заранее определенные фигуры, но не те, которые я пытаюсь открыть.


Здесь я все инициализирую:

case WM_CREATE:
     hDC = GetDC(hWnd);
        hRC=wglCreateContext(hDC);
        wglMakeCurrent(hDC,hRC);
         g_hwndDlg = CreateDialog(hInst,MAKEINTRESOURCE(IDD_DIALOG1),hWnd,DialogProc);
        Figure = new DrawFigure();
        initGL();
         break;

Здесь я узнаю, какой элемент я открываю:

  /* go through each kind of element that we learned is in the file */
  /* and read them */

  for (i = 0; i < nelems; i++) {
    /* get the description of the first element */
    elem_name = elist[i];
    plist = ply_get_element_description (ply, elem_name, &num_elems, &nprops);
    int el=sprintf(szFile,"element %s %d\n", elem_name, num_elems);
    /* print the name of the element, for debugging */
        TextOut(hDC,150,0+i*20,szFile,el);
    /* if we're on vertex elements, read them in */
    if (equal_strings ("vertex", elem_name)) {
      /* create a vertex list to hold all the vertices */
      vlist = (Vertex **) malloc (sizeof (Vertex *) * num_elems);
      /* set up for getting vertex elements */
      ply_get_property (ply, elem_name, &vert_props[0]);
      ply_get_property (ply, elem_name, &vert_props[1]);
      ply_get_property (ply, elem_name, &vert_props[2]);


 /* grab all the vertex elements */
      for (j = 0; j < num_elems; j++) {
        int move=10;
        /* grab and element from the file */
        vlist[j] = (Vertex *) malloc (sizeof (Vertex));
        ply_get_element (ply, (void *) vlist[j]);


        int vert=sprintf(szFile,"vertex: %g %g %g", vlist[j]->x, vlist[j]->y, vlist[j]->z);
        /* print out vertex x,y,z for debugging */
        TextOut(hDC,600,move+j*20,szFile,vert);

        Figure->Parameters(vlist[j]->x, vlist[j]->y, vlist[j]->z);
      }
    }

И вот где находится класс Figure, где я должен рисовать все:

    Figure::Figure(){
}
void Figure::Parameters(float x,float y,float z)
{
     this->x1=x;
    this->y1=y;
    this->z1=z;
}
void Figure::Draw()
{
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();
    gluLookAt(0.0,0.0,4.0,0.0,0.0,0.0,0.0,1.0,0.0);

    glBegin(GL_TRIANGLES);

    glNormal3f(x1,y1,z1);

    glVertex3f(x1,y1,z1);
    glEnd();
}
x1,y1,z1 are declared in Figure.h

Я пытался объяснить себя как мог; если вы думаете, что это все еще нуждается в дополнительном объяснении, пожалуйста, скажите мне, и я постараюсь объяснить это по-другому

Да, я забыл объяснить, наверное, фигура, которую я пытаюсь нарисовать ... ну, я не знаю, какая это будет фигура, потому что я использую OPENFILENAME, чтобы открыть 1 случайную фигуру и нарисовать ее, я использовал треугольники потому что я думал, что с помощью треугольников я могу нарисовать что угодно, а также я пытался в классе Параметры запрашивают номер вершины, с которой я имею дело, и делали «для» в классе Draw, но это не сработало

1 Ответ

3 голосов
/ 26 сентября 2010

Вы указываете только одну вершину между началом / концом. Вам нужно как минимум 3, чтобы указать треугольник.И многое другое, если вы хотите целую кучу треугольников.Вам нужно что-то еще в этом духе:

void Figure::Parameters(float x, float y, float z)
{
    m_vertices.push_back(myVertex(x, y, z));
}

void Figure::Draw()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();
    gluLookAt(0.0,0.0,4.0,0.0,0.0,0.0,0.0,1.0,0.0);

    glBegin(GL_TRIANGLES);

    assert(m_vertices.size() % 3 == 0); // since we're drawing triangles
    for(size_t i=0; i<m_vertices.size(); i++)
    {
        glNormal3f(m_vertices[i].x,m_vertices[i].y,m_vertices[i].z);
        glVertex3f(m_vertices[i].x,m_vertices[i].y,m_vertices[i].z);
    }

    glEnd();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...