Нахождение конечной позиции из исходной позиции + смещение и поворот - PullRequest
0 голосов
/ 22 сентября 2019

Моя строительная система почти готова;проблема в том, что когда я отладил свой Physics.OverlapBox(), используя Gizmos.DrawWireCube() с кодом, показанным ниже:

void OnGizmosDraw()
{
     Gizmos.matrix = Matrix4x4.TRS(transform.position + boundingOffset, transform.rotation, boundingExtents);
     Gizmos.DrawWireCube(Vector3.zero, Vector3.one);
}

я увидел проблему, но я покажу ее на изображении, так как я как быизо всех сил пытается объяснить.

enter image description here

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

enter image description here

Возможно, это тригонометрический расчет.Я надеюсь, вы могли бы найти, как это сделать.

Заранее спасибо.

1 Ответ

0 голосов
/ 23 сентября 2019

Хорошо, если я вас правильно понял, на этот раз проблема в том, что ваше смещение работает до тех пор, пока преобразование не масштабировано и не повернуто.

Причина в том, что

transform.position + boundingOffset

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

Скорее всего, вам нужно смещение относительно положения и масштаба transform.Вы можете преобразовать boundingOffset в локальные координаты относительно преобразования, используя TransformPoint

Преобразование position из локального пространства в мировое пространство.

Так что вместо этого используйте

Collider[] colliders = Physics.OverlapBox(transform.TransformPoint(boundingOffset), boundingExtents / 2, blueprint.transform.rotation);

В основном это

transform.position 
    + transform.right * boundingOffset.x * transform.lossyScale.x 
    + transform.up * boundingOffset.y * transform.lossyScale.y
    + transform.forward * boundingOffset.z * transform.lossyScale.z;

В качестве альтернативы

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

Тогда в коде я просто сделаю

[SerializeField] private Transform boundingOffsetPivot;

...

Collider[] colliders = Physics.OverlapBox(boundingOffsetPivot.position, boundingExtents / 2, blueprint.transform.rotation);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...