Форум программистов, компьютерный форум CyberForum.ru

Считывание obj файла - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Anatoliy Coder
 Аватар для Anatoliy Coder
0 / 0 / 0
Регистрация: 04.10.2012
Сообщений: 75
01.11.2012, 23:29     Считывание obj файла #1
Предыстория 2 месяца прошло с тех пор как я застрял на том что не могу згрузить 3D модель в OpenGl проект.
Я делал конвертеры ("загрузчики") сам 3 совершенно разные версии. Не помогло. Прошу помощь у вас разработать программу или хотябы алгоритм считывание OBJ файла и преобразовние его в код для OpenGl

Задачи:
Есть OBJ файл. Строиться по типу: " v X Y Z " много таких строк (вершин)
потом идут " f 1//1 2//2 5//5 " типа 1 вершина соединяется со 2ой и с 5 (к примеру)
потом опят v и f
Основная задача этот файл преобразовать в код такого типа

glBegin(GL_POLYGON);
glVertex3d(X,Y,Z);
glVertex3d(X,Y,Z);
glVertex3d(X,Y,Z);
glEnd();
glBegin(GL_POLYGON);
...
glEnd();
И результат вписать в файлик txt
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.11.2012, 23:29     Считывание obj файла
Посмотрите здесь:

C++ считывание из файла
C++ Считывание из файла
Считывание файла в массив и запись нового файла C++
считывание из файла C++
C++ как overload ++OBJ и --OBJ
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,343
01.11.2012, 23:50     Считывание obj файла #2
Помнится делал что-то такое, но кода не сохранилось. Если я не ошибаюсь, то в obj файле содержатся вершины, а далее идут по тройках индексы вершин(ака треугольники). Также там могут быть нормали и куча другого хлама. Основная идея в том, что ты эту всю радость загружаешь в массивы(А лучше сделать класс примитива, который будет загружать в себя из obj), а имея массивы вершин, индексов, нормалей просто вызываешь функцию рисования, если память не врет, то нужно использовать функции на подобии glVertexPointer, glDrawElements и т.п. там их много.

Добавлено через 1 минуту
По использованию этих функций кури MSDN.
Anatoliy Coder
 Аватар для Anatoliy Coder
0 / 0 / 0
Регистрация: 04.10.2012
Сообщений: 75
01.11.2012, 23:57  [ТС]     Считывание obj файла #3
Вы не поняли суть.
Вопрос состоит в организации чтения файла и т.д.
А про OpenGl я более менее знаю
castaway
Эксперт С++
4846 / 2985 / 368
Регистрация: 10.11.2010
Сообщений: 11,026
Записей в блоге: 10
Завершенные тесты: 1
02.11.2012, 00:41     Считывание obj файла #4
А зачем тогда вообще OpenGL упомянать? Что не получается? Читать файл?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.11.2012, 07:49     Считывание obj файла #5
Цитата Сообщение от lazybiz Посмотреть сообщение
А зачем тогда вообще OpenGL упомянать? Что не получается? Читать файл?
Я так понял:
Цитата Сообщение от Anatoliy Coder Посмотреть сообщение
Основная задача этот файл преобразовать
Задача расплывчата.

Добавлено через 1 минуту
Цитата Сообщение от Anatoliy Coder Посмотреть сообщение
Есть OBJ файл. Строиться по типу: " v X Y Z " много таких строк (вершин)
И что с такими строками делать?

Цитата Сообщение от Anatoliy Coder Посмотреть сообщение
потом идут " f 1//1 2//2 5//5 "
И что с этими строками делать? Конкретизировать задачу нужно.
Anatoliy Coder
 Аватар для Anatoliy Coder
0 / 0 / 0
Регистрация: 04.10.2012
Сообщений: 75
02.11.2012, 20:09  [ТС]     Считывание obj файла #6
Ладно. Упрошу задачу.
Допустим у меня уже есть Vertexes.txt такого вида:
C++
1
2
3
4
5
6
7
8
9
10
/* 1 */  glVertex3d(-2.092190,0.000000,0.697396);
/* 2 */  glVertex3d(2.927495,0.000000,0.697396);
/* 3 */  glVertex3d(-2.092190,0.000000,-2.282672);
/* 4 */  glVertex3d(2.927495,0.000000,-2.282672);
/* 5 */  glVertex3d(-2.092190,1.609770,0.697396);
/* 6 */  glVertex3d(2.927495,1.609770,0.697396);
/* 7 */  glVertex3d(-2.092190,1.609770,-2.282672);
/* 8 */  glVertex3d(2.927495,1.609770,-2.282672);
/* 9 */  glVertex3d(1.774041,2.909065,1.812822);
/* 10 */  glVertex3d(1.774041,2.853168,1.245292);
P.S. то, что между "/*" и "*/" - это число означает номер точки.

