|
From: julien r. <jul...@us...> - 2004-11-07 11:27:59
|
Update of /cvsroot/epfl/tgengine-0.1 In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24195 Modified Files: boundingbox.h glrenderer.cc physicengine.cc physicnode.cc Removed Files: material.cc Log Message: fixe Index: boundingbox.h =================================================================== RCS file: /cvsroot/epfl/tgengine-0.1/boundingbox.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** boundingbox.h 6 Nov 2004 17:05:39 -0000 1.2 --- boundingbox.h 7 Nov 2004 11:27:47 -0000 1.3 *************** *** 27,31 **** Vector3 vWorldBSCenter; Vector3 vBSCenter; - Quaternion qRotation; float fBSRadius; --- 27,30 ---- Index: physicengine.cc =================================================================== RCS file: /cvsroot/epfl/tgengine-0.1/physicengine.cc,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** physicengine.cc 6 Nov 2004 17:05:39 -0000 1.18 --- physicengine.cc 7 Nov 2004 11:27:47 -0000 1.19 *************** *** 15,18 **** --- 15,19 ---- //pCurrentNode = NULL; } + #define MAXBUMPS 5 *************** *** 22,29 **** --- 23,34 ---- int bumpcount = 0; //Vector3 origin = n->pBBox->vWorldOrigin; + std::vector<Vector3> pPlanes; + int iNumPlanes = 0; float time_left = eTime; trace.Fraction = 0.0f; + int i, j; + while ((trace.Fraction < (1.0f - EPSILON)) && (bumpcount < MAXBUMPS)) //a chaque fois qu'on rencontre un plan, on relance un trace avec comme origine le Endpoint sur le plan précédent et on ajuste la vitesse de notre objet. MAXBUMPS permet simplement d'éviter des boucles infinies *************** *** 33,37 **** if (trace.AllSolid) { ! vVelocity.Null(); return; } --- 38,43 ---- if (trace.AllSolid) { ! //vVelocity.Null(); ! vVelocity.y = 0; return; } *************** *** 40,44 **** origin = trace.EndPoint; } ! if (trace.Fraction > (1.0f - EPSILON)) { break; --- 46,50 ---- origin = trace.EndPoint; } ! if (trace.Fraction == 1) { break; *************** *** 46,50 **** time_left -= time_left*trace.Fraction; ! ClipVelocity (vVelocity, trace.CollisionNormal); bumpcount++; } --- 52,88 ---- time_left -= time_left*trace.Fraction; ! ! pPlanes.push_back(trace.CollisionNormal); ! iNumPlanes++; ! ! for (i=0; i<iNumPlanes; i++) ! { ! ClipVelocity (vVelocity, trace.CollisionNormal); ! for (j=0; j<iNumPlanes; j++) ! if (j != i) ! { ! if (vVelocity*pPlanes[j] < 0) ! break; ! } ! if (j==iNumPlanes) ! break; ! } ! ! if (i != iNumPlanes) ! { ! } ! else ! { ! if (iNumPlanes != 2) ! { ! vVelocity = origin; ! break; ! } ! Vector3 dir = pPlanes[0]%pPlanes[1]; ! float d = dir*vVelocity; ! vVelocity = dir/d; ! } ! ! bumpcount++; } *************** *** 53,63 **** void PhysicEngine::ClipVelocity (Vector3& vel, const Vector3 norm) { ! /* le produit scalaire entre la vitesse et la normale nous donne ! l'angle de collision multiplie par la norme de la vitesse et de la normale ! "change" est la projection de la normale de collision sur la vitesse (grace a l'angle ! constituant backoff) multiplie par la norme de la normale de collision(1) et de la vitesse, ! faisant ainsi rebondir d'exactement ce qu'il faut. ! Overbounce nous permet d'avoir un rebond un peu plus grand que necessaire. ! */ float backoff = vel*norm*fOverBounce; Vector3 change = norm*backoff; --- 91,101 ---- void PhysicEngine::ClipVelocity (Vector3& vel, const Vector3 norm) { ! // le produit scalaire entre la vitesse et la normale nous donne ! // l'angle de collision multiplie par la norme de la vitesse et de la normale ! // "change" est la projection de la normale de collision sur la vitesse (grace a l'angle ! // constituant backoff) multiplie par la norme de la normale de collision(1) et de la vitesse, ! // faisant ainsi rebondir d'exactement ce qu'il faut. ! // Overbounce nous permet d'avoir un rebond un peu plus grand que necessaire. ! float backoff = vel*norm*fOverBounce; Vector3 change = norm*backoff; *************** *** 73,77 **** //ugly hackpour que le bOnGround ne bug pas sur les monstres //-> on différenci la taille du joueur et des autres objets pour être sur le sol ! #define PLAYER_HEIGHT 80 #define BASE_HEIGHT 15 #define STEPSIZE 10 --- 111,115 ---- //ugly hackpour que le bOnGround ne bug pas sur les monstres //-> on différenci la taille du joueur et des autres objets pour être sur le sol ! #define BASE_HEIGHT 15 #define STEPSIZE 10 *************** *** 79,86 **** { PhysicNode* n; - /*Vector3 vVeloc1; - Vector3 vVeloc2; - Vector3 pos1 = n->GetPosition(); - Vector3 pos2 = n->GetPosition();*/ for (unsigned int i=0; i<pNodes.size(); i++) --- 117,120 ---- *************** *** 112,116 **** else if (n->GetYAccel() < 0) //si l'objet touche le sol, il faut ramener la gravité à zéro, sinon, l'objet va se retrouver avec une gravité négative très grande (ça l'empeche de sauter notamment) n->SetYAccel(0.0f); - /*std::cout << n << "\t" ;*/ //std::cout << "OnGround : " << n->OnGround(); //std::cout << "Accel : \t" << n->GetAccel() << std::endl; --- 146,149 ---- Index: glrenderer.cc =================================================================== RCS file: /cvsroot/epfl/tgengine-0.1/glrenderer.cc,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** glrenderer.cc 6 Nov 2004 17:05:39 -0000 1.13 --- glrenderer.cc 7 Nov 2004 11:27:47 -0000 1.14 *************** *** 1851,1860 **** glLineWidth (1); - glPushMatrix (); - float matrix[16]; - b->qRotation.GetMatrix(matrix); - glMultMatrixf (matrix); - - glColor3f(0,1,0); glPointSize(5); --- 1851,1854 ---- *************** *** 1879,1883 **** glEnable(GL_CULL_FACE); //RenderBSphere (b->vWorldBSCenter, b->fBSRadius); - glPopMatrix (); } --- 1873,1876 ---- Index: physicnode.cc =================================================================== RCS file: /cvsroot/epfl/tgengine-0.1/physicnode.cc,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** physicnode.cc 6 Nov 2004 17:05:39 -0000 1.4 --- physicnode.cc 7 Nov 2004 11:27:47 -0000 1.5 *************** *** 26,29 **** --- 26,32 ---- n->SetPosition(vPosition); n->SetRotation(qRotation); + pBBox->vMin = qRotation.Rotate(pBBox->vMin); + pBBox->vMax = qRotation.Rotate(pBBox->vMax); + pBBox->CalculatePlanes(); } } --- material.cc DELETED --- |