Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[Manta] r2272 - in trunk: Interface Model/Cameras UserInterface


Chronological Thread 
  • From: aek@sci.utah.edu
  • To: manta@sci.utah.edu
  • Subject: [Manta] r2272 - in trunk: Interface Model/Cameras UserInterface
  • Date: Tue, 27 May 2008 17:26:49 -0600 (MDT)

Author: aek
Date: Tue May 27 17:26:48 2008
New Revision: 2272

Modified:
   trunk/Interface/Camera.h
   trunk/Model/Cameras/EnvironmentCamera.cc
   trunk/Model/Cameras/EnvironmentCamera.h
   trunk/Model/Cameras/FisheyeCamera.cc
   trunk/Model/Cameras/FisheyeCamera.h
   trunk/Model/Cameras/OrthogonalCamera.cc
   trunk/Model/Cameras/OrthogonalCamera.h
   trunk/Model/Cameras/PinholeCamera.cc
   trunk/Model/Cameras/PinholeCamera.h
   trunk/Model/Cameras/SphereCamera.h
   trunk/Model/Cameras/ThinLensCamera.cc
   trunk/Model/Cameras/ThinLensCamera.h
   trunk/UserInterface/XWindowUI.cc
   trunk/UserInterface/XWindowUI.h
Log:
Adding a "game mode" camera control.  This is a more intuitive UI control
for navigating around architectural type models.

Holding the left mouse button drives the camera forward and back and turns
from side to side.  Holding the right mouse button lets you pan to look
around.  Holding the middle mouse button lets you move up and down and
strafe side to side.  Most movements are relative to the up vector (not the
camera v vector), so you can you can look up at a ceiling or down at the
floor while still moving horizontally.  This probably all sounds rather
complicated, but it's easy once you try it.

Activate this new mode with something like '-ui "X( -game 50.0 )"', where
the number gives the movement speed.



Modified: trunk/Interface/Camera.h
==============================================================================
--- trunk/Interface/Camera.h    (original)
+++ trunk/Interface/Camera.h    Tue May 27 17:26:48 2008
@@ -102,6 +102,7 @@
     // AffineTransform needs to not be a reference in order to get the
     // transactions to work properly.  A copy is needed.
     virtual void transform(AffineTransform t, TransformCenter) = 0;
+    virtual void gameTransform(Vector, Vector) = 0;
     virtual void autoview(const BBox bbox) = 0;
     virtual void output( std::ostream& os ) = 0; // Output a text
                                                  // description of the

Modified: trunk/Model/Cameras/EnvironmentCamera.cc
==============================================================================
--- trunk/Model/Cameras/EnvironmentCamera.cc    (original)
+++ trunk/Model/Cameras/EnvironmentCamera.cc    Tue May 27 17:26:48 2008
@@ -218,6 +218,31 @@
   setup();
 }
 
+void EnvironmentCamera::gameTransform(Vector rotation, Vector translation)
+{
+  Vector gaze( eye - lookat );
+  Vector side( Cross( up, gaze ) );
+  Vector projectedGaze( gaze - up * Dot( up, gaze ) );
+  Vector projectedSide( side - up * Dot( up, side ) );
+  gaze.normalize();
+  side.normalize();
+  projectedGaze.normalize();
+  projectedSide.normalize();
+  AffineTransform frame;
+  frame.initWithTranslation( -eye );
+  frame.rotate( side, rotation.y() );
+  frame.rotate( up, rotation.x() );
+  frame.translate( projectedSide * translation.x() );
+  frame.translate( up * translation.y() );
+  frame.translate( projectedGaze * translation.z() );
+  frame.translate( eye );
+  eye = frame.multiply_point( eye );
+  lookat = frame.multiply_point( lookat );
+  frame.initWithRotation( gaze, rotation.z() );
+  up = frame.multiply_vector( up );
+  setup();
+}
+
 void EnvironmentCamera::autoview(const BBox /*bbox*/)
 {
   // This functionality doesn't make much sense with the environment camera

Modified: trunk/Model/Cameras/EnvironmentCamera.h
==============================================================================
--- trunk/Model/Cameras/EnvironmentCamera.h     (original)
+++ trunk/Model/Cameras/EnvironmentCamera.h     Tue May 27 17:26:48 2008
@@ -25,6 +25,7 @@
     virtual void translate(Vector);
     virtual void dolly(Real);
     virtual void transform(AffineTransform t, TransformCenter);
+    virtual void gameTransform(Vector, Vector);
     virtual void autoview(const BBox bbox);
 
     virtual void getBasicCameraData(BasicCameraData& cam) const;

Modified: trunk/Model/Cameras/FisheyeCamera.cc
==============================================================================
--- trunk/Model/Cameras/FisheyeCamera.cc        (original)
+++ trunk/Model/Cameras/FisheyeCamera.cc        Tue May 27 17:26:48 2008
@@ -168,6 +168,31 @@
   setup();
 }
 
