Как получить 6 позиций (x, y, z), чтобы они образовывали круг вокруг пользовательской позиции, ориентированной от начала координат? - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь закодировать трехмерную модель древовидной структуры в Unity. Идея состоит в том, чтобы иметь полностью генеративное стилизованное дерево для проекта AR, над которым я работаю. Как только вершины для основного ствола созданы, мне нужно нарисовать вершины почти перпендикулярно ему в определенных точках, у меня есть первые точки, нарисованные в правильном положении, но ориентация неправильная.

Пока у меня есть вершины, нарисованные в правильном положении, используя:

     float nrad = (float)nodule_vertices / nbSides * _2pi;
     Vector3 GOpos = new Vector3(pos.x + Mathf.Cos(nrad) * bottomRadius * 0.8f, pos.y + Mathf.Cos(nrad) * bottomRadius * 0.8f, pos.z + Mathf.Sin(nrad) * bottomRadius * 0.8f);

Однако, это просто дает мне перекос вершин вокруг заданной позиции, не в правильной ориентации.

Вершины, представленные сферами

Я поместил несколько сфер, чтобы показать вершины, мне нужно исправить ориентацию этой группы.

Я пытаюсь добиться того, чтобы круг вершин располагался под прямым углом к ​​основному стволу.

1 Ответ

0 голосов
/ 29 марта 2019

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

Предполагая, что основной ствол укоренен в центре мира (0,0,0), чем ближе вершина к оси, тем больше деформаций она должна пройти вдоль этой оси. Так, например, круг с центральной точкой, где X равен 0, должен иметь максимальную деформацию вдоль оси X и минимальную деформацию вдоль оси Z. Однако, если центральная точка находится в самой дальней точке от центра ствола (X является радиусом ствола), она должна получить минимальную деформацию вдоль оси X и максимальную вдоль Z.

Для этого я использовал Mathf.InverseLerp, чтобы назначить процент модификации по оси X и Z отдельно.

Следующий код все еще нуждается в некоторой очистке, но приближает нас.

Vector3 GOpos = new Vector3(Mathf.Clamp(pos.x + Mathf.Sin(nrad)*Mathf.InverseLerp(bottomRadius, 0.0f, Mathf.Abs(pos.x)), pos.x-bottomRadius/2, pos.x+bottomRadius/2), pos.y + Mathf.Cos(nrad) * bottomRadius, Mathf.Clamp(pos.z + Mathf.Sin(nrad) * Mathf.InverseLerp(bottomRadius, 0.0f, Mathf.Abs(pos.z)), pos.z-bottomRadius/2, pos.z+bottomRadius/2));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...