arcball.h
上传用户:gb3593
上传日期:2022-01-07
资源大小:3028k
文件大小:3k
- /**********************************************************************
- arcball.h
- GLUI User Interface Toolkit (LGPL)
- Copyright (c) 1998 Paul Rademacher
- Feb 1998, Paul Rademacher (rademach@cs.unc.edu)
- Oct 2003, Nigel Stewart - GLUI Code Cleaning
- WWW: http://sourceforge.net/projects/glui/
- Forums: http://sourceforge.net/forum/?group_id=92496
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- ---------------------------------------------------------------------
- A C++ class that implements the Arcball, as described by Ken
- Shoemake in Graphics Gems IV.
- This class takes as input mouse events (mouse down, mouse drag,
- mouse up), and creates the appropriate quaternions and 4x4 matrices
- to represent the rotation given by the mouse.
-
- This class is used as follows:
- - initialize [either in the constructor or with set_params()], the
- center position (x,y) of the arcball on the screen, and the radius
- - on mouse down, call mouse_down(x,y) with the mouse position
- - as the mouse is dragged, repeatedly call mouse_motion() with the
- current x and y positions. One can optionally pass in the current
- state of the SHIFT, ALT, and CONTROL keys (passing zero if keys
- are not pressed, non-zero otherwise), which constrains
- the rotation to certain axes (X for CONTROL, Y for ALT).
- - when the mouse button is released, call mouse_up()
- Axis constraints can also be explicitly set with the
- set_constraints() function.
- The current rotation is stored in the 4x4 float matrix 'rot'.
- It is also stored in the quaternion 'q_now'.
- **********************************************************************/
- #ifndef GLUI_ARCBALL_H
- #define GLUI_ARCBALL_H
- #include "glui_internal.h"
- #include "algebra3.h"
- #include "quaternion.h"
- class Arcball
- {
- public:
- Arcball();
- Arcball(mat4 *mtx);
- Arcball(const vec2 ¢er, float radius);
- void set_damping(float d);
- void idle();
- void mouse_down(int x, int y);
- void mouse_up();
- void mouse_motion(int x, int y, int shift, int ctrl, int alt);
- void mouse_motion(int x, int y);
- void set_constraints(bool constrain_x, bool constrain_y);
- void set_params(const vec2 ¢er, float radius);
- void reset_mouse();
- void init();
- vec3 constrain_vector(const vec3 &vector, const vec3 &axis);
- vec3 mouse_to_sphere(const vec2 &p);
-
- //public:
- int is_mouse_down; /* true for down, false for up */
- int is_spinning;
- quat q_now, q_down, q_drag, q_increment;
- vec2 down_pt;
- mat4 rot, rot_increment;
- mat4 *rot_ptr;
- bool constraint_x, constraint_y;
- vec2 center;
- float radius, damp_factor;
- int zero_increment;
- };
- #endif