1 | /* -*- mode: c++; c-basic-offset: 4; indent-tabs-mode: nil -*- */ |
---|
2 | /* |
---|
3 | * ---------------------------------------------------------------------- |
---|
4 | * NvCamera.cpp : NvCamera class |
---|
5 | * |
---|
6 | * ====================================================================== |
---|
7 | * AUTHOR: Wei Qiao <qiaow@purdue.edu> |
---|
8 | * Purdue Rendering and Perceptualization Lab (PURPL) |
---|
9 | * |
---|
10 | * Copyright (c) 2004-2012 HUBzero Foundation, LLC |
---|
11 | * |
---|
12 | * See the file "license.terms" for information on usage and |
---|
13 | * redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES. |
---|
14 | * ====================================================================== |
---|
15 | */ |
---|
16 | #include <stdio.h> |
---|
17 | #include <math.h> |
---|
18 | |
---|
19 | #include <GL/glew.h> |
---|
20 | #include <GL/glu.h> |
---|
21 | |
---|
22 | #include <vrmath/vrQuaternion.h> |
---|
23 | #include <vrmath/vrRotation.h> |
---|
24 | #include <vrmath/vrMatrix4x4f.h> |
---|
25 | |
---|
26 | #include "NvCamera.h" |
---|
27 | #include "Trace.h" |
---|
28 | |
---|
29 | static inline float deg2rad(float deg) |
---|
30 | { |
---|
31 | return ((deg * M_PI) / 180.); |
---|
32 | } |
---|
33 | |
---|
34 | static inline float rad2deg(float rad) |
---|
35 | { |
---|
36 | return ((rad * 180.) / M_PI); |
---|
37 | } |
---|
38 | |
---|
39 | NvCamera::NvCamera(int startx, int starty, int w, int h, |
---|
40 | float loc_x, float loc_y, float loc_z, |
---|
41 | float target_x, float target_y, float target_z, |
---|
42 | float angle_x, float angle_y, float angle_z) : |
---|
43 | _location(loc_x, loc_y, loc_z), |
---|
44 | _target(target_x, target_y, target_z), |
---|
45 | _angle(angle_x, angle_y, angle_z), |
---|
46 | _width(w), |
---|
47 | _height(h), |
---|
48 | _startX(startx), |
---|
49 | _startY(starty) |
---|
50 | { |
---|
51 | } |
---|
52 | |
---|
53 | void |
---|
54 | NvCamera::initialize() |
---|
55 | { |
---|
56 | TRACE("camera: %d, %d\n", _width, _height); |
---|
57 | glViewport(_startX, _startY, _width, _height); |
---|
58 | glMatrixMode(GL_PROJECTION); |
---|
59 | glLoadIdentity(); |
---|
60 | gluPerspective(30, |
---|
61 | (GLdouble)(_width - _startX)/(GLdouble)(_height - _startY), |
---|
62 | 0.1, 50.0); |
---|
63 | |
---|
64 | glMatrixMode(GL_MODELVIEW); |
---|
65 | glLoadIdentity(); |
---|
66 | |
---|
67 | #ifndef OLD_CAMERA |
---|
68 | glTranslatef(-_location.x, -_location.y, -_location.z); |
---|
69 | glMultMatrixf((const GLfloat *)_cameraMatrix.get()); |
---|
70 | #else |
---|
71 | |
---|
72 | gluLookAt(_location.x, _location.y, _location.z, |
---|
73 | _target.x, _target.y, _target.z, |
---|
74 | 0., 1., 0.); |
---|
75 | |
---|
76 | if (_angle.x != 0.0f) |
---|
77 | glRotated(_angle.x, 1., 0., 0.); |
---|
78 | if (_angle.y != 0.0f) |
---|
79 | glRotated(_angle.y, 0., 1., 0.); |
---|
80 | if (_angle.z != 0.0f) |
---|
81 | glRotated(_angle.z, 0., 0., 1.); |
---|
82 | #endif |
---|
83 | } |
---|
84 | |
---|
85 | void NvCamera::rotate(double *quat) |
---|
86 | { |
---|
87 | vrQuaternion q(quat[0], quat[1], quat[2], quat[3]); |
---|
88 | vrRotation rot; |
---|
89 | rot.set(q); |
---|
90 | _cameraMatrix.makeRotation(rot); |
---|
91 | _cameraMatrix.transpose(); |
---|
92 | _angle.set(0, 0, 0); |
---|
93 | TRACE("Set rotation to quat: %g %g %g %g\n", |
---|
94 | quat[0], quat[1], quat[2], quat[3]); |
---|
95 | } |
---|
96 | |
---|
97 | void NvCamera::rotate(float angle_x, float angle_y, float angle_z) |
---|
98 | { |
---|
99 | #ifdef OLD_CAMERA |
---|
100 | _angle = Vector3(angle_x, angle_y, angle_z); |
---|
101 | #else |
---|
102 | angle_x = -angle_x; |
---|
103 | angle_y = angle_y - 180.; |
---|
104 | _angle = Vector3(angle_x, angle_y, angle_z); |
---|
105 | |
---|
106 | _cameraMatrix.makeRotation(1, 0, 0, deg2rad(_angle.x)); |
---|
107 | vrMatrix4x4f mat; |
---|
108 | mat.makeRotation(0, 1, 0, deg2rad(_angle.y)); |
---|
109 | _cameraMatrix.multiply(mat); |
---|
110 | mat.makeRotation(0, 0, 1, deg2rad(_angle.z)); |
---|
111 | _cameraMatrix.multiply(mat); |
---|
112 | //_cameraMatrix.transpose(); |
---|
113 | #endif |
---|
114 | TRACE("Set rotation to angles: %g %g %g\n", |
---|
115 | _angle.x, _angle.y, _angle.z); |
---|
116 | } |
---|
117 | |
---|
118 | void NvCamera::rotate(const Vector3& angle) |
---|
119 | { |
---|
120 | #ifdef OLD_CAMERA |
---|
121 | _angle = angle; |
---|
122 | #else |
---|
123 | _angle.x = -angle.x; |
---|
124 | _angle.y = angle.y - 180.; |
---|
125 | _angle.z = angle.z; |
---|
126 | |
---|
127 | _cameraMatrix.makeRotation(1, 0, 0, deg2rad(_angle.x)); |
---|
128 | vrMatrix4x4f mat; |
---|
129 | mat.makeRotation(0, 1, 0, deg2rad(_angle.y)); |
---|
130 | _cameraMatrix.multiply(mat); |
---|
131 | mat.makeRotation(0, 0, 1, deg2rad(_angle.z)); |
---|
132 | _cameraMatrix.multiply(mat); |
---|
133 | //_cameraMatrix.transpose(); |
---|
134 | #endif |
---|
135 | TRACE("Set rotation to angles: %g %g %g\n", |
---|
136 | _angle.x, _angle.y, _angle.z); |
---|
137 | } |
---|