И есть файл Poligons.txt такого вида:
C++
1
2
3
4
5
6
7
8
1.5.9;
13.13.14;
13.13.103;
16.16.103;
14.14.15;
14.14.104;
103.103.104;
103.103.105;
P.S. А эти цифры означают какую точку с какой точкой соединять.

Вопрос: каким образом мне нужно считать эти оба файла, чтобы потом записать в третий файл данные такого типа.
C++
1
2
3
/* 1 */  glVertex3d(-2.092190,0.000000,0.697396);
/* 5 */  glVertex3d(-2.092190,1.609770,0.697396);
/* 9 */  glVertex3d(1.774041,2.909065,1.812822);
Ещё раз конкретизируЮ: как взять через цыфры из фала Poligons.txt и по номеру цыфры вписать в третии файл нужную верщину.

P.S. В первом файле номер строки не всегда равен номеру элемента, так что искать верщину по номеру строки "невар"
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.11.2012, 23:49     Считывание obj файла #7
Например, такой код:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
//в pol.txt       
 
// 1.1.4;
// 1.5.9;
// 2.2.9;
// 3.3.5;
// 4.4.5;
// 4.4.10;
// 6.6.10;
// 8.8.10;
 
// в ver.txt
 
// 3   glVertex3d(-2.092190,0.000000,0.697396);
// 2   glVertex3d(2.927495,0.000000,0.697396);
// 1   glVertex3d(-2.092190,0.000000,-2.282672);
// 8   glVertex3d(2.927495,0.000000,-2.282672);
// 5   glVertex3d(-2.092190,1.609770,0.697396);
// 6   glVertex3d(2.927495,1.609770,0.697396);
// 7   glVertex3d(-2.092190,1.609770,-2.282672);
// 4   glVertex3d(2.927495,1.609770,-2.282672);
// 10  glVertex3d(1.774041,2.909065,1.812822);
// 9   glVertex3d(1.774041,2.853168,1.245292);
 
// в out.txt будет
 
// 1 glVertex3d(-2.092190,0.000000,-2.282672);
// 1 glVertex3d(-2.092190,0.000000,-2.282672);
// 4 glVertex3d(2.927495,1.609770,-2.282672);
// 1 glVertex3d(-2.092190,0.000000,-2.282672);
// 5 glVertex3d(-2.092190,1.609770,0.697396);
// 9 glVertex3d(1.774041,2.853168,1.245292);
// 2 glVertex3d(2.927495,0.000000,0.697396);
// 2 glVertex3d(2.927495,0.000000,0.697396);
// 9 glVertex3d(1.774041,2.853168,1.245292);
// 3 glVertex3d(-2.092190,0.000000,0.697396);
// 3 glVertex3d(-2.092190,0.000000,0.697396);
// 5 glVertex3d(-2.092190,1.609770,0.697396);
// 4 glVertex3d(2.927495,1.609770,-2.282672);
// 4 glVertex3d(2.927495,1.609770,-2.282672);
// 5 glVertex3d(-2.092190,1.609770,0.697396);
// 4 glVertex3d(2.927495,1.609770,-2.282672);
// 4 glVertex3d(2.927495,1.609770,-2.282672);
// 10 glVertex3d(1.774041,2.909065,1.812822);
// 6 glVertex3d(2.927495,1.609770,0.697396);
// 6 glVertex3d(2.927495,1.609770,0.697396);
// 10 glVertex3d(1.774041,2.909065,1.812822);
// 8 glVertex3d(2.927495,0.000000,-2.282672);
// 8 glVertex3d(2.927495,0.000000,-2.282672);
// 10 glVertex3d(1.774041,2.909065,1.812822);
 
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
 
