pyopengl实现二维小球碰撞,蓄力增加初速度,不考虑重力,给出代码和注释
时间: 2024-02-27 12:57:44 浏览: 95
好的,下面是一份基于PyOpenGL实现二维小球碰撞和蓄力增加初速度的代码和注释。
```python
from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *
import math
# 窗口大小和位置
windowWidth = 800
windowHeight = 600
windowPosX = 100
windowPosY = 100
# 球的半径和初始位置
ballRadius = 30
ballPosX = windowWidth / 2
ballPosY = windowHeight / 2
# 球的初始速度和加速度
ballSpeedX = 0
ballSpeedY = 0
ballAccX = 0
ballAccY = 0
# 蓄力的最大时间和当前时间
maxChargeTime = 2
currentChargeTime = 0
# 碰撞检测函数
def checkCollision(ball1PosX, ball1PosY, ball1Radius, ball2PosX, ball2PosY, ball2Radius):
distance = math.sqrt((ball1PosX - ball2PosX) ** 2 + (ball1PosY - ball2PosY) ** 2)
return distance < (ball1Radius + ball2Radius)
# 碰撞处理函数
def handleCollision():
global ballSpeedX, ballSpeedY, ballAccX, ballAccY
# 碰撞后速度反向
ballSpeedX = -ballSpeedX
ballSpeedY = -ballSpeedY
# 碰撞后加速度为0
ballAccX = 0
ballAccY = 0
# 绘制函数
def draw():
global ballPosX, ballPosY, ballSpeedX, ballSpeedY, ballAccX, ballAccY, currentChargeTime
# 清空颜色缓冲区和深度缓冲区
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
# 绘制小球
glColor3f(1.0, 0.0, 0.0)
glBegin(GL_TRIANGLE_FAN)
glVertex2f(ballPosX, ballPosY)
for i in range(361):
angle = math.pi * i / 180
x = ballPosX + ballRadius * math.cos(angle)
y = ballPosY + ballRadius * math.sin(angle)
glVertex2f(x, y)
glEnd()
# 更新小球位置和速度
ballPosX += ballSpeedX
ballPosY += ballSpeedY
ballSpeedX += ballAccX
ballSpeedY += ballAccY
# 边界检测
if ballPosX - ballRadius < 0:
ballPosX = ballRadius
ballSpeedX = -ballSpeedX
elif ballPosX + ballRadius > windowWidth:
ballPosX = windowWidth - ballRadius
ballSpeedX = -ballSpeedX
if ballPosY - ballRadius < 0:
ballPosY = ballRadius
ballSpeedY = -ballSpeedY
elif ballPosY + ballRadius > windowHeight:
ballPosY = windowHeight - ballRadius
ballSpeedY = -ballSpeedY
# 碰撞检测和处理
if checkCollision(ballPosX, ballPosY, ballRadius, windowWidth / 2, windowHeight / 2, ballRadius):
handleCollision()
# 更新蓄力时间和加速度
if currentChargeTime < maxChargeTime:
currentChargeTime += 0.01
ballAccX = currentChargeTime
ballAccY = currentChargeTime
# 刷新屏幕
glutSwapBuffers()
# 初始化函数
def init():
# 设置窗口大小和位置
glutInitWindowSize(windowWidth, windowHeight)
glutInitWindowPosition(windowPosX, windowPosY)
# 创建窗口
glutCreateWindow("PyOpenGL 2D Ball Collision")
# 设置绘制函数
glutDisplayFunc(draw)
# 设置定时器函数
glutTimerFunc(10, update, 0)
# 设置背景颜色为白色
glClearColor(1.0, 1.0, 1.0, 1.0)
# 定时器函数
def update(value):
glutPostRedisplay()
glutTimerFunc(10, update, 0)
# 主函数
def main():
# 初始化OpenGL
glutInit()
# 初始化窗口
init()
# 进入主循环
glutMainLoop()
if __name__ == '__main__':
main()
```
注释已经写在代码里面了,不过这里再说明一下几个关键点:
1. 碰撞检测函数使用勾股定理计算两个小球之间的距离,如果距离小于两个小球半径之和,则认为发生了碰撞。
2. 碰撞处理函数将小球速度反向,并将小球加速度设为0。
3. 绘制函数中,通过glBegin和glEnd函数绘制了一个实心圆,其中球的每个顶点坐标通过极坐标计算得出。
4. 蓄力的加速度随着时间线性增加,最大时间为maxChargeTime。
5. 定时器函数update用于定时刷新屏幕,每10毫秒刷新一次。
阅读全文