Пятница, 19 Апреля 2024, 16:16

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » C/C++ » Как загрузить модель в память?
Как загрузить модель в память?
ad141Дата: Вторник, 08 Января 2013, 22:40 | Сообщение # 1
почетный гость
Сейчас нет на сайте
Мне надоело рисовать модельку по точкам в OpenGL...
Я научился загружать модель *.obj в память (положение вершин и положение текстуры), но код работает только до 1000 точек...
Просьба написать код загрузки модели формата *.obj в память и её отрисовка в OpenGL...

Как должна модель хранится в памяти? я предпологал что массивом
Код

float v[3][9999], t[2][9999];
  int n;

где v - координата точки, t - координата текстуры, n - количество вершин в модели (Triangle only)...
Но я понял, что - хранить модель так нельзя... А как тогда? И как можно их считывать из файла?
Википедия - *.Obj

Добавлено (08.01.2013, 00:14)
---------------------------------------------

Код
class c_Model_Obj
{
public:
  bool Load(const char *fName)
  {
   Loaded = false;
   Nf = 0;
   char line[100];
   FILE *fp = fopen(fName,"r");
   if (fp != NULL)
   {
    float v[3][4000];unsigned int Nv = 0;
    float t[2][4000];unsigned int Nt = 0;
    float fv[9][4200];
    float ft[6][4200];
       while (fgets(line, 99, fp))
       {
     if (line[0] == 'v' && line[1] == 't')
     {
         sscanf(line, "%*c%*c %f %f", &t[0][Nt], &t[1][Nt]);                   
         Nt++;
     }  
     else
     if (line[0] == 'v' && line[1] == ' ')
     {
         sscanf(line, "%*c %f %f %f", &v[0][Nv], &v[1][Nv], &v[2][Nv]);                   
         Nv++;
     }  
     else
     if (line[0] == 'f')
     {
      unsigned int i[9];
         sscanf(line, "%*c %d/%d/%d %d/%d/%d %d/%d/%d", &i[0], &i[1], &i[2], &i[3], &i[4], &i[5], &i[6], &i[7], &i[8]);
      fv[0][Nf] = v[0][i[0]-1];
      fv[1][Nf] = v[1][i[0]-1];
      fv[2][Nf] = v[2][i[0]-1];

      fv[3][Nf] = v[0][i[3]-1];
      fv[4][Nf] = v[1][i[3]-1];
      fv[5][Nf] = v[2][i[3]-1];

      fv[6][Nf] = v[0][i[6]-1];
      fv[7][Nf] = v[1][i[6]-1];
      fv[8][Nf] = v[2][i[6]-1];

      ft[0][Nf] = t[0][i[1]-1];
      ft[1][Nf] = t[1][i[1]-1];

      ft[2][Nf] = t[0][i[4]-1];
      ft[3][Nf] = t[1][i[4]-1];

      ft[4][Nf] = t[0][i[7]-1];
      ft[5][Nf] = t[1][i[7]-1];

         Nf++;
     }
    }
    fclose(fp);
    vx = new float[Nf*3];
    vy = new float[Nf*3];
    vz = new float[Nf*3];
    tx = new float[Nf*2];
    ty = new float[Nf*2];
    for(unsigned int i = 0; i < Nf*3; i+=3)
    {
     vx[i] = fv[0][i];
     vx[i+1] = fv[3][i];
     vx[i+2] = fv[6][i];
     vy[i] = fv[1][i];
     vy[i+1] = fv[4][i];
     vy[i+2] = fv[7][i];
     vz[i] = fv[2][i];
     vz[i+1] = fv[5][i];
     vz[i+2] = fv[8][i];
     tx[i] = ft[0][i];
     tx[i+1] = ft[2][i];
     tx[i+2] = ft[4][i];
     ty[i] = ft[1][i];
     ty[i+1] = ft[3][i];
     ty[i+2] = ft[5][i];
    }
    Loaded = true;
    return true;
   }
   else
   {
    Loaded = false;
    return false;
   }
  }
  void Delete()
  {
   delete[] vx;
   delete[] vy;
   delete[] vz;
   delete[] tx;
   delete[] ty;
   Loaded = false;
   Nf = 0;
  }
  void Draw()
  {
   if(Loaded)
   {
     
     glColor3f(0.7f,0.7f,0.7f);
     for(unsigned int i = 0; i < Nf*3; i+=3)
     {
      //glTexCoord2f(tx[i],ty[i]);
      glBegin(GL_LINE_LOOP);
       glVertex3f(vx[i],vy[i],vz[i]);
       glVertex3f(vx[i+1],vy[i+1],vz[i+1]);
       glVertex3f(vx[i+2],vy[i+2],vz[i+2]);
      glEnd();
     }
   }
   else
   {
    glBegin(GL_QUADS);
     glColor3f(0.0f,1.0f,0.0f);              // Синий
           glVertex3f( 1.0f, 1.0f,-1.0f);          // Право верх квадрата (Верх)
           glVertex3f(-1.0f, 1.0f,-1.0f);          // Лево верх
           glVertex3f(-1.0f, 1.0f, 1.0f);          // Лево низ
           glVertex3f( 1.0f, 1.0f, 1.0f);          // Право низ
     glColor3f(1.0f,0.5f,0.0f);              // Оранжевый
           glVertex3f( 1.0f,-1.0f, 1.0f);          // Верх право квадрата (Низ)
           glVertex3f(-1.0f,-1.0f, 1.0f);          // Верх лево
           glVertex3f(-1.0f,-1.0f,-1.0f);          // Низ лево
           glVertex3f( 1.0f,-1.0f,-1.0f);          // Низ право
     glColor3f(1.0f,0.0f,0.0f);              // Красный
           glVertex3f( 1.0f, 1.0f, 1.0f);          // Верх право квадрата (Перед)
           glVertex3f(-1.0f, 1.0f, 1.0f);          // Верх лево
           glVertex3f(-1.0f,-1.0f, 1.0f);          // Низ лево
           glVertex3f( 1.0f,-1.0f, 1.0f);          // Низ право
     glColor3f(1.0f,1.0f,0.0f);              // Желтый
           glVertex3f( 1.0f,-1.0f,-1.0f);          // Верх право квадрата (Зад)
           glVertex3f(-1.0f,-1.0f,-1.0f);          // Верх лево
           glVertex3f(-1.0f, 1.0f,-1.0f);          // Низ лево
           glVertex3f( 1.0f, 1.0f,-1.0f);          // Низ право
     glColor3f(0.0f,0.0f,1.0f);              // Синий
           glVertex3f(-1.0f, 1.0f, 1.0f);          // Верх право квадрата (Лево)
           glVertex3f(-1.0f, 1.0f,-1.0f);          // Верх лево
           glVertex3f(-1.0f,-1.0f,-1.0f);          // Низ лево
           glVertex3f(-1.0f,-1.0f, 1.0f);          // Низ право
     glColor3f(1.0f,0.0f,1.0f);              // Фиолетовый
           glVertex3f( 1.0f, 1.0f,-1.0f);          // Верх право квадрата (Право)
           glVertex3f( 1.0f, 1.0f, 1.0f);          // Верх лево
           glVertex3f( 1.0f,-1.0f, 1.0f);          // Низ лево
           glVertex3f( 1.0f,-1.0f,-1.0f);          // Низ право
    glEnd();  
   }
  }
private:
  float *vx;
  float *vy;
  float *vz;
  float *tx;
  float *ty;
  unsigned int Nf;
  bool Loaded;
};

