ลูกบอลกระทบมุมมันจะเบี่ยงเบนไปจากไหน


46

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

การชนกัน 2 มิติระหว่างลูกบอลและขอบมุมของวัตถุที่ไม่สามารถเคลื่อนย้ายได้


22
นี่คือสิ่งที่พวกเขาเรียกว่า "กรณีมุม"?
Andrew Grimm

2
แน่นอนว่าเมื่อเวลาผ่านไปเราอาจใช้ทฤษฏีสัมพัทธภาพเพื่อแก้ปัญหา - ปัญหาก็คือมวล (ive)
Lumis

คำตอบ:


45

หมายเหตุ: ทั้งหมดต่อไปนี้จะถือว่าพื้นผิวของลูกไม่มีแรงเสียดทาน (ดังนั้นมันจะไม่เริ่มหมุนหรือเด้งต่างกันเพราะมันเป็น)

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

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

อนุญาต (nDx, nDy) เป็นความเร็วหลังจากการชน, (oDx, oDy) ความเร็วก่อนการชนและ (x, y) ตำแหน่งของลูกบอล ณ จุดชน สมมติว่ามุมที่ลูกชนกันอยู่ที่ (0,0)

แสดงข้อมูลเชิงลึกของเราเป็นสูตรเรามี:

(nDx, nDy) = (oDx, oDy) + c * (x, y)
length (nDx, nDy) = length (oDx, oDy)

ซึ่งเทียบเท่ากับ:

nDx = oDx + c * x
nDy = oDy + c * y
nDx^2 + nDy^2 = oDx^2 + oDy^2

เราจะได้สมการสองสมการแรกในสมการสุดท้าย

(oDx + c * x)^2 + (oDy + c * y)^2 = oDx^2 + oDy^2

การขยายโดยใช้ทวินามทวิภาค

(a+b)^2 = a^2 + 2ab + b^2 

อัตราผลตอบแทน:

oDx^2 + 2 * oDx * c * x + (c * x) ^ 2 + oDy^2 + 2 * oDy * c * y + (c * y) ^ 2 = oDx^2 + oDy^2
2 * oDx * c * x + 2 * oDy * c * y + (c * x) ^ 2 + (c * y) ^ 2 = 0
(2 * oDx * x + 2 * oDy * y) * c + (x^2 + y^2) * c^2 = 0

สมการกำลังสองนี้cมีสองวิธี, หนึ่งในนั้นคือ 0 เห็นได้ชัดว่านั่นไม่ใช่ทางออกที่เราสนใจโดยทั่วไปทิศทางของลูกบอลจะเปลี่ยนไปเนื่องจากการชน ในการรับโซลูชันอื่นเราแบ่งทั้งสองด้านด้วย c และรับ:

(2 * oDx * x + 2 * oDy * y) + (x^2 + y^2) * c = 0

นั่นคือ:

 c = -(2 * oDx * x + 2 * oDy * y) / (x^2 + y^2)

เพื่อสรุปเรามี:

c = -(2 * oDx * x + 2 * oDy * y) / (x^2 + y^2)
nDx = oDx + c * x
nDy = oDy + c * y

แก้ไข : ในรหัส:

if (collision) {
    float x = ballX - cornerX;
    float y = ballY - cornerY;
    float c = -2 * (ballDx * x + ballDy * y) / (x * x + y * y);
    ballDx = ballDx + c * x;
    ballDy = ballDy + c * y;
}

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

แก้ไข 2: การคำนวณจุดกระทบ

ให้ r คือรัศมี (x0, y0) ตำแหน่งและ (dx, dy) ความเร็วของลูกบอลที่จุดเริ่มต้นของขั้นตอนการจำลอง เพื่อความง่ายเราจะสมมติว่ามุมที่มีปัญหานั้นอยู่ที่ (0,0)

พวกเรารู้:

(x,y) = (x0, y0) + (dx, dy) * t

พวกเราต้องการ

length(x,y) = r

นั่นคือ

(x0 + dx * t) ^ 2 + (y0 + dy * t) ^ 2 = r^2
x0^2 + 2 * x0 * dx * t + dx^2 * t^2 + y0^2 + 2 * y0 * dy * t + dy^2 * t^2 = r ^ 2
(dx^2 + dy^2) * t^2 + (2 * x0 * dx + 2 * y0 * dy) * t + (x0^2 + y0^2 - r^2) = 0
\____  _____/         \____________  ___________/       \_______  ________/
     \/                            \/                           \/
     a                             b                            c

นั่นคือสมการกำลังสองใน t หากเลือกปฏิบัติได้

D = b^2 - 4 * a * c

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

t1 = (-b - sqrt(D)) / (2 * a)
t2 = (-b + sqrt(D)) / (2 * a)

t1เรามีความสนใจในเวลาที่การปะทะกันเริ่มต้นซึ่งเป็นเวลาก่อนหน้านี้

วิธีการของคุณจะกลายเป็น:

    // compute a,b,c and D as given above

    if (D >= 0) {
        t = (-b - sqrt(D)) / (2 * a);
        if (0 < t && t <= ts) {
            // collision during this timestep!

            x = x + t * dx;
            y = y + t * dy;
            ts = ts - t;

            // change dx and dy using the deflection formula 
        }
    }

    x = x + ts * dx;
    y = y + ts * dy;

1
สิ่งนี้สมควรได้รับ +1
ไดนามิก

1
รู้สึกฟรีเพื่อ
โหวต

