Bagaimana saya bisa membalikkan hanya satu sumbu angka empat?

Saya membuat dua objek di Unity3D, mewakili lengan atas (induk) dan lengan bawah (anak), digabungkan dengan gabungan karakter. Perputaran benda-benda ini didorong oleh 2 quaternion yang saya kumpulkan dari sebuah IMU yang terletak di lengan atas dan lengan bawah. Saya mengkalibrasi kedua angka empat. Tujuan saya adalah memvisualisasikan fleksi/ekstensi siku.

Q dalam namanya menunjukkan itu adalah Quaternion. QImu menunjukkan itu adalah Quaternion dari IMU. Qstart menunjukkan ini adalah orientasi awal awal IMU.

// upperarm script attached to upperarm object
if (Input.GetKeyDown(KeyCode.Space))
        {
            QstartUpperArm = QimuUpperArm;
        }

        transform.localRotation = QstartUpperArm * Quaternion.Inverse(QimuUpperArm);
// lowerarm script attached to lowerarm object
if (Input.GetKeyDown(KeyCode.Space))
        {
            QstartLowerArm = QimuLowerArm;
        }

        QimuLowerArm = QstartLowerArm * Quaternion.Inverse(QimuLowerArm);
transform.localrotation = Quaternion.Inverse(Qstart2 * Quaternion.Inverse(Qimu2)) * Qimu1new;

Objek Lengan Atas berputar persis seperti yang diharapkan. Namun objek lengan bawah memiliki salah satu sumbu y yang terbalik. Semua sumbu lainnya baik-baik saja. Bagaimana cara mengubah tanda sumbu yang satu ini menggunakan Quaternion?


person pvand    schedule 15.07.2019    source sumber
comment
Putar pada sumbu tegak lurus sebesar 180 derajat. Sayangnya Anda tidak dapat meniadakan hanya satu sumbu tanpa menggunakan skala negatif atau mengubah penggunaan seluruh sistem.   -  person Leo Bartkus    schedule 15.07.2019
comment
Bisakah Anda menjelaskan lebih lanjut apa yang Anda maksud dengan sumbu y terbalik? Apakah Anda mengatakan itu berputar ke arah yang salah di sekitar sumbu y lokal lengan atas? Kita mungkin memerlukan gambar atau video untuk mendapatkan gambaran tentang apa yang terjadi di sini.   -  person Ruzihm    schedule 15.07.2019
comment
Ini semacam pengambilan gambar dalam kegelapan tanpa melihat apa sebenarnya yang terjadi... Coba ini: Quaternion reversedY = Quaternion.Inverse(Qstart2 * Quaternion.Inverse(Qimu2)) * Qimu1new; transform.localrotation = Quaternion.Euler(Vector3.Scale(reversedY, new Vector3(1f, -1f, 1f) ) );   -  person Ruzihm    schedule 15.07.2019
comment
@pvand beri tahu kami jika itu berhasil   -  person Ruzihm    schedule 16.07.2019
comment
Saya menemukan sesuatu secara online yang memiliki masalah serupa, solusinya adalah: Vector3 myEulerAngles = QimuLowerArm.eulerAngles; Quaternion invertedRotation = Quaternion.Euler(myEulerAngles.x, -myEulerAngles.y, myEulerAngles.z); transform.localRotation = invertedRotation; Jadi menurut saya solusi Anda serupa.   -  person pvand    schedule 16.07.2019


Jawaban (1)


Anda tidak boleh melakukan ini secara langsung di Quaternion. Sepertinya Anda membingungkan Quaternion (yang memiliki 4 komponen x,y,z,w) dengan representasi ruang Euler di x,y,z.

Anda dapat mencoba menggunakan sesuatu seperti

var invertedRotation = Quaternion.Euler(Vector3.Scale(QimuLowerArm.eulerAngles, Vector3.up * -1));

Bergantung pada rotasi mana yang harus Anda balikkan (tidak melihatnya dengan jelas di kode Anda).

  • eulerAngles mengembalikan representasi Euler dari Quaternion

  • Vector3.Scale dikalikan menjadi Vector3 berdasarkan komponen. Dalam hal ini oleh Vector3.up * -1 == new Vector3(0, -1, 0);

  • Quaternion.Euler menghasilkan Quaternion untuk rotasi pada sudut Euler tertentu. Kita harus mencatat di sini bahwa rotasi diterapkan dalam urutan x lalu z lalu y tetapi karena Anda membalikkan yang terakhir, itu akan baik-baik saja.


Alternatif afaik (tidak begitu yakin) adalah dengan

  • meniadakan komponen sumbu yang sesuai
  • meniadakan komponen w

Saya tetap tidak akan melakukan ini secara langsung pada angka empat karena urutannya sangat penting tetapi lakukan mis.

var invertedRotation = new Quaternion (QimuLowerArm.x, - QimuLowerArm.y, QimuLowerArm.z, -QimuLowerArm.w);
person derHugo    schedule 15.07.2019
comment
Jenis solusi pertama berhasil, setiap kali saya memegang lengan atas dalam putaran yang sama. Namun jika saya mulai memutar lengan atas, lengan bawah mulai memutar sumbu yang saya balikkan saja. Dengan kata lain saya mulai melenturkan ketika saya memutar objek lengan atas saya ke samping... - person pvand; 15.07.2019