Я писал программу, которая отображает 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
Каков самый быстрый способ чтения позиций и индексов вершин в буфер из файла .obj? [закрыто] ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Почему я не могу загрузить файлы obj со множеством граней и вершин? [закрыто]
Anonymous » » в форуме C++ - 0 Ответы
- 19 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Почему я не могу загрузить файлы obj со множеством граней и вершин? [закрыто]
Anonymous » » в форуме C++ - 0 Ответы
- 13 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Каков разумный способ показать многие тысячи позиций на геодезической карте?
Anonymous » » в форуме Python - 0 Ответы
- 11 Просмотры
-
Последнее сообщение Anonymous
-