Как получить доступ к минимальным и максимальным координатам 3D-объекта в С++?

Я создаю игру в qt Creator, используя С++ и OpenGL, и пытаюсь добавить ограничивающие рамки в свою сцену, чтобы реализовать обнаружение столкновений. Я использую в своей сцене объекты, импортированные из Maya как .obj, поэтому их размеры не задаются в коде, а только их положение, поворот и масштаб. Я могу создать ограничивающую рамку вокруг каждого объекта, которая соответствует их положению, но я изо всех сил пытаюсь найти способ получить доступ к минимальным и максимальным значениям x, y и z объектов, чтобы сопоставить рамку с размером объекта.

Есть ли у кого-нибудь идеи о том, как я могу получить доступ к минимальным и максимальным координатам? Я знаю, как реализовать код, если бы я мог получить доступ к этим значениям.


person maria    schedule 05.04.2017    source источник
comment
Если вы уже можете создать ограничивающую рамку, то в чем проблема?   -  person vallentin    schedule 05.04.2017
comment
@Vallentin - если бы вы продолжили читать еще две строки, вы бы поняли, что это не так. OP создает ограничивающую рамку, которая на самом деле не ограничивает геометрию.   -  person dtech    schedule 05.04.2017
comment
Я читал это. Взяв минимальные и максимальные значения x, y, z всех вершин, мы создадим подходящую ограничивающую рамку. Единственный случай, когда он не подходит, - это если сетка позже повернута, что OP ничего не упоминает о том, что это не подходит.   -  person vallentin    schedule 05.04.2017
comment
Вращение не будет проблемой, так как ограничительная рамка должна соответствовать только исходной сетке, все преобразования, примененные к сетке, также применяются к ограничительной рамке.   -  person dtech    schedule 05.04.2017
comment
AABB или OBB для ограничивающих рамок?   -  person pleluron    schedule 06.04.2017
comment
Проблемы, с которыми я сталкиваюсь, заключаются в том, что я не могу понять, как получить доступ к минимальным и максимальным вершинам объекта, вот о чем я спрашиваю   -  person maria    schedule 06.04.2017
comment
Плелюрон - AABB   -  person maria    schedule 06.04.2017
comment
@Vallentin, это справедливо только для многоугольника, но предположим, что у вас есть круг, учитывая его центр и радиус, у вас будет ограничивающая рамка, которая рассчитывается иначе, чем ваше предложение. Предположим, у вас есть сплайн, учитывая его контрольные точки... задача не так проста и, вероятно, вам понадобится какой-то полиморфный подход. По крайней мере, это подход, используемый в подходе java2d, и я предлагаю прочитать этот API, чтобы предложить альтернативу. В любом случае, это причина использования ограничивающей рамки: оптимизация взаимодействия объектов с помощью некоторой эвристики.   -  person Luis Colorado    schedule 06.04.2017
comment
@dtech, нет. Предположим, у вас есть прямоугольник (или квадрат), и вы повернете его так, чтобы одна диагональ была выровнена по оси Y, ограничительная рамка будет увеличиваться в высоту, чтобы учесть больший размер диагонали по сторонам. Ваш подход недействителен.   -  person Luis Colorado    schedule 06.04.2017
comment
@maria, как вы можете догадаться из моих комментариев, ограничивающая рамка - это то, что зависит от геометрии объекта, и обычно каждый класс фигур имеет некоторые средства для ее вычисления на основе имеющихся у вас фактических параметров геометрии. Вероятно, у вас будет это предварительно рассчитано или какой-то метод, позволяющий вам его получить. Проверь это.   -  person Luis Colorado    schedule 06.04.2017
comment
Доступ к минимальным/максимальным вершинам объекта потребует перебора всех вершин для получения минимальных/максимальных значений каждого измерения. Для AABB все измерения будут вносить вклад в одно минимальное значение и одно максимальное значение.   -  person pleluron    schedule 06.04.2017


Ответы (2)


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

Давайте попробуем несколько примеров, чтобы проиллюстрировать это:

  • Предположим, у нас есть круг, параметры рисования которого хранятся внутри: координаты центра x_center и y_center и радиус radius. Если вы попытаетесь определить ограничивающую рамку для этого объекта, вы увидите, что она простирается от (x_center - radius, y_center - radius) до (x_center + radius, y_center + radius).

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

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

  • Если, например, у нас есть кубический сплайн, определяемый координатами его четырех контрольных точек, вы будете определять максимальное и минимальное значения двух кубических многоугольников, что означает решение двух квадратных уравнений (после вывода), в общем кейс.

Чтобы справиться со всеми этими вещами, геометрическая фигура обычно включает в себя некоторые средства полиморфного построения своей ограничивающей рамки (обычно она даже кэшируется, поэтому вам не нужно ее вычислять, только после поворотов или изменений ее положения или масштаба) через некоторые Метод экземпляра.

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

person Luis Colorado    schedule 06.04.2017

если у вас есть загрузчик obj, значит, у вас есть массив.

float t[2100];
int x = 2100;
float xmax=-123243;
while(x>=0)
{
   if(xmax<t[x]) xmax=t[x];
   x-=3;
}

Итак, вот максимальный x объекта (?).

person Community    schedule 24.04.2017