// based // Camera object (perspective camera). By John Haggerty (Slime). // http://www.slimeland.com/ // Created January 21, 2003 // originally written in javascript class cCamera2 { private: cTransform xt; cTransform yt; cTransform tt[2]; public: cVector loc,dir,right,down; cRay ray; float theta, phi; cCamera2() { theta=0.0f; phi=0.0f; loc = Vector::O; dir = Vector::Z; right = Vector::scalar(Vector::X,4.0f/3.0f); down = Vector::Y.neg(); } cCamera2(cVector &ploc,cVector &pdir,cVector &pright,cVector &pdown) { theta=0.0f; phi=0.0f; setTo(ploc,pdir,pright,pdown); } void setPos(float x, float y, float z) { loc.setto(x,y,z); } void move(float m) { setRay(0.5f,0.5f); loc.x+=ray.dir.x*m; loc.y+=ray.dir.y*m; loc.z+=ray.dir.z*m; } void rotate(float dt, float dp) { theta+=dt; phi+=dp; reset(); tt[0] = Transform::rotate('x',phi); tt[1] = Transform::rotate('y',theta); transform(Transform::multipletrans(tt,2)); } void reset() { //loc = Vector::O; dir = Vector::Z; right = Vector::scalar(Vector::X,4.0f/3.0f); down = Vector::Y.neg(); } void setTo(cVector &ploc,cVector &pdir,cVector &pright,cVector &pdown) { loc = ploc; dir = pdir; right = pright; down = pdown; } void transform(cTransform &trans) { //loc = Transform::transformed(trans,loc,false); dir = Transform::transformed(trans,dir,true); right = Transform::transformed(trans,right,true); down = Transform::transformed(trans,down,true); } void setRay(float xamnt, float yamnt) { ray.setTo( loc, Vector::add(Vector::add(dir,Vector::scalar(right,(xamnt-0.5f))), Vector::scalar(down,(0.5f-yamnt))), 1.0f); } };