สำหรับเกมพูลแบบง่าย ๆ ที่ไม่มีการสปินแบบอัลกอริทึมนั้นค่อนข้างง่าย
- ในการตรวจสอบว่ามีการชนกันหรือไม่ให้ตรวจสอบว่าระยะห่างระหว่างลูกบอลนั้นน้อยกว่าผลรวมของรัศมีหรือไม่
- คำนวณผลกระทบปกติ
- คำนวณแรงกระแทกโดยพิจารณาจากความแตกต่างของความเร็วปกติสัมประสิทธิ์แรงกระแทกและมวลชน
- ใช้แรงกระแทกกับลูกบอลทั้งสอง
ในรหัสเทียมจะกลายเป็น:
vector difference = ball2.position - ball1.position
float distance = sqrt(difference)
if (distance < ball1.radius + ball2.radius) {
vector normal = difference / distance
//vector velocityDelta = ball2.velocity - ball1.velocity
vector velocityDelta = ball1.velocity - ball2.velocity
float dot = dotProduct(velocityDelta, normal)
if (dot > 0) {
float coefficient = 0.5
float impulseStrength = (1 + coefficient) * dot * (1 / ball1.mass + 1 / ball2.mass)
vector impulse = impulseStrength * normal
ball1.velocity -= impulse / ball1.mass
ball2.velocity += impulse / ball2.mass
}
}
คุณสามารถละมวลจากอัลกอริทึมถ้าลูกบอลทั้งหมดมีมวลเท่ากันและยังถือว่ารัศมีคงที่สำหรับลูกบอลทั้งหมดสำหรับเกมพูล แต่รหัสจะมีประโยชน์มากขึ้นสำหรับคุณโดยไม่ต้องทำให้ง่ายขึ้น
รหัสนี้เป็นไปตามบทช่วยสอนนี้แต่ฉันจำได้ว่าการคูณแรงกระตุ้นนั้นไม่ถูกต้อง