+void FisheyeCamera::gameTransform(Vector rotation, Vector translation)
+{
+  Vector gaze( eye - lookat );
+  Vector side( Cross( up, gaze ) );
+  Vector projectedGaze( gaze - up * Dot( up, gaze ) );
+  Vector projectedSide( side - up * Dot( up, side ) );
+  gaze.normalize();
+  side.normalize();
+  projectedGaze.normalize();
+  projectedSide.normalize();
+  AffineTransform frame;
+  frame.initWithTranslation( -eye );
+  frame.rotate( side, rotation.y() );
+  frame.rotate( up, rotation.x() );
+  frame.translate( projectedSide * translation.x() );
+  frame.translate( up * translation.y() );
+  frame.translate( projectedGaze * translation.z() );
+  frame.translate( eye );
+  eye = frame.multiply_point( eye );
+  lookat = frame.multiply_point( lookat );
+  frame.initWithRotation( gaze, rotation.z() );
+  up = frame.multiply_vector( up );
+  setup();
+}
+
 void FisheyeCamera::autoview(const BBox bbox)
 {
   output(cerr);

Modified: trunk/Model/Cameras/FisheyeCamera.h
==============================================================================
--- trunk/Model/Cameras/FisheyeCamera.h (original)
+++ trunk/Model/Cameras/FisheyeCamera.h Tue May 27 17:26:48 2008
@@ -27,6 +27,7 @@
     virtual void translate(Vector);
     virtual void dolly(Real);
     virtual void transform(AffineTransform t, TransformCenter);
+    virtual void gameTransform(Vector, Vector);
     virtual void autoview(const BBox bbox);
     virtual void output( std::ostream &os );
     static Camera* create(const vector<string>& args);

Modified: trunk/Model/Cameras/OrthogonalCamera.cc
==============================================================================
--- trunk/Model/Cameras/OrthogonalCamera.cc     (original)
+++ trunk/Model/Cameras/OrthogonalCamera.cc     Tue May 27 17:26:48 2008
@@ -171,6 +171,31 @@
   setup();
 }
 
+void OrthogonalCamera::gameTransform(Vector rotation, Vector translation)
+{
+  Vector gaze( eye - lookat );
+  Vector side( Cross( up, gaze ) );
+  Vector projectedGaze( gaze - up * Dot( up, gaze ) );
+  Vector projectedSide( side - up * Dot( up, side ) );
+  gaze.normalize();
+  side.normalize();
+  projectedGaze.normalize();
+  projectedSide.normalize();
+  AffineTransform frame;
+  frame.initWithTranslation( -eye );
+  frame.rotate( side, rotation.y() );
+  frame.rotate( up, rotation.x() );
+  frame.translate( projectedSide * translation.x() );
+  frame.translate( up * translation.y() );
+  frame.translate( projectedGaze * translation.z() );
+  frame.translate( eye );
+  eye = frame.multiply_point( eye );
+  lookat = frame.multiply_point( lookat );
+  frame.initWithRotation( gaze, rotation.z() );
+  up = frame.multiply_vector( up );
+  setup();
+}
+
 void OrthogonalCamera::autoview(const BBox bbox)
 {
   output(cerr);

Modified: trunk/Model/Cameras/OrthogonalCamera.h
==============================================================================
--- trunk/Model/Cameras/OrthogonalCamera.h      (original)
+++ trunk/Model/Cameras/OrthogonalCamera.h      Tue May 27 17:26:48 2008
@@ -24,6 +24,7 @@
     virtual void translate(Vector);
     virtual void dolly(Real);
     virtual void transform(AffineTransform t, TransformCenter);
+    virtual void gameTransform(Vector, Vector);
     virtual void autoview(const BBox bbox);
     virtual void output( std::ostream &os );
     static Camera* create(const vector<string>& args);

Modified: trunk/Model/Cameras/PinholeCamera.cc
==============================================================================
--- trunk/Model/Cameras/PinholeCamera.cc        (original)
+++ trunk/Model/Cameras/PinholeCamera.cc        Tue May 27 17:26:48 2008
@@ -474,6 +474,31 @@
   setup();
 }
 
