В настоящее время я занимаюсь реализацией метода «Sweep and Prune» для проверки коллизий с использованием AABB. (ограничительные рамки, выровненные по оси). Я примерно следую методу, описанному здесь (части 1 и 2): https://leanrada.com/notes/sweep-and-prune/
Алгоритм работает путем сортировки минимального & максимальные координаты каждой оси для каждого блока AABB:
- векторы (отсортированные по координатам) для осей X, Y и Z.
- Алгоритму также необходимо знать, является ли каждое ребро минимальной или максимальной координатой.
- А также идентификатор объекта, которому оно принадлежит.
Код: Выделить всё
struct Edge {
int id;
bool isLeft;
float coord;
Edge(int id, bool isLeft, float coord)
: id(id), isLeft(isLeft), coord(coord) {}
}
};
Код: Выделить всё
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