Загрузка моделей OpenGL в контейнер и вызов их по очереди. - PullRequest
0 голосов
/ 16 января 2012

Я новичок в программировании и хочу написать условные операторы для моделей OpenGL, чтобы при нажатии кнопки загружалась модель треугольника в векторный контейнер stl. Когда я снова нажимаю ту же кнопку, она загружает другую модель, скажем, Quad, в контейнер, а для дальнейших нажатий кнопки она загружает больше моделей, таких как Cube, Toroid и т. Д. Я также собираюсь добавить кнопку «Отменить», чтобы удалить последнюю загруженную модель.

Может ли кто-нибудь помочь мне написать такое условное заявление о том, как загружать около 4 моделей в векторный контейнер STL для каждого нажатия кнопки, а также отменить загрузку

class Shapes {
public:
    Shapes(){}
    ~Shapes(){}
    virtual void draw() 
    { 
        std::cout << "Base function called" << std::endl; 
    }

};

class Models : public Shapes 
{    
  public: Models() 
    {

    }

    ~Models() {}

    virtual void draw() 
    {
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
            glLoadIdentity(); 
            glTranslatef(-1.5f, 0.0f, -6.0f); 
            glBegin(GL_TRIANGLES); 
               glColor3f(1.0f, 0.0f, 0.0f); // Red color
               glVertex3f( 0.0f,  1.0f, 0.0f); // Top
               glColor3f(0.0f, 1.0f, 0.0f); // Green color
               glVertex3f(-1.0f, -1.0f, 0.0f); // Bottom Left
               glColor3f(0.0f, 0.0f, 1.0f); // Blue color
               glVertex3f( 1.0f, -1.0f, 0.0f); // Bottom Right
            glEnd(); // End drawing the triangle


    }

};

Draw_All_models{

  std::vector<Shapes*> myObjects;

  myObjects.push_back(new Triangle());
  myObjects.push_back(new Quad());
  //more models...

  void RenderScene() 
  {
    std::vector<Shapes*>::iterator it;
    for(it = myObjects.begin() ; it != myObjects.end; ++it) (*it)->draw();
     }
}

1 Ответ

1 голос
/ 16 января 2012

Первое, что нужно понять, это то, что OpenGL не поддерживает сцену или модели. Все, что он делает, это рисует на экране милые маленькие точки, линии или треугольники по вашему запросу. Как только вы это поймете, все становится очевидным:

Сохранение списка, где каждый элемент кодирует, что рисовать, где. Затем вам нужен какой-нибудь метод, который пересекает список (или массив), и для каждого элемента отправляется в нужную функцию (также написанную вами), чтобы нарисовать геометрию в соответствии с данными элемента.

Например, в C ++ у вас может быть некоторый базовый класс Model, из которого вы производите классы Box, Sphere, Torus и так далее. Model определяет виртуальный метод draw. Затем вы делаете std::list<Model*> models, который вы можете перебрать с помощью for(std::list<Model*> I = models.begin(); I != models.end(); I++){(*I)->draw();}

Переопределенные виртуальные draw методы затем позаботятся о правильной визуализации каждого типа модели.

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