Orthographic Lenses
The previous page described the PerspectiveLens
class, and the various
properties of a perspective lens, especially its field of view. There is
another kind of lens that is frequently used in 3-D rendering, but it doesn’t
have a field of view in the same sense at all. This is an orthographic lens.
In an orthographic lens, there is no perspective–parallel lines viewed by the
lens don’t converge; instead, they remain absolutely parallel in the image.
While a PerspectiveLens
closely imitates the behavior of a real,
physical camera lens, there is no real lens that does what an
OrthographicLens
does. An OrthographicLens
, therefore, is
most useful for special effects, where you want that unnatural look, or to
emulate the so-called 2½-D look of several popular real-time strategy games, or
strictly to render 2-d objects that shouldn’t have any perspective anyway. In
fact, the default camera created for the render2d scene graph, which is used
to draw all of the onscreen GUI elements in Panda, uses an OrthographicLens.
Since an orthographic lens doesn’t have a field of view angle, the
lens.set_fov()
method does nothing. To
adjust the amount that the orthographic lens sees, you must adjust its film
size. And unlike a PerspectiveLens
, the film size units are not
arbitrary–for an OrthographicLens
, the film size should be specified
in spatial units, the same units you used to model your scene. For instance, the
film size of the OrthographicLens
in the above illustration was set
with the call lens.set_film_size(20, 15)
, which
sets the film size to 20 feet by 15 feet–because the scene is modeled in feet,
and the panda is about 12 feet tall.
Another nice property of an orthographic lens is that the near distance does
not have to be greater than zero. In fact, it can be negative–you can put the
near plane behind the camera plane, which means the camera will see objects
behind itself. The OrthographicLens
for render2d
is set up with .set_near_far(-1000, 1000)
, so it
will render any objects with a Y value between -1000 and 1000 (assuming the
default Z-up coordinate system). (Of course, in render2d almost all objects have
a Y value of 0, so it doesn’t matter much.)
If you like, you can change the default camera to use an orthographic lens with something like this:
lens = OrthographicLens()
lens.setFilmSize(20, 15) # Or whatever is appropriate for your scene
base.cam.node().setLens(lens)
Note that using an orthographic lens can be nonintuitive at times–for instance, objects don’t get larger as you come closer to them, and they don’t get smaller as you get farther away–so it may be impossible to tell your camera is even moving!