Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.07.2015, 11:12   #1
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию Морфинг или интерполяция?

Здравствуйте.
Интересует вот такой вопрос. Допустим есть прямая которую мне нужно отредактировать.
То есть тяну за точку и вся линия должна изменятся плавно.
На первый взгляд вроде бы можно положения точек по некоторой функции чтобы получилось как на рисунке:

Причем также не совсем понятно как определять края этой функции если линия допустим очень длинная или вообще кривая.

Ну это предисловие. Собственно нужно сделать такой же алгоритм но для 3Д тела. Чтобы можно было например выбелить контур окружности и сжать. Но чтобы близлежащие точки также плавно сходились в конус. Типа из шарика сделать песочные часы путем сжимания экватора.

Подобный механизм еще используют в играх при создании персов. Можно сделать толстым или тощим.

Так вот подскажите пожалуйста что за алгоритм используется для такого плавного изменения?
Есть где нибудь исходники или хотя бы толковое и понятное описание?
Изображения
Тип файла: png Безымянный.png (4.6 Кб, 197 просмотров)
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.

Последний раз редактировалось WorldMaster; 31.07.2015 в 11:14.
WorldMaster вне форума Ответить с цитированием
Старый 31.07.2015, 12:12   #2
Akeloya
Форумчанин
 
Регистрация: 27.01.2014
Сообщений: 115
По умолчанию

Кажется, это делается сплайнами.
http://3deasy.ru/3dmax_uroki/splines.php
https://ru.wikipedia.org/wiki/B-%D1%...B0%D0%B9%D0%BD
https://ru.wikipedia.org/wiki/%D0%9A...B0%D0%B9%D0%BD

библиотека сплайнов
http://alglib.sources.ru/interpolation/spline3.php
Akeloya вне форума Ответить с цитированием
Старый 31.07.2015, 12:22   #3
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от Akeloya Посмотреть сообщение
Ну да .. я с ними работал.. но конкретно тут то как использовать?
В 3D модели точки разбросаны в хаотичном порядке ... Из них прямую не построить ...
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 31.07.2015, 13:10   #4
Akeloya
Форумчанин
 
Регистрация: 27.01.2014
Сообщений: 115
По умолчанию

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

В целом, логика изменения криволинейной поверхности ничем не отличается от логики изменения линии - вы берете точку, тянете ее, а все остальные точки изменяются относительно близости к изменяемой.

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

Всё остальное - это непосредственно то, как вы сами хотите видеть изменения. Поищите машинную графику, имхо, так просто готовые алгоритмы трехмерных преобразований наподобие 3dmax найти не просто.
Akeloya вне форума Ответить с цитированием
Старый 31.07.2015, 13:26   #5
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от Akeloya Посмотреть сообщение
В целом, логика изменения криволинейной поверхности ничем не отличается от логики изменения линии - вы берете точку, тянете ее, а все остальные точки изменяются относительно близости к изменяемой.

Криволинейная поверхность как правило строится триангуляцией, значит при изменении одной точки вы будете изменять другие точки треугольника - они являются смежными с изменяемой точкой.
Все правильно .. берем точку и тянем.. но если бы это была прямая то в целом проще .. а с триангуляцией точки не составляют прямой . .как к ним применить тот же сплайн не ясно.

Просто я подумал что ктото сталкивался в жизни с подобными задачками. И наверняка где то есть решение ..
Я даже не могу правильно сформулировать что гуглить .. как фразу строить ..
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 31.07.2015, 14:27   #6
Akeloya
Форумчанин
 
Регистрация: 27.01.2014
Сообщений: 115
По умолчанию

Смотрите, у вас есть точка, которую вы тяните, а есть точки, которые вы изменяете.
Вспоминаем постулат Через две точки можно провести прямую. Вот вам ваш же рисунок, который вы показали в первом посте.

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

Теперь смотрите, основных преобразований всего три:
перенос
растяжение
поворот
Алгоритмы стандартные.
Нестандартные алгоритмы - вытяжение относительно точки. Но сама точка изменяется таки стандартным переносом. Сглаживание можете реализовать как я писал выше - взять точку переноса, взять вторую, построить плоскость, в которой будет ваша прямая сглаживания и вычислить сглаженные координаты для второй точки.
Либо, выбрать некоторое количество плоскостей сглаживания, в которых будет находиться точка, за которую вы тяните, а все остальные спроецировать на эти плоскости в которых произвести преобразования, а затем восстановить точки в пространстве. Но это на мой взгляд сложнее.
Akeloya вне форума Ответить с цитированием
Старый 31.07.2015, 18:11   #7
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от Akeloya Посмотреть сообщение
Нестандартные алгоритмы - вытяжение относительно точки. Но сама точка изменяется таки стандартным переносом. Сглаживание можете реализовать как я писал выше - взять точку переноса, взять вторую, построить плоскость, в которой будет ваша прямая сглаживания и вычислить сглаженные координаты для второй точки.
Либо, выбрать некоторое количество плоскостей сглаживания, в которых будет находиться точка, за которую вы тяните, а все остальные спроецировать на эти плоскости в которых произвести преобразования, а затем восстановить точки в пространстве. Но это на мой взгляд сложнее.
Странно ... неужели это такой сверхсекретный алгоритм?? или настолько простой что никто не хочет нигде писать про это ... Так то понятно что можно выдумать свой алгоритм, но на это же уйдет масса времени..
Я расстроен ...
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 31.07.2015, 22:26   #8
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
По умолчанию

Мне кажется "основные преобразования" тут не при чём...

В 3д вы тянете не одну из хаотичных точек, а часть поверхности одного из объектов за одну (кстати или несколько) его точек. Вслед тянутся грубо говоря соседние точки поверхности.
Сейчас не вспомню и названий алгоритмов. Попробую поискать.
ResourceSpace вне форума Ответить с цитированием
Старый 31.07.2015, 22:35   #9
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

В общем посмотрел как работает блендер. Можно пошукать в исходника блендера функции но лень .. пришла такая идея.
Задать функцию сглаживания. например кубический корень или линейную или параболическую.
Далее задать радиус действия. и затем просто по формуле функции выстраивать множество окружностей начиная от вершины за которую тянем и заканчивая точками, расположенными не далее радиуса действия ... дальше подтягивать точки до этих окружностей.

Наверное вместо окружностей можно найти формулу поверхности в основе которой парабола например .. как фигура вращения... и там вообще просто. Найти проекции точек на эту поверхность.

Возможно что это не самый оптимальный вариант .. но именно эту суть я увидел в работе майя и блендера.

Попробую на днях сделать это на простейшей плоскости и там дальше и до криволинейных объектов доберемся..

Как считаете правильное направление?
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 31.07.2015, 23:34   #10
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
По умолчанию

Пока я не вспомнил как эта штука называлась и где я её читал - попробовать стоит.
В блендере вроде это задавалось кривой Безье в параметрах.
ResourceSpace вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
“Кусочно-линейная и квадратичная интерполяция. Глобальная интерполяция ”. KennyMc Помощь студентам 0 17.04.2012 16:48
Разработать программу “Кусочно-линейная и квадратичная интерполяция. Глобальная интерполяция ”. KennyMc Помощь студентам 0 10.04.2012 16:41
На C++ Разработать программу “Кусочно-линейная и квадратичная интерполяция. Глобальная интерполяция”. KennyMc Помощь студентам 0 26.02.2012 12:08
Морфинг двух изображений. meta Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 04.12.2011 18:08
Интерполяция изображений(Сплайн интерполяция)?????) Danyla Помощь студентам 0 13.04.2010 09:08