Я пытаюсь сделать анимацию, в которой два магнита (отталкивающие друг друга) падают во вращающуюся трубу. У меня есть падающая (гравитационная) бита и вращение вниз, но у меня проблемы с магнитными силами. Уравнение для силы, которое я использую, это (магнитная сила магнита 1 x магнитная сила магнита 2)/(расстояние между магнитами)^2. В основном сила силы уменьшается пропорционально квадрату расстояния между магнитами. Цель состоит в том, чтобы магниты отталкивались друг от друга, поскольку одни и те же полюса обращены друг к другу. Я считаю, что неправильно использую команду apply_force_at_local_point. Я особенно не уверен в обновлении направлений сил x и y в команде apply_force_at_local_point.
Для этого совсем не обязательно знать физику. Спасибо за помощь в продвижении
import pymunk
import pymunk.pygame_util
import pygame
import numpy as np
GRAY = (220, 220, 220)
width_mass=48
height_mass=48
charges=[10000,-10000] #magnet strengths
pygame.init()
size = 800,600
screen = pygame.display.set_mode(size,pygame.FULLSCREEN)
draw_options = pymunk.pygame_util.DrawOptions(screen)
space = pymunk.Space()
space.gravity = (0,-900)
pts = [(-27, -238.5), (27,-238.5), (27,238.5), (-27,238.5)] #enpoints of the endlessly rotating rectangle
body_type=pymunk.Body(body_type=pymunk.Body.KINEMATIC)
body_type.position = (400, 263.5)
space.add(body_type)
for i in range(4):
segment = pymunk.Segment(body_type, pts[i], pts[(i+1)%4], 2)
space.add(segment)
body_type.angular_velocity=1 #rotation speed
class Rectangle:
def __init__(self, rect_mass, pos,size=(80, 50)):
self.body = pymunk.Body(mass=rect_mass)
self.body.position = pos
shape = pymunk.Poly.create_box(self.body, size)
shape.density = 0.1
space.add(self.body, shape)
mass_1 = Rectangle(rect_mass=1,pos=(400,473),size=(50,50))
mass_2 = Rectangle(rect_mass=1,pos=(400,420),size=(50,50))
masses=[mass_1,mass_2]
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill(GRAY)
space.debug_draw(draw_options)
pygame.display.update()
space.step(0.01)
temp=[] #collecting the positions of all masses in one place
for mass in masses:
temp.append(mass.body.position)
if len(masses)==2:
rel_dist=np.sqrt((temp[1][1]-temp[0][1])**2+(temp[1][0]-temp[0][0])**2) #euclidean distance between magnets
mag_force=charges[0]*charges[1]/(rel_dist**2 + 0.00001) #force = magnet1*magnet2/dist of the magnets^2
masses[0].body.apply_force_at_local_point(
(mag_force*(temp[1][0]-temp[0][0]),
mag_force*(temp[1][1]-temp[0][1])),
(masses[0].body.position.x,masses[0].body.position.y)) #this needs to be fixed
masses[1].body.apply_force_at_local_point(
-1*(mag_force*(temp[1][0]-temp[0][0]),
mag_force*(temp[1][1]-temp[0][1])),
(masses[1].body.position.x,masses[1].body.position.y)) #this needs to be fixed
pygame.quit()