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 -
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.
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.