Unity / C# - Существующий API для применения 3D вращений? - PullRequest
1 голос
/ 14 марта 2020

Я хочу, чтобы процедурно генерировать сетки. Я создал метод для предоставления вершин круга. Идея состоит в том, что он создает фигуру в 2d, а затем поворачивает ее в 3d, предполагая, что «вращение» является вектором нормальной оси фигур.

 public List<Vector3> Loop (Vector3 center, Vector3 rotation, float radius, int divisions)
 {
     List<Vector3> loop = new List<Vector3>();
     for(int p = 0; p < divisions; p++)
     {
         float u = (float)Math.Cos(2 * Math.PI * p / divisions) * radius;
         float v = (float)Math.Sin(2 * Math.PI * p / divisions) * radius;
         float x = 0;
         float y = 0;
         float z = 0;
         // Apply rotation to u & v to get x, y, z
         loop.Add(new Vector3(x, y, z));
     }
     return loop;
 }

Создание круга в 2d (u & v) было Это очень просто, но когда я посмотрел на применение трехмерных вращений, мне показалось, что это совершенно незаметная кроличья нора.

Есть ли способ использовать существующий API для этого?

1 Ответ

0 голосов
/ 14 марта 2020

Я бы передал параметр оси, вокруг которого вы вращаете rotation, затем использовал бы Скрещенные произведения, чтобы найти направление "вверх" для "вперед", которое является нормалью окружности.

Использование Quaternion.LookRotation, затем Quaternion * Vector3, чтобы применить вращение к позиции:

public List<Vector3> Loop (Vector3 center, Vector3 rotation, Vector3 axis, float radius, int divisions)
 {
     List<Vector3> loop = new List<Vector3>();
     for(int p = 0; p < divisions; p++)
     {
         float u = (float)Math.Cos(2 * Math.PI * p / divisions) * radius;
         float v = (float)Math.Sin(2 * Math.PI * p / divisions) * radius;
         Vector3 fromPosition = new Vector3(u, v, 0f);

         Vector3 up = Vector3.Cross(rotation.normalized, axis.normalized);

         Quaternion rot = Quaternion.LookRotation(rotation, up);
         loop.Add(rot * fromPosition);
     }
     return loop;
 }

Так что вы можете сделать что-то вроде: List<Vector3> res = Loop(Vector3.zero, Vector3.up, Vector3.right, 10f, 20);

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