С ++ сортировка по глубине с использованием только матрицы. Возможный? - PullRequest
2 голосов
/ 23 августа 2010

Если у меня есть std :: vector объектов, содержащих повернутую / переводящую матрицу, есть ли способ использовать эту матрицу для вычисления позиции Z, чтобы я мог отсортировать объекты по глубине?

Ответы [ 4 ]

1 голос
/ 23 августа 2010

Краткий ответ:

сортировка по матрице [3] [2], которая является позицией z (в мировом пространстве) центра вашего объекта.

Длинный ответ:

В однородных координатах позиция (x, y, z, 1) (в отличие от направления (x, y, z, 0), как мы увидим позже)

Для преобразованияВаша точка из одного пространства в другое, вы умножаете ее на матрицу преобразования.Таким образом, если вы хотите преобразовать центр объекта, который, таким образом, (0,0,0,1) с помощью матрицы, единственный оставшийся член - это правый столбец матрицы.Компонент z является третьим.

При направлении w = 0, поэтому правый столбец (содержащий перевод) будет умножен на 0. Это означает: перевод направления не меняет направление, что делаетсмысл.

Очевидно, что при сортировке центров объектов два близких объекта могут перекрываться.

1 голос
/ 23 августа 2010

Гадание на то, что вы спрашиваете:

Если у вас есть матрица вектора преобразования (то есть 4x4), то компонент Z находится в компоненте перевода матрицы. Должно быть (row, col) = 2,3 или 3,2 в зависимости от вашего соглашения.

например:

1 0 0 0  <-- x position
0 1 0 0  <-- y position
0 0 1 0  <-- z position
0 0 0 1
1 голос
/ 23 августа 2010

Определите желаемый порядок и затем используйте std :: sort как в этот пример .

ОБНОВЛЕНИЕ НА ОСНОВЕ КОММЕНТАРИИ:

ЦентральныйВы, похоже, задаетесь вопросом, как определить порядок, который вы используете в качестве основы для сортировки.Если ваши объекты представляют собой отдельные точки, то вы применяете соответствующее преобразование (если вы его предварительно не вычислили / не преобразовали), и сортируете по компоненту Z результирующего вектора.

Становится сложнее, если ваши объекты состоятнесколько очков.В этом случае вам нужно будет определить подходящее суррогатное местоположение в одной точке, связанное с каждым объектом, которое вы затем сможете использовать в качестве основы для своего рода.Поскольку объекты имеют многоточечный характер, любое суррогатное представление в одной точке, вероятно, даст плохие результаты при некоторых обстоятельствах.Однако, если все объекты являются простыми, плоскими многоугольниками, которые не пересекаются друг с другом, кроме как по краям или вершинам, то вы можете усреднить расположение вершин каждого многоугольника в одну точку, которая служит подходящей суррогатом.Этот метод хорошо распространяется и на непересекающиеся выпуклые многогранники.Если объекты становятся слишком сложными, вам придется либо разложить их на непересекающиеся правильные многоугольники или выпуклые многогранники и отсортировать их, либо принять не всегда правильное решение.

0 голосов
/ 23 августа 2010

Если я понимаю, вы, вероятно, можете сделать это с помощью предиката сортировки.

Matrix transMatrix;

struct DepthSorter
{
    DepthSorter(const Matrix& matrix) : matrix_(matrix) {}
    bool operator()(const Obj& obj1, const Obj& obj2) { return matrix_->translate(obj1) < matrix_->translate(obj2); }
};

std::vector<Obj> objs;

std::sort(objs.begin(), objs.end(), DepthSorter(transMatrix));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...