我怎样才能让我的圆圈自然移动而不是在它们碰撞时不受重力影响?

问题描述

我正在尝试进行一个简单的物理模拟,但是这些圆圈会在与另一个圆圈碰撞时失去所有重力并粘在一起,这使得平衡它们非常容易,但它看起来非常不自然,使您能够做结构像 this 一样违反物理定律。

代码

from pygame.locals import *
import pygame
import sys

pygame.init()

green = (0,255,0)
circles = []
gravity = 1

def input():
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.MOUSEBUTTONDOWN:
            circles.append(list(event.pos))

def boundaries():
    for circle_pos in circles:
        if circle_pos[1] > 495:
            boundaries = circle_pos[1] - 495
            circle_pos[1] -= boundaries
        if circle_pos[0] < 5:
            boundaries2 = circle_pos[0]
            circle_pos[0] += boundaries2
        if circle_pos[0] > 995:
            boundaries3 = circle_pos[0] - 995
            circle_pos[0] -= boundaries3


def collision():
    for i,circle_pos_1 in enumerate(circles):
        for circle_pos_2 in circles[i + 1:]:
            dx = circle_pos_2[0] - circle_pos_1[0]  # circle_pos_2 = y val
            dy = circle_pos_2[1] - circle_pos_1[1]
            if dx * dx + dy * dy < 10 * 10:
                circle_pos_2[1] -= gravity
    for circle_pos in circles:
        pygame.draw.circle(screen,green,circle_pos,5)


def wind():
    for circle_pos in circles:
        wind = 0
        for i in range(2):
            wind += 0.01
            circle_pos[0] -= wind


clock = pygame.time.Clock()
screen = pygame.display.set_mode((1000,500))
while True:
    screen.fill((15,15,15))

    input()
    mouse_pos = pygame.mouse.get_pos()

    for circle_pos in circles:
        circle_pos[1] += gravity
    boundaries()

    collision()

    pygame.display.update()
    clock.tick(120)

解决方法

我不懂 Python,但似乎在 collision() 中您明确指出,如果 Circle 1 和 Circle 2 碰撞(或重叠),则为 Circle 2 减轻重力。 这自然会导致圆圈像雪花一样粘在一起。如果你想让它们相互滚降,你必须改变这个函数。

我建议你从一个更简单的问题开始:一个圆和一个斜面。您似乎已经假设下落的圆圈应该具有恒定速度,就像鹅卵石在水中下沉一样;将其扩展到在倾斜平面上滑动的一种简单方法是让圆滑动的速度随角度的正弦变化。

有些捷径是可能的,但如果最后一段对你来说没有意义,那么你必须复习三角学和基础物理学。 如果不了解一些基本的物理知识,你就不可能让这个程序运行起来。