+void PinholeCamera::gameTransform(Vector rotation, Vector translation)
+{
+  Vector gaze( eye - lookat );
+  Vector side( Cross( up, gaze ) );
+  Vector projectedGaze( gaze - up * Dot( up, gaze ) );
+  Vector projectedSide( side - up * Dot( up, side ) );
+  gaze.normalize();
+  side.normalize();
+  projectedGaze.normalize();
+  projectedSide.normalize();
+  AffineTransform frame;
+  frame.initWithTranslation( -eye );
+  frame.rotate( side, rotation.y() );
+  frame.rotate( up, rotation.x() );
+  frame.translate( projectedSide * translation.x() );
+  frame.translate( up * translation.y() );
+  frame.translate( projectedGaze * translation.z() );
+  frame.translate( eye );
+  eye = frame.multiply_point( eye );
+  lookat = frame.multiply_point( lookat );
+  frame.initWithRotation( gaze, rotation.z() );
+  up = frame.multiply_vector( up );
+  setup();
+}
+
 void PinholeCamera::autoview(const BBox bbox)
 {
   Vector diag(bbox.diagonal());

Modified: trunk/Model/Cameras/PinholeCamera.h
==============================================================================
--- trunk/Model/Cameras/PinholeCamera.h (original)
+++ trunk/Model/Cameras/PinholeCamera.h Tue May 27 17:26:48 2008
@@ -25,6 +25,7 @@
     virtual void translate(Vector);
     virtual void dolly(Real);
     virtual void transform(AffineTransform t, TransformCenter);
+    virtual void gameTransform(Vector, Vector);
     virtual void autoview(const BBox bbox);
     virtual void output( std::ostream& os );
 

Modified: trunk/Model/Cameras/SphereCamera.h
==============================================================================
--- trunk/Model/Cameras/SphereCamera.h  (original)
+++ trunk/Model/Cameras/SphereCamera.h  Tue May 27 17:26:48 2008
@@ -24,6 +24,7 @@
     virtual void translate(Vector) { }
     virtual void dolly(Real) { }
     virtual void transform(AffineTransform t, TransformCenter) { }
+    virtual void gameTransform(Vector, Vector) { }
     virtual void autoview(const BBox bbox) { }
     virtual void output( std::ostream &os );
     static Camera* create(const vector<string>& args);

Modified: trunk/Model/Cameras/ThinLensCamera.cc
==============================================================================
--- trunk/Model/Cameras/ThinLensCamera.cc       (original)
+++ trunk/Model/Cameras/ThinLensCamera.cc       Tue May 27 17:26:48 2008
@@ -349,6 +349,31 @@
   setup();
 }
 
