Wpis z mikrobloga

Jak zamienić Quaternion na Vector3 i odwrotnie? Siedzę pół dnia na tym ( ͡° ʖ̯ ͡°)

Mam w unity 2 obiekty i chciałbym żeby jeden kopiował rotację drugiego ale z lekkim skryptem modyfikujacym. Skrypt chce Vector3 a rotacje są jako Quaterniony. Musiałbym sprowadzić rotację pierwszego do Vector3, zaaplikowac skrypt i zamienić z powrotem na Quaternion.

pseudokod:

Quaternion cube1Rotation;
Quaternion cube2Rotation;

Vector3 cube1Values;
Vector3 cube2Values;

void CalcHarmonicRot (Vector3 newValues)
{

}

Wynik:
cube2.eulerAngles = newValues; //błędy i gimbal locki
cube2.transform.rotation = newValues; //rotacje o bardzo mały kąt

#unity3d #csharp
  • 10
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@jacku:
No własnie musisz skumać że po takiej zamianie stopnie mogą się zmianić o wielokrotność 360 dlatego
1. Staraj się nie operowac na eulerach
2. Jesli juz musisz to tylko w jedną strone operuj, czyl icały czas tryzmaj gdzieś w postaci eulera i sobie przeliczaj i wrzucaj do tranforma, ale nie odczytuj z tranforma nowych eulerów bo moga byc inne
  • Odpowiedz
@zibizz1: największym problemem jest to że nawet jak sobie obliczę w skrypcie wszystko na quaternionach i eksportuję na quaterniony (lub angles) to unity i tak w losowych momentach zmienia pola Rotation o 180, 360 itp. i żaden skrypt wtedy nie ma sensu. W normalnych rotacjach użytkownik nie widzi że mu postać przeskoczyła o 360 ale skrypt to widzi i generuje fikoły
  • Odpowiedz
@jacku: 1. w quaternionach nie masz stopni to jak ma przeskakiwać?:P
2. rotacja to rotacja jeśli wpisujesz pewny stan rotacji do tranforma to taki będzie ,nic nie ma prawa przeskoczyć jak go natomiast odczytasz to moze byc inny niż wpisałeś ale reprezentuje dokładnie to samo.

eulery to taki x w funkcji sin(x) która reprezentuje orientacje obiektu

Wpisujesz x
  • Odpowiedz
@zibizz1: tylko ty tutaj pobierasz rotację Cube1 na starcie a potem dla Cube2 generujesz ruch z niczego a mi chodzi o to żeby w update na bieżąco analizować Cube1 i z niego generować zmodyfikowane rotacje dla Cube2.

W pewnym momencie rotacje odczytywane z Cube1 przeskakują z (90,0,0) na (0,180,180) i nie ma z czego czytać bo dane są już pomieszane. Musiałbym mieć odczyt taki jak w panelach unity tzn. jak x się obróci o 960 st. to odczyt z transforma też powinien taki być, wtedy skrypt by fajnie liczył

Jeśli chcę pobrać dane z Cube1 jako Quaternion to też muszę to zrobić z Transforma
  • Odpowiedz
@zibizz1: chyba że do takich rzeczy jest Quaternion.Slerp a skrypt modyfikujacy powininen oddziaływać wtedy na parametr t, spróbuje jeszcze tego
  • Odpowiedz
@jacku: NIgdzie nie ma błednych danych:P
Problem wynika z tego że nie wszystkie funckje są odwracalne
euler1->q2->euler1

euler1 != euler2 mimo że reprezentuja tą samą orientacje w przestrzeni

Jeśli masz 2 poruszające się obiekty i chcesz np coś naimowac miedzy nimi to będzie np ze zmienna prekościa to tylko operaje na quaternionach wchodza w grę
  • Odpowiedz
@zibizz1: Działa! Okazało się że skrypt którego używam działa na Vector3 i zawsze jak liczył Quaternion XYZW to parametr W pomijał. Po przerobieniu na Vector4 wszystko działa ¯\_(ツ)_/¯ Ale dzięki za pomoc bo mi się dużo rzeczy rozjaśniło przy analizie tego
  • Odpowiedz