Физическая симуляция PyGame по какой-то причине все тела движутся с одинаковой скоростью - PullRequest
0 голосов
/ 20 апреля 2020

В настоящее время я прорабатываю некоторые уроки по естественному моделированию в Академии Хана и пытаюсь воспроизвести их код JavaScript в python. В приведенном ниже коде я пытаюсь симулировать гравитацию и ветер на двух разных телах разных масс. Но, хотя в методе apply_force() я делю на массу тел, при запуске симуляции оба тела движутся с одинаковой скоростью. Ветер должен заставлять тело меньшего размера двигаться быстрее, чем тело большего размера, но это не так.

#init pygame library
import pygame
import random

pygame.init()

window_width = 800
window_height = 800

FPS = 500

screen = pygame.display.set_mode([window_width, window_height])

clock = pygame.time.Clock()

running = True

#basic vector class class
class Vector2f:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def add(self, v2):
        self.x = self.x + v2.x
        self.y = self.y + v2.y

    def mult(self, v2):
        self.x = self.x * v2.x
        self.y = self.y * v2.y

#mover class
class Mover:
    def __init__(self, mass, position, velocity, acceleration):
        self.mass = mass
        self.position = position
        self.velocity = velocity
        self.acceleration = acceleration

    def apply_force(self, force):
        f = Vector2f((force.x/float(self.mass)), (force.y/float(self.mass)))
        self.acceleration.add(f)

    def update(self):
        self.velocity.add(self.acceleration)
        self.position.add(Vector2f(self.velocity.x, self.velocity.y))
        self.acceleration.mult(Vector2f(0,0))

    def draw(self):
        pygame.draw.circle(screen, (50, 50, 50), (int(round(self.position.x)),                                         int(round(self.position.y))), self.mass)

    def check_edges(self):
        if self.position.x > window_width:
            self.position.x = window_width
            self.velocity.x = self.velocity.x * -1
        elif self.position.x < 0:
            self.position.x = 0
            self.velocity.x = self.velocity.x * -1

        if self.position.y > window_height:
            self.velocity.y = self.velocity.y * -1
            self.position.y = window_height


m_position = Vector2f(30, 30)
m_velocity = Vector2f(0, 0)
m_acceleration = Vector2f(0, 0)

m1 = Mover(30, m_position, m_velocity, m_acceleration)
m2 = Mover(5, m_position, m_velocity, m_acceleration)


#simulation loop
while running:
    clock.tick(FPS)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    screen.fill((255,255,255))


    wind = Vector2f(.003, 0)
    gravity = Vector2f(0, .005)

    m1.apply_force(wind)
    m1.apply_force(gravity*m1.mass)

    m1.update()
    m1.draw()
    m1.check_edges()

    m2.apply_force(wind)
    m2.apply_force(gravity*m2.mass)

    m2.update()
    m2.draw()
    m2.check_edges()



    pygame.display.flip()


pygame.quit()

Более того, когда я уменьшаю массу движителя меньшего размера (m2), скорость m1 увеличивается.

...