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
Удачи!
Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
Сообщение отредактировал 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
|
|
| |