pergerakan absolut bagian 3D menggunakan matriks

Saya mencoba menerapkan transformasi bagian 3D dalam sistem koordinat relatif dan absolut. Saya dapat melakukan ini untuk pergerakan relatif - alias pergerakan bagian-bagian dalam sistem koordinat lokal tetapi gagal menerapkannya dengan benar secara absolut (sistem koordinat global/model).

terminologi yang digunakan - 1. Bagian 3D - Geometri apa pun (kombinasi geometri) yang digambar dalam 3 dimensi. Saya menggunakan bagian yang dibuat di CATIA. 2. Sistem koordinat lokal (relatif) - Sistem sumbu untuk bagian 3. Sistem koordinat global (mutlak) - Sistem sumbu untuk bagian induk. 4. Rakitan – bagian-bagian yang dihubungkan satu sama lain sebagai paret-anak. struktur pohon yang khas. Definisi ini sejalan dengan penggunaan dan pemahaman saya. https://www.opengl.org/discussion_boards/showthread.php/127422-Local-and-global-coordinate-system

Masukan saya -

  1. Matriks - Saya memiliki matriks 4X4 yang ditentukan untuk setiap bagian dalam suatu rakitan. Ini mendefinisikan matriks transformasi dengan komponen Rotasi, Terjemahan, dan skala yang diterapkan padanya. Matriks transformasi Matriks kolomnya dengan variabel pada posisi 1-10 untuk rotasi, 12,13 ,14 (kanan bawah) untuk terjemahan.

  2. Pergerakan - Saya menerima pergerakan bagian sebagai vektor nilai x,y,z dalam satuan absolut atau relatif. Atau perubahan rotasi di sekitar sumbu X, Y atau Z dalam derajat.

Apa yang sudah saya coba -

Saya mengikuti langkah-langkah di bawah ini untuk mengonversi input untuk diterapkan pada matriks. Saya harus selalu mengubah perubahan absolut menjadi perubahan relatif karena saya hanya dapat mengubah matriks simpul daun (yang akan selalu berada dalam sistem koordinat lokal). berikut adalah operasi langkah demi langkah yang saya gunakan - Langkah-langkah untuk matriks baru

Langkah 1- Berpartisipasi dalam LCS. WCS - Sistem koordinat dunia; LCS - Sistem Koordinat Lokal Langkah 2 - Meniadakan rotasi di LCS. cadangan rotasi. Langkah 3 - pindahkan bagian tersebut ke WCS. Langkah 4 - Pindahkan bagian dengan delta yang diinginkan di WCS. Langkah 5 - Pindahkan bagian kembali ke LCS Langkah 6 - Putar kembali bagian belakang dengan rotasi yang disimpan pada Langkah 1.

Kode tiruan seperti di bawah ini - Ada dalam TypeScript, tetapi bahasa lain apa pun boleh untuk saya. Saya lebih tertarik pada perhitungan matriks.

//// STEP 1//////

    let absVals = Matrix 4;

    /*This is accumulation of all matrices from child to parent. I take all the matrices starting from Child to the root parent and append with matrix multiplication.*/
    let localVals = Matrix4 on the child node. In our case the the box shown in image;
    let localRotation: .Matrix4 = new Matrix4(localVals);
    localRotation.setTranslation(0, 0, 0); // only local rotation matrix

    //// STEP 2//////

    let localTranslation = localVals.multiplyMatrix(localRotation.inverse()); // only local translation. Step 2 achived.

    //// STEP 3//////

    let localInGlobalSpace = localTranslation.multiplyMatrix(res); // move the part in WCS. Step 3 achieved.

    let xDelta = this.xMovement;
    let yDelta = this.yMovement;
    let zDelta = this.zMovement;
    let newPos = new Matrix4();
    newPos.setTranslation(new .Vector3(xDelta, yDelta, zDelta));
    // Similarly rotations should be handled but can skipped for first step

    //// STEP 4//////

    let movedLocalInGlobalSpace = localInGlobalSpace.multiplyMatrix(newPos); // Step 4 achived.

    //// STEP 5//////

    let localBackInLocalSpace = movedLocalInGlobalSpace.multiplyMatrix(absVals.inverse()); // Step 5 achived.

    //// STEP 6//////

    let localBackInLocalSpaceWithRotation = localBackInLocalSpace.multiplyMatrix(localRotation); // Step 6 achived.

Saya memerlukan bantuan untuk memahami apakah saya melakukan langkah-langkah dengan benar dalam algoritme saya. Saya telah mencoba memberikan informasi sebanyak mungkin. beri tahu saya jika postingannya sulit dipahami. Beri tahu saya pandangan Anda.


person Sumit Kulkarni    schedule 09.07.2018    source sumber
comment
Apa yang membuat Anda berpikir algoritma Anda tidak benar? Apakah Anda melihat kesalahan saat menjalankan kode?   -  person Richie Thomas    schedule 09.07.2018
comment
Hasil gerakannya tidak tepat. Saya memverifikasi silang ini dengan aplikasi lain yang memiliki fungsi serupa. Saya yakin keluaran matriks setelah algoritme saya tidak memberikan angka yang benar. Tapi saya tidak bisa memahami kesalahan yang saya lakukan dengan perhitungan saya.   -  person Sumit Kulkarni    schedule 10.07.2018
comment
Untuk memperjelas, hasil apa yang Anda lihat? Dan hasil apa yang Anda harapkan?   -  person Richie Thomas    schedule 10.07.2018


Jawaban (1)


Saya pikir pertanyaan Anda lebih banyak tentang transformasi matematika daripada kode:

Setiap transformasi dapat dibagi lagi dalam satu translasi sederhana dan tiga rotasi (sepanjang setiap sumbu). Kami hanya akan mempertimbangkan 1 terjemahan dan 1 rotasi untuk saat ini.

Saat Anda menerapkan rotasi, Anda harus yakin bahwa pusat rotasi adalah titik asal, yaitu 0,0,0.

Contoh: Jika kita mempunyai bentuk yang ditentukan oleh empat titik P1, P2, P3, P4 dan kita ingin menerapkan rotasi (Matriks M) di sekitar P1 dan translasi (Vektor V).

  1. Anda harus menerjemahkan setiap poin sehingga P1 menjadi titik asal.
  2. Terapkan matriks M "di sebelah kiri"
  3. Terjemahkan kembali poin-poin tersebut sehingga P1 berpindah ke tempat sebelumnya
  4. Terapkan vektor terjemahan

Formula1

Tentu saja jika pusat rotasi Anda adalah sesuatu yang lain, seperti Pc maka akan menjadi:

Formula1

Jika Anda ingin meniadakan rotasi sebelumnya (Matriks M1), dan menerapkan rotasi baru (Matriks M2), pertimbangkan saja:

Formula2

Mengenai kode Anda:

Berhati-hatilah. Di sebagian besar bahasa/perpustakaan:

C = A.mulityplymatrix(B)

Cara

Formula2

Yang bisa berbeda dari:

Formula3

Menerapkan terjemahan terlebih dahulu dan kemudian rotasi akan memberi Anda sesuatu yang sama sekali berbeda dari rotasi terlebih dahulu kemudian terjemahan.

person P.Manthe    schedule 11.07.2018