void f1(int x, ifstream &fver, ofstream &fout)
{
    int n;
    string str;
    
    while (true)
    {
        fver >> n;
        if (n == x) 
        {
            fver >> str;
            fout << n << ' ' << str << endl;
            fver.clear();
            fver.seekg(0);
            break;
        }
        else
        {
            fver.ignore(255, '\n');
            if (fver.eof())
            {
                fver.clear();
                fver.seekg(0);
                break;
            }
        }
    }
}
 
 
int main()
{
    ifstream fpol("pol.txt", ios::binary);
    ifstream fver("ver.txt", ios::binary);
    ofstream fout("fout.txt");
 
    int x, y, z;
 
    while (!fpol.eof())
    {
        if (fpol.peek() == EOF) break;
        fpol >> x;
        fpol.clear();
        fpol.get();
        fpol >> y;
        fpol.clear();
        fpol.get();
        fpol >> z;
        fpol.clear();
        fpol.get();
        
        f1(x, fver, fout);
        f1(y, fver, fout);
        f1(z, fver, fout);
    }
    
    fpol.close();
    fver.close();
    fout.close(); 
    
    system("pause");
    return 0;
}
Поясните насчёт этого: /* 1 */. Так в файле или вы закоментировали?

Добавлено через 25 минут
Если же номера точек в файле в коментах, то:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
//в pol.txt       
 
// 1.1.4;
// 1.5.9;
// 2.2.9;
// 3.3.5;
// 4.4.5;
// 4.4.10;
// 6.6.10;
// 8.8.10;
 
// в ver.txt
 
// /* 3 */  glVertex3d(-2.092190,0.000000,0.697396);
// /* 2 */  glVertex3d(2.927495,0.000000,0.697396);
// /* 1 */  glVertex3d(-2.092190,0.000000,-2.282672);
// /* 8 */  glVertex3d(2.927495,0.000000,-2.282672);
// /* 5 */  glVertex3d(-2.092190,1.609770,0.697396);
// /* 6 */  glVertex3d(2.927495,1.609770,0.697396);
// /* 7 */  glVertex3d(-2.092190,1.609770,-2.282672);
// /* 4 */  glVertex3d(2.927495,1.609770,-2.282672);
// /* 10 */ glVertex3d(1.774041,2.909065,1.812822);
// /* 9 */  glVertex3d(1.774041,2.853168,1.245292);
 
// в out.txt будет
 
// /* 1 */ glVertex3d(-2.092190,0.000000,-2.282672);
// /* 1 */ glVertex3d(-2.092190,0.000000,-2.282672);
// /* 4 */ glVertex3d(2.927495,1.609770,-2.282672);
// /* 1 */ glVertex3d(-2.092190,0.000000,-2.282672);
// /* 5 */ glVertex3d(-2.092190,1.609770,0.697396);
// /* 9 */ glVertex3d(1.774041,2.853168,1.245292);
// /* 2 */ glVertex3d(2.927495,0.000000,0.697396);
// /* 2 */ glVertex3d(2.927495,0.000000,0.697396);
// /* 9 */ glVertex3d(1.774041,2.853168,1.245292);
// /* 3 */ glVertex3d(-2.092190,0.000000,0.697396);
// /* 3 */ glVertex3d(-2.092190,0.000000,0.697396);
// /* 5 */ glVertex3d(-2.092190,1.609770,0.697396);
// /* 4 */ glVertex3d(2.927495,1.609770,-2.282672);
// /* 4 */ glVertex3d(2.927495,1.609770,-2.282672);
// /* 5 */ glVertex3d(-2.092190,1.609770,0.697396);
// /* 4 */ glVertex3d(2.927495,1.609770,-2.282672);
// /* 4 */ glVertex3d(2.927495,1.609770,-2.282672);
// /* 10 */ glVertex3d(1.774041,2.909065,1.812822);
// /* 6 */ glVertex3d(2.927495,1.609770,0.697396);
// /* 6 */ glVertex3d(2.927495,1.609770,0.697396);
// /* 10 */ glVertex3d(1.774041,2.909065,1.812822);
// /* 8 */ glVertex3d(2.927495,0.000000,-2.282672);
// /* 8 */ glVertex3d(2.927495,0.000000,-2.282672);
// /* 10 */ glVertex3d(1.774041,2.909065,1.812822);
 
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
 
