คุณจะแยกการวางแนวจากเมทริกซ์การแปลงได้อย่างไร?


10

ฉันมีเมทริกซ์การแปลง 4x4 M และฉันต้องการค้นหารูปร่างของทรงกลมเมื่อเปลี่ยนโดย M (ทรงกลมอยู่ที่จุดกำเนิดและมีรัศมี 1)

ฉันรู้ว่าฉันสามารถหาจุดศูนย์กลางได้โดยการคูณ M ด้วย (0,0,0,1)

อย่างไรก็ตามรัศมีกลายเป็นปัญหาเนื่องจาก M สามารถบีบและหมุนทรงกลมได้ ฉันจะทราบรัศมีใหม่ของทรงรีที่เกิดขึ้นได้อย่างไร มีวิธีใดบ้างในการค้นหาการปฐมนิเทศ?

โดยเฉพาะอย่างยิ่งฉันจำเป็นต้องรู้ขนาดของทรงกลมที่มีขอบเขตซึ่งจะล้อมรอบทรงกลมที่ถูกเปลี่ยนรูป กล่าวอีกนัยหนึ่งค่าสูงสุดคืออะไร | M * V - M * (0,0,0,1) | โดยที่ V คือเวกเตอร์หน่วย (จุดบนทรงกลมดั้งเดิม)


1
คุณคำนวณความยาวของแกนเวกเตอร์ที่แปลงแล้วไม่ได้หรือ (3 คอลัมน์ของส่วนการหมุนของเมทริกซ์ของคุณ) ทรงกลมที่มีขอบเขตจะมีรัศมีเท่ากับความยาวของเวกเตอร์ที่ยาวที่สุด
บาร์ต

ไม่ฉันไม่คิดว่าถูกต้อง ทิศทางที่ยาวที่สุดอาจไม่จัดแนวแกน (ลองนึกภาพถ้าคุณบีบมันหมุนแล้วบีบอีกครั้งหมุนไปเรื่อย ๆ )
CaptainCodeman

อืมไม่แน่ใจว่ามีความสำคัญ ถ้าฉันสามารถโน้มน้าวตัวเองได้ฉันจะเขียนคำตอบในวันนี้ ;)
บาร์ต

ปัญหาคือถ้าคุณทำการแปลงสเกล, เวกเตอร์ฐานของเมทริกซ์ M ไม่จำเป็นต้องอยู่ด้วยกัน
GPUquant

คำตอบ:


6

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

การใช้ SVD นั้นไม่ได้มีไว้สำหรับคนที่ใจหดหู่เท่านั้นเพราะมันเกี่ยวข้องกับการหาค่าลักษณะเฉพาะ ถ้าสิ่งที่คุณต้องการคือค่าเอกพจน์พวกมันคือค่ารากที่สองของค่าลักษณะเฉพาะของ M ^ T * M ดังนั้นถ้าคุณมีตัวแก้ปัญหาค่าเฉพาะแบบ 3x3 หรือคุณไม่สนใจเขียนมันคุณสามารถใช้มันได้ ถ้าคุณต้องการแยกทิศทางของแกนด้วยเช่นกันมันก็ยิ่งมีส่วนร่วมมากขึ้นเมื่อคุณต้องหาไอเกนวีคเตอร์เช่นกัน ในบทความ Wikipedia นั้นมีรายการลิงก์ไปยังไลบรารี่สำหรับการทำ SVD ซึ่งหนึ่งในนั้นคุณอาจจะสามารถใช้ในโครงการของคุณได้

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


ขอบคุณฉันขอขอบคุณคำตอบอย่างละเอียด การสลายตัวที่ให้ไว้ในคำตอบอื่น ๆ ไม่ทำงานที่ไหน?
CaptainCodeman

2
@CaptainCodeman คำตอบอื่น ๆ ก็คือดูเวกเตอร์แกนที่ถูกแปลง (เช่นคอลัมน์ของเมทริกซ์) เช่นเดียวกับที่ฉันอธิบายไว้ในย่อหน้าที่สาม มันล้มเหลวในกรณีที่มีสเกล nonuniform หลังจากการหมุนเนื่องจากการปรับสเกลนั้นไม่ได้ใช้กับแกนดั้งเดิม
นาธานรีด

2

อาจแยกปัจจัยขนาดจากเมทริกซ์แล้วใช้ค่าสูงสุดของส่วนประกอบ การใช้เมทริกซ์ SRT (การแปลมาตราส่วนการหมุน) คุณสามารถทำสิ่งนี้ได้:

glm::mat4 m = ...;
// Extract col vectors of the matrix
glm::vec3 col1(m[0][0], m[0][1], m[0][2]);
glm::vec3 col2(m[1][0], m[1][1], m[1][2]);
glm::vec3 col3(m[2][0], m[2][1], m[2][2]);
//Extract the scaling factors
glm::vec3 scaling;
scaling.x = glm::length(col1);
scaling.y = glm::length(col2);
scaling.z = glm::length(col3);

float scaleFactor = MAX(scaling.x, MAX(scaling.y, scaling.z));

(ขึ้นอยู่กับhttp://wklej.org/id/950061/ - ชื่อนี้เป็นแบบ decomposeTRS และไม่ย่อยสลาย RT เพราะฉันใช้ชื่อที่เรียงตามลำดับซึ่งเมทริกซ์จะถูกคูณใน OpenGL)

ตอนนี้คุณสามารถเพิ่มรัศมีทรงกลมดั้งเดิมได้โดย scaleFactor และคุณมีขอบเขต จำกัด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.