我试图在Manim中构建一个Dehn twist在圆环中的动画。我的目标是得到看起来像这样的东西:
我设法在Manim中正确地参数化曲线和曲面。
正如你所看到的,参数曲线应该隐藏的部分完全可见,这使得图片更难理解。如何使可视化显示曲线是在曲面的前面还是后面?
我看了Manim community文档,但找不到关于这个主题的任何内容。
下面是复制上面图像的代码:
from manim import *
class DehnTwist(ThreeDScene):
def torus_coordinates(self, u, v, t=0):
return np.array([np.cos(u), np.sin(u), 0]) + 1/2 * (t * abs(np.sin(u/2)) + 1 - t) * np.array([np.cos(u)* np.cos(v), np.sin(u)*np.cos(v), np.sin(v)])
def cycle_a_twisted_coordinates(self, u, t=0):
return np.array([np.cos(u), -np.sin(u),0]) + 1/2*(t*abs(np.sin(u/2))+1-t)*np.array([np.sin(u)*np.cos(u),-np.sin(u)*np.sin(u), np.cos(u)])
def cycle_a_twisted(self, t, axes):
return ParametricFunction(
lambda u: axes.c2p(*self.cycle_a_twisted_coordinates(u,t)),
t_range=[0,TAU],
color=PURE_RED
)
def torus(self, t, axes):
return Surface(
lambda u, v: axes.c2p(*self.torus_coordinates(u, v, t)),
u_range=[0, TAU],
v_range=[0, TAU],
fill_opacity=0.6,
resolution=20,
)
def construct(self):
axes = ThreeDAxes(x_range=[-4,4], x_length=8)
torus = self.torus(0, axes)
cycle_a_twisted = self.cycle_a_twisted(0, axes)
self.set_camera_orientation(theta=-30 * DEGREES, phi=60 * DEGREES)
self.camera.set_zoom(2)
self.add(cycle_a_twisted,torus)
**编辑:**我已经更新了我的代码关于@A-_-S的答案,也简化了曲线的可行性。
from manim import *
class DehnTwist(ThreeDScene):
def torus_coordinates(self, u, v):
return np.array([np.cos(u), np.sin(u), 0]) + 1/2 * np.array([np.cos(u)* np.cos(v), np.sin(u)*np.cos(v), np.sin(v)])
def cycle_a_twisted_coordinates(self, u):
return np.array([1, 0,0]) + (1/2+1/10)*np.array([-np.cos(u), 0, np.sin(u)])
def cycle_a_twisted(self, axes):
return ParametricFunction(
lambda u: axes.c2p(*self.cycle_a_twisted_coordinates(u)),
t_range=[0,TAU],
color=PURE_RED
).set_shade_in_3d(True)
def torus(self, axes):
return Surface(
lambda u, v: axes.c2p(*self.torus_coordinates(u, v)),
u_range=[0, TAU],
v_range=[0, TAU],
fill_opacity=1,
resolution=20,
)
def construct(self):
axes = ThreeDAxes(x_range=[-4,4], x_length=8)
torus = self.torus(axes)
cycle_a_twisted = self.cycle_a_twisted(axes)
self.set_camera_orientation(theta=-30 * DEGREES, phi=60 * DEGREES)
self.camera.set_zoom(2)
self.add(cycle_a_twisted,torus)
这将生成以下图像:
正如你所看到的,应该在圆环前面的红色路径的一部分没有被正确地着色。
2条答案
按热度按时间xuo3flqw1#
也许这会有所帮助-https://github.com/3b1b/manim/issues/1094
看起来你可能需要两个2D Package 曲线一个在表面上,另一个在后面,增加曲线后面2D的粒度,这样它就不会弹出!我还做了一些挖掘和移动曲线(2D),以及环面(3D但可以转换为2D)也将解决该问题,为此,您需要将环面保存到2D对象中,然后使用该对象(基本上是图像)构建单个 Package 器并将其移到后面https://docs.manim.community/en/stable/tutorials/building_blocks.html#mobject-on-screen-order
祝你好运!对不起,我试过了,但不能在短时间内提交一个工作代码。
1rhkuytd2#
set_shade_in_3d_true。这将计算具有圆环的曲线的深度...即
然后,如果你想让曲线在环面上方弹出一点,在曲线坐标上加上相关方向的epsilon