Рассчитайте верхний левый и правый нижний угол прямоугольника, направления и размера. - PullRequest
0 голосов
/ 20 октября 2011

Я провел поиск по этому вопросу, но не нашел вопрос, который вполне соответствовал бы тому, что я преследовал.Я хочу, чтобы пользователь мог определять текстурированную плоскость.У меня есть следующие параметры:

  • Размер (Вектор 2)
  • Направление (Вектор 3)
  • Источник (Вектор 3)

Итак, я хочу иметь возможность рассчитать 4 вершины прямоугольника с учетом вышеуказанной информации.Итак, если бы я хотел, чтобы плоскость была обращена вверх, с шириной и высотой 1000:

  • Размер = (1000, 1000)
  • Направление = 0, 1, 0 (вверх)
  • Origin = 0, 0, 0

Таким образом, это определило бы плоскость на оси X & Z, обращенную вверх.Что я не понимаю, так это как рассчитать 4 угла в трехмерном пространстве с учетом этой информации.Нужна ли мне дополнительная информация или есть лучший способ произвольно указать плоскость?

Редактировать: текущий код

В следующем коде:

  • Размер = 10000, 10000
  • Центр = 0, 0, 0
  • Normal = 0, 1, 0

            Vector3 arb = new Vector3(1, 1, 1);
            Vector3 planeY = Vector3.Normalize(Vector3.Cross(Normal, arb));
            Vector3 planeX = Vector3.Normalize(Vector3.Cross(Normal, planeY));
    
            planeX *= Size.X / 2;
            planeY *= Size.Y / 2;
    
            Vector3[] ret =  new Vector3[4] 
            {
                (Center - planeX - planeY),
                (Center - planeX + planeY),
                (Center + planeX - planeY),
                (Center + planeX + planeY)
            };
    

Ответы [ 2 ]

1 голос
/ 20 октября 2011

Ваш самолет еще не полностью определен. Вам нужен еще один вектор, идущий вдоль плоскости, так называемый касательный вектор. В приведенном выше примере, куда должна указывать ось Y текстуры? Вдоль оси X, вдоль оси Z? Или, может быть, совершенно другая пользовательская ось? Ваш касательный вектор - это вектор, который должен указывать в общем направлении, куда должна идти ось X плоскости.

Допустим, у нас также есть касательный вектор, он не обязательно должен указывать вдоль плоскости. Вы можете построить плоскость следующим образом:

        Vector3[] vertices(Vector2 size, Vector3 center, Vector3 normal, Vector3 tangent)
    {
        Vector3 planeY = Vector3.Normalize(Vector3.Cross(normal, tangent));
        Vector3 planeX = Vector3.Normalize(Vector3.Cross(normal, planeY));

        planeX *= size.X / 2;
        planeY *= size.Y / 2;

        vertices = new Vector3[]
        {
            (center - planeX - planeY),
            (center - planeX + planeY),
            (center + planeX - planeY),
            (center + planeX + planeY),
        };
        return vertices;
    }

planeX и planeY - нормализованные векторы, которые указывают вдоль осей X и Y самой плоскости. Умножив их на размер / 2, мы получим 2 вектора, которые простираются от центра до края плоскости в направлениях X и Y. Сложив эти два вместе по-разному, мы получим четыре угла.

Вот диаграмма, чтобы вы могли получить лучшую картинку в вашей голове. Вектор касательной T"сплющен" на оси X. Diagram

1 голос
/ 20 октября 2011

Это хорошо для определения плоскости: у вас есть точка и вектор нормали. Вам нужно получить два вектора (A & B) на плоскости и добавить один (A * одно из значений размера) в начало координат, чтобы получить второй угол. Добавьте второй вектор (B * другое значение размера), чтобы получить третий угол, и добавьте оба вектора * их соответствующие значения размера в начало координат, чтобы получить четвертый угол.

Чтобы получить первый вектор, вычислите перекрестное произведение вектора нормали (Направление) с произвольным вектором (не равным направлению). Это даст вам вектор А. Чтобы получить вектор В, рассчитайте перекрестное произведение А и Направления.

...