Skocz do zawartości

Funkcja dopasowywująca automatycznie punkty


Nirvan

Rekomendowane odpowiedzi

Od dłuższego czasu próbuję rozkminić jak jest obliczana funkcja w cinemie 4D do automatycznego dopasowywania punktów kontrolnych w krzywych beziera.

Pokaże wam jak to tam wygląda, może razem to odczytamy ;)

Ogólnie nie trzeba wiedzieć za bardzo jak działa krzywa beziera, bo to wyznaczanie punktów jest prawie takie same jak na osi.

Najważniejsze to ustalić od czego uzależnione jest to ustawianie.

 

Tu filmik jak to wygląda:

 

Jakby co to jeden punkt kontrolny jest zawsze ustawiany naprzeciwko drugiego automatycznie.

 

Próbuję to jakoś rozgryźć, ale nie wiem dlaczego, gdy mamy klucz klatkę na środku to punkty w żaden sposób punkty się nie zmieniają, jakby tylko od osi x były uzależnione, ale jak przesunie się ze środka to już jakby obydwie osi są brane pod uwagę.

Myślę sobie że jak klucz klatka jest bardziej na prawej stronie to uzależnia się od tej klucz klatki, gdy na lewej to od lewej, a na środku to od żadnej/obydwu.

 

Zrobiłem własne dopasowywanie, ale w akcji nie jest takie sprawne jak tutaj.

 

Z góry dzięki.

Odnośnik do komentarza
Udostępnij na innych stronach

Prawdopodobnie chodzi o coś takiego:

Y = (xb >= M)*(X-point_direction(xb,yb,xc,yc)*(xb-M)/M)+(xb < M)*(X-point_direction(xa,ya,xb,yb)*(1-((M-xb)/M)))

Wyjeśnienie: jeżeli współrzędna x punktu środkowego B jest większa od lub równa średniej współrzędnych x punktów krańcowych A i C, wtedy kąt, jaki punkty kontrolne wyznaczają z kierunkiem od B do C, jest równy różnicy kierunku początkowego i kierunku od B do C; następnie kąt jest mnożony przez (xb-M)/M, czyli im bliżej punktu C jest punkt B w osi X, tym mocniej kąt jest modyfikowany; jeżeli punkt B znajduje się dokładnie między A i C, kąt nie jest modyfikowany. Podobnie dla punktu A, jeśli xb jest mniejsze od M.

Nie mówię, żebyś kopiuj-wklej mój kod, bo pewnie coś namieszałem z point_direction (zapewne zła kolejność punktów), ale działa to na podobnej zasadzie, co w tym Cinema 4D.

Odnośnik do komentarza
Udostępnij na innych stronach

Niezbyt mi to działa, jakie powinny wychodzić wyniki? Mi ciągle wychodzą za duże, najbardziej jak punkt B z innym jest jakby na równi y i blisko xem.

 

Zapisałem tak:

 

if ( ActualF >= Mean )

val = ( dirs - dirPre ) *

( ActualF - Mean ) / Mean;

else

val = ( dirs - dirNe ) *

( 1 - ( ( Mean - ActualF ) / Mean ) );

 

ActualF to aktualna klatka

Mean to srednia odległości od B do A i od B do C

val to wartośc do wstawienia za y

dirs to kąt od A do C

dirPre to kąt z B do A

dirNe to kąt z B do C

 

Nie do końca rozumiem jak to powinno działać, według mnie to trochę odbiega od rozwiązania bo liczymy kąty zamiast wartości które mogą być całkowicie różne, a z kątów jak już to trzeba by wyliczyć lengthdiry lub coś.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...