#ifndef TRACKCAM_H #define TRACKCAM_H #include #include class TrackingCam { public: TrackingCam(float x=0, float y=0, float z=0) : distance(3.0), tiltangle(0.15 * M_PI), yoff(0), makejump(false), autocam(false) { sgSetVec3(tgtpos, x,y,z); sgSetVec3(campos, x,y,z); sgMakeIdentQuat(tgtori); } ~TrackingCam() { } void AddTarget(ssgTransform *tgt) { targets.push_back(tgt); } void DelTarget(ssgTransform *tgt) { targets.remove(tgt); } void Update(float dt) { float t=5.0*dt; if (t>1) t=1; sgQuat quats[4]; sgVec3 posis[4]; int i=0; std::list::iterator ip; sgVec3 avgpos; sgZeroVec3(avgpos); for (ip=targets.begin(); ip!=targets.end(); ++ip) { sgMat4 mat; ssgTransform *target = *ip; target->getTransform(mat); // force z straight up sgSetVec3(mat[2],0,0,1); // y = z * x sgVectorProductVec3(mat[1], mat[2], mat[0]); sgNormalizeVec3(mat[1]); // x = y * z; sgVectorProductVec3(mat[0], mat[1], mat[2]); sgMatrixToQuat(quats[i], mat); sgCopyVec3(posis[i], mat[3]); sgAddVec3(avgpos, avgpos, mat[3]); i++; } assert(i>=1 && i<=4); sgScaleVec3(avgpos, avgpos, 1.0 / i); int j; if (autocam) { // What car has longest distance from avg pos? float longest=0; for (j=0; j longest) longest = dist; } distance = 1.5 * longest; if (distance<2.0) distance=2.0; tiltangle = 0.32 * longest; if (tiltangle < 0.25) tiltangle=0.25; if (tiltangle > 0.60) tiltangle=0.60; } for (j=0; j targets; sgVec3 tgtpos; sgVec3 campos; sgQuat tgtori; float distance; float tiltangle; float yoff; bool makejump; bool autocam; }; #endif