Nie do końca wiem czemu "pattern" zmienia się w czasie (unity)

0

Potrzebuję stworzyć podstawowy ruch rękami taki jak np. tutaj http://www.gunswap.co/#
Wydaje mi się, że najprościej prowizoryczne ramię dołączyć jako child do jakiegoś punktu i ten punkt obracać wokół osi y/z.

void FixedUpdate()
    {


        yROT = rb.transform.eulerAngles.y;
        if(throwMode)
        {
            zRotation();
            yRotation();
            rb.transform.Rotate(0f, rotYSpeed * Time.fixedDeltaTime, rotZSpeed * Time.fixedDeltaTime);
        }
       
    }

    private void yRotation()
    {
        if (yTime < 0f)
        {
            rotYSpeed *= -1;
            yTime = rotYtime;
        }
        yTime -= Time.fixedDeltaTime;
    }

    private void zRotation()
    {
        if (zTime < 0f)
        {
            rotZSpeed *= -1;
            zTime = rotZtime;
        }
        zTime -= Time.fixedDeltaTime;
    }

Coś takiego mam i działa na początku ok, ale zmienia się dość znacząco w miarę kolejnych iteracji całej "równoległobokowej ścieżki", mimo że cały czas dodaję tą samą rotacje w tych samych okresach czasu i teoretycznie koniec ramienia powinien zataczać taki równoległobok i się "znosić".

2

obracasz poprzednio obróconą transformację, za każdym razem powiększając błąd obliczeń. żeby sobie to zobrazować narysuj coś w programie graficznym, obróć o 15 stopni, zrasteryzuj, znowu obróć i tak w kółko. zobaczysz że po kilku obrotach niewiele zostanie z twojego rysunku. rozwiązań jest kilka, myślę że nie powinieneś mieć problemu z dotarciem do nich

0
obscurity napisał(a):

obracasz poprzednio obróconą transformację, za każdym razem powiększając błąd obliczeń. żeby sobie to zobrazować narysuj coś w programie graficznym, obróć o 15 stopni, zrasteryzuj, znowu obróć i tak w kółko. zobaczysz że po kilku obrotach niewiele zostanie z twojego rysunku. rozwiązań jest kilka, myślę że nie powinieneś mieć problemu z dotarciem do nich

Zastosowałem moją metodę i był wyraźny przeskok pod koniec, ale metodą prób i błędów dodałem jeszcze coś takiego do kluczowej linijki:

rb.transform.Rotate(0f, rotYSpeed * Time.fixedDeltaTime * Mathf.Cos(yTime*cosScale), rotZSpeed * Time.fixedDeltaTime * Mathf.Cos(zTime*cosScale));

i nie ma już tego przeskoku, jak to się dzieje to ja nie wiem. Też mogę usunąć resetowanie rotacji pod koniec cyklu, a i tak pattern wydaje się zachowywać swój kształt.

1 użytkowników online, w tym zalogowanych: 0, gości: 1