3DCenter.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Reply to this topicStart new topic
> Риг с зависимостями
Jahman
сообщение 14/04/2018, 01:11
Сообщение #1


уже всё сделал
Иконка группы

Группа: Пользователи
Сообщений: 2 456
Регистрация: 01/06/2005
Из: z3л3№гр@d
Пользователь №: 13 838



Есть тележка и она через path constraint или еще как-то анимирована
Есть зависимые от нее колеса, которые движутся по какому-то пути, но так, что от оси колеса до тележки всегда +- какое-то конкретное расстояние.
Это как-то делается без хитрых скрипт контроллеров?
Прикрепленное изображение

Go to the top of the page
 
+Quote Post
igorznag2
сообщение 14/04/2018, 23:37
Сообщение #2


MaxMan
Иконка группы

Группа: Пользователи
Сообщений: 153
Регистрация: 14/08/2015
Пользователь №: 109 394



Добавляем модификатор Extrude к неровному пути.
В Script контролере используем функцию intersectRay.
Пример: https://youtu.be/qiF82b1aqr8
Go to the top of the page
 
+Quote Post
Jahman
сообщение 15/04/2018, 00:45
Сообщение #3


уже всё сделал
Иконка группы

Группа: Пользователи
Сообщений: 2 456
Регистрация: 01/06/2005
Из: z3л3№гр@d
Пользователь №: 13 838



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

Картинкой наверное будет понятнее
Прикрепленное изображение
Тележка едет по своему зеленому пути, колеса, закрепленные на синих подвесках по черному пути. Подвески несжимаемы, но вращаются.
Я не смог ничего умнее придумать нежели мелкими шагами вперед/назад менять процент path_constraint колеса пока расстояние от крепления подвески до оси колеса не станет равным длине подвески.


Go to the top of the page
 
+Quote Post
igorznag2
сообщение 15/04/2018, 22:26
Сообщение #4


MaxMan
Иконка группы

Группа: Пользователи
Сообщений: 153
Регистрация: 14/08/2015
Пользователь №: 109 394



Можно попробовать использовать функцию, которая находит пересечения отрезка и сферы.
Отрезок это часть-отрезок сплайна. Сплайн должен быть замкнутым.
Центр сферы это крепление подвески $Point1. Радиус сферы равен длине подвески.
$Point2 используется, когда нет пересечений. Для левого колеса используем код t1.x>0, а для правого t1.x<0
Пример: https://youtu.be/QBHWNJ-0zG4

Код
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
Go to the top of the page
 
+Quote Post
Babuinische
сообщение 16/04/2018, 05:51
Сообщение #5


психомазохист
Иконка группы

Группа: Пользователи
Сообщений: 4 418
Регистрация: 16/10/2012
Из: Восточная Африка - Маисовое поле
Пользователь №: 86 591



WOW!
Go to the top of the page
 
+Quote Post
Jahman
сообщение 16/04/2018, 09:42
Сообщение #6


уже всё сделал
Иконка группы

Группа: Пользователи
Сообщений: 2 456
Регистрация: 01/06/2005
Из: z3л3№гр@d
Пользователь №: 13 838



Да, все сложно.
Go to the top of the page
 
+Quote Post
Bots
сообщение Системное сообщение






Reply to this topicStart new topic

1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 18/04/2024 - 03:17