Autor Wątek: Kręcenie wektorem  (Przeczytany 948 razy)

Offline muchomorek90

  • Użytkownik

# Grudzień 23, 2010, 16:44:14
Mam problem z obrotem wektora, a dokładniej z zamianą współrzędnych kartezjańskich na biegunowe. Mógłby ktoś podrzucić jakieś info o tym, bo nie mogę tego nigdzie znaleźć.

To co udało mi się dotychczas spłodzić(posługując się wikipedią):
                //zamiana na współrzędne biegunowe
                float MovingDirectionVectorRotation = (float)Math.Acos(MovingDirection.X) * Math.Sign(MovingDirection.Y);
                //dodaję rotację obiektu
                MovingDirectionVectorRotation += Rotation;

                //zamień na kartezjańskie
                Vector2 MovingVector = new Vector2((float)Math.Cos(MovingDirectionVectorRotation), (float)Math.Sin(MovingDirectionVectorRotation));
                //pomnóż przez prędkość i deltę
                MovingVector *= (float)(delta * Speed);

                //zmodyfikuj pozycje
                Position += MovingVector;
Jednak tu są dziwne błędy.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Avaj

  • Użytkownik

# Grudzień 23, 2010, 16:54:33
jeśli dobrze rozumiem, to chcesz, żeby Position zbliżało się do punktu MovingDirection.XY z prędkością delta*speed?

jeśli tak to zamiast te kombinacje zrób tak:

Kod: (cpp) [Zaznacz]
Vector2 velocityVector = (MovingDirection - Position);
velocityVector.normalize();
velocityVector = velocityVector * (delta * Speed);
Position += velocityVector;

Offline muchomorek90

  • Użytkownik

# Grudzień 23, 2010, 18:35:13
Nie. Moving direction to znormalizowany(tzn nie znormalizowany, ale wynik jest o długości 1, więc długość wektora nie ma znaczenia, ważna jest tylko amplituda) wektor określający, w którą stronę idzie postać. Np. w górę to (0, -1), na ukos w lewo, do przodu to (1, -1) itp. Chcę ten wektor obrócić, tak, jak patrzy obiekt. Po pomnożeniu przez delta i speed mam wektor, o jaki przesunąć obiekt.

Offline Liosan

  • Redaktor

# Grudzień 23, 2010, 18:46:42
Moving direction to znormalizowany(tzn nie znormalizowany...
No to jaki w końcu? Bo jeśli nie znormalizowany, to taki kod jest błędny:
float MovingDirectionVectorRotation = (float)Math.Acos(MovingDirection.X) * Math.Sign(MovingDirection.Y);

Liosan

Offline bartekm

  • Użytkownik
    • Wordpress Blog

# Grudzień 23, 2010, 18:54:51
Przekształcaj współrzędne wektora zgodnie ze wzorem:
x' = x*cos(alfa) - y*sin(alfa)
y' = x*sin(alfa) + y*cos(alfa)

Albo skorzystaj z macierzy obrotu. Nie wiem z jakiego API korzystasz, ale w DX wygląda to mniej więcej tak:
D3DXMATRIX Rotation;
D3DXMatrixRotationY(&Rotation, alfa);
D3DXVec3TransformCoord(&Vector, &Vector, &Rotation);

Pamiętaj jednak, żeby w pierwszym jak i drugim przypadku, przed tranformacją obrotu umieścić wektor na początku układu współrzędnych.
« Ostatnia zmiana: Grudzień 23, 2010, 19:11:13 wysłana przez beem »

Offline muchomorek90

  • Użytkownik

# Grudzień 23, 2010, 19:22:14
Liosan: dzięki, znormalizowanie wektora trochę pomogło
beem: co to za wzór?

Nie napisałem jeszcze, co jest źle. Były 2 problemy:
1. poruszanie się na ukos było niemożliwe(rozwiązało to znormalizowanie wektora)
2. podczas poruszania się tylko w lewo, lub tylko w prawo(wartość x) postać idzie zawsze w prawo. Łażenie do przodu i do tyłu działa, tak samo jak łażenie na ukos(tzn w bok i do przodu), jednak łażenie w bok, w lewo jest niemożliwe.

Offline Liosan

  • Redaktor

# Grudzień 23, 2010, 19:25:10
Proponuję użyć debuggera albo logów, żeby się zorientować co się dzieje. Podziel ten wzór na kilka zmiennych tymczasowych i podejrzyj ich wartości w różnych przypadkach.

Liosan

Offline muchomorek90

  • Użytkownik

# Grudzień 23, 2010, 19:40:17
Cóż, użycie debuggera mi nie pomaga, bo dostaje jakieś jakieś gąsienice(radiany). Jedyne, co mi przychodzi na myśl to to, że funkcja singnum zeruje rotacje, jeśli nie poruszamy się do przodu/tyłu.

Offline Liosan

  • Redaktor

# Grudzień 23, 2010, 19:48:14
Jak na to wpadłeś, Whatsonie ::) Debugger mógł Ci to powiedzieć, wystarczyło dokładnie zobaczyć skąd się biorą jakie wartości.

Liosan

Offline muchomorek90

  • Użytkownik

# Grudzień 23, 2010, 20:02:22
No ok, ale co ja mam teraz z tym zrobić? Ustawić sig na 1?

Edit:
Ok, działa. Dzięki za pomoc Liosan.
« Ostatnia zmiana: Grudzień 23, 2010, 20:36:54 wysłana przez muchomorek90 »