ฉันจะแก้ไขวัตถุ“ popping” หรือ jittering ในเอ็นจินฟิสิกส์ได้อย่างไร


11

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

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

ฉันต้องการแก้ไขสิ่งนี้โดยการเรียงลำดับวัตถุตามพิกัด y ของพวกเขาดังนั้นการชนจึงได้รับการแก้ไขจากล่างขึ้นบน แต่ตอนนี้เอ็นจิ้นแสดงพฤติกรรมการเต้นแปลก ๆ สำหรับวัตถุที่ควรจะพัก (ดู gif)

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

หากไม่ได้ให้ซอร์สโค้ดแก่คุณคุณจะทำอย่างไร


5
สรุปทั้งหมดนี้คล้ายกับการแก้ระบบเชิงเส้นของสมการในลักษณะวนซ้ำ (หรือระบบไม่เชิงเส้นขึ้นอยู่กับข้อ จำกัด / เงื่อนไข / ฯลฯ ) ไม่ว่าในกรณีใดคุณจะเห็นสิ่งประดิษฐ์เหล่านี้เพราะมันเป็นตัวเลขที่ถูกต้องที่จะดู: สถานะสื่อกลางของกระบวนการบรรจบกัน การหลีกเลี่ยงปัญหานี้ค่อนข้างยากและอาจบ่งบอกถึงการแฮ็กที่น่ารังเกียจมากมาย (อย่างไรก็ตามสิ่งนี้เกิดขึ้นในชีวิตจริงในระดับโมเลกุลและนั่นคือสิ่งที่คุณมีเพื่อคล้ายกับบางสิ่งบางอย่างในชีวิตจริง :)) มันอาจจะดีที่จะตรวจสอบ box2d เพื่อดูวิธีแก้ปัญหาของพวกเขาสำหรับการเปลี่ยนแปลงตามแรงกระตุ้น
Teodron

@TravisG คุณแก้ปัญหาได้อย่างไร? ฉันกำลังดูปัญหาที่คล้ายกันเมื่อพยายามใช้เครื่องมือทางฟิสิกส์ที่ง่ายมาก
ชีส

1
@ cheeesus เป็นเวลานานแล้วที่ข้าเริ่มทำงาน แต่ฉันเชื่อว่าฉันใช้การวนซ้ำที่มากขึ้นด้วยการประทับเวลาที่น้อยลง
TravisG

คำตอบ:


5

ทางออกหนึ่งที่ฉันพบเมื่อใช้การแก้ไขตำแหน่งคือมีการวนซ้ำสองสามครั้งและเปลี่ยนความแข็งแรงของการวนซ้ำแต่ละครั้ง

doPhysics();

int num_iterations = 5;
for(int iteration=0; iteration<num_iterations; ++iteration)
{
    float strength = float(iteration+1)/num_iterations;
    correctPositions(strength);
}

ดังนั้นการวนซ้ำครั้งแรกมีความแรง 1 / num_iterations และสุดท้ายมีความแรง 1 ทำให้การจำลองของฉันราบรื่นและมีเสถียรภาพมากกว่าเพียงใช้การวนซ้ำที่มีจำนวนคงที่


2
วิธีแก้ปัญหาที่ดี แต่ทำไมมันถึงทำงาน
Gustavo Maciel

5

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

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

เอนจิ้นฟิสิกส์เรียกค่านี้ว่า "slop"

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


0

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

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