एक सरल पूल गेम के लिए जहां स्पिन को मॉडल नहीं किया जाता है एल्गोरिथ्म काफी सरल है।
- यदि कोई टक्कर होती है, तो यह जांचने के लिए कि क्या गेंदों के बीच की दूरी उनकी त्रिज्या के योग से छोटी है।
- प्रभाव की सामान्य गणना करें
- प्रभाव अंतर, सामान्य, प्रभाव गुणांक और द्रव्यमान के आधार पर प्रभाव बल की गणना करें
- दोनों गेंदों पर प्रभाव बल लागू करें
छद्म कोड में यह बन जाता है:
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
}
}
आप एल्गोरिथ्म से द्रव्यमान को छोड़ सकते हैं यदि सभी गेंदों में समान द्रव्यमान है और पूल गेम के लिए सभी गेंदों के लिए निरंतर त्रिज्या मान लेते हैं, लेकिन कोड आपके लिए उन सरलीकरणों के बिना अधिक उपयोगी होगा।
कोड इस ट्यूटोरियल पर आधारित है , लेकिन मुझे याद है कि आवेग गुणन वहां गलत था।