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
@jacku:
Tu nie ma filozofii:
var v = myRotation.eulerAngles;
//modifikacja v
myRotation = Quaternion.Euler(v);

tylko jest to nieprawidłowe podejście

nie rozumiem tego:

cube2.eulerAngles = newValues; //błędy i gimbal locki

cube2.transform.rotation = newValues; //rotacje o bardzo mały kąt

przeciez to jest tylkop przypisanie, jeśli masz nieprawidłowosci to są w newValues a to dlatego że to złe podejście
@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
@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
@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 do transforma
Ale odczutujesz potem **x -2*pi** orientacja jest dokladnie ta sama (wynik
@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
@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ę
@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