mirror of
https://github.com/3b1b/manim.git
synced 2025-08-05 16:49:03 +00:00
Finished first pass of multilayered glass scenes
This commit is contained in:
parent
9d94337d99
commit
55fb146400
1 changed files with 125 additions and 7 deletions
|
@ -30,8 +30,8 @@ from brachistochrone.curves import *
|
|||
#v_1, v_2, v_3
|
||||
#proportional to sqrt y_1, y_2, y_3
|
||||
#limiting process
|
||||
|
||||
#show sliding object and light
|
||||
|
||||
#which path is fastest
|
||||
#instantaneously obey snell's law
|
||||
|
||||
|
@ -264,25 +264,143 @@ class LimitingProcess(MultilayeredScene):
|
|||
self.get_layers((2**x)*self.n_layers)
|
||||
for x in range(num_iterations)
|
||||
]
|
||||
aligned_layer_sets = [
|
||||
glass_sets = [
|
||||
Mobject(*[
|
||||
Mobject(
|
||||
*layer_sets[x][(2**x)*index:(2**x)*(index+1)]
|
||||
).ingest_sub_mobjects()
|
||||
)
|
||||
for index in range(self.n_layers)
|
||||
])
|
||||
]).ingest_sub_mobjects()
|
||||
for x in range(num_iterations)
|
||||
]
|
||||
aligned_layer_sets.append(self.get_continuous_glass())
|
||||
curr_set = aligned_layer_sets[0]
|
||||
glass_sets.append(self.get_continuous_glass())
|
||||
for glass_set in glass_sets:
|
||||
glass_set.sort_points(lambda p : p[1])
|
||||
curr_set = glass_sets[0]
|
||||
self.add(curr_set)
|
||||
for layer_set in aligned_layer_sets[1:]:
|
||||
for layer_set in glass_sets[1:]:
|
||||
self.dither()
|
||||
self.play(Transform(curr_set, layer_set))
|
||||
self.dither()
|
||||
|
||||
|
||||
|
||||
class ShowLightAndSlidingObject(MultilayeredScene, TryManyPaths, PhotonScene):
|
||||
CONFIG = {
|
||||
"show_time" : False,
|
||||
"dither_and_add" : False,
|
||||
"RectClass" : FilledRectangle
|
||||
}
|
||||
def construct(self):
|
||||
glass = self.get_continuous_glass()
|
||||
self.play(ApplyMethod(glass.fade, 0.3))
|
||||
self.freeze_background()
|
||||
|
||||
paths = self.get_paths()
|
||||
for path in paths:
|
||||
if path.get_height() > self.total_glass_height:
|
||||
path.stretch(0.7, 1)
|
||||
path.shift(self.top - path.get_top())
|
||||
path.rgbs[:2] = 0
|
||||
loop = paths.pop(1) ##Bad!
|
||||
randy = Randolph()
|
||||
randy.scale(RANDY_SCALE_VAL)
|
||||
randy.shift(-randy.get_bottom())
|
||||
photon_run = self.photon_run_along_path(
|
||||
loop,
|
||||
rate_func = lambda t : smooth(t, 3),
|
||||
run_time = 4.1
|
||||
)
|
||||
text = self.get_text().to_edge(UP, buff = 0.2)
|
||||
|
||||
self.play(ShowCreation(loop))
|
||||
self.dither()
|
||||
self.play(photon_run)
|
||||
self.remove(photon_run.mobject)
|
||||
randy = self.slide(randy, loop)
|
||||
self.add(randy)
|
||||
self.dither()
|
||||
self.remove(randy)
|
||||
self.play(ShimmerIn(text))
|
||||
for path in paths:
|
||||
self.play(Transform(
|
||||
loop, path,
|
||||
path_func = path_along_arc(np.pi/2),
|
||||
run_time = 2
|
||||
))
|
||||
|
||||
|
||||
class ContinuouslyObeyingSnellsLaw(MultilayeredScene, ZoomedScene):
|
||||
CONFIG = {
|
||||
"arc_radius" : 0.1,
|
||||
"RectClass" : FilledRectangle
|
||||
}
|
||||
def construct(self):
|
||||
glass = self.get_continuous_glass()
|
||||
self.add(glass)
|
||||
|
||||
line = Line(
|
||||
UP, DOWN,
|
||||
density = self.zoom_factor*DEFAULT_POINT_DENSITY_1D
|
||||
)
|
||||
theta = TexMobject("\\theta")
|
||||
theta.scale(0.5/self.zoom_factor)
|
||||
equation = TexMobject([
|
||||
"\\dfrac{\\sin(\\theta)}",
|
||||
"{\\sqrt{y}}",
|
||||
" = \\text{constant}"
|
||||
])
|
||||
equation.next_to(Point(self.top), DOWN)
|
||||
equation.shift(LEFT)
|
||||
cycloid = Cycloid(end_theta = np.pi)
|
||||
cycloid.highlight(YELLOW)
|
||||
|
||||
for mob in equation.split():
|
||||
self.play(GrowFromCenter(mob), run_time = 0.5)
|
||||
self.play(ShowCreation(cycloid))
|
||||
self.activate_zooming()
|
||||
little_square = self.get_zoomed_camera_mobject()
|
||||
|
||||
self.add(line)
|
||||
indices = np.arange(
|
||||
0, cycloid.get_num_points()-1, 10
|
||||
)
|
||||
for index in indices:
|
||||
point = cycloid.points[index]
|
||||
next_point = cycloid.points[index+1]
|
||||
angle = angle_of_vector(point - next_point)-np.pi/2
|
||||
for mob in little_square, line:
|
||||
mob.shift(point - mob.get_center())
|
||||
arc = Arc(angle, start_angle = np.pi/2)
|
||||
arc.scale(self.arc_radius)
|
||||
arc.shift(point)
|
||||
color = Color()
|
||||
height = (self.top-self.point)[1]
|
||||
color.set_rgb([height/self.total_glass_height]*3)
|
||||
for mob in arc, theta, line:
|
||||
mob.highlight(color)
|
||||
if angle > np.pi/15:
|
||||
self.add(arc)
|
||||
if angle > np.pi/6:
|
||||
vect_angle = angle/2 + np.pi/2
|
||||
vect = rotate_vector(RIGHT, vect_angle)
|
||||
theta.center()
|
||||
theta.shift(point)
|
||||
theta.shift(1.5*self.arc_radius*vect)
|
||||
self.add(theta)
|
||||
self.dither(self.frame_duration)
|
||||
self.remove(arc)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue