ฉันกำลังพยายามใช้การแปลงส่วน 3 มิติในระบบพิกัดสัมพัทธ์และสัมบูรณ์ ฉันสามารถทำเช่นนี้ได้สำหรับการเคลื่อนไหวแบบสัมพัทธ์ - หรือที่เรียกว่าการเคลื่อนไหวของชิ้นส่วนต่างๆ ในระบบพิกัดเฉพาะที่ แต่ไม่สามารถนำไปใช้ได้อย่างถูกต้องในระบบสัมบูรณ์ (ระบบพิกัดทั่วโลก / โมเดล)
คำศัพท์ที่ใช้ - 1. ส่วน 3 มิติ - เรขาคณิตใดๆ (การรวมกันของรูปทรงเรขาคณิต) ที่วาดใน 3 มิติ ฉันใช้ชิ้นส่วนที่สร้างขึ้นใน CATIA 2. ระบบพิกัดท้องถิ่น (สัมพัทธ์) - ระบบแกนสำหรับส่วนที่ 3 ระบบพิกัดทั่วโลก (สัมบูรณ์) - ระบบแกนสำหรับพาเรนต์ของชิ้นส่วน 4. การประกอบ - ส่วนที่เชื่อมต่อถึงกันเหมือนลูกพาเรต โครงสร้างต้นไม้ทั่วไป คำจำกัดความเหล่านี้สอดคล้องกับการใช้งานและความเข้าใจของฉัน https://www.opengl.org/discussion_boards/showthread.php/127422-Local-and-global-coordinate-system
อินพุตของฉัน -
เมทริกซ์ - ฉันมีเมทริกซ์ 4X4 ที่กำหนดไว้สำหรับแต่ละส่วนในแอสเซมบลี สิ่งนี้จะกำหนดเมทริกซ์การแปลงสภาพโดยใช้องค์ประกอบการหมุน การแปล และมาตราส่วน เมทริกซ์การแปลง เมทริกซ์คอลัมน์พร้อมตัวแปรที่ 1-10 ตำแหน่งสำหรับการหมุน 12,13 ,14 (ล่างขวา) ใช้สำหรับการแปล
การเคลื่อนไหว - ฉันได้รับการเคลื่อนที่ของชิ้นส่วนเป็นเวกเตอร์ของค่า x,y,z ในหน่วยสัมบูรณ์หรือหน่วยสัมพัทธ์ หรือเปลี่ยนการหมุนรอบแกน X, Y หรือ Z เป็นองศา
ฉันลองทำอะไรไปแล้ว -
ฉันทำตามขั้นตอนต่อไปนี้เพื่อแปลงอินพุตเพื่อใช้กับเมทริกซ์ ฉันต้องแปลงการเปลี่ยนแปลงแบบสัมบูรณ์เป็นการเปลี่ยนแปลงแบบสัมพันธ์เสมอ เนื่องจากฉันสามารถแก้ไขเมทริกซ์ของโหนดลีฟเท่านั้น (ซึ่งจะอยู่ในระบบพิกัดท้องถิ่นเสมอ) นี่คือการดำเนินการทีละขั้นตอนที่ฉันใช้ - ขั้นตอนสำหรับเมทริกซ์ใหม่
ขั้นตอนที่ 1- มีส่วนร่วมใน LCS WCS - ระบบพิกัดโลก LCS - ระบบประสานงานเฉพาะที่ ขั้นตอนที่ 2 - ปฏิเสธการหมุนใน LCS สำรองการหมุน ขั้นตอนที่ 3 - ย้ายชิ้นส่วนไปที่ WCS ขั้นตอนที่ 4 - ย้ายชิ้นส่วนด้วยเดลต้าที่ต้องการใน WCS ขั้นตอนที่ 5 - ย้ายชิ้นส่วนกลับไปที่ LCS ขั้นตอนที่ 6 - หมุนด้านหลังอีกครั้งโดยบันทึกการหมุนไว้ในขั้นตอนที่ 1
รหัสจำลองด้านล่าง - เป็น typescript แต่ภาษาอื่น ๆ ก็ใช้ได้สำหรับฉัน ฉันสนใจการคำนวณเมทริกซ์มากกว่า
//// 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.
ฉันต้องการความช่วยเหลือเพื่อให้เข้าใจว่าฉันทำตามขั้นตอนในอัลกอริทึมอย่างถูกต้องหรือไม่ ฉันได้พยายามที่จะให้ข้อมูลมากที่สุด แจ้งให้เราทราบหากโพสต์นั้นเข้าใจยาก แจ้งให้เราทราบมุมมองของคุณ