Каков самый быстрый способ чтения позиций и индексов вершин в буфер из файла .obj? [закрыто]C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Каков самый быстрый способ чтения позиций и индексов вершин в буфер из файла .obj? [закрыто]

Сообщение Anonymous »

Я писал программу, которая отображает 3D-сетки с использованием OpenGl. Я попробовал загрузить сетку с примерно 70 000 вершинами, и это заняло довольно много времени. Я просто экспортировал свою модель из блендера в формате .obj и анализировал ее таким образом, но мне было интересно, есть ли лучший способ, поскольку то, что я делаю сейчас, происходит довольно медленно. На данный момент меня не интересует ничего, кроме позиций и индексов вершин.
Есть ли для этого лучший формат файла? Или можно оптимизировать код ниже? Каков отраслевой стандарт для подобных вещей? Должен ли я просто смириться с тем, что это будет медленно, несмотря ни на что?
Вот что я делаю, чтобы загрузить вершины и индексы. В настоящее время для довольно большой сетки с ~70 000 вершин это занимает ~1950 мс (с \O2).
struct MeshData {
std::vector vertexPositions;
std::vector indicies;
};

MeshData VertexTest::parseObj(const char* path)
{
Timer t("Loading");
MeshData data;

std::ifstream stream(path);
std::string line;

srand(time(NULL));

while (std::getline(stream, line)) {
//if line specifies vertex position eg. "v -1.0 1.0 1.0"
if (line[0] == 'v' && line[1] == ' ') {
line = line.substr(2);
std::stringstream ss(line);

float num;
while (ss >> num) {
data.vertexPositions.push_back(num);
}

data.vertexPositions.push_back((float)rand() / (float)RAND_MAX);
data.vertexPositions.push_back((float)rand() / (float)RAND_MAX);
data.vertexPositions.push_back((float)rand() / (float)RAND_MAX);
data.vertexPositions.push_back(1.0f);
}
//if line specifies face eg. "f 1/2/3 3/2/4 2/3/2"
if (line[0] == 'f' && line[1] == ' ') {
line = line.substr(2);
std::stringstream parse(line);
std::string section;
std::vector temp;
//only extract first int from each "x/y/z" others don't matter
while (std::getline(parse, section, ' ')) {
temp.push_back(std::stoi(section.substr(0, section.find('/'))) - 1);
}

if (temp.size() == 4) {

data.indicies.push_back(temp[0]);
data.indicies.push_back(temp[1]);
data.indicies.push_back(temp[2]);

data.indicies.push_back(temp[0]);
data.indicies.push_back(temp[2]);
data.indicies.push_back(temp[3]);

}

else if (temp.size() == 3) {
data.indicies.push_back(temp[0]);
data.indicies.push_back(temp[1]);
data.indicies.push_back(temp[2]);
}

else {
std::cout

Подробнее здесь: https://stackoverflow.com/questions/785 ... uffer-from
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как отфильтровать список (случайных) вершин по расстоянию между каждой из двух соседних вершин?
    Anonymous » » в форуме C++
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Почему я не могу загрузить файлы obj со множеством граней и вершин? [закрыто]
    Anonymous » » в форуме C++
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Почему я не могу загрузить файлы obj со множеством граней и вершин? [закрыто]
    Anonymous » » в форуме C++
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Почему я не могу загрузить файлы obj со множеством граней и вершин?
    Anonymous » » в форуме C++
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Каков разумный способ показать многие тысячи позиций на геодезической карте?
    Anonymous » » в форуме Python
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»