Spaces:
Sleeping
Sleeping
import numpy as np | |
import pytest | |
from pyrender import PerspectiveCamera, OrthographicCamera | |
def test_perspective_camera(): | |
# Set up constants | |
znear = 0.05 | |
zfar = 100 | |
yfov = np.pi / 3.0 | |
width = 1000.0 | |
height = 500.0 | |
aspectRatio = 640.0 / 480.0 | |
# Test basics | |
with pytest.raises(TypeError): | |
p = PerspectiveCamera() | |
p = PerspectiveCamera(yfov=yfov) | |
assert p.yfov == yfov | |
assert p.znear == 0.05 | |
assert p.zfar is None | |
assert p.aspectRatio is None | |
p.name = 'asdf' | |
p.name = None | |
with pytest.raises(ValueError): | |
p.yfov = 0.0 | |
with pytest.raises(ValueError): | |
p.yfov = -1.0 | |
with pytest.raises(ValueError): | |
p.znear = -1.0 | |
p.znear = 0.0 | |
p.znear = 0.05 | |
p.zfar = 100.0 | |
assert p.zfar == 100.0 | |
with pytest.raises(ValueError): | |
p.zfar = 0.03 | |
with pytest.raises(ValueError): | |
p.zfar = 0.05 | |
p.aspectRatio = 10.0 | |
assert p.aspectRatio == 10.0 | |
with pytest.raises(ValueError): | |
p.aspectRatio = 0.0 | |
with pytest.raises(ValueError): | |
p.aspectRatio = -1.0 | |
# Test matrix getting/setting | |
# NF | |
p.znear = 0.05 | |
p.zfar = 100 | |
p.aspectRatio = None | |
with pytest.raises(ValueError): | |
p.get_projection_matrix() | |
assert np.allclose( | |
p.get_projection_matrix(width, height), | |
np.array([ | |
[1.0 / (width / height * np.tan(yfov / 2.0)), 0.0, 0.0, 0.0], | |
[0.0, 1.0 / np.tan(yfov / 2.0), 0.0, 0.0], | |
[0.0, 0.0, (zfar + znear) / (znear - zfar), | |
(2 * zfar * znear) / (znear - zfar)], | |
[0.0, 0.0, -1.0, 0.0] | |
]) | |
) | |
# NFA | |
p.aspectRatio = aspectRatio | |
assert np.allclose( | |
p.get_projection_matrix(width, height), | |
np.array([ | |
[1.0 / (aspectRatio * np.tan(yfov / 2.0)), 0.0, 0.0, 0.0], | |
[0.0, 1.0 / np.tan(yfov / 2.0), 0.0, 0.0], | |
[0.0, 0.0, (zfar + znear) / (znear - zfar), | |
(2 * zfar * znear) / (znear - zfar)], | |
[0.0, 0.0, -1.0, 0.0] | |
]) | |
) | |
assert np.allclose( | |
p.get_projection_matrix(), p.get_projection_matrix(width, height) | |
) | |
# N | |
p.zfar = None | |
p.aspectRatio = None | |
assert np.allclose( | |
p.get_projection_matrix(width, height), | |
np.array([ | |
[1.0 / (width / height * np.tan(yfov / 2.0)), 0.0, 0.0, 0.0], | |
[0.0, 1.0 / np.tan(yfov / 2.0), 0.0, 0.0], | |
[0.0, 0.0, -1.0, -2.0 * znear], | |
[0.0, 0.0, -1.0, 0.0] | |
]) | |
) | |
def test_orthographic_camera(): | |
xm = 1.0 | |
ym = 2.0 | |
n = 0.05 | |
f = 100.0 | |
with pytest.raises(TypeError): | |
c = OrthographicCamera() | |
c = OrthographicCamera(xmag=xm, ymag=ym) | |
assert c.xmag == xm | |
assert c.ymag == ym | |
assert c.znear == 0.05 | |
assert c.zfar == 100.0 | |
assert c.name is None | |
with pytest.raises(TypeError): | |
c.ymag = None | |
with pytest.raises(ValueError): | |
c.ymag = 0.0 | |
with pytest.raises(ValueError): | |
c.ymag = -1.0 | |
with pytest.raises(TypeError): | |
c.xmag = None | |
with pytest.raises(ValueError): | |
c.xmag = 0.0 | |
with pytest.raises(ValueError): | |
c.xmag = -1.0 | |
with pytest.raises(TypeError): | |
c.znear = None | |
with pytest.raises(ValueError): | |
c.znear = 0.0 | |
with pytest.raises(ValueError): | |
c.znear = -1.0 | |
with pytest.raises(ValueError): | |
c.zfar = 0.01 | |
assert np.allclose( | |
c.get_projection_matrix(), | |
np.array([ | |
[1.0 / xm, 0, 0, 0], | |
[0, 1.0 / ym, 0, 0], | |
[0, 0, 2.0 / (n - f), (f + n) / (n - f)], | |
[0, 0, 0, 1.0] | |
]) | |
) | |