Попытка деформировать любую сетку в сферу.Как перевести положение вершины, чтобы лежать на сфере? - PullRequest
1 голос
/ 22 апреля 2019

Я пытаюсь написать скрипт деформера для Maya, используя API Maya, который преобразует любую сетку в сферу, переводя ее вершины.

То, что у меня уже есть, - это деформер, который переводит каждую вершину меша в направлении его нормали с указанным количеством.Это делается с помощью приведенного ниже уравнения.

point += normals[itGeo.index()] * bulgeAmount * w * env;

Где точка - это вершина меша.normals [itGeo.index ()] - векторный массив, который представляет нормали каждой вершины.w и env должны управлять весами деформации и огибающей.

Этот код в основном делает то, что он переводит вершину в направлении нормали с указанным количеством.Хотя это работает для сферы, потому что нормали вершин сферы будут указывать на центр.Это не будет работать для других сеток, так как нормали не будут указывать на центр сетки.


    float bulgeAmount = data.inputValue(aBulgeAmount).asFloat();
    float env = data.inputValue(envelope).asFloat();
    MPoint point;
    float w;
    for (; !itGeo.isDone(); itGeo.next())
    {
        w = weightValue(data, geomIndex, itGeo.index());

        point = itGeo.position();

        point += normals[itGeo.index()] * bulgeAmount * w * env;

        itGeo.setPosition(point);
    }

Сначала я думал, что изменение направления перемещения решит проблему.Например, если мы сможем найти вектор в направлении от центра сетки к каждой вершине и перевести его вдоль этого направления для указанного количества, это решит проблему.Вот так:

point += (Center - point) * bulgeAmount * w * env;

Где, Центр - это центр сетки.Но это не дает желаемого результата.Я также хотел бы, чтобы деформатор был настроен таким образом, чтобы пользователь мог ввести значение радиуса "r", а также изменить атрибут количества с 0 на 1, чтобы деформировать сетку из ее исходного состояния в сферическое.Так что он может выбрать значение между ними, если ее желания и сетка будут чем-то между сферой и ее первоначальной формой.

Это мой самый первый пост в stackOverflow.Я извиняюсь, если формат не соответствует ожиданиям сообщества.Буду признателен за любую помощь в этом.

Спасибо.

1 Ответ

1 голос
/ 22 апреля 2019

О направлении:

Я думаю, что ваша линия: точка + = (центр - точка) * bulgeAmount * w * env;

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

Относительно вашего отклонения от 0,0 (оригинал) до 1,0 (сфера):

Если Po является исходной позицией
Если Pf - конечная позиция
Если d - исходное расстояние между точкой Po и центром C: d = норма (центр - точка) = норма (C-Po)
Если Направление (Центральная точка) / d (нормализовано, как описано выше)

Что мы хотим:
При r = 0.0 ваша вершина должна оставаться в исходном положении: Pf = Центр + Направление * d

При r = 1,0 ваша вершина должна придерживаться сферы радиуса R: Pf = Центр + Направление * R

А если обобщить:

Pf = C + Направление * (r * R + (1-r) * d)

С d = нормой (C-Po)
Направление = (C-Po) / d
R радиус вашей сферы
и r пользовательский параметр между [0.0; 1,0]

Не уверен, что я достаточно ясен, я не привык ни отвечать здесь :) Лучший

...