用Manim实现三维坐标系的绘制

news2024/9/22 5:43:39

1.ThreeDAxes 函数

ThreeDAxes是 Manim 中用于创建三维坐标系的类。在manim中常用的三位坐标绘制函数是:

class ThreeDAxes(x_range=(-6, 6, 1), y_range=(-5, 5, 1), z_range=(-4, 4, 1), 
x_length=10.5, y_length=10.5, z_length=6.5, z_axis_config=None, 
z_normal=array([0., -1., 0.]), num_axis_pieces=20, 
light_source=array([-7., -9., 10.]), depth=None, gloss=0.5, **kwargs)

下面是对该类及其参数的解释:

类及参数说明

  • x_range: 三维坐标系中 X 轴的范围,格式为 (起始值, 结束值, 步长)。默认为 (-6, 6, 1)。

  • y_range: 三维坐标系中 Y 轴的范围,格式同上。默认为 (-5, 5, 1)。

  • z_range: 三维坐标系中 Z 轴的范围,格式同上。默认为 (-4, 4, 1)。

  • x_length: X 轴的长度,默认为 10.5。

  • y_length: Y 轴的长度,默认为 10.5。

  • z_length: Z 轴的长度,默认为 6.5。

  • z_axis_config: 对 Z 轴的配置,通常用于设置轴的颜色、粗细等。

  • z_normal: 定义 Z 轴的“正向”方向,默认为 [0., -1., 0.],表示 Z 轴的正方向是负 Y 方向。

  • num_axis_pieces: 轴的细分数量,即轴上分割的部分数,默认为 20。

  • light_source: 光源的位置,影响阴影和光照效果设置,默认为 [-7., -9., 10.]

  • depth: 深度配置,用于定义坐标系的深度。缺省为 None。

  • gloss: 光泽度,影响表面的光泽度效果,默认为 0.5。

  • kwargs: 额外的关键字参数,允许传递其他配置。

示例1:

from manim import *  

class ThreeDAxesExample1122(ThreeDScene):  
    def construct(self):  
        # 创建三维坐标系  
        axes = ThreeDAxes(  
            x_range=(-6, 6, 1),  # X 轴范围,从 -6 到 6,步长为 1  
            y_range=(-5, 5, 1),  # Y 轴范围,从 -5 到 5,步长为 1  
            z_range=(-4, 4, 1),  # Z 轴范围,从 -4 到 4,步长为 1  
            x_length=10.5,      # X 轴长度  
            y_length=10.5,      # Y 轴长度  
            z_length=6.5,       # Z 轴长度  
            z_axis_config={"color": BLUE},  # Z 轴颜色配置  
            z_normal=np.array([0., -1., 0.]),  # Z 轴法向量配置  
            num_axis_pieces=20,  # 每个坐标轴的分段数量  
            light_source=np.array([-7., -9., 10.]),  # 光源位置  
            depth=None,          # 深度信息,设置为 None 表示 2D 显示  
            gloss=0.5,          # Glossiness (光泽度)设置,范围 0-1  
        ).add_coordinates()  # 添加坐标标记  

        # 添加坐标系到场景中  
        self.add(axes)  

        # 设置视角  
        self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES)  # 设置相机的旋转角度  

        # 可以添加一条三维曲线以展示三维坐标系  
        curve = ParametricFunction(  
            lambda t: axes.c2p(t, np.sin(t), np.cos(t)),  # 使用参数方程生成三维曲线  
            t_range=np.array([-TAU, TAU]),  # t 变量的范围,从 -2π 到 2π  
            color=YELLOW,  # 曲线颜色  
        )  

        # 让曲线显示在三维空间中  
        self.play(Create(curve))  # 播放创建曲线的动画  
        self.wait(2)  # 等待 2 秒

 运行结果:

 示例2:

from manim import *  

class ThreeDAxesExample1123(ThreeDScene):  
    def construct(self):  
        # 创建三维坐标系  
        axes = ThreeDAxes(  
            x_range=(-6, 6, 1),  
            y_range=(-5, 5, 1),  
            z_range=(-4, 4, 1),  
            x_length=10.5,  
            y_length=10.5,  
            z_length=6.5,  
            z_axis_config={"color": BLUE},  
            num_axis_pieces=20,  
        ).add_coordinates()  

        # 添加坐标系到场景中  
        self.add(axes)  
        # 创建坐标标签  
        x_label = MathTex("X").scale(0.7).next_to(axes.x_axis.get_end(), UP)  
        y_label = MathTex("Y").scale(0.7).next_to(axes.y_axis.get_end(), RIGHT)  
        z_label = MathTex("Z").scale(0.7).next_to(axes.z_axis.get_end(), OUT)  

        # 添加坐标系和标签到场景中  
        self.add(axes, x_label, y_label, z_label)  

        

        # 展示 XY 平面  
        self.set_camera_orientation(phi=90 * DEGREES, theta=0 * DEGREES)  
        self.wait(2)  

        # 过渡到 XZ 平面  
        self.move_camera(phi=0 * DEGREES, theta=0 * DEGREES, run_time=2)  
        self.wait(2)  

        # 过渡到 YZ 平面  
        self.move_camera(phi=90 * DEGREES, theta=90 * DEGREES, run_time=2)  
        self.wait(2)  

        # 结束场景  
        self.play(FadeOut(axes))   

运行结果:

 示例3:

from manim import *  

class SaddleSurfaceScene(ThreeDScene):  
    def construct(self):  
        self.camera.background_color =GREEN_E
        # 创建三维坐标系  
        axes = ThreeDAxes(  
            x_range=(-3, 3, 1),  
            y_range=(-3, 3, 1),  
            z_range=(-3, 3, 1),  
            x_length=6,  
            y_length=6,  
            z_length=4,  
        )  

        # 定义马鞍表面  
        surface = Surface(  
            lambda u, v: axes.c2p(u, v, u * v),  # 马鞍表面方程  
            u_range=[-2, 2],  
            v_range=[-2, 2],  
            checkerboard_colors=[RED, GREEN],  # 有效的颜色  
            resolution=(15, 15),  
        )  

        # 设置表面的阴影效果  
        surface.set_shade_in_3d(True)  

        # 添加到场景  
        self.add(axes, surface)  

        # 设置相机的观察角度  
        self.set_camera_orientation(phi=70 * DEGREES, theta=30 * DEGREES)  

        # 播放创建表面和坐标系的动画  
        self.play(Create(surface), FadeIn(axes))  
        
        # 共同围绕 z 轴旋转图形和坐标系  
        self.play(Rotate(VGroup(surface, axes), angle=2 * PI, axis=IN), run_time=8)  # 围绕 Z 轴旋转 360 度  
        self.wait(2)  # 等待 2 秒  

这段代码是使用 Manim 库创建和可视化一个三维马鞍面(saddle surface)的动画。下面是对代码的逐行解释:

from manim import * 

导入 Manim 库,使用它提供的功能来创建动画。

class SaddleSurfaceScene(ThreeDScene): 

定义一个名为 SaddleSurfaceScene 的类,继承自 ThreeDScene。这个类将实现生成三维场景的所有必要方法。

def construct(self): 

定义 construct 方法,这是 Manim 中每个场景的主要创建方法。

self.camera.background_color = GREEN_E 

设置场景的背景颜色为绿色(GREEN_E 是 Manim 中预定义的绿色)。

# 创建三维坐标系 axes = ThreeDAxes( x_range=(-3, 3, 1), 
y_range=(-3, 3, 1), z_range=(-3, 3, 1), x_length=6, y_length=6, z_length=4, ) 

创建一个三维坐标系对象 axes,指定 X、Y 和 Z 轴的范围、步长以及长度。这允许我们在三维空间中展示曲面。

# 定义马鞍表面 
surface = Surface( lambda u, v: axes.c2p(u, v, u * v), # 马鞍表面方程 
u_range=[-2, 2], v_range=[-2, 2], 
checkerboard_colors=[RED, GREEN], # 有效的颜色 resolution=(15, 15), ) 

定义一个 Surface 对象 surface,表示马鞍面。这里使用一个 lambda 函数来定义 Z 坐标的计算方式:u * vu_range 和 v_range 指定了表面在 U 和 V 方向的范围。checkerboard_colors 用于设置表面上的颜色,使其具有颜色效果,resolution 设置了图形的细度。

# 设置表面的阴影效果 
surface.set_shade_in_3d(True) 

为表面设置三维阴影效果,使其在光照变化时能呈现更好的视觉效果。

# 添加到场景 
self.add(axes, surface) 

将坐标系和马鞍面添加到场景中,使它们成为可视化的一部分。

# 设置相机的观察角度 
self.set_camera_orientation(phi=70 * DEGREES, theta=30 * DEGREES) 

设置相机的观察角度(phi 和 theta 分别表示从水平面向上和水平面的角度),以便以特定的视角观察马鞍面。

# 播放创建表面和坐标系的动画 
self.play(Create(surface), FadeIn(axes)) 

使用动画播放功能,在场景中以动态的方式创建表面和渐显坐标系。

# 共同围绕 z 轴旋转图形和坐标系 
self.play(Rotate(VGroup(surface, axes), 
angle=2 * PI, axis=IN), run_time=8) # 围绕 Z 轴旋转 360 度 

使用 Rotate 动画将马鞍面和坐标系组合在一起,围绕 Z 轴进行 360 度的旋转,动画持续 8 秒。

self.wait(2) # 等待 2 秒 

等待 2 秒,让观众可以静止观察当前的动画效果。

总而言之,这段代码创建了一个动态的 3D 马鞍面示例,展示了三维曲面和坐标系,并使用了旋转动画来增加视觉效果。

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1990338.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据仓库怎么建设?一文详解数仓的建设过程!

随着信息技术的飞速发展,企业不仅需要存储和管理海量数据,更迫切需要从这些数据中提取有价值的信息,以支持复杂的决策制定过程。数据仓库不仅是存储数据的场所,更是支持复杂查询、报告和数据分析的强有力工具,其建设已…

JavaScript异步简介|Promise快速入门

异步(Asynchronous, async)是与同步(Synchronous, sync)相对的概念。 异步 JavaScript 简介 异步编程技术使你的程序可以在执行一个可能长期运行的任务的同时继续对其他事件做出反应而不必等待任务完成。与此同时,你…

Linux工具|运维工具rename常用命令详解

📫 作者简介:「六月暴雪飞梨花」,专注于研究Java,就职于科技型公司后端工程师 🏆 近期荣誉:华为云云享专家、阿里云专家博主、腾讯云优秀创作者、ACDU成员 🔥 三连支持:欢迎 ❤️关注…

【vulnhub】Wakanda :1靶机

靶机安装 下载地址:https://download.vulnhub.com/wakanda/wakanda-1.ova 运行环境:Virtual Box 信息收集 靶机IP扫描 netdiscover -i eth0 -r 192.168.7.0/24 端口扫描 nmap -A 192.168.7.243 -p- 80端口开启了http服务,在3333端口开启…

案例研究丨盛泰光电携手DataEase实现数据驱动智能制造

盛泰光电科技股份有限公司(以下简称为“盛泰光电”)是中国第一批摄像头模组制造企业。自成立至今,一直专注于手机摄像头模组的研发、制造、销售与服务,并向非手机包括笔记本、车载、医疗、AIoT等领域延伸,形成以手机摄…

PHP + Laravel + RabbitMQ + Redis 实现消息队列 (二) 消费队列在RabbitMQ和redis中的简单使用

最简单的队列功能 RabbitMQ和消息传递通常会使用一些术语: 生产者(Producer)意味着发送消息。一个发送消息的程序称为生产者。队列(Queue)尽管消息通过RabbitMQ和您的应用程序流动,但它们只能存储在队列中…

数据结构(01):数据结构概述(基本术语、逻辑结构和物理结构)

1、数据结构概述 (1)基本术语 A.数据元素 具有一定意义的基本单位。如人类的数据元素是人(张三、李四等)。 B.数据项 可以看作是数据元素的属性。如人的属性(姓名、年龄、身高等) C.数据对象 性质相同的数据元素的集合。如某一栋…

群聊的创建 表情包发送 图片发送

目录 群聊: ​编辑 表情包发送: 图片发送: 群聊: 1.群资料的表groupinformation 字段:GroupId 群id,GroupName 群名,CreatTime 创群时间,CreatUserId 创群的人,…

萤石云 ezuikit-js创建的播放器实例esc取消全屏后变黑屏

原因:上层页面重新设置了容器的宽高,导致uikit退出全屏时宽高计算异常 解决方法:实例初始化的时候会传入宽高width、height,播放器的画面尺寸是根据这两个参数设置的,然后退出全屏会回到这两个值

计算机的错误计算(五十五)

摘要 展示大数的余弦函数值的错误计算。 根据国际IEEE 754 标准[1],包括余弦在内的三角函数的定义域是整个实数范围: 但是,实际情况怎样呢? 例1. 计算 . 在 Python下计算: x30**65 print(x) import math print(ma…

只强的Java学习之路8-7

一. 安装配置nodejs npm create vitelatest npm install vue-router npm install axios npm install element-plus --save npm run dev https://element-plus.org/zh-CN/#/zh-CN 新建项目&#xff1a; easy.vue <script setup></script><!--绑定数据-->…

在vue中页面使用了动态组件组件导致首次页面加载时子组件样式不显示,刷新后才正常

问题&#xff1a; 在vue中页面使用了动态组件组件导致首次页面加载时子组件样式不显示&#xff0c;刷新后才正常。 原因&#xff1a; 因为动态组件的延迟加载&#xff0c;如果使用了Vue的动态组件&#xff08;如<component :is"...">&#xff09;&#xff0c;…

【代码随想录】有序数组的平方

本博文为《代码随想录》的学习笔记&#xff0c;原文链接&#xff1a;代码随想录 题目 977. 有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&…

6种常用的AR跟踪方法

增强现实 (AR) 是一项令人着迷的技术&#xff0c;可将虚拟内容与现实世界无缝集成。实现这种无缝集成的关键组件之一是跟踪。各种类型的跟踪用于确定 AR 内容在环境中的准确位置和方向。本文介绍 AR 最常见的6种跟踪方法。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - Y…

ctfshow-web入门-sql注入(web191-web195)

目录 1、web191 2、web192 3、web193 4、web194 5、web195 1、web191 过滤了 ascii 使用 ord 代替&#xff1a; import requests import string url "http://a585c278-320a-40e7-841f-109b1e394caa.challenge.ctf.show/api/index.php" out for j in range(1…

哈佛大学单细胞课程|笔记汇总 (五)

哈佛大学单细胞课程|笔记汇总 &#xff08;四&#xff09; &#xff08;五&#xff09;Count Normalization and Principal Component Analysis 获得高质量的单细胞后&#xff0c;单细胞RNA-seq&#xff08;scRNA-seq&#xff09;分析工作流程的下一步就是执行聚类。聚类的目…

代理IP如何助力社交媒体数据挖掘

目录 引言 一、 社交媒体数据挖掘的挑战 1、访问限制 2、反爬虫技术 3、数据隐私和合规性 4、数据的多样性和复杂性 5、技术门槛 二、解决方案:代理IP 1、绕过IP封锁 2、管理访问频率 3、保护用户隐私 4、提高数据获取的成功率 三、代理IP平台:站大爷 1、高效性…

商标担保注册出现的常见问题!

最近有个网友联系到普推知产商标老杨&#xff0c;问一个商标名称注册担保事项&#xff0c;检索信息给详细分析下&#xff0c;这个商标名称他以前申请注册过&#xff0c;也做过驳回复审&#xff0c;还是不予注册。 如果相同的名称现在去申请注册&#xff0c;当然会直接驳回&…

模型太大加载不畅?不兼容?3D模型轻量化帮您瘦身减负

在当今的数字时代&#xff0c;3D模型已成为游戏开发、建筑设计、虚拟现实及增强现实等多个行业不可或缺的基石。它们不仅为这些领域带来了前所未有的视觉盛宴和沉浸式体验&#xff0c;还极大地推动了行业的创新与发展。然而&#xff0c;随着模型设计日益复杂&#xff0c;其文件…

Mysql执行计划(下)

1、执行计划概念 执行计划是什么&#xff1a;使用EXPLAIN关键字可以模拟优化器执行SQL查询语句&#xff0c;从而知道MySQL是如何处理你的SQL语句的。 作用&#xff1a;分析你的查询语句或是表结构的性能瓶颈 语法&#xff1a;Explain SQL语句 执行计划输出内容介绍&#xf…