void f1(int x, ifstream &fver, ofstream &fout)
{
    int n;
    string str;
    
    while (true)
    {
        fver.seekg(2, ios::cur); // попасть на пробел перед номером точки
        fver >> n;
        //fver.clear();
        fver.seekg(3, ios::cur); // попасть на пробел перед записью функции
        if (n == x) 
        {
            fver >> str;
            fout << "/* " << n << " */ " << str << endl;
            fver.clear();
            fver.seekg(0);
            break;
        }
        else
        {
            fver.ignore(255, '\n');
            if (fver.eof())
            {
                fver.clear();
                fver.seekg(0);
                break;
            }
        }
    }
}
 
 
int main()
{
    ifstream fpol("pol.txt", ios::binary);
    ifstream fver("ver.txt", ios::binary);
    ofstream fout("fout.txt");
 
    int x, y, z;
    
 
    while (!fpol.eof())
    {
        if (fpol.peek() == EOF) break;
        fpol >> x;
        fpol.clear();
        fpol.get();
        fpol >> y;
        fpol.clear();
        fpol.get();
        fpol >> z;
        fpol.clear();
        fpol.get();
        
        f1(x, fver, fout);
        f1(y, fver, fout);
        f1(z, fver, fout);
    }
    
    fpol.close();
    fver.close();
    fout.close();
 
    system("pause");
    return 0;
}


Добавлено через 5 минут
Добавить
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
03.11.2012, 00:09     Считывание obj файла #8
Напишите, как эти данные точно хранятся. Если просто 3 подряд значения типа double, то создайте структуру:
C++
1
2
3
4
5
struct coord {
   double x;
   double y;
   double z;
};
Соединения тоже можно хранить в структуре, в виде указателей.
castaway
Эксперт С++
4846 / 2985 / 368
Регистрация: 10.11.2010
Сообщений: 11,026
Записей в блоге: 10
Завершенные тесты: 1
03.11.2012, 00:14     Считывание obj файла #9
Anatoliy Coder, хочу спросить. В чем смысл данного действия?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.11.2012, 02:42     Считывание obj файла #10
Еще вариант:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
//в pol.txt       
 
// 1.1.4;
// 1.5.9;
// 2.2.9;
// 3.3.5;
// 4.4.5;
// 4.4.10;
// 6.6.10;
// 8.8.10;
 
// в ver.txt
 
// /* 3 */  glVertex3d(-2.092190,0.000000,0.697396);
// /* 2 */  glVertex3d(2.927495,0.000000,0.697396);
// /* 1 */  glVertex3d(-2.092190,0.000000,-2.282672);
// /* 8 */  glVertex3d(2.927495,0.000000,-2.282672);
// /* 5 */  glVertex3d(-2.092190,1.609770,0.697396);
// /* 6 */  glVertex3d(2.927495,1.609770,0.697396);
// /* 7 */  glVertex3d(-2.092190,1.609770,-2.282672);
// /* 4 */  glVertex3d(2.927495,1.609770,-2.282672);
// /* 10 */ glVertex3d(1.774041,2.909065,1.812822);
// /* 9 */  glVertex3d(1.774041,2.853168,1.245292);
 
// в out.txt будет
 
// /* 1 */ glVertex3d(-2.092190,0.000000,-2.282672);
// /* 1 */ glVertex3d(-2.092190,0.000000,-2.282672);
// /* 4 */ glVertex3d(2.927495,1.609770,-2.282672);
// /* 1 */ glVertex3d(-2.092190,0.000000,-2.282672);
// /* 5 */ glVertex3d(-2.092190,1.609770,0.697396);
// /* 9 */ glVertex3d(1.774041,2.853168,1.245292);
// /* 2 */ glVertex3d(2.927495,0.000000,0.697396);
// /* 2 */ glVertex3d(2.927495,0.000000,0.697396);
// /* 9 */ glVertex3d(1.774041,2.853168,1.245292);
// /* 3 */ glVertex3d(-2.092190,0.000000,0.697396);
// /* 3 */ glVertex3d(-2.092190,0.000000,0.697396);
// /* 5 */ glVertex3d(-2.092190,1.609770,0.697396);
// /* 4 */ glVertex3d(2.927495,1.609770,-2.282672);
// /* 4 */ glVertex3d(2.927495,1.609770,-2.282672);
// /* 5 */ glVertex3d(-2.092190,1.609770,0.697396);
// /* 4 */ glVertex3d(2.927495,1.609770,-2.282672);
// /* 4 */ glVertex3d(2.927495,1.609770,-2.282672);
// /* 10 */ glVertex3d(1.774041,2.909065,1.812822);
// /* 6 */ glVertex3d(2.927495,1.609770,0.697396);
// /* 6 */ glVertex3d(2.927495,1.609770,0.697396);
// /* 10 */ glVertex3d(1.774041,2.909065,1.812822);
// /* 8 */ glVertex3d(2.927495,0.000000,-2.282672);
// /* 8 */ glVertex3d(2.927495,0.000000,-2.282672);
// /* 10 */ glVertex3d(1.774041,2.909065,1.812822);
 
