3b1b / 3b1b/manim

How to use checkerboard pattern for Surface class

Open
#2,404 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Python
Stars
93.8k
Forks
7.7k
PR merge metrics
PR metrics pending

Description

### Describe the error
Hi, I'm using manimGL v1.7.2. I recently learned about the Surface class in Manim, I really want to represent surfaces by a checkerboard model (like the old version before). I copied some code to create the checkerboard model to try to reproduce it in the new version. But the rendered image looks weird, is there something I forgot to set up?

### Code and Error
**Code**:
class Test(InteractiveScene):
def construct(self):
# Try add surface by checkerboard colors
frame = self.camera.frame
frame.reorient(
-87, 92, 179, (np.float32(-0.15), np.float32(0.0), np.float32(-0.0)), 2.67
)
sphere = ParametricSurface(
uv_func=lambda u, v: np.array(
[
np.sin(u) * np.cos(v),
np.sin(u) * np.sin(v),
np.cos(u),
]
),
u_range=[0, PI],
v_range=[0, TAU],
resolution=(10, 10),
)

# From def get_u_values_and_v_values(self) in class ParametricSurface
res = tuplify(sphere.resolution)
if len(res) == 1:
u_res = v_res = res[0]
else:
u_res, v_res = res
u_min = sphere.u_range[0]
u_max = sphere.u_range[-1]
v_min = sphere.v_range[0]
v_max = sphere.v_range[-1]
u_values = np.linspace(u_min, u_max, u_res + 1)
v_values = np.linspace(v_min, v_max, v_res + 1)

# From def setup_in_uv_space(self) in class ParametricSurface
faces = VGroup()
for i in range(len(u_values) - 1):
for j in range(len(v_values) - 1):
u1, u2 = u_values[i : i + 2]
v1, v2 = v_values[j : j + 2]
face = VMobject() # Old version: face = ThreeDVMobject()
face.set_points_as_corners(
[
[u1, v1, 0],
[u2, v1, 0],
[u2, v2, 0],
[u1, v2, 0],
[u1, v1, 0],
]
)
face.apply_function(lambda p: sphere.uv_func(p[0], p[1]))
faces.add(face)
face.u_index = i
face.v_index = j
face.u1 = u1
face.u2 = u2
face.v1 = v1
face.v2 = v2

# From def set_fill_by_checkerboard(self, *colors, opacity=None):
faces.set_fill(color=sphere.color, opacity=sphere.opacity)
faces.set_stroke(
color=WHITE,
width=1,
opacity=1,
)
checkerboard_colors = [BLUE_D, BLUE_E]
n_colors = len(checkerboard_colors)
for face in faces:
c_index = (face.u_index + face.v_index) % n_colors
face.set_fill(checkerboard_colors[c_index], opacity=1)
self.add(sphere, faces)

**Error**:

### Environment

Image

**OS System**: Window 11
**manim version**: v1.7.2
**python version**: 3.11.8

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.