+void ThinLensCamera::gameTransform(Vector rotation, Vector translation)
+{
+  Vector gaze( eye - lookat );
+  Vector side( Cross( up, gaze ) );
+  Vector projectedGaze( gaze - up * Dot( up, gaze ) );
+  Vector projectedSide( side - up * Dot( up, side ) );
+  gaze.normalize();
+  side.normalize();
+  projectedGaze.normalize();
+  projectedSide.normalize();
+  AffineTransform frame;
+  frame.initWithTranslation( -eye );
+  frame.rotate( side, rotation.y() );
+  frame.rotate( up, rotation.x() );
+  frame.translate( projectedSide * translation.x() );
+  frame.translate( up * translation.y() );
+  frame.translate( projectedGaze * translation.z() );
+  frame.translate( eye );
+  eye = frame.multiply_point( eye );
+  lookat = frame.multiply_point( lookat );
+  frame.initWithRotation( gaze, rotation.z() );
+  up = frame.multiply_vector( up );
+  setup();
+}
+
 void ThinLensCamera::autoview(const BBox bbox)
 {
   Vector diag(bbox.diagonal());

Modified: trunk/Model/Cameras/ThinLensCamera.h
==============================================================================
--- trunk/Model/Cameras/ThinLensCamera.h        (original)
+++ trunk/Model/Cameras/ThinLensCamera.h        Tue May 27 17:26:48 2008
@@ -26,6 +26,7 @@
     virtual void translate(Vector);
     virtual void dolly(Real);
     virtual void transform(AffineTransform t, TransformCenter);
+    virtual void gameTransform(Vector, Vector);
     virtual void autoview(const BBox bbox);
     virtual void output( std::ostream& os );
 

Modified: trunk/UserInterface/XWindowUI.cc
==============================================================================
--- trunk/UserInterface/XWindowUI.cc    (original)
+++ trunk/UserInterface/XWindowUI.cc    Tue May 27 17:26:48 2008
@@ -83,6 +83,14 @@
   int offset=0;
   CameraPath::IOMode mode = CameraPath::WriteKnots;
   string fname="";
+  bool gameMode = false;
+
+  fov_speed = 10;
+  translate_speed = 1;
+  dolly_speed = 5;
+  rotate_speed = 2;
+  autoview_fov = 60;
+  trackball_radius = 0.8;
 
   // Parse command line args.
   for (size_t i=0;i<args.size();++i) {
@@ -101,6 +109,11 @@
       if (!getStringArg(i, args, fname))
         throw IllegalArgument("XWindowUI -path", i, args);
       mode=CameraPath::ReadKnots;
+    } else if (arg=="-game") {
+      gameMode = true;
+      double speed = 50.0;
+      getDoubleArg(i, args, speed);
+      translate_speed = speed;
     } else if (arg=="-quit") {
       quit=true;
     }
@@ -121,19 +134,15 @@
                           offset);
   }
 
-  fov_speed = 10;
-  translate_speed = 1;
-  dolly_speed = 5;
-  rotate_speed = 2;
-  autoview_fov = 60;
-  trackball_radius = 0.8;
-  
   lightsVisible = false;
   waitingToDeleteLights = false;
   originalObject = NULL;
 
   register_default_keys();
-  register_default_mouse();
+  if (gameMode)
+      register_game_mouse();
+  else
+      register_default_mouse();
   rtrt_interface->registerSetupCallback(this);
   rtrt_interface->registerSerialAnimationCallback(Callback::create(this, 
&XWindowUI::animation_callback));
   rtrt_interface->registerTerminationCallback(Callback::create(this, 
&XWindowUI::shutdown));
@@ -571,6 +580,28 @@
                  Callback::create(this, &XWindowUI::mouse_debug_ray));
 }
 
