Skip to content

Commit 5926827

Browse files
authored
Merge pull request #106 from rdeits/rd/perspective-camera
Add perspective camera bindings (and test)
2 parents 46b2ae1 + c976ab5 commit 5926827

File tree

3 files changed

+66
-2
lines changed

3 files changed

+66
-2
lines changed

src/meshcat/commands.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from .geometry import Geometry, Object, Mesh, MeshPhongMaterial, OrthographicCamera, PointsMaterial, Points
1+
from .geometry import Geometry, Object, Mesh, MeshPhongMaterial, OrthographicCamera, PerspectiveCamera, PointsMaterial, Points
22
from .path import Path
33

44

@@ -9,7 +9,7 @@ def __init__(self, geometry_or_object, material=None, path=None):
99
if material is not None:
1010
raise(ValueError("Please supply either an Object OR a Geometry and a Material"))
1111
self.object = geometry_or_object
12-
elif isinstance(geometry_or_object, OrthographicCamera):
12+
elif isinstance(geometry_or_object, (OrthographicCamera, PerspectiveCamera)):
1313
self.object = geometry_or_object
1414
else:
1515
if material is None:

src/meshcat/geometry.py

+50
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,56 @@ def lower(self):
286286
}
287287
return data
288288

289+
class PerspectiveCamera(SceneElement):
290+
"""
291+
The PerspectiveCamera is the default camera used by the meshcat viewer. See
292+
https://threejs.org/docs/#api/en/cameras/PerspectiveCamera for more
293+
information.
294+
"""
295+
def __init__(self, fov = 50, aspect = 1, near = 0.1, far = 2000,
296+
zoom = 1, filmGauge=35, filmOffset = 0, focus = 10):
297+
"""
298+
fov : Camera frustum vertical field of view, from bottom to top of view, in degrees. Default is 50.
299+
aspect: Camera frustum aspect ratio, usually the canvas width / canvas height. Default is 1 (square canvas).
300+
near : Camera frustum near plane. Default is 0.1. The valid range is greater than 0 and less than the current
301+
value of the far plane. Note that, unlike for the OrthographicCamera, 0 is not a valid value for a
302+
PerspectiveCamera's near plane.
303+
far : Camera frustum far plane. Default is 2000.
304+
zoom : Gets or sets the zoom factor of the camera. Default is 1.
305+
filmGauge: Film size used for the larger axis. Default is 35 (millimeters). This parameter does not influence
306+
the projection matrix unless .filmOffset is set to a nonzero value.
307+
filmOffset: Horizontal off-center offset in the same unit as .filmGauge. Default is 0.
308+
focus: Object distance used for stereoscopy and depth-of-field effects. This parameter does not influence
309+
the projection matrix unless a StereoCamera is being used. Default is 10.
310+
"""
311+
#super(PerspectiveCamera, self).__init__()
312+
SceneElement.__init__(self)
313+
self.fov = fov
314+
self.aspect = aspect
315+
self.far = far
316+
self.near = near
317+
self.zoom = zoom
318+
self.filmGauge = filmGauge
319+
self.filmOffset = filmOffset
320+
self.focus = focus
321+
322+
def lower(self):
323+
data = {
324+
u"object": {
325+
u"uuid": self.uuid,
326+
u"type": u"PerspectiveCamera",
327+
u"aspect": self.aspect,
328+
u"far": self.far,
329+
u"filmGauge": self.filmGauge,
330+
u"filmOffset": self.filmOffset,
331+
u"focus": self.focus,
332+
u"fov": self.fov,
333+
u"near": self.near,
334+
u"zoom": self.zoom,
335+
}
336+
}
337+
return data
338+
289339
def item_size(array):
290340
if array.ndim == 1:
291341
return 1

src/meshcat/tests/test_drawing.py

+14
Original file line numberDiff line numberDiff line change
@@ -286,3 +286,17 @@ def runTest(self):
286286
self.vis['/Cameras/default/rotated/<object>'].set_property(
287287
"position", [0, 0, 0])
288288
self.vis['/Grid'].set_property("visible", False)
289+
290+
class TestPerspectiveCamera(VisualizerTest):
291+
def runTest(self):
292+
"""
293+
Test that we can set_object with a PerspectiveCamera.
294+
"""
295+
self.vis.set_object(g.Box([0.5, 0.5, 0.5]))
296+
297+
camera = g.PerspectiveCamera(fov=90)
298+
self.vis['/Cameras/default/rotated'].set_object(camera)
299+
self.vis['/Cameras/default'].set_transform(
300+
tf.translation_matrix([1, -1, 0.5]))
301+
self.vis['/Cameras/default/rotated/<object>'].set_property(
302+
"position", [0, 0, 0])

0 commit comments

Comments
 (0)