Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум .:3DCenter.ru:. _ 3ds Max _ Риг с зависимостями

Автор: Jahman 14/04/2018, 01:11

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



Автор: igorznag2 14/04/2018, 23:37

Добавляем модификатор Extrude к неровному пути.
В Script контролере используем функцию intersectRay.
Пример: https://youtu.be/qiF82b1aqr8

Автор: Jahman 15/04/2018, 00:45

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

Картинкой наверное будет понятнее

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



Автор: igorznag2 15/04/2018, 22:26

Можно попробовать использовать функцию, которая находит пересечения отрезка и сферы.
Отрезок это часть-отрезок сплайна. Сплайн должен быть замкнутым.
Центр сферы это крепление подвески $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

Автор: Babuinische 16/04/2018, 05:51

WOW!

Автор: Jahman 16/04/2018, 09:42

Да, все сложно.

Форум Invision Power Board (http://nulled.cc)
© Invision Power Services (http://nulled.cc)