+void XWindowUI::register_game_mouse()
+{
+  register_mouse(0, Button1,
+                 "track and pan",
+                 Callback::create(this, &XWindowUI::mouse_track_and_pan));
+  register_mouse(0, Button2,
+                 "track",
+                 Callback::create(this, &XWindowUI::mouse_track));
+  register_mouse(0, Button3,
+                 "pan",
+                 Callback::create(this, &XWindowUI::mouse_pan));
+  register_mouse(ShiftMask, Button3,
+                 "change field of view",
+                 Callback::create(this, &XWindowUI::mouse_fov));
+  register_mouse(ControlMask, Button1,
+                 "Debug ray",
+                 Callback::create(this, &XWindowUI::mouse_debug_ray));
+  register_mouse(ShiftMask, Button1,
+                 "Debug SSE ray",
+                 Callback::create(this, &XWindowUI::mouse_debug_ray));
+}
+
 void XWindowUI::helpkey(unsigned int, unsigned long, int)
 {
   cerr << "Keymapping:\n";
@@ -910,6 +941,72 @@
   rtrt_interface->addTransaction("dolly",
                                  Callback::create(camera, &Camera::dolly,
                                                   scale));
+}
+
+void XWindowUI::mouse_track_and_pan(unsigned int, unsigned int,
+                                    int event, int channel, int mouse_x, int 
mouse_y)
+{
+  InteractionState& ias = interactions[channel];
+  if(event == ButtonPress){
+    ias.last_x = mouse_x;
+    ias.last_y = mouse_y;
+  } else {
+    XWindow* window = windows[channel];
+    Real xmotion =  Real(ias.last_x-mouse_x)/window->xres;
+    Real ymotion = -Real(ias.last_y-mouse_y)/window->yres;
+    Vector rotation(xmotion*rotate_speed, 0, 0);
+    Vector translation(0, 0, ymotion*translate_speed);
+    Camera* camera = rtrt_interface->getCamera(channel);
+    rtrt_interface->addTransaction("game",
+                                   Callback::create(camera, 
&Camera::gameTransform,
+                                                    rotation, translation));
+    ias.last_x = mouse_x;
+    ias.last_y = mouse_y;
+  }
+}
+
+void XWindowUI::mouse_track(unsigned int, unsigned int,
+                            int event, int channel, int mouse_x, int mouse_y)
+{
+  InteractionState& ias = interactions[channel];
+  if(event == ButtonPress){
+    ias.last_x = mouse_x;
+    ias.last_y = mouse_y;
+  } else {
+    XWindow* window = windows[channel];
+    Real xmotion = -Real(ias.last_x-mouse_x)/window->xres;
+    Real ymotion =  Real(ias.last_y-mouse_y)/window->yres;
+    Vector rotation(0, 0, 0);
+    Vector translation(xmotion*translate_speed, ymotion*translate_speed, 0);
+    Camera* camera = rtrt_interface->getCamera(channel);
+    rtrt_interface->addTransaction("game",
+                                   Callback::create(camera, 
&Camera::gameTransform,
+                                                    rotation, translation));
+    ias.last_x = mouse_x;
+    ias.last_y = mouse_y;
+  }
+}
+
+void XWindowUI::mouse_pan(unsigned int, unsigned int,
+                            int event, int channel, int mouse_x, int mouse_y)
+{
+  InteractionState& ias = interactions[channel];
+  if(event == ButtonPress){
+    ias.last_x = mouse_x;
+    ias.last_y = mouse_y;
+  } else {
+    XWindow* window = windows[channel];
+    Real xmotion = Real(ias.last_x-mouse_x)/window->xres;
+    Real ymotion = Real(ias.last_y-mouse_y)/window->yres;
+    Vector rotation(xmotion*rotate_speed, ymotion*rotate_speed, 0);
+    Vector translation(0, 0, 0);
+    Camera* camera = rtrt_interface->getCamera(channel);
+    rtrt_interface->addTransaction("game",
+                                   Callback::create(camera, 
&Camera::gameTransform,
+                                                    rotation, translation));
+    ias.last_x = mouse_x;
+    ias.last_y = mouse_y;
+  }
 }
 
 void XWindowUI::shootDebugRays(int channel,

Modified: trunk/UserInterface/XWindowUI.h
==============================================================================
--- trunk/UserInterface/XWindowUI.h     (original)
+++ trunk/UserInterface/XWindowUI.h     Tue May 27 17:26:48 2008
@@ -71,6 +71,7 @@
   protected:
     void register_default_keys();
     void register_default_mouse();
+    void register_game_mouse();
     void printhelp(std::ostream& out);
 
   private:
@@ -99,6 +100,9 @@
     void mouse_dolly(unsigned int, unsigned int, int, int, int, int);
     void mouse_wheel_dolly(unsigned int, unsigned int, int, int, int, int);
     void mouse_rotate(unsigned int, unsigned int, int, int, int, int);
+    void mouse_track_and_pan(unsigned int, unsigned int, int, int, int, int);
+    void mouse_track(unsigned int, unsigned int, int, int, int, int);
+    void mouse_pan(unsigned int, unsigned int, int, int, int, int);
     void mouse_debug_ray(unsigned int, unsigned int, int, int, int, int);
     // Transaction function
     void shootDebugRays(int channel, int mouse_x, int mouse_y, int 
numPixels);



Archive powered by MHonArc 2.6.16.

Top of page