Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/47: Рейтинг темы: голосов - 47, средняя оценка - 4.60
 Аватар для Anatoliy Coder
0 / 0 / 0
Регистрация: 04.10.2012
Сообщений: 75

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

01.11.2012, 23:29. Показов 9609. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Предыстория 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
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.11.2012, 23:29
Ответы с готовыми решениями:

Заменить считывание с клавиатуры на считывание из файла
Помогите пожалуйста, ни разу не работал со считыванием из файла поэтому не понимаю как и что делать. Почитал в интернете, попробовал, не...

Увеличение скорости загрузки из файла obj мешей в Directx
Пробую написать свой класс для загрузки .obj мешей в Directx. Идея в 2 функциях: Первая(Convert_Obj) конвертирует стандартный формат...

как overload ++OBJ и --OBJ
как overload ++OBJ и --OBJ

13
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
01.11.2012, 23:50
Помнится делал что-то такое, но кода не сохранилось. Если я не ошибаюсь, то в obj файле содержатся вершины, а далее идут по тройках индексы вершин(ака треугольники). Также там могут быть нормали и куча другого хлама. Основная идея в том, что ты эту всю радость загружаешь в массивы(А лучше сделать класс примитива, который будет загружать в себя из obj), а имея массивы вершин, индексов, нормалей просто вызываешь функцию рисования, если память не врет, то нужно использовать функции на подобии glVertexPointer, glDrawElements и т.п. там их много.

Добавлено через 1 минуту
По использованию этих функций кури MSDN.
0
 Аватар для Anatoliy Coder
0 / 0 / 0
Регистрация: 04.10.2012
Сообщений: 75
01.11.2012, 23:57  [ТС]
Вы не поняли суть.
Вопрос состоит в организации чтения файла и т.д.
А про OpenGl я более менее знаю
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.11.2012, 00:41
А зачем тогда вообще OpenGL упомянать? Что не получается? Читать файл?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
02.11.2012, 07:49
Цитата Сообщение от lazybiz Посмотреть сообщение
А зачем тогда вообще OpenGL упомянать? Что не получается? Читать файл?
Я так понял:
Цитата Сообщение от Anatoliy Coder Посмотреть сообщение
Основная задача этот файл преобразовать
Задача расплывчата.

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

Цитата Сообщение от Anatoliy Coder Посмотреть сообщение
потом идут " f 1//1 2//2 5//5 "
И что с этими строками делать? Конкретизировать задачу нужно.
0
 Аватар для Anatoliy Coder
0 / 0 / 0
Регистрация: 04.10.2012
Сообщений: 75
02.11.2012, 20:09  [ТС]
Ладно. Упрошу задачу.
Допустим у меня уже есть 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. В первом файле номер строки не всегда равен номеру элемента, так что искать верщину по номеру строки "невар"
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
02.11.2012, 23:49
Например, такой код:
Кликните здесь для просмотра всего текста
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 минут
Добавить
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
03.11.2012, 00:09
Напишите, как эти данные точно хранятся. Если просто 3 подряд значения типа double, то создайте структуру:
C++
1
2
3
4
5
struct coord {
   double x;
   double y;
   double z;
};
Соединения тоже можно хранить в структуре, в виде указателей.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
03.11.2012, 00:14
Anatoliy Coder, хочу спросить. В чем смысл данного действия?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
03.11.2012, 02:42
Еще вариант:
Кликните здесь для просмотра всего текста
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;
}
0
Twilight Parasite
 Аватар для Invader_Zim
154 / 150 / 7
Регистрация: 21.07.2011
Сообщений: 908
03.11.2012, 02:44
Как по мне, кошернее будет ply.
нефиг делать лоадер без головняка запилить.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
03.11.2012, 02:55
В дополнение.
На то и была создана индексация вершин, нормалей и координат текстур, чтобы уменьшить объемы потребляемой памяти и увеличить производительность.
То что ты хочешь сделать называется деградацией. А еще правильнее регрессом.

Добавлено через 1 минуту
У меня не было никакого умысла тебя обидеть (оскорбить). Я лишь сказал что я думаю по этому поводу.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
03.11.2012, 05:09
Лучший ответ Сообщение было отмечено SatanaXIII как решение

Решение

С небольшими дополнениями:
Кликните здесь для просмотра всего текста
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;
}
1
 Аватар для Anatoliy Coder
0 / 0 / 0
Регистрация: 04.10.2012
Сообщений: 75
03.11.2012, 15:24  [ТС]
1) Смысл: загрузить 3D модель в OpenGl
2) Спасибо мне уже помогли. Так что тема закрыта.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.11.2012, 15:24
Помогаю со студенческими работами здесь

Парсинг .obj файла
при парсенге файла столкнулся с серьёзной проблемой, а именно у треугольника три нормали пример: f 309//309 387//387 312//312 f...

Считывание файла в массив и запись нового файла
Консоль VS C++. Текстовый файл открывается как бинарный, и считывается по 100 байт в массив - и сразу они переписываются в другой файл. В...

Считывание из файла
Ребят, помогите, пожалуйста, новичку разобраться=) Есть файл, в котором расположена информация примерно такого содержания 1946 12 30 0...

Считывание с файла
2 3 4 5 3 2 9 4 4 5 5 1 2 8 7 0 1 9 2 3 4 3 8 1 5 1 4 2 7 9 4 0 0 7 7 1 9 5 8 5 8 3 0 1 4 8 9 3 4 1 7 7 1 3 3 7 0 1 3 1 0...

считывание с файла
файл содержит data.txt: 200 185 170 160 76 54.9 39 27 7.5 10.7 12.9 15.9 6.5 7.9 12 12 ...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru