Exemplo n.º 1
0
ColliderData ColliderGroup::isHit(const glm::vec3& rayStart, const glm::vec3& rayDir)
{
    ColliderData finalHit(reinterpret_cast<Collider *>(this));
    SceneObject *ownerObject = owner_object();

    hit_ = glm::vec3(std::numeric_limits<float>::infinity());
    if (nullptr != ownerObject)
    {
        Transform *transform = ownerObject->transform();
        finalHit.ObjectHit = ownerObject;
        if (nullptr != transform)
        {
            glm::mat4 model_inverse = glm::affineInverse(transform->getModelMatrix());
            glm::vec3 O(rayStart);
            glm::vec3 D(rayDir);

            transformRay(model_inverse, O, D);
            for (auto it = colliders_.begin(); it != colliders_.end(); ++it)
            {
                ColliderData currentHit = (*it)->isHit(O, D);
                if (currentHit.IsHit && (currentHit.Distance < finalHit.Distance))
                {
                    hit_ = currentHit.HitPosition;
                    finalHit.CopyHit(currentHit);
                }
            }
        }
    }
    return finalHit;
}
Exemplo n.º 2
0
float ScenRectangle::intersect(Node *node)
 {
   ////////////////
   if(nodeOverlap(*node))
    {
      Point2D pt(node->getPosition());
      //Trasformo il punto nelle coordinate locali del rettangolo
      pt.translate(-this->p.x,-this->p.y);
      pt.rotate(-rotAngle);
	
      Vector2D lv;
      lv=node->getVelocity();
      lv.rotate(-rotAngle);
		 
     Vector2D shift=calcShift(pt,lv,node->getRadius()+0.01f);
     node->setPosition(shift);
     //return 0;
   }	
  ////////////////////////////   	 
	 
	 
   float radius=node->getRadius();	
   ScenRectangle boundRect(Point2D(p.x-radius,p.y-radius),
		                              width+radius*2,height+radius*2);
  
  //Creo il raggio e lo trasformo nelle coodinate locali del rettangolo
  Ray2D ray=transformRay(Ray2D(node->getPosition(),node->getVelocity()));
  
  //Lo devo traslare perchè calcolo 
  //l'intersezione con un rettangolo allargato
  ray.o.x+=radius; ray.o.y+=radius;
  
  //Calcolo l'intersezione
  return boundRect.rayLocalIntersect(ray);
 }//Fine intersect
Exemplo n.º 3
0
float ScenRectangle::rayIntersect(const Ray2D &ray)
 {
   //Trasformo il raggio
  Ray2D rayTransf=transformRay(ray);	
  //Calcolo e ritorno l'intersezione tra il raggio 
  //trasformato e il rettangolo
  return rayLocalIntersect(rayTransf);
 }//Fine rayIntersect 
Exemplo n.º 4
0
void updateLineOfTouch(s16 x, s16 y)
{
	vect3D o=vect(inttof32(x),inttof32(y),inttof32(0));
	vect3D v=vect(0,0,-inttof32(1));
	getUnprojectedZLine(&editorCamera, x, y, &o, &v);
	transformRay(&o, &v);
	lineOfTouchOrigin=o;
	lineOfTouchVector=vectMultInt(normalize(v),-1);
	planeOfTouch[0]=evalVectMatrix33(editorCamera.transformationMatrix,vect(inttof32(1),0,0));
	planeOfTouch[1]=evalVectMatrix33(editorCamera.transformationMatrix,vect(0,inttof32(1),0));

	// NOGBA("LOT %d %d %d",lineOfTouchOrigin.x,lineOfTouchOrigin.y,lineOfTouchOrigin.z);
}
Exemplo n.º 5
0
bool CMeshCoordinate::intersect(const Vec3D& vRayPos , const Vec3D& vRayDir,Vec3D& vCoord)const
{
	Vec3D vNewRayPos = vRayPos;
	Vec3D vNewRayDir = vRayDir;
	transformRay(vNewRayPos,vNewRayDir,getWorldMatrix());

	float fMin,fMax;
	float fR = 0.05f;
	if(LineCapsuleIntersector(vNewRayPos,vNewRayDir,m_CoordLines[CLT_X].vBegin,m_CoordLines[CLT_X].vEnd,fR,fMin,fMax)>0)
	{
		vCoord = Vec3D(1,0,0);
		return true;
	}
	if(LineCapsuleIntersector(vNewRayPos,vNewRayDir,m_CoordLines[CLT_X_Y].vBegin,m_CoordLines[CLT_X_Y].vEnd,fR,fMin,fMax)>0)
	{
		vCoord = Vec3D(1,1,0);
		return true;
	}
	if(LineCapsuleIntersector(vNewRayPos,vNewRayDir,m_CoordLines[CLT_X_Z].vBegin,m_CoordLines[CLT_X_Z].vEnd,fR,fMin,fMax)>0)
	{
		vCoord = Vec3D(1,0,1);
		return true;
	}

	if(LineCapsuleIntersector(vNewRayPos,vNewRayDir,m_CoordLines[CLT_Y].vBegin,m_CoordLines[CLT_Y].vEnd,fR,fMin,fMax)>0)
	{
		vCoord = Vec3D(0,1,0);
		return true;
	}
	if(LineCapsuleIntersector(vNewRayPos,vNewRayDir,m_CoordLines[CLT_Y_X].vBegin,m_CoordLines[CLT_Y_X].vEnd,fR,fMin,fMax)>0)
	{
		vCoord = Vec3D(1,1,0);
		return true;
	}
	if(LineCapsuleIntersector(vNewRayPos,vNewRayDir,m_CoordLines[CLT_Y_Z].vBegin,m_CoordLines[CLT_Y_Z].vEnd,fR,fMin,fMax)>0)
	{
		vCoord = Vec3D(0,1,1);
		return true;
	}

	if(LineCapsuleIntersector(vNewRayPos,vNewRayDir,m_CoordLines[CLT_Z].vBegin,m_CoordLines[CLT_Z].vEnd,fR,fMin,fMax)>0)
	{
		vCoord = Vec3D(0,0,1);
		return true;
	}
	if(LineCapsuleIntersector(vNewRayPos,vNewRayDir,m_CoordLines[CLT_Z_X].vBegin,m_CoordLines[CLT_Z_X].vEnd,fR,fMin,fMax)>0)
	{
		vCoord = Vec3D(1,0,1);
		return true;
	}
	if(LineCapsuleIntersector(vNewRayPos,vNewRayDir,m_CoordLines[CLT_Z_Y].vBegin,m_CoordLines[CLT_Z_Y].vEnd,fR,fMin,fMax)>0)
	{
		vCoord = Vec3D(0,1,1);
		return true;
	}

	Vec3D vOut;
	int nSubID  = -1;
	if (CMeshData::intersect(vNewRayPos, vNewRayDir, vOut, nSubID))
	{
		switch(nSubID)
		{
		case 0:
			vCoord = Vec3D(1,0,0);
			break;
		case 1:
			vCoord = Vec3D(0,1,0);
			break;
		case 2:
			vCoord = Vec3D(0,0,1);
			break;
		default:
			break;
		}
		return true;
	}
	return false;
}