3
คุณพูดเร็วมากว่าAt the moment of collision, the ball will be touching the cornerแต่ฉันไม่เห็นเหตุผลของการประมาณนี้ (และมันต้องเป็นการประมาณค่าเพราะมันไม่เป็นความจริง - ลูกบอลถูกสัมผัสในสองแห่งซึ่งไม่ใช่มุม)
Peter Taylor

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

1
รักคำตอบนี้ แต่มันสามารถใช้เครื่องหมาย $ \ LaTeX $ ของคณิตศาสตร์ได้
Martin Wickman

13

นี่คือวิธีการมองปัญหา

ชุดปัญหาดั้งเดิมคือวงกลมกับสี่เหลี่ยมผืนผ้า (สีเทาในภาพด้านล่าง) สิ่งนี้เทียบเท่ากับจุดเทียบกับการปัดสี่เหลี่ยม (แสดงด้วยสีดำ)

นี่เป็นปัญหาหลายส่วน คุณกำลังทดสอบการชนกันของจุดกับ 4 บรรทัด (แผ่ออกมาจากขอบกล่องตามรัศมีของวงกลมเดิม) และ 4 วงกลม (ที่มุมของสี่เหลี่ยมผืนผ้าที่มีรัศมีเดียวกันกับวงกลมเดิม)

ด้วยความเร็วคร่าวๆในภาพต้นฉบับของคุณจุดนั้นจะชนกับวงกลมมุมล่างขวา สิ่งที่คุณต้องทำคือหาจุดบนวงกลมมุมที่คุณจะตีคำนวณมุมของมันและสะท้อนออกมา

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

ฉันจะปล่อยให้รากศัพท์ของสิ่งนั้นเป็นแบบฝึกหัดให้กับผู้อ่าน


2

ฉันกำลังเล่นเกมและติดอยู่ที่นี่ แต่ฉันเดาว่ามันจะเป็นแบบนี้:

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

มีอีกมุมมอง ปัญหาของฉันคือฉันไม่รู้วิธีคำนวณ dx ใหม่ dy (สำหรับฉันโดยใช้คณิตศาสตร์แบบดั้งเดิมต้องการการคำนวณมากเกินไป)


มุมมองของฉันแตกต่างจากลิงค์ที่ 2 เนื่องจากฉันไม่คิดว่าเวกเตอร์ความเร็วใหม่ขึ้นอยู่กับจุดศูนย์กลางของบล็อกเช่นนั้น พี่ชายของฉันบอกฉันว่าลูกบอลจะเด้งกลับไปในทิศทางเดิม (dx = -dx && dy = - dy) แต่ฉันไม่คิดอย่างนั้น
Risa

หากลูกบอลกระทบมุมและระยะ ballX จากมุม X น้อยกว่า 1/4 ของลูกบอล W มันจะเด้งกลับมามิฉะนั้นลูกบอลจะเบี่ยงเบนไปทางขวา นี่เป็นแบบง่าย ๆ ที่ฉันใช้อยู่ในขณะนี้ซึ่งไม่ได้รับการปรับแต่งเพื่อค้นหามุมที่แน่นอน
Lumis

0

จลนศาสตร์คือทั้งหมดที่เกี่ยวกับการเลือกที่ถูกต้องในขณะที่ส่วนใหญ่สะดวกสำหรับการคำนวณกรอบของการอ้างอิง

ที่นี่เราจะกำหนดการแปลงTที่แก้ไขแกนของเราเป็นส่วนประกอบขนาน ( x ' ) และตั้งฉาก ( y' ) เป็นเส้นแบ่งระหว่างศูนย์กลางของลูกและมุม การแปลงผกผันT *จะคืนค่าระบบพิกัดเดิมของเรา

ในกรอบการอ้างอิงใหม่นี้โดยการสะท้อน (และสมมาตรของเวลาและพื้นที่ของฟิสิกส์) เรามีการแปลงความเร็วของการติดต่อM ( จุดกระตุ้น ) เป็นสิ่งที่ย้อนกลับองค์ประกอบของ xและเปลี่ยนองค์ประกอบของ y ' ในแง่เมทริกซ์นี่คือเมทริกซ์ทแยงมุมที่มี -1 และ 1 อยู่บนเส้นทแยงมุม

จากนั้นความเร็วหลังจากการปะทะกันเป็นเพียง: V' = T * . . Vo .

เวลาของผลกระทบทีหลังจากนั้นก็เป็นเพียงการแก้ปัญหาสำหรับ ( T . Do ) + ( X . ที . Vo ) ( T ) = Rที่Xเป็นผู้ประกอบการฉายแกน X และRคือรัศมีของลูกบอล จัดใหม่เราได้รับ
T = ( R - ( T . Do )) / (( X . ที . Vo ) ( T ))

สิ่งนี้มีข้อได้เปรียบที่แตกต่างจากการฝังคณิตศาสตร์ที่ซับซ้อนทั้งหมดในไลบรารีกราฟิกมาตรฐานที่เขียนอย่างเข้มงวดทดสอบและดีบั๊กอย่างเข้มงวด วิธีการแก้ปัญหานี้ยังเหมือนกันสำหรับสถานการณ์ 2D และ 3D - เพียงแค่สลับไลบรารีกราฟิก ในที่สุดมันก็ไฮไลท์ที่ว่าเราควรนึกถึงกรอบอ้างอิงที่เหมาะสมก่อนที่จะจัดการกับปัญหาฟิสิกส์ใด ๆ มีสิ่งล่อใจจาก NIH เสมอ แต่ในความจริงแล้วเป็นเพียงสูตรสำหรับข้อบกพร่องเมื่อมีวิธีแก้ปัญหาที่กระชับกว่านี้

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