Как решить Sweep и обрезать ложные срабатывания относительно большой плоскости пола

Я разрабатываю модуль 3d sweep и prune для проекта, и он создает ложные срабатывания.

Код генерации пары выглядит следующим образом:

    for (unsigned int i = 0; i < mXExtents.size(); i +=2)
    {
        if (mXExtents[i]->mOwner->getID() != mXExtents[i + 1]->mOwner->getID())
        {
                tempXPairs.push_back(new Pair(mXExtents[i]->mOwner, mXExtents[i + 1]->mOwner));
        }
    }
    for (unsigned int i = 0; i < mYExtents.size(); i +=2)
    {
        if (mYExtents[i]->mOwner->getID() != mYExtents[i + 1]->mOwner->getID())
        {
                tempYPairs.push_back(new Pair(mYExtents[i]->mOwner, mYExtents[i + 1]->mOwner));
        }
    }
    for (unsigned int i = 0; i < mZExtents.size(); i +=2)
    {
        if (mZExtents[i]->mOwner->getID() != mZExtents[i + 1]->mOwner->getID())
        {
                tempZPairs.push_back(new Pair(mZExtents[i]->mOwner, mZExtents[i + 1]->mOwner));
        }
    }

Где каждый объект имеет уникальный идентификатор в мире. Это отлично работает с небольшими объектами, но я столкнулся с проблемой, где: если земля представлена ​​конечной плоскостью, выровненной по вертикали (albiet large), генерируются ложные срабатывания и негативы, что препятствует тому, чтобы узкая фаза выполняла свою работу.

Как вы можете видеть, каждый список осей перемещается в наборах из двух элементов и сравниваются уникальные идентификаторы. Если они не совпадают, тогда для этой оси создается пара.

Без плоскости земли порядок каждого списка будет Амин, Amax, Bmin, Bmax и т. д., которые не генерировали бы ложные срабатывания. Однако с добавлением плоскости заземления порядок становится Pmin, Amin, Amax, Bmin, BMax, PMax.

Даже если A и B находятся далеко друг от друга на рассматриваемой оси, пара все еще генерируется. Кроме того, если есть подлинное перекрытие на этой оси, например. Pmin, Amin, Bmin, Bmax, Amax, Pmax, то подлинные пересечения пропущены.

Кроме того, я только что столкнулся с другой проблемой: даже при перемещении списков по одному элементу за раз. В случае объектов, уложенных на ось, могут быть пропущены конфликты. На следующем рисунке показано следующее:

 введите описание изображения здесь>> </a> </p>

<p> Если кто-то еще столкнулся с этой проблемой, я хотел бы услышать, как они ее решили. </p></body></html>

4 голоса | спросил Ian Young 4 Jpm1000000pmMon, 04 Jan 2016 18:59:25 +030016 2016, 18:59:25

1 ответ


1

Я придумал решение:

Чтобы записать все возможные пересечения на заданной оси, вы должны записать пару для каждого возможного перекрытия. Код, который я написал, не делал этого. Вместо этого мой новый код перемещается по списку по одному, и для каждой конечной точки, которая отмечена как минимум, найдите остальные элементы, пока не найдете максимальную конечную точку для одного и того же объекта и создайте пару для всех элементов между:

    for (unsigned int i = 0; i < mXExtents.size()-1; i++)
    {
        //if the endpoint is a minimum
        if (!mXExtents[i]->mMax)
        {
            //search remaining elements for the max endpoint
            for (unsigned int j = i + 1; j < mXExtents.size(); j++)
            {
                //objects only have two endpoints, so this is the max one.
                if (mXExtents[j]->mOwner->getID() == mXExtents[i]->mOwner->getID())
                {
                    break;
                }
                else
                {
                    //between min and max is an intersection of AABB on this axis
                    tempXPairs.push_back(new Pair(mXExtents[i]->mOwner, mXExtents[j]->mOwner));
                }
            }
        }
    }

Поскольку каждый объект имеет только две конечные точки, min и max, как только вы достигнете этого, можно сделать вывод о том, что другая конечная точка является максимальной, поэтому за ее пределами дальнейшие пересечения невозможны, и поэтому дальнейшее перемещение необходимо. Естественно, это увеличивает сложность, но поскольку проверки очень простые целые /целочисленные и логические проверки, это не должно иметь большого влияния на производительность.

ответил Ian Young 5 Jam1000000amTue, 05 Jan 2016 10:23:57 +030016 2016, 10:23:57

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132