예제 #1
0
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;
}
예제 #2
0
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;
	}
	
}