Реализация «очистки и обрезки» — общий дизайн обработки данных.C++

Программы на C++. Форум разработчиков
Anonymous
Реализация «очистки и обрезки» — общий дизайн обработки данных.

Сообщение Anonymous »

Я работаю над 3D/физическим движком с использованием C++ и OpenGL.
В настоящее время я занимаюсь реализацией метода «Sweep and Prune» для проверки коллизий с использованием AABB. (ограничительные рамки, выровненные по оси). Я примерно следую методу, описанному здесь (части 1 и 2): https://leanrada.com/notes/sweep-and-prune/
Алгоритм работает путем сортировки минимального & максимальные координаты каждой оси для каждого блока AABB:
  • векторы (отсортированные по координатам) для осей X, Y и Z.
  • Алгоритму также необходимо знать, является ли каждое ребро минимальной или максимальной координатой.
  • А также идентификатор объекта, которому оно принадлежит.
Для этих данных я использую структуру Edge:

Код: Выделить всё

struct Edge {
int id;
bool isLeft;
float coord;

Edge(int id, bool isLeft, float coord)
: id(id), isLeft(isLeft), coord(coord) {}
}
};
Пример класса Entity с соответствующими функциями для Edge:

Код: Выделить всё

class Entity
{
public:
int id;
std::vector edgesList;

std::vector vertices;
std::vector indices;
glm::vec3 position;

// create Edges
void setupEdges(const std::vector& minMax)
{
// Create Edge objects and add them to edgesList
edgesList.emplace_back(id, true,  minMax[0]); // min_X
edgesList.emplace_back(id, false, minMax[1]); // max_X
edgesList.emplace_back(id, true,  minMax[2]); // min_Y
edgesList.emplace_back(id, false, minMax[3]); // max_Y
edgesList.emplace_back(id, true,  minMax[4]); // min_Z
edgesList.emplace_back(id, false, minMax[5]); // max_Z
}

// update Edges. The new coordinates are calculated separately in another function
void updateEdges(const std::vector& minMax)
{
edgesList[0].coord = minMax[0];   // new min_X
edgesList[1].coord = minMax[1];   // new max_X
edgesList[2].coord = minMax[2];   // new min_Y
edgesList[3].coord = minMax[3];   // new max_Y
edgesList[4].coord = minMax[4];   // new min_Z
edgesList[5].coord = minMax[5];   // new max_Z
}
Чтобы сэкономить на производительности, я хочу использовать сортировку вставкой для векторов-осей (поскольку обычно сущности не меняют места в каждом кадре).
Также Я хотел бы обновить Edge-структуры изнутри Entity-объектов и автоматически обновить оси-векторы.
Вопрос: Как мне поместить все Edge-структуры из всех Entities внутри одного вектора, сохраняя при этом возможность обновлять значения внутри каждого Entity (которому принадлежат структуры)? Особенно после сортировки указанного вектора

Подробнее здесь: https://stackoverflow.com/questions/786 ... a-handling

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