You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Manim的3D场景中创建一维坐标轴的技术求助

Manim中实现一维坐标轴及相机旋转效果

一、优先方案:使用NumberLine创建一维坐标轴

Manim自带的NumberLine是专门为一维场景设计的组件,完全适配你的需求,无需处理二维坐标轴的冗余元素。示例代码如下:

from manim import *

class OneDAxisAnimation(Scene):
    def construct(self):
        # 创建带刻度、数字和箭头的一维坐标轴
        one_d_axis = NumberLine(
            x_range=[-5, 5, 1],  # 坐标轴范围:-5到5,刻度间隔1
            length=10,  # 坐标轴总长度
            include_numbers=True,  # 显示刻度下方的数字
            include_ticks=True,  # 显示刻度短线
            tip_width=0.2,  # 箭头宽度,可按需调整
            tip_height=0.3,  # 箭头高度,可按需调整
            color=WHITE
        )
        self.add(one_d_axis)

        # 相机先放大显示2D视图(缩小帧等价于放大视图)
        self.play(camera.frame.scale(0.8), run_time=1.5)
        self.wait(1)

        # 绕一维坐标轴(X轴)旋转相机视角
        self.play(camera.frame.rotate, PI/2, axis=X_AXIS, run_time=3)
        self.wait(2)

二、为什么你之前的方法效果差?

Axes是为二维坐标系设计的组件,即便将y_length设为0,其内部仍会保留y轴的箭头、刻度布局逻辑,导致残留元素显示异常。而NumberLine从底层就是为一维场景实现的,没有多余的二维元素,更适合你的需求。

三、备选方案:通过Axes改造(不推荐)

如果一定要基于Axes修改,可手动隐藏y轴的所有元素,但可能存在布局偏移风险:

from manim import *

class ModifiedAxesDemo(Scene):
    def construct(self):
        axes = Axes(x_length=10, y_length=0)
        # 隐藏y轴及相关元素
        axes.y_axis.set_opacity(0)
        axes.y_axis_labels.set_opacity(0)
        axes.y_axis_ticks.set_opacity(0)
        self.add(axes)

        # 后续相机操作同前
        self.play(camera.frame.scale(0.8), run_time=1.5)
        self.wait(1)
        self.play(camera.frame.rotate, PI/2, axis=X_AXIS, run_time=3)
        self.wait(2)

内容的提问来源于stack exchange,提问作者GoodErnest64

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 01:35:08