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

Распарсить файл 3Dmax - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Структура - Окно c++ http://www.cyberforum.ru/cpp-beginners/thread1129213.html
Структура - Окно. Структура должна включать соответствующие поля: размер окна, его положение на экране, цвет, текст в окне. Простейшие функции: отображение окна, удаление окна, изменение цветов, смена текста в окне.
C++ Switch - case Доброго времени суток. Сделал меню по такой схеме: switch(a) { case 1: { case 1: case 2: switch(aa) { case 1: http://www.cyberforum.ru/cpp-beginners/thread1129208.html
Программа проверяет, содержится ли какой-либо предлог из массива в данной строчке C++
Дан массив с предлогами : in, and, is, a, an, or и дана пустая строчка char str, Пользователь вводит предложение, к примеру: Hello, my name is Anton. - оно записывается в строчку str Программа проверяет, содержится ли какой-либо предлог из массива в данной строчке и если да, то он удаляется из строчки. Как такое реализовать?
Какое число будет через n дней C++
Есть дата 01.01.2008. Вопрос какой день будет через n (0<= n <=1000) дней (c учётом високосных годов)? Пример: n=1 cout << 02.01.2008 n=0 cout << 01.01.2008 n=5 cout << 06.01.2008
C++ Алгоритм шифрования полей БД http://www.cyberforum.ru/cpp-beginners/thread1129186.html
Написать алгоритм шифрования ряда полей БД,осуществляемые при вводе и редактировании. Продумать алгоритм дешифрования
C++ Имеется информационный поток и написать алгоритм его шифрования при передаче данных по компьютерным сетям, чтобы поток не увеличивался в объеме Имеется информационный поток и написать алгоритм его шифрования при передаче данных по компьютерным сетям, так чтобы данный поток не увеличивался в объеме.. подробнее

Показать сообщение отдельно
x5reunion
3 / 3 / 1
Регистрация: 25.03.2014
Сообщений: 45

Распарсить файл 3Dmax - C++

25.03.2014, 13:55. Просмотров 365. Ответов 9
Метки (Все метки)

Всем привет.

В 3DMax есть возможность сохранять модели в формате obj это тоже самое что и txt.

Вот пример элементарного объекта с текстурой.

Возникло два вопроса.

Первый.

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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
//-----------------------------------------------------------------------------------
 
# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware
# File Created: 23.03.2014 06:46:18
 
mtllib Box.mtl
 
#
# object Box01
#
 
v  -0.5000 0.0000 0.5000
v  -0.5000 0.0000 -0.0000
v  0.0000 0.0000 -0.0000
v  0.0000 0.0000 0.5000
v  0.5000 0.0000 -0.0000
v  0.5000 0.0000 0.5000
v  -0.5000 0.0000 -0.5000
v  0.0000 0.0000 -0.5000
v  0.0000 2.0000 0.5000
v  0.5000 2.0000 0.5000
v  0.5000 2.0000 -0.0000
v  0.0000 2.0000 -0.0000
v  -0.5000 2.0000 -0.0000
v  0.0000 2.0000 -0.5000
v  -0.5000 2.0000 -0.5000
v  0.0000 0.5000 0.5000
v  -0.5000 0.5000 0.5000
v  0.5000 0.5000 0.5000
v  0.0000 1.0000 0.5000
v  0.5000 1.0000 0.5000
v  0.5000 0.5000 -0.0000
v  0.5000 1.0000 -0.0000
v  -0.5000 0.5000 -0.5000
v  0.0000 0.5000 -0.5000
v  0.0000 1.0000 -0.5000
v  -0.5000 1.0000 -0.5000
v  -0.5000 0.5000 -0.0000
v  -0.5000 1.0000 -0.0000
v  0.0000 1.0000 -0.0000
v  0.0000 0.5004 -0.0000
# 30 vertices
 
vn 0.0000 -1.0000 -0.0000
vn 0.0000 1.0000 -0.0000
vn 0.0000 0.0000 1.0000
vn 1.0000 0.0000 -0.0000
vn 0.0000 0.0000 -1.0000
vn -1.0000 0.0000 -0.0000
vn 0.7071 0.0000 -0.7071
vn -0.0004 1.0000 0.0004
# 8 vertex normals
 
vt 0.5464 0.5464 0.0000
vt 0.5464 0.4206 0.0000
vt 0.6723 0.4206 0.0000
vt 0.6723 0.5464 0.0000
vt 0.7981 0.4206 0.0000
vt 0.7981 0.5464 0.0000
vt 0.5464 0.2947 0.0000
vt 0.6723 0.2947 0.0000
vt 0.6723 0.0100 0.0000
vt 0.7981 0.0100 0.0000
vt 0.7981 0.1359 0.0000
vt 0.6723 0.1359 0.0000
vt 0.5464 0.1359 0.0000
vt 0.6723 0.2617 0.0000
vt 0.5464 0.2617 0.0000
vt 0.0100 0.4206 0.0000
vt 0.1359 0.4206 0.0000
vt 0.1359 0.5464 0.0000
vt 0.0100 0.5464 0.0000
vt 0.0100 0.2947 0.0000
vt 0.1359 0.2947 0.0000
vt 0.2617 0.4206 0.0000
vt 0.2617 0.2947 0.0000
vt 0.5134 0.2947 0.0000
vt 0.5134 0.4206 0.0000
vt 0.0100 0.7053 0.0000
vt 0.1359 0.7053 0.0000
vt 0.1359 0.8311 0.0000
vt 0.0100 0.8311 0.0000
vt 0.2617 0.8311 0.0000
vt 0.2617 0.7053 0.0000
vt 0.5134 0.7053 0.0000
vt 0.5134 0.8311 0.0000
vt 0.0100 0.8641 0.0000
vt 0.1359 0.8641 0.0000
vt 0.1359 0.9900 0.0000
vt 0.0100 0.9900 0.0000
vt 0.2617 0.9900 0.0000
vt 0.2617 0.8641 0.0000
vt 0.5134 0.8641 0.0000
vt 0.5134 0.9900 0.0000
vt 0.0100 0.1359 0.0000
vt 0.1359 0.1359 0.0000
vt 0.1359 0.2617 0.0000
vt 0.0100 0.2617 0.0000
vt 0.0100 0.0100 0.0000
vt 0.1359 0.0100 0.0000
vt 0.2617 0.2617 0.0000
vt 0.2617 0.1359 0.0000
vt 0.5134 0.1359 0.0000
vt 0.5134 0.2617 0.0000
vt 0.6723 0.7383 0.0000
vt 0.9240 0.7383 0.0000
vt 0.9240 0.8641 0.0000
vt 0.6723 0.8641 0.0000
vt 0.9240 0.7053 0.0000
vt 0.6723 0.7053 0.0000
vt 0.6723 0.5794 0.0000
vt 0.9240 0.5794 0.0000
vt 0.2617 0.5794 0.0000
vt 0.5134 0.5794 0.0000
vt 0.1359 0.5794 0.0000
vt 0.0100 0.5794 0.0000
vt 0.5465 0.8641 0.0000
vt 0.5464 0.7383 0.0000
vt 0.5464 0.7053 0.0000
vt 0.5465 0.5794 0.0000
vt 0.9322 0.1359 0.0000
vt 0.8064 0.1359 0.0000
vt 0.8064 0.0100 0.0000
vt 0.9322 0.0100 0.0000
# 71 texture coords
 
g Box01
usemtl 03___Default
s 2
f 1/1/1 2/2/1 3/3/1 4/4/1 
f 4/4/1 3/3/1 5/5/1 6/6/1 
f 2/2/1 7/7/1 8/8/1 3/3/1 
s 4
f 9/9/2 10/10/2 11/11/2 12/12/2 
f 13/13/2 12/12/2 14/14/2 15/15/2 
s 8
f 4/16/3 16/17/3 17/18/3 1/19/3 
f 6/20/3 18/21/3 16/17/3 4/16/3 
f 19/22/3 20/23/3 10/24/3 9/25/3 
s 16
f 5/26/4 21/27/4 18/28/4 6/29/4 
f 20/30/4 22/31/4 11/32/4 10/33/4 
s 32
f 7/34/5 23/35/5 24/36/5 8/37/5 
f 25/38/5 26/39/5 15/40/5 14/41/5 
s 64
f 2/42/6 27/43/6 23/44/6 7/45/6 
f 1/46/6 17/47/6 27/43/6 2/42/6 
f 26/48/6 28/49/6 13/50/6 15/51/6 
s off
f 19/52/6 9/53/6 12/54/6 29/55/6 
f 13/56/3 28/57/3 29/58/3 12/59/3 
f 25/60/7 14/61/7 11/32/7 22/31/7 
f 11/11/2 14/14/2 12/12/2 
f 24/62/7 21/27/7 5/26/7 8/63/7 
f 3/3/1 8/8/1 5/5/1 
s 8
f 20/23/3 19/22/3 16/17/3 18/21/3 
s 16
f 22/31/4 20/30/4 18/28/4 21/27/4 
s 32
f 26/39/5 25/38/5 24/36/5 23/35/5 
s 64
f 28/49/6 26/48/6 23/44/6 27/43/6 
s off
f 25/60/7 22/31/7 21/27/7 24/62/7 
f 19/52/6 29/55/6 30/64/6 16/65/6 
f 29/58/3 28/57/3 27/66/3 30/67/3 
f 30/68/8 27/69/8 17/70/8 16/71/8 
# 27 polygons - 2 triangles
 
//-----------------------------------------------------------------------------------
Естественной мне нужно написать для этого парсер. Я знаю за что какие переменные тут отвечают и что значат символы F V VT и т.д. Понятно что никто мне не будет писать готовый код для этого, да и не к чему это примитивная модель тут даже не используется доп материал.

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

Возникает вопрос, какую книгу мне нужно прочитать чтобы приблизительно понимать что нужно сделать и использовать для всего этого?



Второй.
Я написал частично прогу обшаря пол инета и найдя функцию разбивки строк на слова.


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
#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
 
// Функция разбивает строку на слова, основываясь на строке разделителей
// Принимаемые параметры:
//  str - строка, которую необходимо разбить на слова
//  delims - строку, содержащая разделители
// Возвращаемое значение:
//  динамически выделенный массив слов (заканчивающийся нулевым указателем)
 
using namespace std;
 
char **split_string(const char *str, const char *delims)
{
    // Предварительно считаем длину входной строки
    size_t str_len = strlen(str);
 
    // Счётчик слов в предложении
    size_t words_cntr = 1;
 
    // Результирующий массив слов
    char **words;
 
    // Счётчики циклов
    size_t i, j;
    size_t w;
 
    // Считаем количество слов
    for (i = 0; i < str_len; ++i)
        // Если очередной символ входной строки совпал с одним из разделителей
        if (strchr(delims, str[i]) != NULL)
            // Увеличиваем счётчик слов
            ++words_cntr;
 
    // Выделяем память под массив слов (размером количество слов + 1 элемент для
    // нулевого указателя - конца массива слов)
    words = (char **)malloc((words_cntr + 1) * sizeof(char *));
 
    // Сразу устанавливаем ограничитель массив слов
    words[words_cntr] = NULL;
 
    // Идём по всем символам строки
    for (i = 0, w = 0; i < str_len + 1; ++i)
    {
        // j служит для указания на конеч слова, i - на начало
        // Поиск конца слова начинаем с его начала
        j = i;
 
        // Пока не достигли конца строки или не нашли разделитель
        while (str[j] != '\0' && strchr(delims, str[j]) == NULL)
            // Говорим, что очередной символ строки входит в очередное слово
            ++j;
 
        // Выделяем память под очередное слово
        words[w] = (char *)malloc((j - i + 1) * sizeof(char));
 
        // Копируем слово в выделенную память
        strncpy(words[w], str + i, j - i);
        // Ограничиваем слово нуль-терминатором
        words[w++][j - i] = '\0';
 
        // Продолжаем поиск следующего слова с конца только что обработанного
        i = j;
    }
 
    // Возвращаем сформированный массив слов
    return words;
}
 
// Функция просто очищает память, выделенную под массив слов
void destroy_words(char **words)
{
    size_t i = 1;
 
    while (words[i - 1] != NULL)
        free(words[i++]);
 
    free(words);
}
 
int main(void)
{
    char str[1000];
 
    char LINE[1000];
 
    double f;
 
    ifstream in_file("D:\\Hedra\\Obj\\Box1.txt",ios::in);
 
    while (!in_file.eof())
    {
 
    in_file.getline(LINE,1000);
    
    strcpy(str,LINE);
 
    const char *delims = " ";
 
    char **words = split_string(str, delims);
    
    size_t i;
    
    for (i = 0; words[i] != NULL; ++i)
    {
 
    //sscanf(words[i], "%4lf", &f);
 
    //printf("%.4lf\n", f);
 
    printf("%s\n", words[i]);
 
    }
 
    destroy_words(words);
 
    }
 
    system("pause");
 
    return 0;
}


Начал с малого и использовал простейший пример.

v -0.5000 -0.0000 -0.5000
v -0.5000 -0.0000 -0.0000
v -0.0000 -0.0000 -0.0000
v -0.0000 -0.0000 -0.5000

все выводится корректно. Но стоит начать использовать чтобы преобразовать string в double.

//sscanf(words[i], "%4lf", &f);

//printf("%.4lf\n", f);

как начинает выводить то 3 значения то вообще ничего не выводит тоже самое и с функцией atof.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 17:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru