Я пытаюсь правильно отсортировать мои рендеры / актеры и заметил, что у меня есть некоторые проблемы со стенами, так как они отсортированы по их центральной точке. Поэтому я сортирую всех своих актеров, прежде чем нарисовать их в зависимости от расстояния до камеры с помощью вставки. После этого я пытаюсь определить, следует ли рисовать стену позади или перед игровым полем. Чтобы объяснить это, игра происходит внутри куба, который находится вне 6 плоскостей. Так как я могу вращать камеру вокруг этого куба, мне нужна сортировка, которая бы помещала плоскости вперед / назад в зависимости от этого. Итак, вот картинка, чтобы вы знали, о чем мы говорим:
Вы можете четко видеть, что происходит с рендерингом перед этим змеем.
Хорошо, вот моя текущая сортировка:
//list of Actors the abstract class which Wall and cube and so on extend
void Group::insertionSort(vector<Actor *> &actors)
{
int j;
for (int i = 1; i < actors.size(); i++)
{
Actor *val = actors[i];
j = i - 1;
while (j >= 0 && distanceToCamera(*actors[j]) < distanceToCamera(*val))
{
actors[j + 1] = actors[j];
j = j - 1;
}
actors[j + 1] = val;
}
}
float Group::distanceToCamera(Actor &a)
{
float result = 0;
XMVECTOR posActor = XMLoadFloat3(&a.getPosition()); //here i get the centerpoint of the object
XMVECTOR posCamera = XMLoadFloat3(&m_camera->getPosition());
XMVECTOR length = XMVector3Length(posCamera - posActor);
XMStoreFloat(&result, length);
return result;
}
Чтобы определить, является ли это Wall
Я использовал вид, как это dynamic_cast<Wall*>(val)
но я не получаю их впереди / сзади вектора в зависимости от этого. Чтобы запомнить объекты, верните их центральную точку. Кто-нибудь может привести меня на правильный путь?
Трудно ответить на ваш вопрос, потому что это сложная система, которую вы не полностью объяснили здесь, и которую вы также должны уменьшить до публикации. Скорее всего, вы найдете решение самостоятельно на пути. Во всяком случае, я сделаю некоторые предположения …
Теперь, первое, что я исправлю, это алгоритм сортировки. Не анализируя подробно, правильно ли он работает во всех случаях или нет, я бы выбросил его и использовал std :: sort (), который эффективен и очень маловероятно, что содержит ошибки.
При его замене необходимо тщательно продумать порядок расположения двух визуализированных объектов: вопрос в том, когда именно один объект должен быть нарисован раньше другого? Вы используете расстояние от центральной точки до камеры. Я не уверен, сортируете ли вы 2D-объекты или 3D-объекты, но в обоих случаях легко привести примеры, когда это не работает! Например, большой квадрат, который не направлен прямо в камеру, может закрыть меньший, даже если центр меньшего квадрата находится ближе. Другая проблема, когда два объекта пересекаются. Аналогично для трехмерных объектов, если они имеют разные размеры или пересекаются, тогда ваш алгоритм не работает. Если все ваши объекты имеют одинаковый размер и они не могут пересекаться, все будет в порядке.
Тем не менее, и здесь я подозреваю одну проблему, это может быть то, что поверхность объекта и поверхность решетки куба имеют абсолютно одинаковое положение. Один из подходов состоит в том, что вы немного сжимаете объекты или увеличиваете внешнюю сетку, чтобы порядок всегда был четким. Это также поможет обойти проблему, связанную с ошибками округления с плавающей запятой. Из-за этого два объекта, которые не имеют математического порядка, могут оказаться в разных позициях в зависимости от обстоятельств. Это может проявляться в виде мерцания между видимым и закрытым в зависимости от угла камеры.
И последнее: я предполагаю, что вы хотите решить это самостоятельно из образовательных соображений, верно? В противном случае это было бы пустой тратой времени с существующими инструментами рендеринга, которые даже перенесли бы все вычисления на графическое оборудование.