Как повернуть Вектор3 размеров на Вектор3 углов? - PullRequest
0 голосов
/ 21 октября 2019

У меня есть вектор 3, в котором количество блоков в сетке находится вдоль каждой оси. Например, если бы один из этих векторов был (1, 2, 1), он был бы длиной 1 блок по оси x, длиной 2 блока по оси y и длиной один блок по оси z. У меня также есть Вектор 3 углов, которые обозначают повороты вдоль каждой оси. Например, если бы один из этих векторов был (90, 180, 0), то кусок повернулся бы на 90 градусов вокруг оси x, на 180 градусов вокруг оси y и на 0 градусов вокруг оси z. Чего я не могу понять, так это как повернуть размеры куска по его вектору углов поворота, чтобы я знал, какие точки в пространстве занимают.

public class Block
{
    private Vector3 localOrientation;
    private Vector3 dimensions;

    public Vector3 GetRotatedDimensions()
    {
         //your implementation here
    }
}

1 Ответ

0 голосов
/ 21 октября 2019

Если я правильно понимаю, в вашем вопросе что-то принципиально не так. Не может быть «повернутых размеров». Давайте используем прямоугольник, чтобы продемонстрировать это. (я не правильно понял)

Предположим, есть этот начальный прямоугольник:

Initial rectangle

и вы вращаете его. Вот что вы получите:

Rectangle after rotation

Используя один Vector2, вы не можете отличить «повернутый x * y прямоугольник» от «начального (х ') * (у') прямоугольник ". Чтобы в достаточной степени описать положение прямоугольника, вам нужно сохранить размер и вращение в переменной, описывающей блок.

Является ли x' и y' тем, что вы хотели знать? Я сомневаюсь в этом. О, да? Отлично!

В 3-х измерениях я бы определил то, что вы ищете, как

The minimum dimensions of a rectangular box that
1. has its faces parallel to the XY, XZ and YZ planes and
2. contains another rectangular box of known dimensions and orientation.

Возможно, есть более элегантные решения, но я бы сказал, что это просто:

  1. Создайте 8 объектов Vector3 (по одному на каждую вершину вашего блока),
  2. Поверните их все вокруг оси X.
  3. Поверните их (новые, которые выполучено от "2") вокруг оси Y.
  4. Поверните их (новые, которые вы получили от "3") вокруг оси Z.
  5. Найдите минимальное и максимальное значениякоординаты x, y и z между всеми вашими точками.
  6. Ваши новые измерения будут (x_max-x_min), (y_max-y_min), (z_max-z_min).

Я не уверен на 100% в этом, поэтому убедитесь, что вы проверили результаты!

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