Я пытаюсь сделать цветную ленту Мебиуса, но всегда получаю разницу в цвете между началом и концом ленты.
Вот MWE и изображение, которое он создает.
from manim import *
BG_COLOR = "#F7F5E7"
config.background_color = BG_COLOR
def mobius_func(u, v):
x = (1 + v / 2 * np.cos(u / 2)) * np.cos(u)
y = (1 + v / 2 * np.cos(u / 2)) * np.sin(u)
z = v / 2 * np.sin(u / 2)
return np.array((x, y, z))
class Logo(ThreeDScene):
def construct(self):
self.set_camera_orientation(
phi=50 * DEGREES, theta=330 * DEGREES, run_time=2, zoom=2.2
)
mobius = Surface(
mobius_func,
u_range=[0, 2 * PI],
v_range=[-1, 1],
resolution=(64, 16),
)
mobius.set_color(RED)
self.add(mobius)
Что вызывает эту проблему и как я могу ее исправить?
Для правильного рендеринга ленты Мёбиуса вам нужен движок рендеринга, который поддерживает удаление скрытых поверхностей (таких как z-буферизация) и отсечение граней. Но Маним их не поддерживает. Короче говоря, вы не можете решить эту проблему.
Лучше всего взломать Manim таким образом. (Конечно, это не рекомендуется для долгосрочного проекта, потому что он может не работать на версиях, отличных от 0.17.2.)
import numpy as np
import manim
def new_get_shaded_rgb(
rgb: np.ndarray,
point: np.ndarray,
unit_normal_vect: np.ndarray,
light_source: np.ndarray,
) -> np.ndarray:
to_sun = manim.utils.space_ops.normalize(light_source - point)
factor = 0.5 * np.dot(unit_normal_vect, to_sun) ** 3
factor = abs(factor) # This patch will give the same color for a back or front face.
result = rgb + factor
return result
manim.camera.three_d_camera.get_shaded_rgb = new_get_shaded_rgb