คำถามที่ซับซ้อนและยาวนิดหน่อยที่ฉันจะยอมรับฉันยังไม่ค่อยเข้าใจดีนักดังนั้นฉันจะพยายามอธิบายให้ดีที่สุดเท่าที่จะทำได้
เวอร์ชั่นย่อ:มีสูตร 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และสร้างฟังก์ชั่นที่ทำงานคล้ายกับการหมุนข้างล่างนี้
หรือถ้าการหมุนสิ้นสุดแล้วเช่นนี้
ดังนั้นนี่ดูเหมือนจะให้ผลลัพธ์ที่คล้ายกับวิธีที่เราทำ แต่ฉันไม่ต้องการเปลี่ยนมาใช้วิธีนี้โดยไม่ทำให้แน่ใจว่ามันจะใช้งานได้ทั่วไป ด้านล่างเป็นรหัสสำหรับฟังก์ชั่นของฉันตามภาพแรกที่มีลูกบาศก์และเดือยกลาง
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);
}
ฉันไม่สามารถรับประกันได้ว่านี่เป็นวิธีที่ถูกต้องที่จะทำ (เป็นวิธีที่แม่นยำที่สุดคือการใช้รูปร่างจริงแทนที่จะเป็นกล่องที่มีขอบเขต) และฉันไม่คุ้นเคยกับความเฉื่อยของเมตริกซ์และคณิตศาสตร์ แต่ดูเหมือนว่าจะคืนค่าตัวเลข ค่อนข้างคล้ายกับสิ่งที่เราใช้ ทุกคนที่นี่รู้ว่ามีวิธีที่ดีกว่าในการทำเช่นนี้?