Чтобы действительно ответить на этот вопрос, нам все еще нужно немного больше информации о формате ваших данных и о том, как вы применяете преобразования.Но вот предположение: ваши объекты, скорее всего, представлены в виде набора полигонов, которые сами представлены в виде набора точек относительно некоторой «корневой точки», такой как центр объекта или нижний угол.Когда вы размещаете объект где-то, например в комнате, вы можете сделать это, применяя последовательность умножений матриц к точкам, которые представляют объект.Умножение одной матрицы обычно может выполнять все преобразование, но для нас это имеет больше смысла, если мы составим последовательность преобразований, которые делают интуитивные вещи.Например, вы обычно
- Масштаб нужного вам размера объекта.
- Поверните объекта, который будет ориентирован натак, как вы хотите.
- Переведите объект, чтобы быть там, где вы хотите.
Все эти преобразования происходят относительно «корневой точки» объекта иих порядок имеет большое значение.Если вы переводите, а затем масштабируете или поворачиваете, масштабирование и поворот будут происходить относительно вновь переведенного центра.
Итак, если вы разместили объекты в комнате, и [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] .
Вам решать, какие точки объектов не должны двигаться.Затем вы перемещаете эту точку в начало координат до масштабирования.Затем вы перемещаете его обратно потом.Поскольку вы не хотите, чтобы ваши объекты проталкивались через пол, вы, вероятно, выберете точку на земле (или на любой поверхности, к которой они прикреплены).Если один объект лежит на другом (книги на столе), то эти объекты, вероятно, должны использовать одну и ту же контрольную точку.