mirror of
https://github.com/Comfy-Org/ComfyUI.git
synced 2026-09-29 17:38:39 -05:00
79 lines
2.6 KiB
Python
79 lines
2.6 KiB
Python
import math
|
|
|
|
import pytest
|
|
|
|
from comfy_extras.nodes_camera_angle import (
|
|
CameraAngle,
|
|
MAX_ZOOM_FACTOR,
|
|
MIN_ZOOM_FACTOR,
|
|
SUBJECT_CENTER,
|
|
SUBJECT_DISTANCE,
|
|
build_camera_info,
|
|
describe_camera_angle,
|
|
horizontal_term,
|
|
zoom_to_factor,
|
|
)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"angle, term",
|
|
[
|
|
(0, "front view"),
|
|
(22, "front view"),
|
|
(23, "front-right quarter view"),
|
|
(90, "right side view"),
|
|
(135, "back-right quarter view"),
|
|
(180, "back view"),
|
|
(225, "back-left quarter view"),
|
|
(270, "left side view"),
|
|
(315, "front-left quarter view"),
|
|
(338, "front view"),
|
|
(360, "front view"),
|
|
],
|
|
)
|
|
def test_horizontal_term_buckets_by_45_degree_sector(angle, term):
|
|
assert horizontal_term(angle) == term
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"vertical, zoom, expected",
|
|
[
|
|
(-30, 0, "front view low-angle shot wide shot"),
|
|
(-15, 2, "front view eye-level shot medium shot"),
|
|
(15, 6, "front view elevated shot close-up"),
|
|
(45, 10, "front view high-angle shot close-up"),
|
|
],
|
|
)
|
|
def test_describe_camera_angle_joins_vertical_and_distance_terms(vertical, zoom, expected):
|
|
assert describe_camera_angle(0, vertical, zoom) == expected
|
|
|
|
|
|
def test_zoom_maps_linearly_onto_the_lens_zoom_factor():
|
|
assert zoom_to_factor(0) == MIN_ZOOM_FACTOR
|
|
assert zoom_to_factor(10) == MAX_ZOOM_FACTOR
|
|
assert zoom_to_factor(5) == pytest.approx((MIN_ZOOM_FACTOR + MAX_ZOOM_FACTOR) / 2)
|
|
|
|
|
|
def test_front_view_places_camera_on_positive_z_looking_at_subject_centre():
|
|
info = build_camera_info(0, 0, 0)
|
|
assert info["position"] == pytest.approx({"x": 0.0, "y": 0.0, "z": SUBJECT_DISTANCE})
|
|
assert info["target"] == {"x": 0.0, "y": 0.0, "z": 0.0}
|
|
assert info["cameraType"] == "perspective"
|
|
assert info["zoom"] == 1.0
|
|
|
|
|
|
def test_orbit_position_follows_yaw_and_pitch_while_zoom_only_changes_the_lens():
|
|
info = build_camera_info(90, 30, 10)
|
|
position = info["position"]
|
|
assert position["x"] == pytest.approx(SUBJECT_DISTANCE * math.cos(math.radians(30)))
|
|
assert position["y"] == pytest.approx(SUBJECT_CENTER[1] + SUBJECT_DISTANCE * math.sin(math.radians(30)))
|
|
assert position["z"] == pytest.approx(0.0, abs=1e-9)
|
|
assert info["zoom"] == MAX_ZOOM_FACTOR
|
|
|
|
|
|
def test_execute_clamps_inputs_and_returns_camera_info_and_prompt():
|
|
result = CameraAngle.execute(horizontal_angle=400, vertical_angle=-90, zoom=99)
|
|
camera_info, prompt = result.args
|
|
assert prompt == "front view low-angle shot close-up"
|
|
assert camera_info == build_camera_info(360, -30, 10)
|