Относительно масштабировать коллекцию объектов в трехмерном пространстве - PullRequest
2 голосов
/ 09 января 2012

Учитывая группу трехмерных моделей, пространственно расположенных в определенной формации, как мне масштабировать их, сохраняя относительные расстояния между собой?

Пример: у меня есть 10 меш.Шесть из них расположены в закрытой квадратной комнате.Остальные 4 предмета мебели размещены в соответствующих местах внутри него.Все сетки имеют масштаб 1,0.Я хочу увеличить его, скажем, до 2.0.

Ответы [ 3 ]

5 голосов
/ 09 января 2012

Я не математик, поэтому я собираюсь использовать самую основную терминологию, которую я знаю, как объяснить процедуру. Вы можете даже найти простоту терминологии, которую я использую, проще для понимания, чем математический «жаргон»

Вам необходимо использовать номинальные центральные точки всех объектов в формации, чтобы определить точное Центр формации (это, конечно, 3D-вектор, состоящий из значений X, Y и Z) ...

Всего объектов = Общее количество объектов в вашей "формации"

  • Цикл по всем объектам в вашей формации
    • Для каждого объекта (для расчета Итого по оси )
      • Сложить координаты X вместе (дает нам Итого по оси X )
      • Сложить координаты Y вместе (дает нам Итого по оси Y )
      • Сложить координаты Z вместе (дает нам Общая ось Z )
    • Для каждой Итого по оси по оси (для расчета Центр формирования )
      • Центр формирования X = Общая ось X , деленная на Общая сумма объекта
      • Центр формирования Y = Общая ось Y , деленная на Общая сумма объекта
      • Центр формирования Z = Общая ось Z , разделенная на Общая сумма объекта

Три значения, которые у вас теперь есть, составляют Центр формирования (как трехмерный вектор).

ПРИМЕЧАНИЕ : Если вы размещаете свои объекты на основе заранее определенной фиксированной точки в трехмерном пространстве (например, 0, 0, 0), вам не нужно выполнять вышеуказанные вычисления , поскольку ваш Центр формирования будет этой фиксированной точкой.

  • за каждый объект
    • Рассчитать Расстояние каждой оси ( Расстояние X , Расстояние Y и Расстояние Z ) Центра объектов от соответствующей оси Центр формирования ...
      • Расстояние X = Центр формирования X - Положение объекта X
      • Расстояние Y = Центр формирования Y - Положение объекта Y
      • Расстояние Z = Центр формирования Z - Положение объекта Z
    • Масштабирование объекта по вашему желанию Коэффициент масштабирования
    • Установите значения X, Y и Z Position на их текущее значение плюс значение расстояния той же оси, умноженное на шкалу ...
      • Положение X = Положение X + ( Расстояние X * Коэффициент масштабирования )
      • Положение Y = Положение Y + ( Расстояние Y * Коэффициент масштабирования )
      • Позиция Z = Позиция Z + ( Расстояние Z * Коэффициент масштабирования )

Если вы сделали это правильно, ваши объекты теперь масштабированы, все еще сохраняют свое формирование, но сместились относительно Центра Формирования и Коэффициент масштабирования . Проще говоря: окклюзия между этими объектами больше не может происходить, поскольку их Позиции масштабируются вместе с их Размерами .

1 голос
/ 09 января 2012

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

  1. Масштаб нужного вам размера объекта.
  2. Поверните объекта, который будет ориентирован натак, как вы хотите.
  3. Переведите объект, чтобы быть там, где вы хотите.

Все эти преобразования происходят относительно «корневой точки» объекта иих порядок имеет большое значение.Если вы переводите, а затем масштабируете или поворачиваете, масштабирование и поворот будут происходить относительно вновь переведенного центра.

Итак, если вы разместили объекты в комнате, и [0,0,0] вашей системы координат окажется в центре комнаты, если вы масштабируете всетрансформированные точки этих объектов, все они будут расти / уменьшаться и выталкиваться наружу / внутрь от [0,0,0] .Поскольку это не то, что вам нужно, вы должны сначала изменить источник, переместив объект, затем масштабировать, а затем изменить источник на то место, где он был.

Если у меня есть две точки: [3,0, 0] и [4,0,0] , и я хочу масштабировать их так, чтобы расстояние между ними составляло 2 вместо 1 ,если я просто умножу (масштабирую) на 2 , я получу [6,0,0] и [8,0,0] .Сейчас между ними расстояние 2 , но они оба двинулись.Если я хочу, чтобы первая точка оставалась на месте, тогда я сначала перевожу на [- 3,0,0] , затем масштабируюсь на 2 , затем я перевожу на [3,0,0] и у меня есть то, что я хотел.Если вместо этого я хочу, чтобы центр этих двух точек оставался неизменным, я перевожу на [(+/-) 3,5,0,0] .

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

1 голос
/ 09 января 2012

Если я правильно понял ваш вопрос, вы должны выбрать центр c вашего действия масштаба, а затем получить положение вашего объекта относительно этого центра (давайте назовем один из этих относительных векторов v).Теперь масштабируйте эти векторы с коэффициентом (например, v = v * factor) и перемещайте объекты на их новые позиции.(position = c + v) После этого просто масштабируйте сами объекты с их собственной позицией в качестве масштаба-центра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...