Риг с зависимостями |
Home· Статьи · Вакансии · Чертежи · 3D Галерея · 2D Галерея · Форум · Форум Realtime | Реклама |  Конкурсы | RAR Award | Правила |
Здравствуйте, гость ( Вход | Регистрация )
Риг с зависимостями |
14/04/2018, 01:11
Сообщение
#1
|
|
уже всё сделал Группа: Пользователи Сообщений: 2 456 Регистрация: 01/06/2005 Из: z3л3№гр@d Пользователь №: 13 838 |
Есть тележка и она через path constraint или еще как-то анимирована
Есть зависимые от нее колеса, которые движутся по какому-то пути, но так, что от оси колеса до тележки всегда +- какое-то конкретное расстояние. Это как-то делается без хитрых скрипт контроллеров? |
|
|
14/04/2018, 23:37
Сообщение
#2
|
|
MaxMan Группа: Пользователи Сообщений: 153 Регистрация: 14/08/2015 Пользователь №: 109 394 |
Добавляем модификатор Extrude к неровному пути.
В Script контролере используем функцию intersectRay. Пример: |
|
|
15/04/2018, 00:45
Сообщение
#3
|
|
уже всё сделал Группа: Пользователи Сообщений: 2 456 Регистрация: 01/06/2005 Из: z3л3№гр@d Пользователь №: 13 838 |
Сорри, видимо я криво объяснил.
Это первое, что я попробовал, но так не выйдет, поскольку, если расстояние от тележки до оси колеса станет меньше допустимого, то колесо должно продвинуться вперед тележки или назад, чтобы компенсировать разницу. Картинкой наверное будет понятнее Тележка едет по своему зеленому пути, колеса, закрепленные на синих подвесках по черному пути. Подвески несжимаемы, но вращаются. Я не смог ничего умнее придумать нежели мелкими шагами вперед/назад менять процент path_constraint колеса пока расстояние от крепления подвески до оси колеса не станет равным длине подвески. |
|
|
15/04/2018, 22:26
Сообщение
#4
|
|
MaxMan Группа: Пользователи Сообщений: 153 Регистрация: 14/08/2015 Пользователь №: 109 394 |
Можно попробовать использовать функцию, которая находит пересечения отрезка и сферы.
Отрезок это часть-отрезок сплайна. Сплайн должен быть замкнутым. Центр сферы это крепление подвески $Point1. Радиус сферы равен длине подвески. $Point2 используется, когда нет пересечений. Для левого колеса используем код t1.x>0, а для правого t1.x<0 Пример: Код fn sphere_segment_intersect c r o t=
( roots_a=#(); sp_dir=normalize(t-o) det=(dot sp_dir (o-c))*(dot sp_dir (o-c))- dot (o-c) (o-c)+r*r if(det>=0)then ( d1=-(dot sp_dir (o-c))+pow det 0.5; d2=-(dot sp_dir (o-c))-pow det 0.5 p1=o+d1*sp_dir; p2=o+d2*sp_dir if(dot sp_dir (p1-o)>0 and length (p1-o) < length (t-o))then append roots_a p1 if(dot sp_dir (p2-o)>0 and length (p2-o) < length (t-o))then append roots_a p2 )--if(det>=0)then roots_a )--fn sphere_segment_intersect c r o t= point_need=undefined; with animate off ( igorznag_spline_path=$spline len=curveLength igorznag_spline_path 1 if(len>0)then ( seg_points=#();n=numSegments igorznag_spline_path 1 for i=1 to n do for j=0 to igorznag_spline_path.steps do ( p0=getKnotPoint igorznag_spline_path 1 i; p1=getOutVec igorznag_spline_path 1 i;p2=undefined;p3=undefined if i==n then (p2=getInVec igorznag_spline_path 1 1;p3=getKnotPoint igorznag_spline_path 1 1) else (p2=getInVec igorznag_spline_path 1 (i+1);p3=getKnotPoint igorznag_spline_path 1 (i+1)) t=1.0*j/(igorznag_spline_path.steps+1) p=(1-t)*(1-t)*(1-t)*p0+3*t*(t-1)*(t-1)*p1+3*t*t*(1-t)*p2+t*t*t*p3; append seg_points p )--for i=1 to n do for j=0 to igorznag_spline_path.steps do n=seg_points.count; points_intersect=#() for i=1 to n do ( c=$Point1.pos; r=length($Point2.pos-$Point1.pos) o=seg_points[i]; t=undefined; if i<n then t=seg_points[i+1] else t=seg_points[1] roots=sphere_segment_intersect c r o t if roots.count>0 do ( if roots.count==1 do append points_intersect roots[1] if roots.count==2 do (append points_intersect roots[1]; append points_intersect roots[2]) )--if roots.count>0 to )--for i=1 to seg_points.count do if points_intersect.count>0 do ( if points_intersect.count==1 do ( p1=points_intersect[1]; t1=p1*(inverse $Point1.transform); if t1.x>0 then point_need=points_intersect[1] else point_need=$Point2.pos )--if points_intersect.count==1 do if points_intersect.count==2 do ( p1=points_intersect[1]; p2=points_intersect[2] t1=p1*(inverse $Point1.transform); t2=p2*( inverse $Point1.transform) if t1.x>0 do point_need=p1; if t2.x>0 do point_need=p2 )--if points_intersect.count==2 do )--if points_intersect.count>0 do if point_need==undefined do point_need=$Point2.pos )--if(len>0)then )--with animate off point_need |
|
|
16/04/2018, 05:51
Сообщение
#5
|
|
психомазохист Группа: Пользователи Сообщений: 4 418 Регистрация: 16/10/2012 Из: Восточная Африка - Маисовое поле Пользователь №: 86 591 |
WOW!
|
|
|
16/04/2018, 09:42
Сообщение
#6
|
|
уже всё сделал Группа: Пользователи Сообщений: 2 456 Регистрация: 01/06/2005 Из: z3л3№гр@d Пользователь №: 13 838 |
Да, все сложно.
|
|
|
Bots |
Системное сообщение
|
|
|
|
|
Текстовая версия | Сейчас: 18/04/2024 - 09:01 |