#include "vector.h"
#include "tll.h"
Go to the source code of this file.
Compounds | |
class | SPLINE |
Functions | |
void | bspline (SPLINE *spline) |
VECTOR | bsplinepoint (SPLINE *spline) |
float | blend (int k, int t, int *u, float v) |
void | compute_intervals (int *u, int n, int t) |
void | compute_point (int *u, int n, int t, float v, VECTOR *control, VECTOR *output) |
void | DrawSplines (LinkedList< SPLINE > &) |
|
Definition at line 133 of file bspline.cpp. Referenced by compute_point().
00134 { 00135 float value; 00136 00137 if (t == 1) // base case for the recursion 00138 { 00139 if ((u[k] <= v) && (v < u[k+1])) 00140 value = 1; 00141 else 00142 value = 0; 00143 } 00144 else 00145 { 00146 if ((u[k+t-1] == u[k]) && (u[k+t] == u[k+1])) // check for divide by zero 00147 value = 0; 00148 else 00149 if (u[k+t-1] == u[k]) // if a term's denominator is zero,use just the other 00150 value = (u[k+t] - v) / (u[k+t] - u[k+1]) * blend(k+1, t-1, u, v); 00151 else 00152 if (u[k+t]==u[k+1]) 00153 value = (v - u[k]) / (u[k+t-1] - u[k]) * blend(k, t-1, u, v); 00154 else 00155 value = (v - u[k]) / (u[k+t-1] - u[k]) * blend(k, t-1, u, v) + (u[k+t] - v) / (u[k+t] - u[k+1]) * blend(k+1, t-1, u, v); 00156 } 00157 return value; 00158 } |
|
Definition at line 43 of file bspline.cpp. References compute_intervals(), compute_point(), SPLINE::Control, SPLINE::Degree, SPLINE::NumControl, SPLINE::NumPoints, SPLINE::Output, VECTOR::x, VECTOR::y, and VECTOR::z. Referenced by DrawSplines().
00044 { 00045 int t = spline->Degree; 00046 int n = spline->NumControl; 00047 int num_output = spline->NumPoints; 00048 VECTOR* control = spline->Control; 00049 00050 int* u; 00051 00052 int output_index; 00053 float increment,interval; 00054 VECTOR calcxyz; 00055 00056 u = new int[n+t+1]; 00057 compute_intervals(u, n, t); 00058 00059 increment = (float) (n-t+2) / (num_output-1); // how much parameter goes up each time 00060 interval = 0; 00061 00062 for (output_index = 0; output_index < num_output - 1; output_index++) 00063 { 00064 compute_point(u, n, t, interval, control, &calcxyz); 00065 spline->Output[output_index].x = calcxyz.x; 00066 spline->Output[output_index].y = calcxyz.y; 00067 spline->Output[output_index].z = calcxyz.z; 00068 interval = interval + increment; // increment our parameter 00069 } 00070 spline->Output[num_output-1].x = control[n].x; // put in the last point 00071 spline->Output[num_output-1].y = control[n].y; 00072 spline->Output[num_output-1].z = control[n].z; 00073 00074 delete u; 00075 } |
|
Definition at line 78 of file bspline.cpp. References ApplicationStartTime, compute_intervals(), compute_point(), SPLINE::Control, SPLINE::CopyOfEndTime, SPLINE::CopyOfStartTime, SPLINE::Degree, SPLINE::EndTime, SPLINE::NumControl, SPLINE::Repeat, SPLINE::StartTime, VECTOR::x, VECTOR::y, and VECTOR::z. Referenced by DrawSplines().
00079 { 00080 int t = spline->Degree; 00081 int n = spline->NumControl; 00082 VECTOR *control = spline->Control; 00083 // VECTOR *output = spline->Output; 00084 00085 int* u; 00086 float increment; 00087 VECTOR calcxyz; 00088 00089 u = new int[n+t+1]; 00090 compute_intervals(u, n, t); 00091 00092 float CurrentTime = (float)GetTickCount() - ApplicationStartTime; 00093 00094 float TotalTime = spline->EndTime - spline->StartTime; 00095 float Position; 00096 float ActualTime; 00097 00098 if (CurrentTime <= spline->CopyOfStartTime) 00099 { 00100 calcxyz.x = control[0].x; 00101 calcxyz.y = control[0].y; 00102 calcxyz.z = control[0].z; 00103 delete u; 00104 return calcxyz; 00105 } 00106 else if (CurrentTime >= spline->CopyOfEndTime) 00107 { 00108 if (spline->Repeat) 00109 { 00110 spline->CopyOfStartTime = CurrentTime; 00111 spline->CopyOfEndTime = CurrentTime + TotalTime; 00112 } 00113 calcxyz.x = control[n].x; 00114 calcxyz.y = control[n].y; 00115 calcxyz.z = control[n].z; 00116 delete u; 00117 return calcxyz; 00118 } 00119 else 00120 { 00121 ActualTime = CurrentTime - spline->CopyOfStartTime; 00122 Position = 1 / (TotalTime / ActualTime); 00123 } 00124 increment = (n - t + 2) * Position; // how much parameter goes up each time 00125 00126 compute_point(u, n, t, increment, control, &calcxyz); 00127 00128 delete u; 00129 00130 return calcxyz; 00131 } |
|
Definition at line 160 of file bspline.cpp. Referenced by bspline(), and bsplinepoint().
00161 { 00162 int j; 00163 00164 for (j = 0; j <= n+t; j++) 00165 { 00166 if (j<t) 00167 u[j]=0; 00168 else 00169 if ((t <= j) && (j <= n)) 00170 u[j] = j-t+1; 00171 else 00172 if (j > n) 00173 u[j] = n-t+2; // if n-t=-2 then we're screwed, everything goes to 0 00174 } 00175 } |
|
Definition at line 177 of file bspline.cpp. References blend(), VECTOR::x, VECTOR::y, and VECTOR::z. Referenced by bspline(), and bsplinepoint().
00178 { 00179 int k; 00180 float temp; 00181 00182 // initialize the variables that will hold our outputted point 00183 output->x=0; 00184 output->y=0; 00185 output->z=0; 00186 00187 for (k = 0; k <= n; k++) 00188 { 00189 temp = blend(k,t,u,v); // same blend is used for each dimension coordinate 00190 output->x = output->x + (control[k]).x * temp; 00191 output->y = output->y + (control[k]).y * temp; 00192 output->z = output->z + (control[k]).z * temp; 00193 } 00194 } |
|
Definition at line 196 of file bspline.cpp. References SPLINE::Blue, bspline(), bsplinepoint(), cameraMode, SPLINE::Control, currentCamera, currentLight, currentSpline, MATRIX::Element, LinkedList< T >::Get(), SPLINE::Green, lookAtPath, SPLINE::NumControl, SPLINE::NumPoints, numSplines, SPLINE::Output, SPLINE::Red, VECTOR::x, VECTOR::y, and VECTOR::z. Referenced by DrawGLScene().
00197 { 00198 GLUquadricObj * sphere = gluNewQuadric(); // sphere for control points 00199 00200 for (int loop = 0; loop < numSplines; loop++) // loop through all splines 00201 { 00202 spline = SplineList.Get(loop); // get the spline from the linked list 00203 00204 if (visible) // if the curves are visible 00205 { 00206 // draw the control points 00207 glDisable(GL_TEXTURE_2D); 00208 float mat_ambient[] = {spline->Red, spline->Green, spline->Blue, 1.0 }; 00209 float mat_diffuse[] = {spline->Red, spline->Green, spline->Blue, 1.0 }; 00210 float mat_specular[] = { 1.0, 1.0, 1.0, 1.0 }; 00211 glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); 00212 glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); 00213 glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); 00214 for (int i=0; i <= spline->NumControl; i++) 00215 { 00216 glPushMatrix(); 00217 glTranslatef(spline->Control[i].x, spline->Control[i].y, spline->Control[i].z); 00218 gluSphere(sphere,0.4,10,10); 00219 glPopMatrix(); 00220 } 00221 glEnable(GL_TEXTURE_2D); 00222 00223 // get the output point of this spline 00224 VECTOR Output = bsplinepoint(spline); 00225 00226 // draw the point 00227 glPointSize(5.0); 00228 glColor3f(0.0, 1.0 ,0.0); 00229 glDisable(GL_TEXTURE_2D); 00230 glDisable(GL_LIGHTING); 00231 glPushMatrix(); 00232 glBegin(GL_POINTS); 00233 glVertex3f(Output.x, Output.y, Output.z); 00234 glEnd(); 00235 glPopMatrix(); 00236 glEnable(GL_TEXTURE_2D); 00237 glEnable(GL_LIGHTING); 00238 00239 if (cameraMode > 0 && currentSpline == loop) // if the camera mode is not free and this is the current spline 00240 { 00241 VECTOR LookAt; 00242 if (cameraMode == 2 && (currentSpline != lookAtPath)) // if the camera mode is follow 00243 { 00244 SPLINE* spline2 = SplineList.Get(lookAtPath); 00245 LookAt = bsplinepoint(spline2); 00246 } 00247 camera[currentCamera].Position.x = Output.x; // set the camera position to the current spline output 00248 camera[currentCamera].Position.y = Output.y; 00249 camera[currentCamera].Position.z = Output.z; 00250 MATRIX mat; 00251 glPushMatrix(); 00252 glLoadIdentity(); 00253 if (cameraMode == 2 && (currentSpline != lookAtPath)) // if the camera mode is follow 00254 gluLookAt(Output.x, Output.y, Output.z, LookAt.x, LookAt.y, LookAt.z, 0, 1, 0); 00255 else 00256 // else make the camera look at another position 00257 gluLookAt(Output.x, Output.y, Output.z, light[currentLight].Position.x, light[currentLight].Position.y, light[currentLight].Position.z, 0, 1, 0); 00258 glGetFloatv(GL_MODELVIEW_MATRIX, mat.Element); // get the gluLookAt matrix 00259 glPopMatrix(); 00260 00261 float mat2[4][4]; 00262 mat2[0][0] = mat.Element[0]; 00263 mat2[0][1] = mat.Element[1]; 00264 mat2[0][2] = mat.Element[2]; 00265 mat2[0][3] = mat.Element[3]; 00266 mat2[1][0] = mat.Element[4]; 00267 mat2[1][1] = mat.Element[5]; 00268 mat2[1][2] = mat.Element[6]; 00269 mat2[1][3] = mat.Element[7]; 00270 mat2[2][0] = mat.Element[8]; 00271 mat2[2][1] = mat.Element[9]; 00272 mat2[2][2] = mat.Element[10]; 00273 mat2[2][3] = mat.Element[11]; 00274 mat2[3][0] = mat.Element[12]; 00275 mat2[3][1] = mat.Element[13]; 00276 mat2[3][2] = mat.Element[14]; 00277 mat2[3][3] = mat.Element[15]; 00278 00279 camera[currentCamera].Orientation.MatrixToQuat(mat2); // set the camera orientation to the gluLookAt matrix 00280 } 00281 00282 bspline(spline); // get the output points of this spline 00283 00284 // draw the curve along to the output points 00285 glColor3f(spline->Red, spline->Green, spline->Blue); 00286 glDisable(GL_TEXTURE_2D); 00287 glDisable(GL_LIGHTING); 00288 glPushMatrix(); 00289 glBegin(GL_LINE_STRIP); 00290 for (int i=0; i < spline->NumPoints; i++) 00291 { 00292 glVertex3fv(&spline->Output[i].x); 00293 } 00294 glEnd(); 00295 glPopMatrix(); 00296 glEnable(GL_TEXTURE_2D); 00297 glEnable(GL_LIGHTING); 00298 } 00299 00300 else if (cameraMode > 0) // if the curves are not visible and the camera mode is not free 00301 { 00302 VECTOR Output = bsplinepoint(spline); 00303 00304 VECTOR LookAt; 00305 if (cameraMode == 2 && currentSpline != lookAtPath) 00306 { 00307 SPLINE* spline2 = SplineList.Get(lookAtPath); 00308 LookAt = bsplinepoint(spline2); 00309 } 00310 camera[currentCamera].Position.x = Output.x; 00311 camera[currentCamera].Position.y = Output.y; 00312 camera[currentCamera].Position.z = Output.z; 00313 MATRIX mat; 00314 glPushMatrix(); 00315 glLoadIdentity(); 00316 if (cameraMode == 2 && currentSpline != lookAtPath) 00317 gluLookAt(Output.x, Output.y, Output.z, LookAt.x, LookAt.y, LookAt.z, 0, 1, 0); 00318 else 00319 gluLookAt(Output.x, Output.y, Output.z, light[currentLight].Position.x, light[currentLight].Position.y, light[currentLight].Position.z, 0, 1, 0); 00320 glGetFloatv(GL_MODELVIEW_MATRIX, mat.Element); 00321 glPopMatrix(); 00322 00323 float mat2[4][4]; 00324 mat2[0][0] = mat.Element[0]; 00325 mat2[0][1] = mat.Element[1]; 00326 mat2[0][2] = mat.Element[2]; 00327 mat2[0][3] = mat.Element[3]; 00328 mat2[1][0] = mat.Element[4]; 00329 mat2[1][1] = mat.Element[5]; 00330 mat2[1][2] = mat.Element[6]; 00331 mat2[1][3] = mat.Element[7]; 00332 mat2[2][0] = mat.Element[8]; 00333 mat2[2][1] = mat.Element[9]; 00334 mat2[2][2] = mat.Element[10]; 00335 mat2[2][3] = mat.Element[11]; 00336 mat2[3][0] = mat.Element[12]; 00337 mat2[3][1] = mat.Element[13]; 00338 mat2[3][2] = mat.Element[14]; 00339 mat2[3][3] = mat.Element[15]; 00340 00341 camera[currentCamera].Orientation.MatrixToQuat(mat2); 00342 } 00343 } 00344 } |