Source code for manim.mobject.three_d.three_d_utils

"""Utility functions for three-dimensional mobjects."""

from __future__ import annotations

__all__ = [
    "get_3d_vmob_gradient_start_and_end_points",
    "get_3d_vmob_start_corner_index",
    "get_3d_vmob_end_corner_index",
    "get_3d_vmob_start_corner",
    "get_3d_vmob_end_corner",
    "get_3d_vmob_unit_normal",
    "get_3d_vmob_start_corner_unit_normal",
    "get_3d_vmob_end_corner_unit_normal",
]


import numpy as np

from manim.constants import ORIGIN, UP
from manim.utils.space_ops import get_unit_normal


[docs]def get_3d_vmob_gradient_start_and_end_points(vmob): return ( get_3d_vmob_start_corner(vmob), get_3d_vmob_end_corner(vmob), )
[docs]def get_3d_vmob_start_corner_index(vmob): return 0
[docs]def get_3d_vmob_end_corner_index(vmob): return ((len(vmob.points) - 1) // 6) * 3
[docs]def get_3d_vmob_start_corner(vmob): if vmob.get_num_points() == 0: return np.array(ORIGIN) return vmob.points[get_3d_vmob_start_corner_index(vmob)]
[docs]def get_3d_vmob_end_corner(vmob): if vmob.get_num_points() == 0: return np.array(ORIGIN) return vmob.points[get_3d_vmob_end_corner_index(vmob)]
[docs]def get_3d_vmob_unit_normal(vmob, point_index): n_points = vmob.get_num_points() if len(vmob.get_anchors()) <= 2: return np.array(UP) i = point_index im3 = i - 3 if i > 2 else (n_points - 4) ip3 = i + 3 if i < (n_points - 3) else 3 unit_normal = get_unit_normal( vmob.points[ip3] - vmob.points[i], vmob.points[im3] - vmob.points[i], ) if np.linalg.norm(unit_normal) == 0: return np.array(UP) return unit_normal
[docs]def get_3d_vmob_start_corner_unit_normal(vmob): return get_3d_vmob_unit_normal(vmob, get_3d_vmob_start_corner_index(vmob))
[docs]def get_3d_vmob_end_corner_unit_normal(vmob): return get_3d_vmob_unit_normal(vmob, get_3d_vmob_end_corner_index(vmob))