bool CollisionDetector::TriangleCollisionAlgorithm(const Object& objectA, const Object& objectB) { //Position Ogre::Vector3 positionA=objectA.Node->_getDerivedPosition(); Ogre::Vector3 positionB=objectB.Node->_getDerivedPosition(); //Orientation Ogre::Quaternion orientationA=objectA.Node->_getDerivedOrientation(); Ogre::Quaternion orientationB=objectB.Node->_getDerivedOrientation(); //FullTransform Ogre::Matrix4 transformA=objectA.Node->_getFullTransform(); Ogre::Matrix4 transformB=objectB.Node->_getFullTransform(); //trzyprzejściowe pętle bardzo wszystko spowalniały, więc trzeba sobie radzić inaczej Ogre::Vector3 a0,a1,a2, b0,b1,b2; //dla każdego trójkąta A for(int faceIndexA=0;faceIndexA<objectA.IndicesBuffer.size()/3;faceIndexA++) { //trójkąt A a0=transformA*objectA.VerticesBuffer[objectA.IndicesBuffer[3*faceIndexA]]; //std::cout<<a0<<" "<<objectA.VerticesBuffer[objectA.IndicesBuffer[3*faceIndexA]]<<" "<<positionA<<std::endl; a1=transformA*objectA.VerticesBuffer[objectA.IndicesBuffer[3*faceIndexA+1]]; a2=transformA*objectA.VerticesBuffer[objectA.IndicesBuffer[3*faceIndexA+2]]; //sprawdzamy każdy trójkąt B for(int faceIndexB=0;faceIndexB<objectB.IndicesBuffer.size()/3;faceIndexB++) { //trójkąt B b0=transformB*objectB.VerticesBuffer[objectB.IndicesBuffer[3*faceIndexB]]; b1=transformB*objectB.VerticesBuffer[objectB.IndicesBuffer[3*faceIndexB+1]]; b2=transformB*objectB.VerticesBuffer[objectB.IndicesBuffer[3*faceIndexB+2]]; //if(Moller(a0, a1, a2, b0, b1, b2)) if(NoDivTriTriIsect(&a0.x,&a1.x,&a2.x,&b0.x,&b1.x,&b2.x)) return true; } } return false; }
bool xtCollisionEngine::TriTriCollision(int i, int j) { std::vector<xtVector3d> &iverts = mSurfI->verts; xtIndexTria3 &itria = mSurfI->indices[i]; xtVector3d ipa = iverts[itria.a[0]]; xtVector3d ipb = iverts[itria.a[1]]; xtVector3d ipc = iverts[itria.a[2]]; //ipa = mSurfI->tran + mSurfI->rot*ipa; //ipb = mSurfI->tran + mSurfI->rot*ipb; //ipc = mSurfI->tran + mSurfI->rot*ipc; std::vector<xtVector3d> &jverts = mSurfJ->verts; xtIndexTria3 &jtria = mSurfJ->indices[j]; xtVector3d jpa = jverts[jtria.a[0]]; xtVector3d jpb = jverts[jtria.a[1]]; xtVector3d jpc = jverts[jtria.a[2]]; //jpa = mSurfJ->tran + mSurfJ->rot*jpa; //jpb = mSurfJ->tran + mSurfJ->rot*jpb; //jpc = mSurfJ->tran + mSurfJ->rot*jpc; jpa = tranj2i + rotj2i*jpa; jpb = tranj2i + rotj2i*jpb; jpc = tranj2i + rotj2i*jpc; float v0[3] = {(float)ipa.x(),(float)ipa.y(),(float)ipa.z()}; float v1[3] = {(float)ipb.x(),(float)ipb.y(),(float)ipb.z()}; float v2[3] = {(float)ipc.x(),(float)ipc.y(),(float)ipc.z()}; float u0[3] = {(float)jpa.x(),(float)jpa.y(),(float)jpa.z()}; float u1[3] = {(float)jpb.x(),(float)jpb.y(),(float)jpb.z()}; float u2[3] = {(float)jpc.x(),(float)jpc.y(),(float)jpc.z()}; if ( 1==NoDivTriTriIsect(v0,v1,v2,u0,u1,u2) ) { return true; } else { return false; } }