#include <iostream>
#include <string>
#include <fstream>
#include <cctype>
using namespace std;
 
void f1(int x, ifstream &fver, ofstream &fout, int flag = 0)
{
    int n;
    string str;
    
    while (true)
    {
        fver.seekg(2, ios::cur);
        fver >> n;
        fver.seekg(3, ios::cur);
        if (n == x) 
        {
            fver >> str;
            fout << "/* " << n << " */ " << str;
            if (flag == 0) fout << endl;
            fver.clear();
            fver.seekg(0);
            break;
        }
        else
        {
            fver.ignore(255, '\n');
            if (fver.eof())
            {
                fver.clear();
                fver.seekg(0);
                break;
            }
        }
    }
}
 
void f2(istream& fpol)
{
    while (true)
    {
        if (isdigit(fpol.peek()) || fpol.peek() == EOF) break;
        fpol.seekg(1, ios::cur);
    }
}
 
int main()
{
    ifstream fpol("pol.txt", ios::binary);
    ifstream fver("ver.txt", ios::binary);
    ofstream fout("fout.txt");
 
    int x, y, z;
    int flag = 0;
    
    while (!fpol.eof())
    {
        if (fpol.peek() == EOF) break;
        f2(fpol);
        fpol >> x;
        fpol.clear();
        
        f2(fpol);
        fpol >> y;
        fpol.clear();
        
        f2(fpol);
        fpol >> z;
        fpol.clear();
        fpol.get();
        if (fpol.peek() == EOF) flag = 1;
        
        f1(x, fver, fout);
        f1(y, fver, fout);
        f1(z, fver, fout, flag);
    }
    
    fpol.close();
    fver.close();
    fout.close();
 
    system("pause");
    return 0;
}
Invader_Zim
Twilight Parasite
 Аватар для Invader_Zim
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
03.11.2012, 02:44     Считывание obj файла #11
Как по мне, кошернее будет ply.
нефиг делать лоадер без головняка запилить.
castaway
Эксперт С++
4846 / 2985 / 368
Регистрация: 10.11.2010
Сообщений: 11,026
Записей в блоге: 10
Завершенные тесты: 1
03.11.2012, 02:55     Считывание obj файла #12
В дополнение.
На то и была создана индексация вершин, нормалей и координат текстур, чтобы уменьшить объемы потребляемой памяти и увеличить производительность.
То что ты хочешь сделать называется деградацией. А еще правильнее регрессом.

Добавлено через 1 минуту
У меня не было никакого умысла тебя обидеть (оскорбить). Я лишь сказал что я думаю по этому поводу.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.11.2012, 05:09     Считывание obj файла #13
Сообщение было отмечено автором темы, экспертом или модератором как ответ
С небольшими дополнениями:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
//в pol.txt       
 
// 1.1.4;
// 1.5.9;
// 2.2.9;
// 3.3.5;
// 4.4.5;
// 4.4.10;
// 6.6.10;
// 8.8.10;
 
// в ver.txt
 
// /* 3 */  glVertex3d(-2.092190,0.000000,0.697396);
// /* 2 */  glVertex3d(2.927495,0.000000,0.697396);
// /* 1 */  glVertex3d(-2.092190,0.000000,-2.282672);
// /* 8 */  glVertex3d(2.927495,0.000000,-2.282672);
// /* 5 */  glVertex3d(-2.092190,1.609770,0.697396);
// /* 6 */  glVertex3d(2.927495,1.609770,0.697396);
// /* 7 */  glVertex3d(-2.092190,1.609770,-2.282672);
// /* 4 */  glVertex3d(2.927495,1.609770,-2.282672);
// /* 10 */ glVertex3d(1.774041,2.909065,1.812822);
// /* 9 */  glVertex3d(1.774041,2.853168,1.245292);
 
// в out.txt будет
 
