SoftimageRu Форум -> Edge Slide

Новости • Форум • Помощь • Поиск • Участники • Календарь • База


Страницы: (5) [1] 2 3 ... Последняя »  ( Перейти к первому непрочитанному сообщению ) Ответ в темуОтвет      Создание новой темыНовая тема   

> Edge Slide, алгоритм ?   
Bravlin Pechatnik
Профиль
Статус: слон
Группа: Артисты
Рейтинг: 2
Привет.
Появилась задачка реализовать с помощью C++ алгоритм EdgeSlide.
А если быть точнее то алгоритм майского DuplicateEdge который по сути делает всё
то же самое , только смещает не один ейдж-сегмент а два, и не в одну и ту же
сторону а в противоположенные.

(IMG:http://i.imgur.com/8Z5HFYT.gif)

Соответственно как я это вижу:
01.
Для каждого исходного вертекса берём нужных соседей (не входящих в исходный селект) и рассчитываем вектора направлений.
Далее собираем инстанс для исходного вертекса:
- Индекс исх. вертекса.
- Координаты исх. вертекса.
- Координаты правого соседнего вертекса.
- Координаты левого соседнего вертекса.
02.
Далее проходимся по всем инстансам (исх.вертексам) и для каждого рассчитываем 2 вектора направления:
<вектор направления> = <правый соседний вертекс> - <исх. вертекс>
<вектор направления> = <левый соседний вертекс> - <исх. вертекс>
03.
Теперь через любой механизм по вкусу получаем от пользователя значение
параметра на которое нам нужно "раздвинуть" ейджи.
04.
Получаем точку в направлении <вектора направления> от <исх. вертекса>
сдвинутую на величину параметра полученого от пользователя.
05.
Отрисовываем там через OGL примитивы замену дейтсвительных ейджей до тех пор
пока пользователь не отпустит кл. мыши после чего на последние координаты
добавляем вертексы и соединяем их ейджами.

Так вот.
Меня смущает производительность такого подхода, т.к. он однопоточный.
Также хочется услышать ваши соображения по алгоритму.
Наверняка есть подводные камни или возможность сделать лучше или проще.
Так же смущает вопрос сохранения исходного селекта т.к. мы добавляем новые вертексы и новые
ейджи (хотя возможно это и не актуально т.к. мы не удаляем имеющиеся компоненты),
могут ли изменится индексы у исходных вертексов или ейджей.
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 20.09.2015 - 14:39 Top
Angel 07
Профиль
Статус: слон
Группа: Артисты
Рейтинг: 7
Вроде индексы не меняются. Подход нормальный, однопоточность тут ничего не значит, так как никаких вычислений и перебора не делается.
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 20.09.2015 - 17:33 Top
Bravlin Pechatnik
Профиль
Статус: слон
Группа: Артисты
Рейтинг: 2
Столкнулся с таким нюансом:
в C++ API насколько я вижу нет механизма добавляющего к имеющейся
геометрии вертексы и пр компоненты. Есть механизм полностью пересобирающий
или собирающий с нуля геометрию CMeshBuilder.
Но в таком случае разумеется поменяется уже гараздо больше индексов если не все.

Мне просто как-то кажется это странным что на уровне C++ нет таких команд,
и нужно использовать нативные команды XSI.
Tо-есть получается что мне в любом случае нужно собирать строку и запускать её через ExecuteCommand().
При этом многие команды будут применятся через операторы и соответственно ложится в стек.

Тотже например:
SplitEdge "cube.edge[6,8,9], cube.edge[1,3]", 69.242, False, True
создаст два Оператора в стеке и в случае если мы захотим его накручивать из C++
нам нужно будет задавать параметр не для одного оператора а для двух. То-есть
если таких сплитов у нас будет штук 20+ ... неудобно.

С др стороны конкретно в этой задаче нам изменять параметр не потребуется.
Т.к. добавлять геометрию мы будем в самом конце, но иметь по 20+ операторов в стеке не хотелось бы.
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 20.09.2015 - 20:50 Top
Mo...
Профиль
Статус: слон
Группа: Артисты
Рейтинг: 0
Поддерживаю, я сам задумывался о таком. Было бы круто, если можно было вставлять параллельные еджи в полигоне :mm:
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 24.09.2015 - 12:54 Top
maxFox
Профиль
Статус: нажиматель кнопок
Группа: Элита
Рейтинг: 17
Bravlin Pechatnik
свой алгоритм ты собираешься реализовывать через плагин-оператор, или созданием новой копии геометрии?
CMeshBuilder - служит для создания геометрии и в операторе не применяется.
А в операторе, да нужно заново пересобирать меш. т.е. ты получаеш на входе массив вертексов и массив описания полигонов. Массив вертексов можно просто увеличить и вернуть обратно, а вот массив полигонов придется пересобрать заново. Это фундаментальный закон АПИ в КСЕ и его не обойти.
А задача, в целом, довольно тривиальная. Думаю такое даже в айсе можно собрать.

п.с. извини если ошибся, но с твоими знаниями стоить вначале собрать просто какой нить деформер, прежде чем топо-модифер, да еще и по выделенным еджам :)
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователяICQ
Цитировать сообщение Дата 25.09.2015 - 12:59 Top
Bravlin Pechatnik
Профиль
Статус: слон
Группа: Артисты
Рейтинг: 2
мне бы какраз не хотелось прибегать к пересобиранию меша.
пока что смотрю в сторону SplitEdge и AddEdge операторов но по прежнему смущает вопрос с history и селектами.
думаю что для такой тривиальной задачки нет необходимости пересобирать меш.

