การคำนวณความเฉื่อยเทนเซอร์


10

คำถามที่ซับซ้อนและยาวนิดหน่อยที่ฉันจะยอมรับฉันยังไม่ค่อยเข้าใจดีนักดังนั้นฉันจะพยายามอธิบายให้ดีที่สุดเท่าที่จะทำได้

เวอร์ชั่นย่อ:มีสูตร c ++ / physx ทั่วไปที่นั่นเพื่อคำนวณแรงเฉื่อยเทนเซอร์ตามรูปร่างของวัตถุหรือไม่?

รุ่นยาว: สำหรับฟิสิกส์ของเราเราต้องระบุเทนเซอร์แรงเฉื่อย x, y และ z ในปัจจุบันวิธีที่เราทำมันก็แค่อัตราส่วนตามมวล ดังนั้นหากวัตถุยาวบนแกน X และบางบน Y และ Z และมวลเป็น 10,000 เราจะตั้งค่า Z และ Y เป็น 7000 และ X ถึง 3000 (นี่ไม่แน่นอน แต่เพื่อให้ความคิด)

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

สิ่งที่ฉันกำลังทำคือฟังก์ชั่นที่จะใช้กล่องขอบเขตของวัตถุและหวังว่าจะคำนวณเมตริกซ์ที่ค่อนข้างแม่นยำ ฉันใช้คณิตศาสตร์บางส่วนจากhttp://en.wikipedia.org/wiki/List_of_moment_of_inertia_tensorsและสร้างฟังก์ชั่นที่ทำงานคล้ายกับการหมุนข้างล่างนี้

ทรงลูกบาศก์ทึบที่มีความกว้าง w, สูง h, ลึก d และมวล m ป้อนคำอธิบายรูปภาพที่นี่

หรือถ้าการหมุนสิ้นสุดแล้วเช่นนี้

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นนี่ดูเหมือนจะให้ผลลัพธ์ที่คล้ายกับวิธีที่เราทำ แต่ฉันไม่ต้องการเปลี่ยนมาใช้วิธีนี้โดยไม่ทำให้แน่ใจว่ามันจะใช้งานได้ทั่วไป ด้านล่างเป็นรหัสสำหรับฟังก์ชั่นของฉันตามภาพแรกที่มีลูกบาศก์และเดือยกลาง

NxVec3 CalculateInertiaTensor( VisBoundingBox_cl boundingBox, float m )
{
    float width = boundingBox.GetSizeX();
    float height = boundingBox.GetSizeZ();
    float depth = boundingBox.GetSizeY();

    float xTensor = 0.083f * m*(height*height + depth*depth);
    float yTensor = 0.083f * m*(width*width + depth*depth);
    float zTensor = 0.083f * m*(width*width + height*height);

    return NxVec3(xTensor, yTensor, zTensor);
}

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


3
หากคุณสามารถย่อยสลายวัตถุของคุณเป็น tetrahedra คุณควรใช้ linearity ของเมตริกซ์พร้อมกับสูตรพื้นฐานสำหรับโมเมนต์ความเฉื่อยของ tetrahedron (คุณสามารถหาสิ่งนี้กับ Wolfram Alpha เป็นต้น) เพื่อคำนวณหาค่าที่แน่นอน เมตริกซ์ ความกังวลของฉันเกี่ยวกับวิธีขอบเขตกล่องจะเป็นจริงขึ้นอยู่กับว่า BB ของคุณเต็มไปด้วยวัตถุเท่าใด ลองจินตนาการถึงความแตกต่างระหว่างไข่ปลาไขมันกับสปริงขดเรียว
Steven Stadnicki

ขอบคุณสำหรับการป้อนข้อมูล และคุณถูกต้องปัญหาหลักของฉันเกิดขึ้นเมื่อมีพูดรูปวัตถุ 'A' BB จะทำให้เทนเซอร์กลับมาอย่างไม่ถูกต้อง ฉันจะตรวจสอบข้อมูลของคุณขอบคุณ!
Mungoid

คุณยินดีต้อนรับ - หากคุณต้องการให้ฉันอธิบายรายละเอียดเพิ่มเติมนี้ฉันควรจะสามารถสร้างคำตอบที่ถูกต้องจากมัน แต่นั่นควรจะเพียงพอสำหรับคุณในการเริ่มต้น
Steven Stadnicki

หากคุณยินดีที่จะเป็นที่น่ากลัว! ฉันพยายามคิดเรื่องนี้มาระยะหนึ่งแล้ว แต่ฉันยังรู้สึกว่ามีบางสิ่งบางอย่างอยู่ในบริเวณนี้ดังนั้นฉันจึงทำให้ตัวเองสับสนมากขึ้นเรื่อย ๆ = -)
Mungoid

คำตอบ:


7

ฉันจะแนะนำว่านี่เป็นปัญหาที่ยากเพราะสูตรปกติตามการใช้ทฤษฎีบทของกรีนในการแปลงอินทิกรัลปริมาตรเป็นอินทิกรัลผิวไม่ได้ใช้ดังนั้นคุณต้องทำการสลายตัว tetrahedral ของคุณ - แต่มันเปลี่ยน ว่ามันไม่ถูกต้อง ตราบใดที่รูปร่างของคุณมีความหนาแน่นเท่ากัน (ซึ่งเป็นการประมาณที่คุณทำอยู่แล้วสันนิษฐานและเหมาะสมอย่างยิ่งสำหรับสถานการณ์ส่วนใหญ่) ดังนั้นอินทิกรัลปริมาตรก็สามารถทำให้อินทิกรัผิวเรียบง่ายได้ ยังดีกว่าดูเหมือนจะมีอัลกอริธึมที่ดูดีและมีรหัสในเน็ตเพื่อทำสิ่งนี้ ดูที่http://www.cs.berkeley.edu/~jfc/mirtich/massProps.html, หน้าของ Brian Mirtich อธิบายอัลกอริทึมของเขาสำหรับการคำนวณช่วงเวลาและศูนย์กลางของมวล มันควรจะครอบคลุมทุกความต้องการของคุณในหน้านี้ โปรดทราบว่านี่เป็นสิ่งที่คุณต้องการทำครั้งเดียวไม่ว่าจะเป็นเครื่องมือในการส่งออกรูปร่างหรือเวลานำเข้า แต่ไม่ใช่สิ่งที่คุณต้องทำทุกเฟรม เพียงเก็บความเฉื่อยเทนเซอร์เกี่ยวกับจุดศูนย์กลางของมวลพร้อมกับข้อมูลรูปร่างที่เหลือและถ้าคุณต้องการหาเมตริกซ์สำหรับช่วงเวลาของความเฉื่อยเกี่ยวกับแกนอื่น ๆ จากนั้นคุณสามารถใช้ทฤษฎีบทมาตรฐานเพื่อให้ได้มา

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


4

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

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


0

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

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

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