// /* 1 */ glVertex3d(-2.092190,0.000000,-2.282672);
// /* 1 */ glVertex3d(-2.092190,0.000000,-2.282672);
// /* 4 */ glVertex3d(2.927495,1.609770,-2.282672);
// /* 1 */ glVertex3d(-2.092190,0.000000,-2.282672);
// /* 5 */ glVertex3d(-2.092190,1.609770,0.697396);
// /* 9 */ glVertex3d(1.774041,2.853168,1.245292);
// /* 2 */ glVertex3d(2.927495,0.000000,0.697396);
// /* 2 */ glVertex3d(2.927495,0.000000,0.697396);
// /* 9 */ glVertex3d(1.774041,2.853168,1.245292);
// /* 3 */ glVertex3d(-2.092190,0.000000,0.697396);
// /* 3 */ glVertex3d(-2.092190,0.000000,0.697396);
// /* 5 */ glVertex3d(-2.092190,1.609770,0.697396);
// /* 4 */ glVertex3d(2.927495,1.609770,-2.282672);
// /* 4 */ glVertex3d(2.927495,1.609770,-2.282672);
// /* 5 */ glVertex3d(-2.092190,1.609770,0.697396);
// /* 4 */ glVertex3d(2.927495,1.609770,-2.282672);
// /* 4 */ glVertex3d(2.927495,1.609770,-2.282672);
// /* 10 */ glVertex3d(1.774041,2.909065,1.812822);
// /* 6 */ glVertex3d(2.927495,1.609770,0.697396);
// /* 6 */ glVertex3d(2.927495,1.609770,0.697396);
// /* 10 */ glVertex3d(1.774041,2.909065,1.812822);
// /* 8 */ glVertex3d(2.927495,0.000000,-2.282672);
// /* 8 */ glVertex3d(2.927495,0.000000,-2.282672);
// /* 10 */ glVertex3d(1.774041,2.909065,1.812822);
 
#include <iostream>
#include <string>
#include <fstream>
#include <cctype>
#include <Windows.h>
using namespace std;
 
void f2(istream& fpol) // ищет цифру
{
    while (true)
    {
        if (isdigit(fpol.peek()) || fpol.peek() == EOF) break;
        fpol.seekg(1, ios::cur);
    }
}
 
void f3(istream& fpol) // ищет букву
{
    while (true)
    {
        if (isalpha(fpol.peek()) || fpol.peek() == EOF) break;
        fpol.seekg(1, ios::cur);
    }
}
 
void f1(int x, ifstream &fver, ofstream &fout, int flag = 0) // находит нужную запись и пишет её в файл
{
    int n;
    string str;
    
    while (true)
    {
        f2(fver); // ищем цифру
        
        fver >> n; // читаем номер точки
        
        if (n == x) // если найден нужный номер
        {
            f3(fver); // ищем букву
            
            fver >> str; // читаем запись функции
            
            fout << "/* " << n << " */ " << str; // записываем всё в файл
            if (flag == 0) fout << endl; // если не последняя строка в файле, то перевод строки
            fver.clear();
            fver.seekg(0);
            break;
        }
        else // если номер не тот
        {
            fver.ignore(255, '\n'); // пропускаем строку
            if (fver.eof())
            {
                fver.clear();
                fver.seekg(0);
                break;
            }
        }
    }
}
 
 
 
int main()
{
    ifstream fpol("pol.txt", ios::binary);
    ifstream fver("ver.txt", ios::binary);
    ofstream fout("fout.txt");
 
    int x, y, z;
    int flag = 0; // флаг последней строки в файле
    
    while (!fpol.eof())
    {
        if (fpol.peek() == EOF) break;
        f2(fpol); // ищем цифру
        fpol >> x; // читаем номер точки
        fpol.clear();
        
        f2(fpol); // ищем цифру
        fpol >> y; // читаем номер точки
        fpol.clear();
        
        f2(fpol); // ищем цифру
        fpol >> z; // читаем номер точки
        fpol.clear();
        fpol.get();
        if (fpol.peek() == EOF) flag = 1; // если строка последняя в файле, то устанавливаем флаг
        
        f1(x, fver, fout); // находим нужную запись для точки с номером x и пишем её в файл
        f1(y, fver, fout); // находим нужную запись для точки с номером y и пишем её в файл
        f1(z, fver, fout, flag); // находим нужную запись для точки с номером z и пишем её в файл
    }
    
    fpol.close();
    fver.close();
    fout.close();
 
    system("pause");
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2012, 15:24     Считывание obj файла
Еще ссылки по теме:

Заменить считывание с клавиатуры на считывание из файла C++
Считывание с файла C++
C++ Увеличение скорости загрузки из файла obj мешей в Directx

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Anatoliy Coder
 Аватар для Anatoliy Coder
0 / 0 / 0
Регистрация: 04.10.2012
Сообщений: 75
03.11.2012, 15:24  [ТС]     Считывание obj файла #14
1) Смысл: загрузить 3D модель в OpenGl
2) Спасибо мне уже помогли. Так что тема закрыта.
Yandex
Объявления
03.11.2012, 15:24     Считывание obj файла
Ответ Создать тему
Опции темы

Текущее время: 05:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru