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; }
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
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
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); }
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; }