💾 В двух свежих вертикальных роликах (
https://www.youtube.com/shorts/3KxATaDQ59A, https://www.youtube.com/shorts/QWrGUD11w0g) программировал физику в . Это делается несложно, хотя и неочевидно из-за отсутствия документации. Используются dt-апдейтеры, как показывал в , либо alpha-апдейтеры — делюсь кодом ниже. Его можно оформить в 10-15 строк, но добавил больше переменных для гибкости, а также цикл for i in range(40) для красоты: отражает жёлтые шлейфы. Также любителям Manim рекомендую посмотреть
https://t.me/compmathweekly симпатичной анимации додекаэдра и другие посты по тегу #manim
from manim import *
class HomeworkGravity(Scene):
def construct(self):
g = 9.8
v = 15
run_time = 3
theta = 55
notes = Tex(f"$v_0={v}$ m/s", rf"$\theta={theta}^\circ$")
theta *= DEGREES
self.add(notes.arrange(DOWN))
ball = Circle(0.3).set_fill(WHITE, 1).to_edge(DL, -1)
ball.set_stroke(YELLOW, 1)
ball.start = ball.get_center()
tails = VGroup()
for i in range(40):
def get_traced_point(i=i):
return ball.point_from_proportion(i / 40)
length = np.random.uniform(0.25, 1)
tail = TracedPath(get_traced_point, dissipating_time=length)
tail.set_stroke(YELLOW, 1, [1,0])
tails.add(tail)
def apply_gravity(mob, alpha):
x_0, y_0 = ball.start[:2]
t = run_time * alpha
x = x_0 + v * np.cos(theta) * t
y = y_0 + v * np.sin(theta) * t - 0.5 * g * t ** 2
pos = np.array((x, y, 0))
mob.move_to(pos)
self.add(ball, tails)
self.play(
UpdateFromAlphaFunc(ball, apply_gravity),
rate_func=linear,
run_time=run_time,
)