Mam dwa obiekty (cel i gracz), oba mają pozycję (wektor3) i rotację (czwartorzęd). Chcę, aby cel się obrócił i był skierowany w stronę gracza. Cel, gdy coś strzela, powinien trafić prosto w gracza.
Widziałem wiele przykładów slerowania dla gracza, ale nie chcę przyrostowej rotacji, cóż, przypuszczam, że byłoby to w porządku, o ile mogę sprawić, że slerp będzie w 100% i tak długo, jak faktycznie zadziała.
FYI - Jestem w stanie użyć pozycji i rotacji do robienia wielu innych rzeczy i wszystko działa świetnie, z wyjątkiem tego ostatniego kawałka, którego nie mogę rozgryźć.
Próbki kodu są uruchamiane w klasie celu, pozycja = pozycja celu, awatar = gracz.
EDYTOWAĆ
Im teraz używa kodu c # Maik, który dostarczył i działa świetnie!
0*(rotation A) + 1*(rotation B)
- innymi słowy, ustawiasz obrót na obrót B na dłuższą metę. Slerp służy tylko do określenia, jak powinien wyglądać obrót (0% <x <100%) na drodze pomiędzy.Odpowiedzi:
Jest na to więcej niż jeden sposób. Możesz obliczyć bezwzględną orientację lub obrót względem swojego awatara, co oznacza, że twoja nowa orientacja = awatarOrientacja * q. Oto ten ostatni:
Oblicz oś obrotu, biorąc iloczyn wektorowy wektora jednostki awatara do przodu i wektora jednostki od awatara do celu, nowego wektora do przodu:
Oblicz kąt obrotu za pomocą iloczynu punktowego
Utwórz czwartorzęd przy użyciu rotAxis i rotAngle i pomnóż go przez bieżącą orientację awatara
Jeśli potrzebujesz pomocy w znalezieniu bieżącego wektora awataru, dane wejściowe dla 1. po prostu strzelaj :)
EDYCJA: Obliczenie orientacji absolutnej jest w rzeczywistości nieco łatwiejsze, użyj wektora do przodu matrycy tożsamości zamiast wektora do przodu awatarów jako danych wejściowych dla 1) i 2). I nie mnoż go w 3), zamiast tego użyj go bezpośrednio jako nowej orientacji:
newRot = q
Ważne, aby pamiętać: Rozwiązanie ma 2 anomalie spowodowane charakterem produktu krzyżowego:
Jeśli wektory przednie są równe. Rozwiązaniem jest po prostu zwrócenie czwartorzędu tożsamości
Jeśli wektory wskazują dokładnie w przeciwnym kierunku. Rozwiązaniem jest tutaj utworzenie czwartorzędu przy użyciu awatarów w górę osi jako osi obrotu i kąta 180,0 stopni.
Oto implementacja w C ++, która zajmuje się tymi przypadkowymi przypadkami. Konwersja do C # powinna być łatwa.
EDYCJA: Poprawiona wersja kodu XNA Marc
źródło
newForward
rotAngle
rotAxis
ireturned quaternion
. Kod moba będzie taki sam, gdy tylko będziemy pracować z awatarem, łatwo będzie zmienić nagłówek dowolnego obiektu.