python动画:三维空间中创建各种形状和场景【下】

一,曲面

三维曲面是指在三维空间中定义的曲面,其通常用数学方程来描述。三维曲面的例子包括平面、球面、圆柱面、锥面等。它们可以通过参数方程或隐式方程进行定义。

常见的三维曲面类型

  1. 平面

    • 形式:( Ax + By + Cz + D = 0 )
    • 例子:( z = 2x + 3y + 5 )
  2. 球面

    • 形式:( (x - x_0)^2 + (y - y_0)^2 + (z - z_0)^2 = r^2 )
    • 例子:以原点为中心的单位球面:( x^2 + y^2 + z^2 = 1 )
  3. 圆柱面

    • 形式:( (x - x_0)^2 + (y - y_0)^2 = r^2)
    • 例子:直立的圆柱面:( x^2 + y^2 = 1)
  4. 锥面 - 形式:( z^2 = k(x^2 + y^2) )

    • 例子:直立的圆锥面:( z^2 = x^2 + y^2)

抛物面

  • 形式:( z = ax^2 + by^2)
  • 例子:( z = x^2 + y2 )
  1. 双曲面
    • 形式:(z =\frac{1}{x^2 + y^2})
    • 例子:单叶双曲面。

应用领域

三维曲面在很多领域都有广泛的应用,包括:

  • 计算机图形学:用于建模和渲染三维物体。
  • 工程:用于设计和分析的几何形状。
  • 数学:用于研究几何性质和拓扑特性。

 1.Surface 函数用于创建一个三维表面对象

Surface 函数用于创建一个三维表面对象,通常是在动画或可视化库中使用,比如 Manim(一个用于创作数学动画的库)。

Surface(func, u_range=[0, 1], v_range=[0, 1], resolution=32, surface_piece_config={}, 
fill_color=ManimColor('#29ABCA'), fill_opacity=1.0, checkerboard_colors=
[ManimColor('#29ABCA'), ManimColor('#236B8E')], stroke_color=ManimColor('#BBBBBB'),
 stroke_width=0.5, should_make_jagged=False, pre_function_handle_to_anchor_scale_factor=1e-
05, **kwargs)

这个函数的参数设置了表面的各种属性,包括形状、颜色、填充方式等。

以下是对各个参数的解释:

  • func: 这是一个函数,用于定义表面的形状。该函数通常是一个有两个参数(u和v)的函数,这些参数将对应于表面的每个点的坐标。

  • u_range: 这是一个包含两个值的列表,定义了u参数的范围。默认值为[0, 1]。

  • v_range: 这是一个包含两个值的列表,定义了v参数的范围。默认值为[0, 1]。

  • resolution: 这个整数值定义了表面的细分程度,决定了在每个方向上的点的数量,默认值为32。

  • surface_piece_config: 一个字典,允许设置表面拼片的额外配置选项,例如是否平滑或是否渲染为多块。

  • fill_color: 表面填充颜色,使用 ManimColor 对象表示,默认值为('#29ABCA')。

  • fill_opacity: 表面填充的透明度,范围是0到1,默认值为1.0(完全不透明)。

  • checkerboard_colors: 用来定义棋盘格纹理的颜色,通常是一个包含两种颜色的列表,默认值为['#29ABCA', '#236B8E']。

  • stroke_color: 表面的边框颜色,默认值为('#BBBBBB')。

  • stroke_width: 表面边框的宽度,默认值为0.5。

  • should_make_jagged: 一个布尔值,指示是否使边缘呈锯齿状,默认值为False。

  • pre_function_handle_to_anchor_scale_factor: 一个浮点数,用于在调用函数之前缩放锚点的比例因子,默认值为1e-05。

  • kwargs: 其他额外的关键字参数,可以根据需要传递。

下面是一个使用所有参数的示例代码,其中包含相关注释:

from manim import *
class ParaSurface01(ThreeDScene):
    def func(self, u, v):
        return np.array([ u, v,  np.sin(u * np.pi) * np.cos(v * np.pi)  ])  # 使用 u 和 v 来生成 z 轴的值 

    def construct(self):
        axes = ThreeDAxes(x_range=[-4,4], x_length=8)
        surface = Surface(
            lambda u, v: axes.c2p(*self.func(u, v)),
            u_range=[0, 2],                # u参数范围从0到2  
            v_range=[0, 1],                # v参数范围从0到1  
            resolution=32,                  # 表面细分的分辨率  
            surface_piece_config={},        # 表面拼片配置  
            fill_color=ManimColor('#29ABCA'),  # 填充颜色为青色  
            fill_opacity=0.8,              # 填充透明度为0.8  
            checkerboard_colors=[ManimColor('#29ABCA'), ManimColor('#236B8E')],  # 棋盘格颜色  
            stroke_color=ManimColor('#BBBBBB'),  # 边框颜色为灰色  
            stroke_width=1.0,               # 边框宽度为1.0  
            should_make_jagged=False,       # 不使用锯齿边缘  
            pre_function_handle_to_anchor_scale_factor=1e-05,  # 缩放比例因子  
        )  
        self.set_camera_orientation(theta=115 * DEGREES, phi=75 * DEGREES)
        self.add(axes, surface)

示例2:

from manim import *

class ParaSurface(ThreeDScene):
    def func(self, u, v):
        return np.array([np.cos(u) * np.cos(v), np.cos(u) * np.sin(v), u])

    def construct(self):
        axes = ThreeDAxes(x_range=[-4,4], x_length=8)
        surface = Surface(
            lambda u, v: axes.c2p(*self.func(u, v)),
            u_range=[-PI, PI],
            v_range=[0, TAU],
            resolution=8,
        )
        self.set_camera_orientation(theta=70 * DEGREES, phi=75 * DEGREES)
        self.add(axes, surface)

 图形的填充颜色函数

        这两个函数 set_fill_by_checkerboard 和 set_fill_by_value 通常用于在数据可视化中设置图形的填充颜色。虽然确切的上下文取决于所使用的库(例如 Plotly、Matplotlib 等),但在这里我为您解释它们可能的含义和参数。

1.set_fill_by_checkerboard
set_fill_by_checkerboard(*colors, opacity=None)

 set_fill_by_checkerboard(*colorsopacity=None)的作用是通过一种类似棋盘的方式来填充颜色。以下是参数的解释:

  • *colors: 变量数量不定的颜色值,可以是字符串(颜色名称)或十六进制颜色代码(如 "#FF0000")。这些颜色将用于填充图形的不同部分。
  • opacity: 一个可选的浮点值,范围通常是 0 到 1,表示填充颜色的透明度,0 表示完全透明,1 表示完全不透明。
  • 示例代码:
    class FillByValueExample(ThreeDScene):
        def construct(self):
            resolution_fa = 8
            self.set_camera_orientation(phi=75 * DEGREES, theta=-160 * DEGREES)
            axes = ThreeDAxes(x_range=(-5, 5, 1), y_range=(-5, 5, 1), z_range=(-1, 1, 0.5))
            def param_surface(u, v):
                x = u
                y = v
                z = np.sin(x) * np.cos(y)*0.25
                return z
            surface_plane = Surface(
                lambda u, v: axes.c2p(u, v, param_surface(u, v)),
                resolution=(resolution_fa, resolution_fa),
                v_range=[-2.55, 2.5],
                u_range=[-1.5, 1.5],
                )
            surface_plane.set_style(fill_opacity=1)
            surface_plane.set_fill_by_checkerboard(RED, opacity=0.55)
            #surface_plane.set_fill_by_value(axes=axes, colorscale=[(RED, -0.5), (YELLOW, 0), (GREEN, 0.5)], axis=2)
            self.add(axes, surface_plane)

2.set_fill_by_value
set_fill_by_value(axes, colorscale=None, axis=2, **kwargs)