по поводу "собрать деформер" здорово было бы отприпарировать уже имеющийся исходник.
так что если вдрук что-то есть на примете - подскажи плз.
единственное , мне пока попадались деформеры никак не взаимодействующие с селектами а зачастую попросту их обнуляющие.
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 26.09.2015 - 03:55 Top
maxFox
Профиль
Статус: нажиматель кнопок
Группа: Элита
Рейтинг: 17
Цитата
мне бы какраз не хотелось прибегать к пересобиранию меша.
пока что смотрю в сторону SplitEdge и AddEdge операторов но по прежнему смущает вопрос с history и селектами.
думаю что для такой тривиальной задачки нет необходимости пересобирать меш.

возможно я ошибаюсь, но скорее всего (99%) родные команды и операторы в КСИ построены на том же АПи, что и доступен программерам. по этому операции SplitEdge и AddEdge всё равно пересобирают меш - просто этого не видно
а по поводуhistory - можно просто фризить стек после каждой операции.

Цитата
по поводу "собрать деформер" здорово было бы отприпарировать уже имеющийся исходник.

конечно обучатся на готовом примере проще. Только у меня нет ничего простого под рукой. попробуй роуниш осиль. тут и селект есть и деформер классический.
Но всё же настоятельно рекомендую осилить хелп по СДК. там всё всеть. Просто нужно время, чтобы разобраться как и где искать. а копать чужой код я всегда считал делом наисложнейшим. И не забывать, что КСИ генерит начальную рыбу для плагина.
Login require!
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователяICQ
Цитировать сообщение Дата 26.09.2015 - 11:17 Top
Bravlin Pechatnik
Профиль
Статус: слон
Группа: Артисты
Рейтинг: 2
ООООО :clapping: Спасибо огромное !!! Раундишь. Давно хотел именно этот разобрать.
Если есть непростое кидай, я когда pm_quickExtrude разобрал много интересного узнал, за что огромное спасибо Петрику.
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 26.09.2015 - 12:22 Top
Gescort
Профиль
Статус: слон
Группа: Заслуженные артисты
Рейтинг: 3
maxFox, пока тут тема идет. А CMeshBuilder он чисто для вывода/создания нового меша? Просто я считал что он как раз для удобной сборки массива поинт позишенов и последовательности эйджей, а дальше его скармливать в выходной порт кастомного оператора. Детально не копал, поэтому сложилось такое мнение. А тут постом выше прочел «CMeshBuilder - служит для создания геометрии и в операторе не применяется»
Можно плиз пояснение, так сказать для внутреннего развития. Пока все больше на Питоне работается и здесь его нет, но вдруг конкретно на Си приспичит.
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 26.09.2015 - 15:58 Top
Angel 07
Профиль
Статус: слон
Группа: Артисты
Рейтинг: 7
Помнится в c++ операторе, который возвращал геометрию в виде выходного порта использовал метод класса PolygonMesh.Set(vertices, polygons). Ну то есть создается пустой PolygonMesh, а потом у него говорится, дескать, Set, и аргументами является массивы координат вершин и индексы вершин для формирования полигонов. C CMeshBuilder-ом тогда, кажется, ничего не вышло, но точно не помню.
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 26.09.2015 - 19:00 Top
maxFox
Профиль
Статус: нажиматель кнопок
Группа: Элита
Рейтинг: 17
CMeshBuilder не работает в стеке оператора. у оператора свои механизы создания, как и написал Angel 07.
но если нужно просто сгенерить меш, или импортнуть от куда то - то для этих целей он и хорош.
Да, в нем тоже есть механизм обновления меша, но и там вначале создаются все массивы данных и только после происходит генерация меша, так что никакого ускорения/оптимизации, он не даёт.
Gescort -а где ты читал по ""..его скармливать в выходной порт.."? Всё что я пишу было актуально 3 года назад. Но может уже всё грандиозно поменяли..
ахаха!))
сейчас почитал справку по кастом операторам и нашёл любопытное признание от разработчиков, в котором они пишут, про то что топо-операторы не поддерживаются в полном объеме, могут быть проблемы , и.т.п..... :) столько лет прошло - они признали - но не исправили.. в рот им ноги мля!

