python 参数曲线总是在曲面之前

xkftehaa  于 2023-03-21  发布在  Python
关注(0)|答案(2)|浏览(129)

我试图在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)

这将生成以下图像:

正如你所看到的,应该在圆环前面的红色路径的一部分没有被正确地着色。

xuo3flqw

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
祝你好运!对不起,我试过了,但不能在短时间内提交一个工作代码。

1rhkuytd

1rhkuytd2#

set_shade_in_3d_true。这将计算具有圆环的曲线的深度...即

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
    ).set_shade_in_3d(true)

然后,如果你想让曲线在环面上方弹出一点,在曲线坐标上加上相关方向的epsilon

相关问题