![]() |
Home· Статьи · Вакансии · Чертежи · 3D Галерея · 2D Галерея · Форум · Форум Realtime | Реклама |  Конкурсы | RAR Award | Правила |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#1
|
|
уже всё сделал ![]() Группа: Пользователи Сообщений: 2 279 Регистрация: 01/06/2005 Из: z3л3№гр@d Пользователь №: 13 838 ![]() |
Есть тележка и она через path constraint или еще как-то анимирована
Есть зависимые от нее колеса, которые движутся по какому-то пути, но так, что от оси колеса до тележки всегда +- какое-то конкретное расстояние. Это как-то делается без хитрых скрипт контроллеров? ![]() |
|
|
![]()
Сообщение
#2
|
|
Бывалый ![]() Группа: Пользователи Сообщений: 110 Регистрация: 14/08/2015 Пользователь №: 109 394 ![]() |
Добавляем модификатор Extrude к неровному пути.
В Script контролере используем функцию intersectRay. Пример: |
|
|
![]()
Сообщение
#3
|
|
уже всё сделал ![]() Группа: Пользователи Сообщений: 2 279 Регистрация: 01/06/2005 Из: z3л3№гр@d Пользователь №: 13 838 ![]() |
Сорри, видимо я криво объяснил.
Это первое, что я попробовал, но так не выйдет, поскольку, если расстояние от тележки до оси колеса станет меньше допустимого, то колесо должно продвинуться вперед тележки или назад, чтобы компенсировать разницу. Картинкой наверное будет понятнее ![]() Тележка едет по своему зеленому пути, колеса, закрепленные на синих подвесках по черному пути. Подвески несжимаемы, но вращаются. Я не смог ничего умнее придумать нежели мелкими шагами вперед/назад менять процент path_constraint колеса пока расстояние от крепления подвески до оси колеса не станет равным длине подвески. |
|
|
![]()
Сообщение
#4
|
|
Бывалый ![]() Группа: Пользователи Сообщений: 110 Регистрация: 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 |
|
|
![]()
Сообщение
#5
|
|
психомазохист ![]() Группа: Пользователи Сообщений: 2 780 Регистрация: 16/10/2012 Из: Восточная Африка - Маисовое поле Пользователь №: 86 591 ![]() |
WOW!
|
|
|
![]()
Сообщение
#6
|
|
уже всё сделал ![]() Группа: Пользователи Сообщений: 2 279 Регистрация: 01/06/2005 Из: z3л3№гр@d Пользователь №: 13 838 ![]() |
Да, все сложно.
|
|
|
Bots |
![]() |
![]() |
|
|
|
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 23/04/2018 - 18:26 |