Перевернуть 3D объект вокруг точки / линии - PullRequest
0 голосов
/ 24 апреля 2020

Я делаю 3D монстра. Недавно я добавил функцию, позволяющую переворачивать детали по осям x и y, сама по себе она прекрасно работает, однако у меня также есть функция, которая позволяет пользователям комбинировать детали (устанавливает флаги, не объединяет меня sh), это означает, что простое переключение отдельных объектов не изменит «форму» объединенного объекта. У меня было две идеи, как это сделать, но это не сработало, и я перечислю их ниже. У меня есть доступ к происхождению объектов и центру масс всех объединенных экземпляров - точки 0, 0, 0 на теоретической числовой плоскости

В этих примерах мы переворачиваем ось y плоскость оси X = ширина, Y = высота, Z = глубина

Попытка # 1 - просто перевернуть шкалу X отдельного объекта, получить расстояние X от centreMass и взять его от centreMass для позиции, это работает, когда направление объекта (0, 0, 1) и правое (1, 0, 0) или (-1, 0, 0), в любом другом направлении X не является точным «влево / вправо» «объекта. Вот видео, чтобы уточнить: https://youtu.be/QXdEF4ScP10

код:

modelInstance[i].scale.x *= -1;
modelInstance[i].basePosition.set(centre.x - modelInstance[i].distFromCentre.x, modelInstance[I].basePosition.y, modelInstance[I].basePosition.z);
modelInstance[i].transform.set(modelInstance[i].basePosition, modelInstance[i].baseRotation, modelInstance[i].scale);

Попытка # 2 - Поверните объекты Y180 ° вокруг centreMass и затем переверните их значение z , Насколько я понимаю, это решение, но я не думаю, что смогу это сделать. Способ поворота объекта вокруг точки AFAIK состоит в том, чтобы преобразовать матрицу в точку, повернуть ее, а затем перевести обратно, что я не могу использовать. Благодаря способности вращать, объединять, переворачивать и масштабировать объекты, я держу вращение, положение и масштабирование совершенно отдельно, потому что возникают проблемы с масштабированием / вращением и перемещением. У меня есть Vector3 для положения, матрица для поворота и Vector3 для масштаба, всякий раз, когда я изменяю любой из них, я использую object.transform.set (position, matrix.getRotation (), scale); Поэтому, когда я пытаюсь сделать этот метод (перевод матрицы вращения в точку et c), объекты по отдельности переворачиваются, но остаются на том же месте, перевод матрицы преобразования объектов имеет странные результаты и не работает. Видео обоих вариантов: https://youtu.be/5xzTAHA1vCU

код:

modelInstance[i].scale.z *= -1;
modelInstance[i].baseRotationMatrix.translate(modelInstance[i].distFromCentre).rotate(Vector3.Y, 180).translate( modelInstance[i].distFromCentre.scl(-1));
modelInstance[i].transform.set(modelInstance[i].basePosition, modelInstance[i].baseRotation, modelInstance[i].scale);
...