NAME
OpenGL::Simple::Viewer - Simple 3D geometry viewer using GLUT
SYNOPSIS
use OpenGL::Simple::Viewer;
use OpenGL::Simple::GLUT qw(:all);
glutInit;
my $v = new OpenGL::Simple::Viewer(
draw_geometry => sub { glutSolidTeapot(1.0); }
);
glutMainLoop;
ABSTRACT
This module uses OpenGL::Simple and OpenGL::Simple::GLUT to provide a quick and simple geometry viewer. If you just want to view a single biomolecule, or throw some polygons at the screen and make sure they come out looking OK, then this module might be for you. If you want to write a first-person-shooter or comprehensive visualization toolkit, this module is probably not for you.
DESCRIPTION
This package provides a simple OpenGL geometry viewer, through the GLUT library. An instance of OpenGL::Simple::Viewer opens a GLUT window, and renders some geometry provided through a callback subroutine; the geometry can be rotated, translated, and zoomed using the mouse.
When the viewer moves around, the window must be redrawn; this usually entails clearing the window, redrawing the background, setting the correct position and orientation, and then drawing the geometry. By default, all you need to supply is a subroutine which draws the geometry; everything else is taken care of. User-defined backgrounds can be set through a callback.
An OpenGL::Simple::Viewer object can be treated as a hashref with several user-adjustable properties:
- position
-
This is a reference to an array of three numbers, corresponding to the position of the viewer with respect to the geometry in 3D space.
- orientation
-
This is a Math::Quaternion representing the orientation of the geometry.
- translatescale,zoomscale
-
These control translation and zooming speeds.
METHODS
- new
-
my $v = new OpenGL::Simple::Viewer; # Should Just Work. my $v2 = new OpenGL::Simple::Viewer( title => 'Shiny window', # Set window title nearclip => 0.1, # Near clipping plane translatescale => 0.01, # Mouse translation speed zoomscale => 0.02, # Mouse zoom speed screenx => 256, # Initial window dimensions screeny => 256, sphererad => 256*0.5, # Virtual trackball size displaymode => GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH, # Window display mode initialize_gl => sub { glClearColor(0,0,1,1); # Blue background }, draw_background => sub { # Clear the window before drawing geometry glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); }, # Draw a teapot. draw_geometry => sub { glutSolidTeapot(1.0); }, );
This method opens up a new GLUT window with some useful event callbacks set, and returns an OpenGL::Simple::Viewer object to represent it. glutInit() should have been called beforehand, to set up the GLUT library.
new() takes either a hash or a reference to a hash of arguments, which can include:
- title
-
Sets the title of the window.
- nearclip
-
Sets the distance of the near clipping plane. Anything closer to the viewer than this will not be displayed.
- translatescale
-
Sets the scale of mouse translation; the larger the scale, the faster the geometry will move for a given mouse motion.
- zoomscale
-
Sets the scale of mouse zooming; the larger the scale, the faster the geometry will move for a given mouse motion.
- screenx,screeny
-
Sets the initial size of the window.
- sphererad
-
Sets the radius of the virtual trackball sphere.
- displaymode
-
Initial arguments to glutInitDisplayMode.
- initialize_gl
-
This is a subroutine which is called once the window has been created, to set up initial GL state such as lighting, texture environment, background colour, etc. By default it sets a black background and a white light. If this argument is set to undef, then no GL state will be changed.
- draw_geometry
-
Every time the viewer moves around, the geometry must be redrawn in its new position. This argument is a coderef which is called to redraw the geometry; you can put any GL calls you like in here.
- draw_background
-
When a redraw event occurs, this routine is called first, before the viewer is oriented or the geometry drawn. It can be used to draw a background image.
- make_reshapefunc
-
This method returns a callback subroutine which can be passed to glutReshapeFunc, and which sets the OpenGL::Viewer::Simple state after a window is resized. You are free to set your own reshape callback by calling glutReshapeFunc(); if you ever want the old one back, then simply
glutReshapeFunc($viewer->make_reshapefunc);
- make_displayfunc
-
Similarly to make_reshapefunc(), this returns the default display callback subroutine.
- make_mousefunc
-
Similarly to make_reshapefunc(), this returns the default mouse click callback subroutine.
- make_motionfunc
-
Similarly to make_reshapefunc(), this returns the default mouse motion callback subroutine.
- mouserotatemotion ($x0,$y0,$x1,$y1)
-
This method takes four arguments, corresponding to a motion from ($x0,$y0) to ($x1,$y1). It interprets the motion as the user dragging on a virtual trackball sitting on the window, and rotates the geometry accordingly. The radius of the trackball is set through the sphererad property.
- mousetransmotion ($x0,$y0,$x1,$y1)
-
This method takes the coordinates of a mouse drag event, and interprets it as a translation. The magnitude of the translation can be set through the translatescale property.
- mousetransmotion ($dz)
-
This method takes a single argument representing the length of a mouse drag event, and zooms the geometry accordingly, controlled by the zoomscale property.
- enslave
-
This method takes a list of OpenGL::Simple::Viewer objects, and sets them all to receive motion events from the object on which the method is invoked. If you have two viewers, $v1 and $v2, then
$v1->enslave($v2);
means that dragging the mouse around in viewer $v1 will cause both $v1 and $v2 to move; however, mouse-dragging in viewer $v2 will only cause it to move, and not $v1.
- decouple
-
This method takes a list of Viewer objects, and decouples their motion from that of the object on which it was invoked.
$v1->decouple($v2,$v3);
is the inverse of
$v1->enslave($v2,$v3);
- gang_together
-
This method takes a list of OpenGL::Simple::Viewer objects, and couples together their motion, so that mouse dragging in any of them will cause all of them to move.
$v1->gang_together($v2,$v3);
is the same as
OpenGL::Simple::Viewer::gang_together($v1,$v2,$v3)
and will couple the motion of $v1,$v2, and $v3.
SEE ALSO
OpenGL::Simple, OpenGL::Simple::GLUT
AUTHOR
Jonathan Chin, <jon-opengl-simple-viewer@earth.li>
COPYRIGHT AND LICENSE
Copyright 2004 by Jonathan Chin
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.