// Camera.cpp: implementation of the CCamera class. // ////////////////////////////////////////////////////////////////////// #include "Camera.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CCamera::CCamera():CObjectInScene() { Type=CAMERA; Name="camera"; Visible=true; Selected=false; NormalColor[0]=0.0; NormalColor[0]=0.8; NormalColor[0]=0.8; Eye[0]=0.0;Eye[1]=0.0;Eye[2]=0.0; At[0]=0.0;At[1]=0.0;At[2]=-1.0; Up[0]=0.0;Up[1]=1.0;Up[2]=0.0; } CCamera::~CCamera() { } void CCamera::readProperty(FILE *fp) { int i; char s[81]; float x0,x1,x2; i = fseek( fp, 0L, SEEK_SET); if( i ) printf( "Fseek failed"); do { fscanf( fp, "%s", s ); i=strcmp( s,Name); }while(!feof(fp) && i!=0); if(!feof(fp)){ fscanf(fp,"%s\t%f\n",s,&x0); fscanf(fp,"%s\t%f\n",s,&x1); fscanf(fp,"%s\t%f\n",s,&x2); Fov=x0;Near=x1;Far=x2; fscanf(fp,"%s\t%f,%f,%f\n",s,&x0,&x1,&x2); //Eye[0]=x0;Eye[1]=x1;Eye[2]=x2; TMatrix[12]=x0;TMatrix[13]=x1;TMatrix[14]=x2; fscanf(fp,"%s\t%f,%f,%f\n",s,&x0,&x1,&x2); At[0]=x0;At[1]=x1;At[2]=x2; fscanf(fp,"%s\t%f,%f,%f\n",s,&x0,&x1,&x2); Up[0]=x0;Up[1]=x1;Up[2]=x2; } } void CCamera::writeProperty(FILE *fp) { fprintf(fp, "%s\t%s\n","Name:", Name); fprintf(fp, "%s\t%f\n","Fov:", Fov); fprintf(fp, "%s\t%f\n","Near:", Near); fprintf(fp, "%s\t%f\n","Far:", Far); //fprintf(fp, "%s\t%f,%f,%f\n","Eye:", Eye[0],Eye[1],Eye[2]); fprintf(fp, "%s\t%f,%f,%f\n","Eye:", TMatrix[12],TMatrix[13],TMatrix[14]); fprintf(fp, "%s\t%f,%f,%f\n","At:", At[0],At[1],At[2]); fprintf(fp, "%s\t%f,%f,%f\n\n","Up:", Up[0],Up[1],Up[2]); } void CCamera::render() { float p[3],n[3],v[3],u[3]; float s,t; int i; if (isSelected()) glColor3fv(HighlightColor); else glColor3fv(NormalColor); GLUquadric* quad=gluNewQuadric(); GLdouble radius=0.3; GLint slices=10; GLint stacks=10; gluSphere(quad, radius,slices,stacks); //calculate n,v,v for(i=0;i<3;i++) p[i]=TMatrix[12+i]; for(i=0;i<3;i++) n[i]=At[i]-p[i]; s=Up[0]*n[0]+Up[1]*n[1]+Up[2]*n[2]; t=n[0]*n[0]+n[1]*n[1]+n[2]*n[2]; s=s/t; for(i=0;i<3;i++) v[i]=Up[i]-s*n[i]; s=v[0]*v[0]+v[1]*v[1]+v[2]*v[2]; s=sqrt(s); t=sqrt(t); if (t==0) printf("Error: Eye and At cann't be the save point!\n"); else { for(i=0;i<3;i++){ n[i]/=t; v[i]/=s; } } u[0]=v[1]*n[2]-v[2]*n[1]; u[1]=v[2]*n[0]-v[0]*n[2]; u[2]=v[0]*n[1]-v[1]*n[0]; //draw n,v,u glBegin(GL_LINES); glColor3f(1.0, 0.0, 0.0); glVertex3d(0.0,0.0,0.0); glVertex3d(3*u[0],3*u[1],3*u[2]); glColor3f(0.0, 1.0, 0.0); glVertex3d(0.0,0.0,0.0); glVertex3d(3*v[0],3*v[1],3*v[2]); glColor3f(0.0, 0.0, 1.0); glVertex3d(0.0,0.0,0.0); glVertex3d(3*n[0],3*n[1],3*n[2]); glEnd(); }