По справке CMeshBuilder я ничего нового не увидел. Зато увидел, что появилось возможность создавать кастом примитив. Так вот, даже там, несмотря на то что это новая фитча, создание геометрии происходит при помощи PolygonMesh и метода SET, в конечном итоге.

ребят. Продукт похоронили, так что ожидать что они там всё сладко намажут перед смертью, просто глупо.Можно только рассчитывать на АЙС, но и там свои ограничения. (это я в плане скорости)
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователяICQ
Цитировать сообщение Дата 27.09.2015 - 13:44 Top
Gescort
Профиль
Статус: слон
Группа: Заслуженные артисты
Рейтинг: 3
Цитата
Gescort -а где ты читал по ""..его скармливать в выходной порт.."?

Не читал, а считал. Просто как-то мнение такое сложилось не проверенное, вот и решил немного подраспросить (с операторами чувствую, что хромает матчасть). Сам тоже через Set делал, когда пробовал писать.
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 27.09.2015 - 23:29 Top
Bravlin Pechatnik
Профиль
Статус: слон
Группа: Артисты
Рейтинг: 2
Цитата
Продукт похоронили ...

sure, теперь это боевой undead :dirol:
Спасибо, maxFox что растолковал по билдеру.
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 28.09.2015 - 10:10 Top
Bravlin Pechatnik
Профиль
Статус: слон
Группа: Артисты
Рейтинг: 2
Такой вопрос:
У любого Custom Operator'a есть колбек _Update().
Можно ли как-то в этот колбек передать массивы посчитанные внутри Tool'a и его колбеков ?
У меня идёт ряд сортировок внутри Tool'a и хотелось бы не терять результаты этих сортировок, а передать их в Operator.
Но не очень понятно как Tool и Operator связаны.
В простейшем случае тул изменяет числовые значения заранее обьявленых в операторе параметров(Parameter).
Мне же требуется просто передать несколько переменных в Operator.

Я не очень понимаю как это сделать т.к зачастую Tool реализуется через класс
а Operator реализуется через колбек функции и не хочется обьявлять какие-то
глобальные переменные или структуры внутри плагина.

Например:
регистрируем myCommand, myTool, myOperator.
Прописываем в myTool Activate() колбек, вызов команды myCommand и передаём в
команду аргументы, а уже команда подключает myOperator, значения параметров
которого накручивает myTool.
Здесь не понятно как в myCommand передать struct или просто массив в качестве аргумента, а оттуда передать его в оператор.
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 9.12.2015 - 21:55 Top
Mr.Core
Профиль
Статус: -
Группа: Модераторы
Рейтинг: 17
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователя
Цитировать сообщение Дата 9.12.2015 - 22:51 Top
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Страницы: (5) [1] 2 3 ... Последняя » Ответ в темуОтвет      Создание новой темыНовая тема   

 

Текстовая версия