Manim中Surface定义报错:LinearGradient参数数量不符
问题分析与解决方案
你遇到的LinearGradient.__new__()错误主要由三个核心问题导致,以下是具体修复步骤:
1. 修正参数化曲面函数
你的funcs(u, v)只返回了2个坐标值,但3D曲面需要三个维度(x、y、z)。对于绕x轴旋转形成的抛物面,正确的参数方程应为:
def funcs(u, v): return np.array([ u, # x轴(旋转轴) np.sqrt(u) * np.cos(v), # 旋转点的y分量 np.sqrt(u) * np.sin(v) # 旋转点的z分量 ])
这里u对应原曲线的x值,v是旋转角度(0到2π)。
2. 调整v_range范围
原代码中v_range=[-5,5]不符合旋转角度的逻辑,应改为完整的圆周范围:
v_range=[0, 2*PI]
3. 解决颜色参数冲突
你同时设置了fill_color、color和checkerboard_colors,这会导致Manim在处理渐变时出错。选择以下两种方式之一:
- 棋盘格样式:移除
fill_color和color,保留checkerboard_colors - 纯色填充:移除
checkerboard_colors,保留fill_color
完整修正代码
from manim import * import numpy as np class Solids(ThreeDScene): def construct(self): x_min, x_max, x_step = 0, 5, 1 y_min, y_max, y_step = -5, 5, 1 z_max, z_min, z_step = -5, 5, 1 axes = ThreeDAxes( x_range=[x_min, x_max + x_step, x_step], y_range=[y_min, y_max + y_step, y_step], z_range=[z_min, z_max + z_step, z_step], ) function = axes.plot(lambda x: np.sqrt(x), color=YELLOW, x_range=[0, 5]) area = axes.get_area(function, x_range=[0, 5], color=BLUE) rec = axes.get_riemann_rectangles(function, dx=0.2, x_range=[1, 1.2], input_sample_type="left", stroke_width=0.5, fill_opacity=0.75, color=BLUE) rec_label = Text("dx", font_size=20) rec_label.next_to(rec, DOWN, buff=0) group = VGroup(function, area, rec) # 修正后的旋转抛物面参数函数 def funcs(u, v): return np.array([ u, np.sqrt(u) * np.cos(v), np.sqrt(u) * np.sin(v) ]) paraboloid = Surface( lambda u, v: axes.c2p(*funcs(u, v)), u_range=[0, 5], v_range=[0, 2*PI], checkerboard_colors=[BLUE, YELLOW], fill_opacity=0.75, stroke_color=BLUE, stroke_width=0.5, resolution=8 ) self.play(FadeIn(axes)) self.wait(2) self.play(FadeIn(function)) self.play(FadeIn(rec)) self.play(Write(rec_label)) self.play(FadeIn(area)) self.wait(2) self.begin_ambient_camera_rotation() self.set_camera_orientation(phi=75 * DEGREES, theta=-30 * DEGREES) self.play(Rotating(group, axis=RIGHT, radians=2*PI, about_point=ORIGIN), run_time=5, rate_func=linear) self.wait(2) self.play(FadeIn(paraboloid)) self.wait(2)
错误原因总结
LinearGradient错误:一方面是参数函数返回2D坐标导致3D渲染逻辑异常,另一方面是颜色参数冲突引发渐变处理失败。- 曲面形状异常:原
v_range设置不符合旋转角度的数学逻辑,导致曲面变形。
内容的提问来源于stack exchange,提问作者SirMrpirateroberts
相关产品推荐
相关产品推荐

