การเคลื่อนที่สัมบูรณ์ของส่วนสามมิติโดยใช้เมทริกซ์

ฉันกำลังพยายามใช้การแปลงส่วน 3 มิติในระบบพิกัดสัมพัทธ์และสัมบูรณ์ ฉันสามารถทำเช่นนี้ได้สำหรับการเคลื่อนไหวแบบสัมพัทธ์ - หรือที่เรียกว่าการเคลื่อนไหวของชิ้นส่วนต่างๆ ในระบบพิกัดเฉพาะที่ แต่ไม่สามารถนำไปใช้ได้อย่างถูกต้องในระบบสัมบูรณ์ (ระบบพิกัดทั่วโลก / โมเดล)

คำศัพท์ที่ใช้ - 1. ส่วน 3 มิติ - เรขาคณิตใดๆ (การรวมกันของรูปทรงเรขาคณิต) ที่วาดใน 3 มิติ ฉันใช้ชิ้นส่วนที่สร้างขึ้นใน CATIA 2. ระบบพิกัดท้องถิ่น (สัมพัทธ์) - ระบบแกนสำหรับส่วนที่ 3 ระบบพิกัดทั่วโลก (สัมบูรณ์) - ระบบแกนสำหรับพาเรนต์ของชิ้นส่วน 4. การประกอบ - ส่วนที่เชื่อมต่อถึงกันเหมือนลูกพาเรต โครงสร้างต้นไม้ทั่วไป คำจำกัดความเหล่านี้สอดคล้องกับการใช้งานและความเข้าใจของฉัน https://www.opengl.org/discussion_boards/showthread.php/127422-Local-and-global-coordinate-system

อินพุตของฉัน -

  1. เมทริกซ์ - ฉันมีเมทริกซ์ 4X4 ที่กำหนดไว้สำหรับแต่ละส่วนในแอสเซมบลี สิ่งนี้จะกำหนดเมทริกซ์การแปลงสภาพโดยใช้องค์ประกอบการหมุน การแปล และมาตราส่วน เมทริกซ์การแปลง เมทริกซ์คอลัมน์พร้อมตัวแปรที่ 1-10 ตำแหน่งสำหรับการหมุน 12,13 ,14 (ล่างขวา) ใช้สำหรับการแปล

  2. การเคลื่อนไหว - ฉันได้รับการเคลื่อนที่ของชิ้นส่วนเป็นเวกเตอร์ของค่า 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.

ฉันต้องการความช่วยเหลือเพื่อให้เข้าใจว่าฉันทำตามขั้นตอนในอัลกอริทึมอย่างถูกต้องหรือไม่ ฉันได้พยายามที่จะให้ข้อมูลมากที่สุด แจ้งให้เราทราบหากโพสต์นั้นเข้าใจยาก แจ้งให้เราทราบมุมมองของคุณ


person Sumit Kulkarni    schedule 09.07.2018    source แหล่งที่มา
comment
อะไรทำให้คุณคิดว่าอัลกอริทึมของคุณไม่ถูกต้อง คุณเห็นข้อผิดพลาดเมื่อคุณเรียกใช้โค้ดหรือไม่   -  person Richie Thomas    schedule 09.07.2018
comment
ผลลัพธ์ของการเคลื่อนไหวไม่ถูกต้อง ฉันตรวจสอบสิ่งนี้กับแอปพลิเคชันอื่นที่มีฟังก์ชันคล้ายกัน ฉันแน่ใจว่าเอาต์พุตเมทริกซ์หลังจากอัลกอริธึมของฉันไม่ได้ให้ตัวเลขที่ถูกต้องแก่ฉัน แต่ฉันไม่สามารถเข้าใจข้อผิดพลาดที่ฉันทำกับการคำนวณของฉันได้   -  person Sumit Kulkarni    schedule 10.07.2018
comment
เพื่อชี้แจงว่าเห็นผลอะไรบ้าง? และคุณคาดหวังผลลัพธ์อะไร?   -  person Richie Thomas    schedule 10.07.2018


คำตอบ (1)


ฉันคิดว่าคำถามของคุณเกี่ยวกับการเปลี่ยนแปลงทางคณิตศาสตร์มากกว่าโค้ด:

การเปลี่ยนแปลงทุกครั้งสามารถแบ่งย่อยเป็นการแปลง่ายๆ หนึ่งครั้งและการหมุนสามครั้ง (ตามแต่ละแกน) เราจะพิจารณาการแปลเพียง 1 รายการและการหมุนเวียน 1 ครั้งในตอนนี้

เมื่อคุณใช้การหมุน คุณต้องแน่ใจว่าจุดศูนย์กลางของการหมุนคือจุดกำเนิด เช่น 0,0,0

ตัวอย่าง: หากเรามีรูปร่างที่กำหนดโดยสี่จุด P1, P2, P3, P4 และเราต้องการใช้การหมุน (Matrix M) รอบ P1 และการแปล (Vector V)

  1. คุณต้องแปลทุกจุดเพื่อให้ P1 กลายเป็นจุดกำเนิด
  2. ใช้เมทริกซ์ M "ทางซ้าย"
  3. แปลจุดใหม่เพื่อให้ P1 ไปที่ตำแหน่งเดิม
  4. ใช้เวกเตอร์การแปล

Formula1

แน่นอนว่าถ้าจุดศูนย์กลางการหมุนของคุณเป็นอย่างอื่น เช่น พีซี มันจะเป็น:

Formula1

หากคุณต้องการลบล้างการหมุนครั้งก่อน (Matrix M1) และใช้การหมุนใหม่ (Matrix M2) ให้พิจารณาว่า:

Formula2

เกี่ยวกับรหัสของคุณ:

ระมัดระวัง. ในภาษา/ห้องสมุดส่วนใหญ่:

C = A.mulityplymatrix(B)

วิธี

Formula2

ซึ่งอาจแตกต่างจาก:

Formula3

การใช้การแปลก่อนแล้วจึงหมุนเวียนจะทำให้คุณได้รับสิ่งที่แตกต่างอย่างสิ้นเชิงจากการหมุนเวียนก่อนแล้วจึงแปล

person P.Manthe    schedule 11.07.2018