set_fill_by_value(axes, colorscale=None, axis=2, **kwargs) 的作用是根据给定的值来设置填充颜色。以下是参数的解释:

  • axes: 需要填充的图形的坐标轴对象。
  • colorscale: 定义颜色渐变的列表或数组,通常是与数据值对应的颜色映射,类似于热图颜色渐变,可以是预定义的(比如 ViridisPlasma 等)或自定义的。
  • axis: 指定使用的轴,通常为整数 0、1 或 2,表示 x 轴、y 轴或 z 轴。
  • **kwargs: 其他关键字参数,可能用于进一步定制填充的行为(例如设置颜色范围、边界等)。

示例代码

下面是一个使用 set_fill_by_value 的示例代码,假设这是在一个绘图库(如 Matplotlib 或 Plotly)中填充的一个简单示例:

class FillByValueExample12(ThreeDScene):
    def construct(self):
        resolution_fa = 8
        self.set_camera_orientation(phi=75 * DEGREES, theta=-160 * DEGREES)
        axes = ThreeDAxes(x_range=(0, 5, 1), y_range=(0, 5, 1), z_range=(-1, 1, 0.5))
        def param_surface(u, v):
            x = u
            y = v
            z = np.sin(x) * np.cos(y)
            return z
        surface_plane = Surface(
            lambda u, v: axes.c2p(u, v, param_surface(u, v)),
            resolution=(resolution_fa, resolution_fa),
            v_range=[0, 5],
            u_range=[0, 5],
            )
        surface_plane.set_style(fill_opacity=1)
        surface_plane.set_fill_by_value(axes=axes, colorscale=[(RED, 0.5), (YELLOW, 1), (GREEN, 5)], axis=1)
        self.add(axes, surface_plane)

 2.圆环(Torus)

Torus 是一个在 3D 图形和几何建模中常用的函数,用于生成一个二维参数化的环面(圆环)。这个环面是由两个半径定义的,分别是主要半径和次要半径。

参数解释

  • major_radius: 这是环面中心到管道中心的距离,定义了环的“厚度”。例如,major_radius=3 表示环面中心到管道中心的距离为 3 个单位。

  • minor_radius: 这是环面管道的半径,定义了环的“大小”。例如,minor_radius=1 表示管道的半径为 1 个单位。

  • u_range: 这是参数 u 的范围,通常定义为一个元组 (起始值, 终止值)。例如,u_range=(0, 2π) 表示 u 在 0 到 2π 之间变化,这是一个完整的循环。

  • v_range: 这是参数 v 的范围,类似于 u_range,通常也定义为一个元组 (起始值, 终止值)。例如,v_range=(0, 2π)

  • resolution: 可选参数,定义网格的分辨率。如果设置,可能会影响生成的环面细节程度。

  • kwargs: 其他关键字参数,用于进一步自定义环面属性,比如颜色、光照等。

示例代码1:

class ExampleTorus(ThreeDScene):
    def construct(self):
        axes = ThreeDAxes()
        torus = Torus(major_radius=4,minor_radius=0.5,u_range=(0, PI),v_range=(0,PI),resolution=108)
                    
                     
        self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES)
        self.add(axes, torus)

示例2:

class ExampleTorus(ThreeDScene):
    def construct(self):
        axes = ThreeDAxes()
        torus = Torus(major_radius=4,minor_radius=2,u_range=(0, -PI),v_range=(0,2*PI),resolution=108)
                    
                     
        self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES)
        self.add(axes, torus)

示例3:

class ExampleTorus13(ThreeDScene):
    def construct(self):
        axes = ThreeDAxes()
        torus = Torus(major_radius=4,minor_radius=2,u_range=(0, -PI*14/13),v_range=(0,2*PI),resolution=100)
                    
                     
        self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES)
        self.add(axes, torus)

示例4:
class ExampleTorus24(ThreeDScene):
    def construct(self):
        axes = ThreeDAxes()
        torus = Torus( )
                    
                     
        self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES)
        self.add(axes, torus)

  • 17
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yasen.M

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值