C # / Unity: вращающиеся треугольники в трехмерном пространстве для формирования двухмерного многоугольника - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть несколько треугольников в трехмерном пространстве, которые берут начало от 0,0,0 и тянутся к двум точкам p1 = -x0, 0, z0 и p2 = + x0, 0, z0.Это в Unity, так что + z - это передняя ось (т.е. они лежат ровно).Каждый треугольник - это своя сетка, точка поворота - 0,0,0.

Теперь я хотел бы повернуть их (используя Quaternion.LookRotation) так, чтобы их концы образовывали непрерывный многоугольник, в случае трех треугольников.треугольник, в случае четырех треугольников квадрат и т. д.

Мой подход состоит в том, чтобы рассчитать радиус вогнутости получающегося многоугольника на основе длины каждого треугольника (который равен 2 * x0).Если я теперь вычислю n точек на этом круге (где n - количество треугольников, которые у меня есть), я получу координаты x / y, которые я могу напрямую использовать для правильной установки оси «вверх» каждого треугольника, то есть Quaternion.LookRotation(Vector3.forward, new Vector3(x,y,0)).Это правильно ориентирует треугольник вокруг оси z, то есть центр по-прежнему находится на 0,0,1.

Однако, и это поставило меня в тупик, мне все еще нужно изменить переднюю ось треугольников так, чтобы онинаклон, чтобы сформировать окончательный многоугольник.Я попытался использовать новый Vector3(x,y,z0), который дает почти правильный результат, но приводит к перекрытию по краям.Я подозреваю, что это как-то связано с тем, что вращение треугольников эффективно меняет z0, но я не уверен, как действовать.

Мой вопрос заключается в том, как рассчитать новую прямую ось так, чтобы треугольники правильно совмещались

1 Ответ

0 голосов
/ 29 ноября 2018

Проблема заключается в установке передней оси на (x,y,z0), что неправильно, поскольку длина вектора (x,y,z0) не равна исходной длине (которая равна просто z0).Таким образом, значение z необходимо отрегулировать так, чтобы new Vector(x,y,z1).magnitude == z0.Это можно сделать, рассчитав

Mathf.Sqrt(Mathf.Pow(z0, 2) - Mathf.Pow(x, 2) - Mathf.Pow(y, 2))

Проблема решена.

...