2018-08-21 19:58:48 -07:00
|
|
|
import numpy as np
|
|
|
|
|
2018-12-24 12:37:51 -08:00
|
|
|
from manimlib.constants import ORIGIN
|
|
|
|
from manimlib.constants import UP
|
|
|
|
from manimlib.utils.space_ops import get_norm
|
|
|
|
from manimlib.utils.space_ops import get_unit_normal
|
2018-08-21 19:58:48 -07:00
|
|
|
|
|
|
|
|
|
|
|
def get_3d_vmob_gradient_start_and_end_points(vmob):
|
|
|
|
return (
|
|
|
|
get_3d_vmob_start_corner(vmob),
|
|
|
|
get_3d_vmob_end_corner(vmob),
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
def get_3d_vmob_start_corner_index(vmob):
|
|
|
|
return 0
|
|
|
|
|
|
|
|
|
|
|
|
def get_3d_vmob_end_corner_index(vmob):
|
|
|
|
return ((len(vmob.points) - 1) // 6) * 3
|
|
|
|
|
|
|
|
|
|
|
|
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)]
|
|
|
|
|
|
|
|
|
|
|
|
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)]
|
|
|
|
|
|
|
|
|
|
|
|
def get_3d_vmob_unit_normal(vmob, point_index):
|
|
|
|
n_points = vmob.get_num_points()
|
2018-08-22 21:23:10 -07:00
|
|
|
if len(vmob.get_anchors()) <= 2:
|
2018-08-21 19:58:48 -07:00
|
|
|
return np.array(UP)
|
|
|
|
i = point_index
|
2018-09-04 16:14:39 -07:00
|
|
|
im3 = i - 3 if i > 2 else (n_points - 4)
|
|
|
|
ip3 = i + 3 if i < (n_points - 3) else 3
|
2018-08-21 19:58:48 -07:00
|
|
|
unit_normal = get_unit_normal(
|
2018-09-04 16:14:39 -07:00
|
|
|
vmob.points[ip3] - vmob.points[i],
|
|
|
|
vmob.points[im3] - vmob.points[i],
|
2018-08-21 19:58:48 -07:00
|
|
|
)
|
|
|
|
if get_norm(unit_normal) == 0:
|
|
|
|
return np.array(UP)
|
|
|
|
return unit_normal
|
|
|
|
|
|
|
|
|
|
|
|
def get_3d_vmob_start_corner_unit_normal(vmob):
|
|
|
|
return get_3d_vmob_unit_normal(
|
|
|
|
vmob, get_3d_vmob_start_corner_index(vmob)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
def get_3d_vmob_end_corner_unit_normal(vmob):
|
|
|
|
return get_3d_vmob_unit_normal(
|
|
|
|
vmob, get_3d_vmob_end_corner_index(vmob)
|
|
|
|
)
|