Добавлено (08.01.2013, 00:16)
---------------------------------------------
и как модель после загрузки из файла *.obj можно конвертировать в бинарник? ну чтобы быстрее грузилась...

Добавлено (08.01.2013, 22:40)
---------------------------------------------
Не кто с такими вопросами не сталкивался?!



Баблосы здесь... Зарегестрируйся и начни получать деньги... Платят мало, но стабильно, а самое главное платят! а не обещают...
vasua99Дата: Вторник, 08 Января 2013, 23:26 | Сообщение # 2
GNU follower
Сейчас нет на сайте
Храни лучше в list или vector если памяти мало.

Код

#include <list>
using namespace std;

int main() {
       list<Point3D *> Model3D;
       Model3D.push_back(new Point3D(0.0f, 10.0f, 5.0f));
}


Надеюсь с английским на уровне технической знаком?Тогда вот:
List class
Vector class

Удачи! biggrin


Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)

Сообщение отредактировал vasua99 - Вторник, 08 Января 2013, 23:27
ad141Дата: Среда, 09 Января 2013, 16:39 | Сообщение # 3
почетный гость
Сейчас нет на сайте
ладно... Попробую разобратся... а можно ли как нибудь оптимизировать загрузку?

Добавлено (09.01.2013, 16:39)
---------------------------------------------
я слышал что то про списки в OpenGL типа оптимизируется отрисовка объекта по точкам, а потом отрисоваваешь весь объект, а не по точкам заного...



Баблосы здесь... Зарегестрируйся и начни получать деньги... Платят мало, но стабильно, а самое главное платят! а не обещают...
SEvgДата: Среда, 09 Января 2013, 17:56 | Сообщение # 4
Алхимик
Сейчас нет на сайте
Очень советую использовать glDrawElements, вместо glBegin... glEnd
ad141Дата: Среда, 09 Января 2013, 20:42 | Сообщение # 5
почетный гость
Сейчас нет на сайте
Цитата (SEvg)
Очень советую использовать glDrawElements, вместо glBegin... glEnd


SEvg, пожалуйста поподробнее или ссыль на мануал/статью



Баблосы здесь... Зарегестрируйся и начни получать деньги... Платят мало, но стабильно, а самое главное платят! а не обещают...
Форум игроделов » Программирование » C/C++ » Как загрузить модель в память?
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг