// CollisionDetection.cpp: implementation of the CCollisionDetection class. // ////////////////////////////////////////////////////////////////////// #include "CollisionDetection.h" #include "SceneManager.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// #define PLANE_BACKSIDE 0x000001 #define PLANE_FRONT 0x000010 #define ON_PLANE 0x000100 //Check!! DWORD ClassifyPoint(vector3 point,vector3 p0,vector3 pN) { vector3 dir=p0-point; float d=dir*pN; if(d<-0.001f) return PLANE_FRONT; else if(d>0.001f) return PLANE_BACKSIDE; return ON_PLANE; } //Check!! float IntersectRaySphere(vector3 rO,vector3 rV,vector3 sO,float sR) { vector3 Q=sO-rO; float c=Q.GetLens(); float v=Q*rV; float d=sR*sR - (c*c-v*v); if(d<0.0f)return (-1.0f); return v-sqrtf(d); } //Check!! float IntersectRayPlane(vector3 rOrigin,vector3 rVector,vector3 pOrigin,vector3 pNormal) { float d=-(pNormal*pOrigin); float numer=(pNormal*rOrigin)+d; float denom=pNormal*rVector; if(denom==0.0f) return -1.0f; return -(numer/denom); } //Check!! bool CheckPointInTriangle(vector3 point,vector3 a,vector3 b,vector3 c) { float fTotal_Angle=0.0f; vector3 v1=point-a; vector3 v2=point-b; vector3 v3=point-c; v1.Normalize(); v2.Normalize(); v3.Normalize(); fTotal_Angle+=acos(v1*v2); fTotal_Angle+=acos(v2*v3); fTotal_Angle+=acos(v3*v1); if(fabs(fTotal_Angle-2.0f*3.14159f) <= 0.005f) return true; return false; } //Check!! vector3 ClosestPointOnLine(vector3 &a,vector3 &b,vector3 &p) { vector3 c=p-a; vector3 V=b-a; float d=V.GetLens(); V.Normalize(); float t=V*c; if(t<0.0f)return a; if(t>d)return b; V=V*t; return a+V; } //Check!! vector3 ClosestPointOnTriangle(vector3 a,vector3 b,vector3 c,vector3 p) { vector3 Rab=ClosestPointOnLine(a,b,p); vector3 Rbc=ClosestPointOnLine(b,c,p); vector3 Rca=ClosestPointOnLine(c,a,p); vector3 vecForLens; vecForLens=p-Rab; float dAB=vecForLens.GetLens(); vecForLens=p-Rbc; float dBC=vecForLens.GetLens(); vecForLens=p-Rca; float dCA=vecForLens.GetLens(); float min=dAB; vector3 result =Rab; if( dBC < min ) { min=dBC; result=Rbc; } if( dCA < min ) { result=Rca; } return result; } /* vector3 ClosestPointOnPerimeter(vector3 *Poly,vector3 &p,vector3 &e0,vector3 &e1,bool &edgeFlag) { bool bFound=false; bool bEdge; float fClosestDistance=0.0f; vector3 vecClosestPoint(0.0f,0.0f,0.0f); vector3 vecClosestP0,vecClosestP1; int index; vector3 vecForLens; vector3 Rab=ClosestPointOnLine(Poly[0],Poly[1],p,bEdge); vecForLens=Rab-p; if(vecForLens.GetLens() < fClosestDistance ||!bFound) { fClosestDistance=vecForLens.GetLens(); vecClosestPoint=Rab; vecClosestP0=Poly[0]; vecClosestP1=Poly[1]; edgeFlag=bEdge; bFound=true; index=0; } vector3 Rbc=ClosestPointOnLine(Poly[1],Poly[2],p,bEdge); vecForLens=Rbc-p; if(vecForLens.GetLens() < fClosestDistance ||!bFound) { fClosestDistance=vecForLens.GetLens(); vecClosestPoint=Rbc; vecClosestP0=Poly[1]; vecClosestP1=Poly[2]; edgeFlag=bEdge; bFound=true; index=1; } vector3 Rca=ClosestPointOnLine(Poly[2],Poly[0],p,bEdge); vecForLens=Rca-p; if(vecForLens.GetLens() < fClosestDistance ||!bFound) { fClosestDistance=vecForLens.GetLens(); vecClosestPoint=Rca; vecClosestP0=Poly[2]; vecClosestP1=Poly[0]; edgeFlag=bEdge; bFound=true; index=2; } if(!edgeFlag) { index=index+1 > 3 ? 0 : index+1; e0=Poly[index]; e1=Poly[index]; } else { e0=vecClosestP0; e1=vecClosestP1; } return vecClosestPoint; } */ /* bool CheckPointInSphere(vector3 point,vector3 sO,float sR) { vector3 vecForLens=point-sO; float d=vecForLens.GetLens(); if(d<=sR)return true; return false; } */ /* bool isEmbedde(vector3 &vecPos,vector3 &vecMostInner,vector3 *vecPoly) { vector3 vecNormal=(vecPoly[1]-vecPoly[0])^(vecPoly[2]-vecPoly[0]); vecNormal.Normalize(); float fPlaneDistance=IntersectRayPlane(vecPos,-vecNormal,vecPoly[0],vecNormal); if( fPlaneDistance > 1.0f-0.05f) return false; vecMostInner= vecPos-vecNormal*fPlaneDistance; // If the closest point on the plane is within the polygon, the polygon is embedded if(!CheckPointInTriangle(vecMostInner,vecPoly[0],vecPoly[1],vecPoly[2])) { ClosestPointOnTriangle(vecPoly[0],vecPoly[1],vecPoly[2],vecMostInner); vector3 vecInter=vecMostInner-vecPos; if(vecInter.GetLens() > 1.0f-0.05f) return false; } return true; } */ /* bool UnitSphereIntersection(vector3 &vecCenter,vector3 &vecOrigin,vector3 &vecDir,float &time) { vector3 q=vecCenter-vecOrigin; float c=q.GetLens(); vector3 vecNormalDir=vecDir; vecNormalDir.Normalize(); float v=q*vecNormalDir; float d=1.0f - (c*c-v*v); if(d<0.0f) { time=0.0f; return false; } time=v-sqrtf(d); return true; } */ CCollisionDetection::CCollisionDetection() { m_vecRadius.x=40.0f; m_vecRadius.y=85.0f; m_vecRadius.z=40.0f; m_vecMinMove=vector3(-10000000.0f,0.0f,-10000000.0f); m_vecMaxMove=vector3(10000000.0f,0.0f,10000000.0f); m_fMinYBound = -123.0f; m_fMaxYBound = -123.0f; m_bHeightGradient = false; } CCollisionDetection::~CCollisionDetection() { } //DEL vector3 CCollisionDetection::Detect(vector3 vecPos,int &Detection) //DEL { //DEL Detection=0; //DEL float fViewHeight; //DEL vector3 vecOldPos; //DEL vecOldPos=vecPos; //DEL //DEL vecPos=DetectHouse(vecPos); //DEL if( vecPos.x == vecOldPos.x && //DEL vecPos.y == vecOldPos.y && //DEL vecPos.z == vecOldPos.z) //DEL { //DEL float GroundHeight=m_HeightField->GetHeight(vecPos); //DEL fViewHeight=vecPos.y; //DEL if(GroundHeight+m_fRad > fViewHeight) //DEL { //DEL fViewHeight=GroundHeight+m_fRad; //DEL } //DEL else //DEL { //DEL if(fViewHeight-10.0f > GroundHeight+m_fRad ) //DEL { //DEL fViewHeight-=10.0f; //DEL } //DEL else //DEL { //DEL fViewHeight=GroundHeight+m_fRad; //DEL } //DEL //DEL } //DEL vecPos.y=fViewHeight; //DEL vecPos=DetectHouse(vecPos); //DEL return vecPos; //DEL } //DEL return vecPos; //DEL } //DEL vector3 CCollisionDetection::DetectHouse(vector3 vecPos) //DEL { //DEL vector3 vecHousePos,vecHouseInter,vecInHousePos; //DEL float fHouseInter; //DEL matrix matInv,matInHousePos; //DEL for(int cSector=0;cSectorm_SectorScene[cSector].m_HouseObjectNode.num;cHouse++) //DEL { //DEL vecHousePos=m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM.GetLoc(); //DEL vecHouseInter=vecHousePos-vecPos; //DEL fHouseInter=vecHouseInter.GetLens(); //DEL if( m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_HouseObject->m_pOctree && //DEL fHouseInterm_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM); //DEL matInHousePos.Translation(vecPos); //DEL matInHousePos=matInHousePos*matInv; //DEL vecInHousePos=matInHousePos.GetLoc(); //DEL List CollPoly; //DEL //DEL for(int cNode=0;cNodem_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_HouseObject->m_pOctree->m_pOctree->m_PolyList.num;cNode++) //DEL m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_HouseObject->m_pOctree->m_pOctree->m_PolyList[cNode]->m_used=0; //DEL //DEL m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_HouseObject->m_pOctree->m_pOctree->m_PolyList.num=0; //DEL m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_HouseObject->m_pOctree->m_pOctree->CullSphere(vecInHousePos,m_fRad,CollPoly); //DEL //DEL if(CollPoly.num>0) //DEL { //DEL vector3 vecIntersect[6]; //DEL int cIntersect; //DEL vector3 *vecPoly[3]; //DEL vector3 vecSphere[3]; //DEL for(int i=0;im_vecPoly[0]; //DEL vecPoly[1]=*CollPoly[i]->m_vecPoly[1]; //DEL vecPoly[2]=*CollPoly[i]->m_vecPoly[2]; //DEL */ //DEL //DEL /* //DEL vecSphere[0]=*CollPoly[i]->m_vecPoly[0]; //DEL vecSphere[1]=*CollPoly[i]->m_vecPoly[1]; //DEL vecSphere[2]=*CollPoly[i]->m_vecPoly[2]; //DEL if(CIntersection::PolygonSphere(vecInHousePos,m_fRad,vecSphere,vecIntersect,cIntersect)==3) //DEL { //DEL vector3 n=(vecSphere[1]-vecSphere[0])^(vecSphere[2]-vecSphere[0]); //DEL n.Normalize(); //DEL vector3 vecForLens=vecInHousePos-vecIntersect[0]; //DEL float fLens=vecForLens.GetLens(); //DEL vecInHousePos=vecInHousePos+(m_fRad-fLens)*n; //DEL matInHousePos.Translation(vecInHousePos); //DEL matInHousePos=matInHousePos*m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; //DEL vecPos=matInHousePos.GetLoc(); //DEL } //DEL */ //DEL vecPoly[0]=CollPoly[i]->m_vecPoly[0]; //DEL vecPoly[1]=CollPoly[i]->m_vecPoly[1]; //DEL vecPoly[2]=CollPoly[i]->m_vecPoly[2]; //DEL vector3 vecDownInter; //DEL float fInter; //DEL if(CIntersection::PolygonRay(vecInHousePos,vecInHousePos+vector3(0.0f,-1.0f,0.0f)*m_fRad,vecPoly,fInter)==1) //DEL { //DEL vecDownInter=vecInHousePos+vector3(0.0f,-1.0f,0.0f)*fInter; //DEL if(vecInHousePos.y-m_fRad <= vecDownInter.y) //DEL { //DEL vecInHousePos.y=vecDownInter.y+m_fRad; //DEL matInHousePos.Translation(vecInHousePos); //DEL matInHousePos=matInHousePos*m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; //DEL vecPos=matInHousePos.GetLoc(); //DEL } //DEL } //DEL //int InterMethod=CIntersection::PolygonSphere(vecInHousePos,m_fRad,vecPoly,vecIntersect,cIntersect); //DEL /* //DEL if(InterMethod==1) //DEL { //DEL for(int cInter=0;cInter= vecIntersect[cInter].y) //DEL { //DEL vecInHousePos.y=vecIntersect[cInter].y+m_fRad; //DEL matInHousePos.Translation(vecInHousePos); //DEL matInHousePos=matInHousePos*m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; //DEL vecPos=matInHousePos.GetLoc(); //DEL } //DEL } //DEL } //DEL */ //DEL /* //DEL if(InterMethod==2) //DEL { //DEL Detection=1; //DEL for(int cInter=0;cInterm_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; //DEL vecPos=matInHousePos.GetLoc(); //DEL Detection=0; //DEL } //DEL } //DEL fMoveY=1.0f; //DEL } //DEL //DEL } //DEL //if(cIntersect>0) //DEL // fMoveY=1.0f; //DEL */ //DEL CollPoly[i]->m_used=0; //DEL } //DEL } //DEL // //DEL } //DEL } //DEL } //DEL return vecPos; //DEL } void CCollisionDetection::CheckHouseCollision() { vector3 p[3]; vector3 vecNormal; vector3 v1,v2; float fHeight=m_HeightField->GetHeight(m_vecSourcePoint); if((fHeight+m_vecRadius.y > m_vecSourcePoint.y)) { CCollisionList AddNode; AddNode.m_CollisionType=CT_TERRAIN; AddNode.m_vecIntersectionPoint=vector3(m_vecSourcePoint.x,fHeight,m_vecSourcePoint.z); AddNode.m_fDistance=abs(fHeight-m_vecSourcePoint.y); m_CollisionList.Add(AddNode); } //* for(int cSector=0;cSectorGetLSizeX()*m_HeightField->GetLSizeY();cSector++) { bool bCollision=false; if(m_CollisionDetectionDetail) { if( (m_HeightField->m_SectorScene[cSector].m_AccumulateTM._41 <= m_vecSourcePoint.x && m_HeightField->m_SectorScene[cSector].m_AccumulateTM._41+SECTORSIZE > m_vecSourcePoint.x && m_HeightField->m_SectorScene[cSector].m_AccumulateTM._43 <= m_vecSourcePoint.z && m_HeightField->m_SectorScene[cSector].m_AccumulateTM._43+SECTORSIZE > m_vecSourcePoint.z) || (m_HeightField->m_SectorScene[cSector].m_AccumulateTM._41 <= m_vecSourcePoint.x-SECTORSIZE && m_HeightField->m_SectorScene[cSector].m_AccumulateTM._41+SECTORSIZE > m_vecSourcePoint.x-SECTORSIZE && m_HeightField->m_SectorScene[cSector].m_AccumulateTM._43 <= m_vecSourcePoint.z-SECTORSIZE && m_HeightField->m_SectorScene[cSector].m_AccumulateTM._43+SECTORSIZE > m_vecSourcePoint.z-SECTORSIZE ) || (m_HeightField->m_SectorScene[cSector].m_AccumulateTM._41 <= m_vecSourcePoint.x&& m_HeightField->m_SectorScene[cSector].m_AccumulateTM._41+SECTORSIZE > m_vecSourcePoint.x&& m_HeightField->m_SectorScene[cSector].m_AccumulateTM._43 <= m_vecSourcePoint.z-SECTORSIZE && m_HeightField->m_SectorScene[cSector].m_AccumulateTM._43+SECTORSIZE > m_vecSourcePoint.z-SECTORSIZE ) || (m_HeightField->m_SectorScene[cSector].m_AccumulateTM._41 <= m_vecSourcePoint.x+SECTORSIZE && m_HeightField->m_SectorScene[cSector].m_AccumulateTM._41+SECTORSIZE > m_vecSourcePoint.x+SECTORSIZE && m_HeightField->m_SectorScene[cSector].m_AccumulateTM._43 <= m_vecSourcePoint.z-SECTORSIZE && m_HeightField->m_SectorScene[cSector].m_AccumulateTM._43+SECTORSIZE > m_vecSourcePoint.z-SECTORSIZE ) || (m_HeightField->m_SectorScene[cSector].m_AccumulateTM._41 <= m_vecSourcePoint.x-SECTORSIZE && m_HeightField->m_SectorScene[cSector].m_AccumulateTM._41+SECTORSIZE > m_vecSourcePoint.x-SECTORSIZE && m_HeightField->m_SectorScene[cSector].m_AccumulateTM._43 <= m_vecSourcePoint.z && m_HeightField->m_SectorScene[cSector].m_AccumulateTM._43+SECTORSIZE > m_vecSourcePoint.z) || (m_HeightField->m_SectorScene[cSector].m_AccumulateTM._41 <= m_vecSourcePoint.x+SECTORSIZE && m_HeightField->m_SectorScene[cSector].m_AccumulateTM._41+SECTORSIZE > m_vecSourcePoint.x+SECTORSIZE && m_HeightField->m_SectorScene[cSector].m_AccumulateTM._43 <= m_vecSourcePoint.z && m_HeightField->m_SectorScene[cSector].m_AccumulateTM._43+SECTORSIZE > m_vecSourcePoint.z) || (m_HeightField->m_SectorScene[cSector].m_AccumulateTM._41 <= m_vecSourcePoint.x-SECTORSIZE && m_HeightField->m_SectorScene[cSector].m_AccumulateTM._41+SECTORSIZE > m_vecSourcePoint.x-SECTORSIZE && m_HeightField->m_SectorScene[cSector].m_AccumulateTM._43 <= m_vecSourcePoint.z+SECTORSIZE && m_HeightField->m_SectorScene[cSector].m_AccumulateTM._43+SECTORSIZE > m_vecSourcePoint.z+SECTORSIZE ) || (m_HeightField->m_SectorScene[cSector].m_AccumulateTM._41 <= m_vecSourcePoint.x&& m_HeightField->m_SectorScene[cSector].m_AccumulateTM._41+SECTORSIZE > m_vecSourcePoint.x&& m_HeightField->m_SectorScene[cSector].m_AccumulateTM._43 <= m_vecSourcePoint.z+SECTORSIZE && m_HeightField->m_SectorScene[cSector].m_AccumulateTM._43+SECTORSIZE > m_vecSourcePoint.z+SECTORSIZE ) || (m_HeightField->m_SectorScene[cSector].m_AccumulateTM._41 <= m_vecSourcePoint.x+SECTORSIZE && m_HeightField->m_SectorScene[cSector].m_AccumulateTM._41+SECTORSIZE > m_vecSourcePoint.x+SECTORSIZE && m_HeightField->m_SectorScene[cSector].m_AccumulateTM._43 <= m_vecSourcePoint.z+SECTORSIZE && m_HeightField->m_SectorScene[cSector].m_AccumulateTM._43+SECTORSIZE > m_vecSourcePoint.z+SECTORSIZE ) ) { bCollision=true; } } else { if( m_HeightField->m_SectorScene[cSector].m_AccumulateTM._41 <= m_vecSourcePoint.x && m_HeightField->m_SectorScene[cSector].m_AccumulateTM._41+SECTORSIZE > m_vecSourcePoint.x && m_HeightField->m_SectorScene[cSector].m_AccumulateTM._43 <= m_vecSourcePoint.z && m_HeightField->m_SectorScene[cSector].m_AccumulateTM._43+SECTORSIZE > m_vecSourcePoint.z) { bCollision=true; } } if(bCollision) { for(int cHouse=0;cHousem_SectorScene[cSector].m_HouseObjectNode.num;cHouse++) { vector3 vecHousePos=m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM.GetLoc(); vector3 vecHouseInterLens=vecHousePos-m_vecSourcePoint; if( (m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_HouseObject->m_pOctree && vecHouseInterLens.GetLens() < m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_fRad) || (m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_HouseObject->m_pOctree && m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_HouseObject->m_pOutHouseObject==NULL && vecHouseInterLens.GetLens() < 1000.0f)) { matrix matInv; matInv.Inverse(m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM); matrix matInHousePos; matInHousePos.Translation(m_vecSourcePoint); matInHousePos=matInHousePos*matInv; vector3 vecInHousePos=matInHousePos.GetLoc(); vector3 vecSource=matInHousePos.GetLoc(); matrix matInvRot=m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; matInvRot._41=0.0f; matInvRot._42=0.0f; matInvRot._43=0.0f; matInv.Inverse(matInvRot); vector3 vecVelocity=m_vecVelocity.Normalized(); matrix matInHouseRot; matInHouseRot.Translation(vecVelocity); matInHouseRot=matInHouseRot*matInv; vecVelocity=matInHouseRot.GetLoc(); List CollPoly; //m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_HouseObject->m_pOctree->m_pOctree->CullSphere(vecInHousePos,85.0f,CollPoly); m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_HouseObject->m_pOctree->CullSphere(vecInHousePos,585.0f,CollPoly); if(strstr(m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_strInName,"innercastle_in.r3s")) { bool bFlag = false; vector3 vecMin; vector3 vecMax; if(m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_HouseObject) { // InHouseÀÇ bound box Get m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_HouseObject->CalcBox(vecMin,vecMax,1); /*vecMin.x += 800.0f; vecMin.z += 800.0f; vecMax.x -= 800.0f; vecMax.z -= 800.0f; */ if( (vecSource.x >= vecMin.x) && (vecSource.y >= vecMin.y) && (vecSource.z >= vecMin.z) ) { if( (vecSource.x <= vecMax.x) && (vecSource.y <= vecMax.y) && (vecSource.z <= vecMax.z) ) { CSceneManager::SetInViewHouseScene(m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]); CSceneManager::SetInView(true); bFlag = true; } } } if(!bFlag) { CSceneManager::SetInViewHouseScene(NULL); CSceneManager::SetInView(false); } } vector3 vecCheckDir; float fAngle; for(int cPoly=0;cPolym_used=0; p[0]=(CollPoly[cPoly]->m_vecPoly[0]); p[1]=(CollPoly[cPoly]->m_vecPoly[1]); p[2]=(CollPoly[cPoly]->m_vecPoly[2]); v1=p[1]-p[0]; v2=p[2]-p[1]; vecNormal=v1^v2; vecNormal.Normalize(); float fIntersection; // ¹Ø¿¡ °Ë»ç vecCheckDir.x=0.0f; vecCheckDir.y=1.0f; vecCheckDir.z=0.0f; fAngle=vecCheckDir*vecNormal; if(vecNormal==vecCheckDir) fAngle=1.0f; // fAngle=3.14159f; //if(fAngle < 0.0f) // fAngle=-fAngle; if(fAngle > 0.5f) { if(CIntersection::PointFromPlane(vecNormal,p[0],vecSource)>=m_vecRadius.y) continue; if(CIntersection::PolygonRay(vecSource,vecSource+vector3(0.0f,-1.0f,0.0f)*m_vecRadius.y, p, fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; matInHousePos.Translation(vecSource+vector3(0.0f,-1.0f,0.0f)*fIntersection); matInHousePos=matInHousePos*m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; AddNode.m_vecIntersectionPoint=matInHousePos.GetLoc(); matrix matInHouseRot=m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; matInHouseRot._41=matInHouseRot._42=matInHouseRot._43=0.0f; matInHousePos.Translation(vecNormal); matInHousePos=matInHousePos*matInHouseRot; AddNode.m_vecPlaneNormal=matInHousePos.GetLoc(); AddNode.m_CollisionType=CT_BOTTOM; m_CollisionList.Add(AddNode); continue; } if(CIntersection::PolygonRay(vecSource+vector3(1.0f,0.0f,0.0f)*m_vecRadius.x, vecSource+vector3(1.0f,0.0f,0.0f)*m_vecRadius.x+vector3(0.0f,-1.0f,0.0f)*m_vecRadius.y, p, fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; matInHousePos.Translation(vecSource+vector3(0.0f,-1.0f,0.0f)*fIntersection); matInHousePos=matInHousePos*m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; AddNode.m_vecIntersectionPoint=matInHousePos.GetLoc(); matrix matInHouseRot=m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; matInHouseRot._41=matInHouseRot._42=matInHouseRot._43=0.0f; matInHousePos.Translation(vecNormal); matInHousePos=matInHousePos*matInHouseRot; AddNode.m_vecPlaneNormal=matInHousePos.GetLoc(); AddNode.m_CollisionType=CT_BOTTOM; m_CollisionList.Add(AddNode); continue; } if(CIntersection::PolygonRay(vecSource+vector3(-1.0f,0.0f,0.0f)*m_vecRadius.x, vecSource+vector3(-1.0f,0.0f,0.0f)*m_vecRadius.x+vector3(0.0f,-1.0f,0.0f)*m_vecRadius.y, p, fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; matInHousePos.Translation(vecSource+vector3(0.0f,-1.0f,0.0f)*fIntersection); matInHousePos=matInHousePos*m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; AddNode.m_vecIntersectionPoint=matInHousePos.GetLoc(); matrix matInHouseRot=m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; matInHouseRot._41=matInHouseRot._42=matInHouseRot._43=0.0f; matInHousePos.Translation(vecNormal); matInHousePos=matInHousePos*matInHouseRot; AddNode.m_vecPlaneNormal=matInHousePos.GetLoc(); AddNode.m_CollisionType=CT_BOTTOM; m_CollisionList.Add(AddNode); continue; } if(CIntersection::PolygonRay(vecSource+vector3(0.0f,0.0f,1.0f)*m_vecRadius.x, vecSource+vector3(0.0f,0.0f,1.0f)*m_vecRadius.x+vector3(0.0f,-1.0f,0.0f)*m_vecRadius.y, p, fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; matInHousePos.Translation(vecSource+vector3(0.0f,-1.0f,0.0f)*fIntersection); matInHousePos=matInHousePos*m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; AddNode.m_vecIntersectionPoint=matInHousePos.GetLoc(); matrix matInHouseRot=m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; matInHouseRot._41=matInHouseRot._42=matInHouseRot._43=0.0f; matInHousePos.Translation(vecNormal); matInHousePos=matInHousePos*matInHouseRot; AddNode.m_vecPlaneNormal=matInHousePos.GetLoc(); AddNode.m_CollisionType=CT_BOTTOM; m_CollisionList.Add(AddNode); continue; } if(CIntersection::PolygonRay(vecSource+vector3(0.0f,0.0f,-1.0f)*m_vecRadius.x, vecSource+vector3(0.0f,0.0f,-1.0f)*m_vecRadius.x+vector3(0.0f,-1.0f,0.0f)*m_vecRadius.y, p, fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; matInHousePos.Translation(vecSource+vector3(0.0f,-1.0f,0.0f)*fIntersection); matInHousePos=matInHousePos*m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; AddNode.m_vecIntersectionPoint=matInHousePos.GetLoc(); matrix matInHouseRot=m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; matInHouseRot._41=matInHouseRot._42=matInHouseRot._43=0.0f; matInHousePos.Translation(vecNormal); matInHousePos=matInHousePos*matInHouseRot; AddNode.m_vecPlaneNormal=matInHousePos.GetLoc(); AddNode.m_CollisionType=CT_BOTTOM; m_CollisionList.Add(AddNode); continue; } } else { if(CIntersection::PointFromPlane(vecNormal,p[0],vecSource)>=m_vecRadius.x) continue; float fRate=vecVelocity*vecNormal; //if(fRate>= 0.0f) // continue; if( CIntersection::PolygonRay(vecSource, vecSource+vector3(0.0f,1.0f,0.0f)*m_vecRadius.y, p, fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; matInHousePos.Translation(vecSource+vector3(0.0f,1.0f,0.0f)*fIntersection); matInHousePos=matInHousePos*m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; AddNode.m_vecIntersectionPoint=matInHousePos.GetLoc(); matrix matInHouseRot=m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; matInHouseRot._41=matInHouseRot._42=matInHouseRot._43=0.0f; matInHousePos.Translation(vecNormal); matInHousePos=matInHousePos*matInHouseRot; AddNode.m_vecPlaneNormal=matInHousePos.GetLoc(); AddNode.m_CollisionType=CT_SIDE; matrix matWorldPos=m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; matInHousePos.Translation(p[0]); matWorldPos=matInHousePos*matWorldPos; AddNode.m_vecPlanePoint=matWorldPos.GetLoc(); m_CollisionList.Add(AddNode); continue; } if( CIntersection::PolygonRay(vecSource, vecSource+vector3(0.707f,0.0f,0.707f)*m_vecRadius.x, p, fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; matInHousePos.Translation(vecSource+vector3(0.707f,0.0f,0.707f)*fIntersection); matInHousePos=matInHousePos*m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; AddNode.m_vecIntersectionPoint=matInHousePos.GetLoc(); matrix matInHouseRot=m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; matInHouseRot._41=matInHouseRot._42=matInHouseRot._43=0.0f; matInHousePos.Translation(vecNormal); matInHousePos=matInHousePos*matInHouseRot; AddNode.m_vecPlaneNormal=matInHousePos.GetLoc(); AddNode.m_CollisionType=CT_SIDE; matrix matWorldPos=m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; matInHousePos.Translation(p[0]); matWorldPos=matInHousePos*matWorldPos; AddNode.m_vecPlanePoint=matWorldPos.GetLoc(); m_CollisionList.Add(AddNode); continue; } if( CIntersection::PolygonRay(vecSource, vecSource+vector3(-0.707f,0.0f,0.707f)*m_vecRadius.x, p, fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; matInHousePos.Translation(vecSource+vector3(-0.707f,0.0f,0.707f)*fIntersection); matInHousePos=matInHousePos*m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; AddNode.m_vecIntersectionPoint=matInHousePos.GetLoc(); matrix matInHouseRot=m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; matInHouseRot._41=matInHouseRot._42=matInHouseRot._43=0.0f; matInHousePos.Translation(vecNormal); matInHousePos=matInHousePos*matInHouseRot; AddNode.m_vecPlaneNormal=matInHousePos.GetLoc(); AddNode.m_CollisionType=CT_SIDE; matrix matWorldPos=m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; matInHousePos.Translation(p[0]); matWorldPos=matInHousePos*matWorldPos; AddNode.m_vecPlanePoint=matWorldPos.GetLoc(); m_CollisionList.Add(AddNode); continue; } if( CIntersection::PolygonRay(vecSource, vecSource+vector3(0.707f,0.0f,-0.707f)*m_vecRadius.x, p, fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; matInHousePos.Translation(vecSource+vector3(0.707f,0.0f,-0.707f)*fIntersection); matInHousePos=matInHousePos*m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; AddNode.m_vecIntersectionPoint=matInHousePos.GetLoc(); matrix matInHouseRot=m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; matInHouseRot._41=matInHouseRot._42=matInHouseRot._43=0.0f; matInHousePos.Translation(vecNormal); matInHousePos=matInHousePos*matInHouseRot; AddNode.m_vecPlaneNormal=matInHousePos.GetLoc(); AddNode.m_CollisionType=CT_SIDE; matrix matWorldPos=m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; matInHousePos.Translation(p[0]); matWorldPos=matInHousePos*matWorldPos; AddNode.m_vecPlanePoint=matWorldPos.GetLoc(); m_CollisionList.Add(AddNode); continue; } if( CIntersection::PolygonRay(vecSource, vecSource+vector3(-0.707f,0.0f,-0.707f)*m_vecRadius.x, p, fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; matInHousePos.Translation(vecSource+vector3(-0.707f,0.0f,-0.707f)*fIntersection); matInHousePos=matInHousePos*m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; AddNode.m_vecIntersectionPoint=matInHousePos.GetLoc(); matrix matInHouseRot=m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; matInHouseRot._41=matInHouseRot._42=matInHouseRot._43=0.0f; matInHousePos.Translation(vecNormal); matInHousePos=matInHousePos*matInHouseRot; AddNode.m_vecPlaneNormal=matInHousePos.GetLoc(); AddNode.m_CollisionType=CT_SIDE; matrix matWorldPos=m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; matInHousePos.Translation(p[0]); matWorldPos=matInHousePos*matWorldPos; AddNode.m_vecPlanePoint=matWorldPos.GetLoc(); m_CollisionList.Add(AddNode); continue; } if( CIntersection::PolygonRay(vecSource, vecSource+vector3(1.0f,0.0f,0.0f)*m_vecRadius.x, p, fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; matInHousePos.Translation(vecSource+vector3(1.0f,0.0f,0.0f)*fIntersection); matInHousePos=matInHousePos*m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; AddNode.m_vecIntersectionPoint=matInHousePos.GetLoc(); matrix matInHouseRot=m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; matInHouseRot._41=matInHouseRot._42=matInHouseRot._43=0.0f; matInHousePos.Translation(vecNormal); matInHousePos=matInHousePos*matInHouseRot; AddNode.m_vecPlaneNormal=matInHousePos.GetLoc(); AddNode.m_CollisionType=CT_SIDE; matrix matWorldPos=m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; matInHousePos.Translation(p[0]); matWorldPos=matInHousePos*matWorldPos; AddNode.m_vecPlanePoint=matWorldPos.GetLoc(); m_CollisionList.Add(AddNode); continue; } if( CIntersection::PolygonRay(vecSource, vecSource+vector3(-1.0f,0.0f,0.0f)*m_vecRadius.x, p, fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; matInHousePos.Translation(vecSource+vector3(-1.0f,0.0f,0.0f)*fIntersection); matInHousePos=matInHousePos*m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; AddNode.m_vecIntersectionPoint=matInHousePos.GetLoc(); matrix matInHouseRot=m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; matInHouseRot._41=matInHouseRot._42=matInHouseRot._43=0.0f; matInHousePos.Translation(vecNormal); matInHousePos=matInHousePos*matInHouseRot; AddNode.m_vecPlaneNormal=matInHousePos.GetLoc(); AddNode.m_CollisionType=CT_SIDE; matrix matWorldPos=m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; matInHousePos.Translation(p[0]); matWorldPos=matInHousePos*matWorldPos; AddNode.m_vecPlanePoint=matWorldPos.GetLoc(); m_CollisionList.Add(AddNode); continue; } if( CIntersection::PolygonRay(vecSource, vecSource+vector3(0.0f,0.0f,1.0f)*m_vecRadius.x, p, fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; matInHousePos.Translation(vecSource+vector3(0.0f,0.0f,1.0f)*fIntersection); matInHousePos=matInHousePos*m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; AddNode.m_vecIntersectionPoint=matInHousePos.GetLoc(); matrix matInHouseRot=m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; matInHouseRot._41=matInHouseRot._42=matInHouseRot._43=0.0f; matInHousePos.Translation(vecNormal); matInHousePos=matInHousePos*matInHouseRot; AddNode.m_vecPlaneNormal=matInHousePos.GetLoc(); AddNode.m_CollisionType=CT_SIDE; matrix matWorldPos=m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; matInHousePos.Translation(p[0]); matWorldPos=matInHousePos*matWorldPos; AddNode.m_vecPlanePoint=matWorldPos.GetLoc(); m_CollisionList.Add(AddNode); continue; } if( CIntersection::PolygonRay(vecSource, vecSource+vector3(0.0f,0.0f,-1.0f)*m_vecRadius.x, p, fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; matInHousePos.Translation(vecSource+vector3(0.0f,0.0f,-1.0f)*fIntersection); matInHousePos=matInHousePos*m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; AddNode.m_vecIntersectionPoint=matInHousePos.GetLoc(); matrix matInHouseRot=m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; matInHouseRot._41=matInHouseRot._42=matInHouseRot._43=0.0f; matInHousePos.Translation(vecNormal); matInHousePos=matInHousePos*matInHouseRot; AddNode.m_vecPlaneNormal=matInHousePos.GetLoc(); AddNode.m_CollisionType=CT_SIDE; matrix matWorldPos=m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; matInHousePos.Translation(p[0]); matWorldPos=matInHousePos*matWorldPos; AddNode.m_vecPlanePoint=matWorldPos.GetLoc(); m_CollisionList.Add(AddNode); continue; } } } } } } } //*/ } vector3 CCollisionDetection::GetPosition(vector3 vecPos, vector3 vecVelocity,vector3 vecBeforePos,CollisionType &CT,bool ChrCollision) { vector3 vecScaledPosition,vecScaledVelocity; vector3 vecFinalPosition; //vecVelocity.y=-20.0f; m_CollisionDetectionDetail=ChrCollision; vecScaledPosition=vecPos; vecScaledVelocity=vecVelocity; m_vecSourcePoint=vecPos; m_vecVelocity=vecVelocity; bool bOutMovePos=false; if(vecPos.x < m_vecMinMove.x) { vecPos.x=m_vecMinMove.x; bOutMovePos=true; } if(vecPos.z < m_vecMinMove.z) { vecPos.z=m_vecMinMove.z; bOutMovePos=true; } if(vecPos.x > m_vecMaxMove.x) { vecPos.x=m_vecMaxMove.x; bOutMovePos=true; } if(vecPos.z > m_vecMaxMove.z) { vecPos.z=m_vecMaxMove.z; bOutMovePos=true; } if(bOutMovePos) return vecPos; vector3 m_vecMinMove,m_vecMaxMove; if(!CSceneManager::GetInView()) CheckSectorHeightCollision(); /* m_vecSourcePoint.x=m_vecSourcePoint.x/m_vecRadius.x; m_vecSourcePoint.y=m_vecSourcePoint.y/m_vecRadius.y; m_vecSourcePoint.z=m_vecSourcePoint.z/m_vecRadius.z; m_vecVelocity.x=m_vecVelocity.x/m_vecRadius.x; m_vecVelocity.y=m_vecVelocity.y/m_vecRadius.y; m_vecVelocity.z=m_vecVelocity.z/m_vecRadius.z; */ CT=CT_NONE; vector3 vecMovePoint=CollideWithWorld(m_vecSourcePoint, m_vecVelocity,vecBeforePos,0,CT,ChrCollision); /* if(CT==CT_CHRSIDE) { return vecPos; } */ /* if(CT==CT_TERRAIN) { List vecHeightList; m_HeightField->GetHeightFieldShadowPoly(vecMovePoint,vecHeightList); vector3 v[3]; vector3 vecNormal,vecCompareNormal; float fLens; float fAngle; vecCompareNormal=vector3(0.0f,1.0f,0.0f); for(int cPoly=0;cPoly ((3.14159/180.0f)*35.0f)) { return vecPos; } } } } */ /* bool bUpper=false; if(vecPos.yGetHeight(vecPos); return vector3(vecPos.x,fHeight+m_vecRadius.y,vecPos.z); //return vecPos; } //vecMovePoint.y=100.0f; */ if(!CSceneManager::GetInView()) { if(CheckSectorWater(vecMovePoint,false)) { CT=CT_WATER; } } ZoneBoundApply(vecMovePoint,CT); // Zone Y Bound Àû¿ë // epsilon Àû¿ë.¹ú¹ú Çö»ó ¼öÁ¤. vector3 vecEpsilon = vecMovePoint - vecBeforePos; if(fabs(vecEpsilon.x + vecEpsilon.z) <= 1.0) if((vecEpsilon.GetLens() <= 10.0f) &&(CT == CT_NONE || CT == CT_SIDE|| CT == CT_BOTTOM)) return vecBeforePos; /**/ return vecMovePoint; } vector3 CCollisionDetection::CollideWithWorld(vector3 vecPos, vector3 vecVelocity,vector3 vecBeforePos,int Depth,CollisionType &CT,bool ChrCollision) { if((++Depth) == 6) { return vecBeforePos; } vecPos+=vecVelocity; m_vecVelocity=vecVelocity; m_vecSourcePoint=vecPos; m_CollisionList.num=0; float TmpHeight=m_vecRadius.y; //m_vecRadius.y*=1.9f; if(CSceneManager::m_pBspScene) CheckBspCollision(); else CheckHouseCollision(); if(!CSceneManager::GetInView()) { if(ChrCollision) { CheckSectorMeshCollision(); CheckSectorPlantCollision(); } } //CheckSectorHeightCollision(); if(ChrCollision) CheckCharacterCollision(true); else CheckCharacterCollision(false); m_vecRadius.y=TmpHeight; if(m_CollisionList.num==0) { //vector3 vecNewPos=vecPos-vecVelocity; //return vecNewPos; CT=CT_NONE; return vecPos; } if(m_CollisionList.num) { for(int i=0;i m_vecRadius.x - 0.01) break; */ vector3 vecUnit = vector3(0.0f,1.0f,0.0f); vector3 vecUnit2 = vecUp; vecUnit2.Normalize(); float fUnit = vecUnit * vecUnit2; if(fUnit <= -0.5f) { //CT=CT_BOTTOM; CT = CT_SIDE; return vecBeforePos; } CT=CT_SIDE; //return vecNewPos+(vecPos+vecUp-vecNewPos); //vector3 vel=(vecPos+vecUp-vecNewPos); vecUp+=vecPos; vector3 vecNewVelocity=(vecUp-vecNewPos); //vecNewVelocity=vecNewVelocity/2.0f; return CollideWithWorld(vecNewPos,vecNewVelocity,vecBeforePos,Depth,CT,ChrCollision); //return vecNewPos+vecUp; //return CollideWithWorld(vecNewPos,(vecPos+vecUp)-vecNewPos,Depth,bWallCollision); //return CollideWithWorld(vecPos,vecUp,Depth,CT); //return vecNewPos; /* m_CollisionList[i].m_vecIntersectionPoint; return vecNewPos; */ } /* if(m_CollisionList[i].m_CollisionType == CT_CHRSIDE) { CT=CT_CHRSIDE; return vecPos; } */ } float fMinDistance=1000000000.0f; int MinIndex=-1; for(i=0;iGetLSizeX()*m_HeightField->GetLSizeY();cSector++) { if( m_HeightField->m_SectorScene[cSector].m_AccumulateTM._41 <= m_vecSourcePoint.x && m_vecSourcePoint.x < m_HeightField->m_SectorScene[cSector].m_AccumulateTM._41+SECTORSIZE && m_HeightField->m_SectorScene[cSector].m_AccumulateTM._43 <= m_vecSourcePoint.z && m_vecSourcePoint.z < m_HeightField->m_SectorScene[cSector].m_AccumulateTM._43+SECTORSIZE) { for(int cObject=0;cObjectm_SectorScene[cSector].m_ObjectSceneNode.num;cObject++) { vecLens=m_HeightField->m_SectorScene[cSector].m_ObjectSceneNode[cObject]->m_TM.GetLoc()-m_vecSourcePoint; if(vecLens.GetLens() > 1000.0f) continue; if(strstr(m_HeightField->m_SectorScene[cSector].m_ObjectSceneNode[cObject]->m_strObjectName,"ZXC") || strstr(m_HeightField->m_SectorScene[cSector].m_ObjectSceneNode[cObject]->m_strObjectName,"zxc") ) continue; vecBoundBox[0].x=m_HeightField->m_SectorScene[cSector].m_ObjectSceneNode[cObject]->m_vecMinBox.x; vecBoundBox[0].y=m_HeightField->m_SectorScene[cSector].m_ObjectSceneNode[cObject]->m_vecMinBox.y; vecBoundBox[0].z=m_HeightField->m_SectorScene[cSector].m_ObjectSceneNode[cObject]->m_vecMinBox.z; vecBoundBox[1].x=m_HeightField->m_SectorScene[cSector].m_ObjectSceneNode[cObject]->m_vecMaxBox.x; vecBoundBox[1].y=m_HeightField->m_SectorScene[cSector].m_ObjectSceneNode[cObject]->m_vecMinBox.y; vecBoundBox[1].z=m_HeightField->m_SectorScene[cSector].m_ObjectSceneNode[cObject]->m_vecMinBox.z; vecBoundBox[2].x=m_HeightField->m_SectorScene[cSector].m_ObjectSceneNode[cObject]->m_vecMinBox.x; vecBoundBox[2].y=m_HeightField->m_SectorScene[cSector].m_ObjectSceneNode[cObject]->m_vecMinBox.y; vecBoundBox[2].z=m_HeightField->m_SectorScene[cSector].m_ObjectSceneNode[cObject]->m_vecMaxBox.z; vecBoundBox[3].x=m_HeightField->m_SectorScene[cSector].m_ObjectSceneNode[cObject]->m_vecMaxBox.x; vecBoundBox[3].y=m_HeightField->m_SectorScene[cSector].m_ObjectSceneNode[cObject]->m_vecMinBox.y; vecBoundBox[3].z=m_HeightField->m_SectorScene[cSector].m_ObjectSceneNode[cObject]->m_vecMaxBox.z; vecBoundBox[4].x=m_HeightField->m_SectorScene[cSector].m_ObjectSceneNode[cObject]->m_vecMinBox.x; vecBoundBox[4].y=m_HeightField->m_SectorScene[cSector].m_ObjectSceneNode[cObject]->m_vecMaxBox.y; vecBoundBox[4].z=m_HeightField->m_SectorScene[cSector].m_ObjectSceneNode[cObject]->m_vecMinBox.z; vecBoundBox[5].x=m_HeightField->m_SectorScene[cSector].m_ObjectSceneNode[cObject]->m_vecMaxBox.x; vecBoundBox[5].y=m_HeightField->m_SectorScene[cSector].m_ObjectSceneNode[cObject]->m_vecMaxBox.y; vecBoundBox[5].z=m_HeightField->m_SectorScene[cSector].m_ObjectSceneNode[cObject]->m_vecMinBox.z; vecBoundBox[6].x=m_HeightField->m_SectorScene[cSector].m_ObjectSceneNode[cObject]->m_vecMinBox.x; vecBoundBox[6].y=m_HeightField->m_SectorScene[cSector].m_ObjectSceneNode[cObject]->m_vecMaxBox.y; vecBoundBox[6].z=m_HeightField->m_SectorScene[cSector].m_ObjectSceneNode[cObject]->m_vecMaxBox.z; vecBoundBox[7].x=m_HeightField->m_SectorScene[cSector].m_ObjectSceneNode[cObject]->m_vecMaxBox.x; vecBoundBox[7].y=m_HeightField->m_SectorScene[cSector].m_ObjectSceneNode[cObject]->m_vecMaxBox.y; vecBoundBox[7].z=m_HeightField->m_SectorScene[cSector].m_ObjectSceneNode[cObject]->m_vecMaxBox.z; for(int i=0;i<8;i++) { matTrans.Translation(vecBoundBox[i]); matTrans=matTrans*m_HeightField->m_SectorScene[cSector].m_ObjectSceneNode[cObject]->m_AccumulateTM; vecBoundBox[i]=matTrans.GetLoc(); } // //vecPolyTest[0]=vecBoundBox[4]; //vecPolyTest[1]=vecBoundBox[0]; //vecPolyTest[2]=vecBoundBox[1]; vector3 vecVelocity=m_vecVelocity.Normalized(); vecVelocity.y=0.0f; vecVelocity.Normalize(); for(int cIndices=0;cIndices<8;cIndices++) { vecPolyTest[0]=vecBoundBox[wCollisionIndices[cIndices*3+0]]; vecPolyTest[1]=vecBoundBox[wCollisionIndices[cIndices*3+1]]; vecPolyTest[2]=vecBoundBox[wCollisionIndices[cIndices*3+2]]; vector3 vecNormal=(vecPolyTest[1]-vecPolyTest[0])^(vecPolyTest[2]-vecPolyTest[1]); vecNormal.Normalize(); for(i=0;i<8;i++) { // 9.26 ¼öÁ¤(vector3 °ü·Ã) /*vecVelocity.y = -1.0f; float fRate=vecVelocity*vecNormal; if(fRate>= 0.0f) continue;*/ if(CIntersection::PolygonRay(m_vecSourcePoint,m_vecSourcePoint+vecDirection[i]*m_vecRadius.x,vecPolyTest,fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; AddNode.m_vecIntersectionPoint=m_vecSourcePoint+vecDirection[i]*fIntersection; AddNode.m_vecPlanePoint=vecPolyTest[0]; vecPlaneNormal=(vecPolyTest[1]-vecPolyTest[0])^(vecPolyTest[2]-vecPolyTest[1]); vecPlaneNormal.Normalize(); AddNode.m_vecPlaneNormal=vecPlaneNormal; AddNode.m_CollisionType=CT_SIDE; m_CollisionList.Add(AddNode); } } } for(cIndices=8;cIndices<10;cIndices++) { vecPolyTest[0]=vecBoundBox[wCollisionIndices[cIndices*3+0]]; vecPolyTest[1]=vecBoundBox[wCollisionIndices[cIndices*3+1]]; vecPolyTest[2]=vecBoundBox[wCollisionIndices[cIndices*3+2]]; if(CIntersection::PolygonRay(m_vecSourcePoint,m_vecSourcePoint+vector3(0.0f,-1.0f,0.0f)*m_vecRadius.y, vecPolyTest, fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; AddNode.m_vecIntersectionPoint=m_vecSourcePoint+vector3(0.0f,-1.0f,0.0f)*fIntersection; AddNode.m_vecPlaneNormal=vector3(0.0f,1.0f,0.0f); AddNode.m_CollisionType=CT_BOTTOM; m_CollisionList.Add(AddNode); continue; } /* if(CIntersection::PolygonRay(m_vecSourcePoint+vector3(1.0f,0.0f,0.0f)*m_vecRadius.x, m_vecSourcePoint+vector3(1.0f,0.0f,0.0f)*m_vecRadius.x+vector3(0.0f,-1.0f,0.0f)*m_vecRadius.y, vecPolyTest,fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; AddNode.m_vecIntersectionPoint=m_vecSourcePoint+vector3(1.0f,0.0f,0.0f)*m_vecRadius.x+vector3(0.0f,-1.0f,0.0f)*m_vecRadius.y; AddNode.m_vecPlaneNormal=vector3(0.0f,1.0f,0.0f); AddNode.m_CollisionType=CT_BOTTOM; m_CollisionList.Add(AddNode); continue; } if(CIntersection::PolygonRay(m_vecSourcePoint+vector3(-1.0f,0.0f,0.0f)*m_vecRadius.x, m_vecSourcePoint+vector3(-1.0f,0.0f,0.0f)*m_vecRadius.x+vector3(0.0f,-1.0f,0.0f)*m_vecRadius.y, vecPolyTest, fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; AddNode.m_vecIntersectionPoint=m_vecSourcePoint+vector3(-1.0f,0.0f,0.0f)*m_vecRadius.x+vector3(0.0f,-1.0f,0.0f)*m_vecRadius.y; AddNode.m_vecPlaneNormal=vector3(0.0f,1.0f,0.0f); AddNode.m_CollisionType=CT_BOTTOM; m_CollisionList.Add(AddNode); continue; } if(CIntersection::PolygonRay(m_vecSourcePoint+vector3(0.0f,0.0f,1.0f)*m_vecRadius.x, m_vecSourcePoint+vector3(0.0f,0.0f,1.0f)*m_vecRadius.x+vector3(0.0f,-1.0f,0.0f)*m_vecRadius.y, vecPolyTest,fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; AddNode.m_vecIntersectionPoint=m_vecSourcePoint+vector3(0.0f,0.0f,1.0f)*m_vecRadius.x+vector3(0.0f,-1.0f,0.0f)*m_vecRadius.y; AddNode.m_vecPlaneNormal=vector3(0.0f,1.0f,0.0f); AddNode.m_CollisionType=CT_BOTTOM; m_CollisionList.Add(AddNode); continue; } if(CIntersection::PolygonRay(m_vecSourcePoint+vector3(0.0f,0.0f,-1.0f)*m_vecRadius.x, m_vecSourcePoint+vector3(0.0f,0.0f,-1.0f)*m_vecRadius.x+vector3(0.0f,-1.0f,0.0f)*m_vecRadius.y, vecPolyTest,fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; AddNode.m_vecIntersectionPoint=m_vecSourcePoint+vector3(0.0f,0.0f,-1.0f)*m_vecRadius.x+vector3(0.0f,-1.0f,0.0f)*m_vecRadius.y; AddNode.m_vecPlaneNormal=vector3(0.0f,1.0f,0.0f); AddNode.m_CollisionType=CT_BOTTOM; m_CollisionList.Add(AddNode); continue; } */ } } break; } } } void CCollisionDetection::CheckSectorPlantCollision() { vector3 vecInSectorPos; int nTreeIndexX,nTreeIndexZ; int nCheckTreeIndexX[4],nCheckTreeIndexZ[4]; vector3 vecBoundBox[8]; vector3 vecTransBoundBox[8]; vector3 vecMinBox,vecMaxBox; vecMinBox=vector3(-150.0f,0.0f,-150.0f); vecMaxBox=vector3(150.0f,400.0f,150.0f); vecBoundBox[0].x=vecMinBox.x; vecBoundBox[0].y=vecMinBox.y; vecBoundBox[0].z=vecMinBox.z; vecBoundBox[1].x=vecMaxBox.x; vecBoundBox[1].y=vecMinBox.y; vecBoundBox[1].z=vecMinBox.z; vecBoundBox[2].x=vecMinBox.x; vecBoundBox[2].y=vecMinBox.y; vecBoundBox[2].z=vecMaxBox.z; vecBoundBox[3].x=vecMaxBox.x; vecBoundBox[3].y=vecMinBox.y; vecBoundBox[3].z=vecMaxBox.z; vecBoundBox[4].x=vecMinBox.x; vecBoundBox[4].y=vecMaxBox.y; vecBoundBox[4].z=vecMinBox.z; vecBoundBox[5].x=vecMaxBox.x; vecBoundBox[5].y=vecMaxBox.y; vecBoundBox[5].z=vecMinBox.z; vecBoundBox[6].x=vecMinBox.x; vecBoundBox[6].y=vecMaxBox.y; vecBoundBox[6].z=vecMaxBox.z; vecBoundBox[7].x=vecMaxBox.x; vecBoundBox[7].y=vecMaxBox.y; vecBoundBox[7].z=vecMaxBox.z; WORD wCollisionIndices[]= { 4,1,0, 1,4,5, 5,3,1, 3,5,7, 7,2,3, 2,7,6, 6,0,2, 0,6,4 }; vector3 vecPolyTest[3]; vector3 vecPlaneNormal; float fTransY; float fIntersection; vector3 vecDirection[8]; vecDirection[0]=vector3(0.707f,0.0f,0.707f); vecDirection[1]=vector3(0.707f,0.0f,-0.707f); vecDirection[2]=vector3(-0.707f,0.0f,0.707f); vecDirection[3]=vector3(-0.707f,0.0f,-0.707f); vecDirection[4]=vector3(1.0f,0.0f,0.0f); vecDirection[5]=vector3(-1.0f,0.0f,0.0f); vecDirection[6]=vector3(0.0f,0.0f,1.0f); vecDirection[7]=vector3(0.0f,0.0f,-1.0f); //for(int cSector=0;cSectorGetLSizeX()*m_HeightField->GetLSizeY();cSector++) { if( m_HeightField->m_SectorScene[cSector].m_AccumulateTM._41 <= m_vecSourcePoint.x && m_vecSourcePoint.x < m_HeightField->m_SectorScene[cSector].m_AccumulateTM._41+SECTORSIZE && m_HeightField->m_SectorScene[cSector].m_AccumulateTM._43 <= m_vecSourcePoint.z && m_vecSourcePoint.z < m_HeightField->m_SectorScene[cSector].m_AccumulateTM._43+SECTORSIZE) { vecInSectorPos.x=m_vecSourcePoint.x-m_HeightField->m_SectorScene[cSector].m_AccumulateTM._41; vecInSectorPos.z=m_vecSourcePoint.z-m_HeightField->m_SectorScene[cSector].m_AccumulateTM._43; nTreeIndexX=vecInSectorPos.x/LINTERVAL; nTreeIndexZ=vecInSectorPos.z/LINTERVAL; nCheckTreeIndexX[0]=nTreeIndexX; nCheckTreeIndexZ[0]=nTreeIndexZ; if(nTreeIndexX==SECTORSX-1) { nCheckTreeIndexX[1]=-1; nCheckTreeIndexZ[1]=-1; } else { nCheckTreeIndexX[1]=nTreeIndexX+1; nCheckTreeIndexZ[1]=nTreeIndexZ; } if(nTreeIndexZ==SECTORSX-1) { nCheckTreeIndexX[2]=-1; nCheckTreeIndexZ[2]=-1; } else { nCheckTreeIndexX[2]=nTreeIndexX; nCheckTreeIndexZ[2]=nTreeIndexZ+1; } if(nTreeIndexX==SECTORSX-1 || nTreeIndexZ==SECTORSX-1) { nCheckTreeIndexX[3]=-1; nCheckTreeIndexZ[3]=-1; } else { nCheckTreeIndexX[3]=nTreeIndexX+1; nCheckTreeIndexZ[3]=nTreeIndexZ+1; } for(int i=0;i<4;i++) { if( nCheckTreeIndexX[i]!=-1 && //m_HeightField->m_SectorScene[cSector].m_TreeObjectNode.m_AlreadyPutPlant[nCheckTreeIndexX[i]+nCheckTreeIndexZ[i]*SECTORSX]!=-1) m_HeightField->m_SectorScene[cSector].m_TreeObjectNode.m_usDetailTree[nCheckTreeIndexX[i]+nCheckTreeIndexZ[i]*SECTORSX]!=0xff) { //fTransY=m_HeightField->m_SectorScene[cSector].m_TreeObjectNode.m_vecPlantPosition[m_HeightField->m_SectorScene[cSector].m_TreeObjectNode.m_AlreadyPutPlant[nCheckTreeIndexX[i]+nCheckTreeIndexZ[i]*SECTORSX]].y; fTransY=m_HeightField->m_SectorScene[cSector].m_TreeObjectNode.m_pHeight[nCheckTreeIndexX[i]+nCheckTreeIndexZ[i]*SECTORSX]; //m_HeightField->m_SectorScene[cSector].m_TreeObjectNode.m_vecPlantPosition[m_HeightField->m_SectorScene[cSector].m_TreeObjectNode.m_pHeight; for(int cVertex=0;cVertex<8;cVertex++) { vecTransBoundBox[cVertex]=vecBoundBox[cVertex]+vector3(nCheckTreeIndexX[i]*LINTERVAL+m_HeightField->m_SectorScene[cSector].m_AccumulateTM._41, fTransY, nCheckTreeIndexZ[i]*LINTERVAL+m_HeightField->m_SectorScene[cSector].m_AccumulateTM._43); } for(int cIndices=0;cIndices<8;cIndices++) { vecPolyTest[0]=vecTransBoundBox[wCollisionIndices[cIndices*3+0]]; vecPolyTest[1]=vecTransBoundBox[wCollisionIndices[cIndices*3+1]]; vecPolyTest[2]=vecTransBoundBox[wCollisionIndices[cIndices*3+2]]; for(int cDir=0;cDir<8;cDir++) { if(CIntersection::PolygonRay(m_vecSourcePoint,m_vecSourcePoint+vecDirection[cDir]*m_vecRadius.x,vecPolyTest,fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; AddNode.m_vecIntersectionPoint=m_vecSourcePoint+vecDirection[cDir]*fIntersection; AddNode.m_vecPlanePoint=vecPolyTest[0]; vecPlaneNormal=(vecPolyTest[1]-vecPolyTest[0])^(vecPolyTest[2]-vecPolyTest[1]); vecPlaneNormal.Normalize(); AddNode.m_vecPlaneNormal=vecPlaneNormal; AddNode.m_CollisionType=CT_SIDE; m_CollisionList.Add(AddNode); } } } } } break; } } } void CCollisionDetection::CheckCharacterCollision(bool bChrMode) { vector3 vecLens,vecChrPos,vecPos; float fLens; vecPos=m_vecSourcePoint; vecPos.y -= 85.0f; //vecPos.y=0.0f; if(bChrMode) { /* CSceneManager::m_CharacterManager.m_CharacterList[0]->GetPosition(vecChrPos.x,vecChrPos.y,vecChrPos.z); vecChrPos.y=0.0f; vecLens=vecPos-vecChrPos; fLens=vecLens.GetLens(); if(fLens < m_vecRadius.x*2.0f) { CCollisionList AddNode; AddNode.m_fDistance=fLens-m_vecRadius.x; AddNode.m_vecPlaneNormal=vecLens; AddNode.m_vecPlaneNormal.Normalize(); AddNode.m_vecPlanePoint=vecChrPos+AddNode.m_vecPlaneNormal*(m_vecRadius.x); AddNode.m_CollisionType=CT_SIDE; m_CollisionList.Add(AddNode); } */ for(int nChr=1;nChrGetPosition(vecChrPos.x,vecChrPos.y,vecChrPos.z); //vecChrPos.y=0.0f; vecLens=vecPos-vecChrPos; fLens=vecLens.GetLens(); if(fLens < m_vecRadius.x*2.0f) { CCollisionList AddNode; /// ¿ì¼±¼øÀ§¸¦ ¹Ð±â À§ÇØ ´õ¹Ì°ª( 2000.0f )¸¦ ´õÇØÁØ´Ù AddNode.m_fDistance=(fLens-m_vecRadius.x) + 2000.0f; AddNode.m_vecPlaneNormal=vecLens; AddNode.m_vecPlaneNormal.Normalize(); AddNode.m_vecPlanePoint= vecChrPos+AddNode.m_vecPlaneNormal*(m_vecRadius.x); AddNode.m_CollisionType= CT_SIDE ; m_CollisionList.Add(AddNode); } } else { int a=0; } } } else { //for(int cChr=0;cChr0) { CSceneManager::m_CharacterManager.m_CharacterList[0]->GetPosition(vecChrPos.x,vecChrPos.y,vecChrPos.z); vecChrPos.y=0.0f; vecLens=vecPos-vecChrPos; fLens=vecLens.GetLens(); if(fLens < m_vecRadius.x*2.0f) { CCollisionList AddNode; AddNode.m_fDistance=fLens-m_vecRadius.x; AddNode.m_vecPlaneNormal=vecLens; AddNode.m_vecPlaneNormal.Normalize(); AddNode.m_vecPlanePoint=vecChrPos+AddNode.m_vecPlaneNormal*(m_vecRadius.x); AddNode.m_CollisionType=CT_SIDE; m_CollisionList.Add(AddNode); } } */ } /* vecLens=m_vecSourcePoint-vecChrPos; if(vecLens.GetLens() > 500.0f) continue; for(int i=0;i<8;i++) { vecTransBoundBox[i]=vecBoundBox[i]+vecChrPos; } for(int cIndices=0;cIndices<8;cIndices++) { vecPolyTest[0]=vecTransBoundBox[wCollisionIndices[cIndices*3+0]]; vecPolyTest[1]=vecTransBoundBox[wCollisionIndices[cIndices*3+2]]; vecPolyTest[2]=vecTransBoundBox[wCollisionIndices[cIndices*3+1]]; for(i=0;i<8;i++) { if(CIntersection::PolygonRay(m_vecSourcePoint,m_vecSourcePoint+vecDirection[i]*m_vecRadius.x,vecPolyTest,fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; AddNode.m_vecIntersectionPoint=m_vecSourcePoint+vecDirection[i]*fIntersection; AddNode.m_vecPlanePoint=vecPolyTest[0]; vecPlaneNormal=(vecPolyTest[1]-vecPolyTest[0])^(vecPolyTest[2]-vecPolyTest[1]); vecPlaneNormal.Normalize(); AddNode.m_vecPlaneNormal=vecPlaneNormal; AddNode.m_CollisionType=CT_CHRSIDE; m_CollisionList.Add(AddNode); } } } } */ /* CSceneManager::m_CharacterManager.m_CharacterList[0]->GetPosition(vecChrPos.x,vecChrPos.y,vecChrPos.z); vecLens=m_vecSourcePoint-vecChrPos; if(vecLens.GetLens() > 500.0f) return; for(int i=0;i<8;i++) { vecTransBoundBox[i]=vecBoundBox[i]+vecChrPos; } for(int cIndices=0;cIndices<8;cIndices++) { vecPolyTest[0]=vecTransBoundBox[wCollisionIndices[cIndices*3+0]]; vecPolyTest[1]=vecTransBoundBox[wCollisionIndices[cIndices*3+2]]; vecPolyTest[2]=vecTransBoundBox[wCollisionIndices[cIndices*3+1]]; for(i=0;i<8;i++) { if(CIntersection::PolygonRay(m_vecSourcePoint,m_vecSourcePoint+vecDirection[i]*m_vecRadius.x,vecPolyTest,fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; AddNode.m_vecIntersectionPoint=m_vecSourcePoint+vecDirection[i]*fIntersection; AddNode.m_vecPlanePoint=vecPolyTest[0]; vecPlaneNormal=(vecPolyTest[1]-vecPolyTest[0])^(vecPolyTest[2]-vecPolyTest[1]); vecPlaneNormal.Normalize(); AddNode.m_vecPlaneNormal=vecPlaneNormal; AddNode.m_CollisionType=CT_CHRSIDE; m_CollisionList.Add(AddNode); } } } */ /* if( CIntersection::PolygonRay(vecSource, vecSource+vector3(0.707f,0.0f,0.707f)*m_vecRadius.x, p, fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; matInHousePos.Translation(vecSource+vector3(0.707f,0.0f,0.707f)*fIntersection); matInHousePos=matInHousePos*m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; AddNode.m_vecIntersectionPoint=matInHousePos.GetLoc(); matrix matInHouseRot=m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; matInHouseRot._41=matInHouseRot._42=matInHouseRot._43=0.0f; matInHousePos.Translation(vecNormal); matInHousePos=matInHousePos*matInHouseRot; AddNode.m_vecPlaneNormal=matInHousePos.GetLoc(); AddNode.m_CollisionType=CT_SIDE; matrix matWorldPos=m_HeightField->m_SectorScene[cSector].m_HouseObjectNode[cHouse]->m_AccumulateTM; matInHousePos.Translation(p[0]); matWorldPos=matInHousePos*matWorldPos; AddNode.m_vecPlanePoint=matWorldPos.GetLoc(); m_CollisionList.Add(AddNode); continue; } */ /* vector3 vecBoundBox[8],vecTransBoundBox[8]; vector3 vecPolyTest[3]; vector3 vecPlaneNormal; matrix matTrans; float fIntersection; WORD wCollisionIndices[]= { 4,1,0, 1,4,5, 5,3,1, 3,5,7, 7,2,3, 2,7,6, 6,0,2, 0,6,4 }; vector3 vecDirection[8]; vecDirection[0]=vector3(0.707f,0.0f,0.707f); vecDirection[1]=vector3(0.707f,0.0f,-0.707f); vecDirection[2]=vector3(-0.707f,0.0f,0.707f); vecDirection[3]=vector3(-0.707f,0.0f,-0.707f); vecDirection[4]=vector3(1.0f,0.0f,0.0f); vecDirection[5]=vector3(-1.0f,0.0f,0.0f); vecDirection[6]=vector3(0.0f,0.0f,1.0f); vecDirection[7]=vector3(0.0f,0.0f,-1.0f); vector3 vecMaxBox,vecMinBox; vecMaxBox=vector3(-60.0f,0.0f,-60.0f); vecMinBox=vector3(60.0f,200.0f,60.f); vecBoundBox[0].x=vecMinBox.x; vecBoundBox[0].y=vecMinBox.y; vecBoundBox[0].z=vecMinBox.z; vecBoundBox[1].x=vecMaxBox.x; vecBoundBox[1].y=vecMinBox.y; vecBoundBox[1].z=vecMinBox.z; vecBoundBox[2].x=vecMinBox.x; vecBoundBox[2].y=vecMinBox.y; vecBoundBox[2].z=vecMaxBox.z; vecBoundBox[3].x=vecMaxBox.x; vecBoundBox[3].y=vecMinBox.y; vecBoundBox[3].z=vecMaxBox.z; vecBoundBox[4].x=vecMinBox.x; vecBoundBox[4].y=vecMaxBox.y; vecBoundBox[4].z=vecMinBox.z; vecBoundBox[5].x=vecMaxBox.x; vecBoundBox[5].y=vecMaxBox.y; vecBoundBox[5].z=vecMinBox.z; vecBoundBox[6].x=vecMinBox.x; vecBoundBox[6].y=vecMaxBox.y; vecBoundBox[6].z=vecMaxBox.z; vecBoundBox[7].x=vecMaxBox.x; vecBoundBox[7].y=vecMaxBox.y; vecBoundBox[7].z=vecMaxBox.z; vector3 vecLens; vector3 vecChrPos; /* if(bChrMode) { for(int cChr=0;cChrGetPosition(vecChrPos.x,vecChrPos.y,vecChrPos.z); vecLens=m_vecSourcePoint-vecChrPos; if(vecLens.GetLens() > 500.0f) continue; for(int i=0;i<8;i++) { vecTransBoundBox[i]=vecBoundBox[i]+vecChrPos; } for(int cIndices=0;cIndices<8;cIndices++) { vecPolyTest[0]=vecTransBoundBox[wCollisionIndices[cIndices*3+0]]; vecPolyTest[1]=vecTransBoundBox[wCollisionIndices[cIndices*3+2]]; vecPolyTest[2]=vecTransBoundBox[wCollisionIndices[cIndices*3+1]]; for(i=0;i<8;i++) { if(CIntersection::PolygonRay(m_vecSourcePoint,m_vecSourcePoint+vecDirection[i]*m_vecRadius.x,vecPolyTest,fIntersection)) { vector3 v1=vecPolyTest[1]-vecPolyTest[0]; vector3 v2=vecPolyTest[2]-vecPolyTest[1]; vector3 vecNormal=v1^v2; vecNormal.Normalize(); float fAngle=vecDirection[i]*vecNormal; fAngle=acosf(fAngle); if(fAngle>=(3.14159f/2.0f)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; AddNode.m_vecIntersectionPoint=m_vecSourcePoint+vecDirection[i]*fIntersection; AddNode.m_vecPlanePoint=vecPolyTest[0]; vecPlaneNormal=(vecPolyTest[1]-vecPolyTest[0])^(vecPolyTest[2]-vecPolyTest[1]); vecPlaneNormal.Normalize(); AddNode.m_vecPlaneNormal=vecPlaneNormal; AddNode.m_CollisionType=CT_CHRSIDE; m_CollisionList.Add(AddNode); } } } } } /* CSceneManager::m_CharacterManager.m_CharacterList[0]->GetPosition(vecChrPos.x,vecChrPos.y,vecChrPos.z); vecLens=m_vecSourcePoint-vecChrPos; if(vecLens.GetLens() > 500.0f) return; for(int i=0;i<8;i++) { vecTransBoundBox[i]=vecBoundBox[i]+vecChrPos; } for(int cIndices=0;cIndices<8;cIndices++) { vecPolyTest[0]=vecTransBoundBox[wCollisionIndices[cIndices*3+0]]; vecPolyTest[1]=vecTransBoundBox[wCollisionIndices[cIndices*3+2]]; vecPolyTest[2]=vecTransBoundBox[wCollisionIndices[cIndices*3+1]]; for(i=0;i<8;i++) { if(CIntersection::PolygonRay(m_vecSourcePoint,m_vecSourcePoint+vecDirection[i]*m_vecRadius.x,vecPolyTest,fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; AddNode.m_vecIntersectionPoint=m_vecSourcePoint+vecDirection[i]*fIntersection; AddNode.m_vecPlanePoint=vecPolyTest[0]; vecPlaneNormal=(vecPolyTest[1]-vecPolyTest[0])^(vecPolyTest[2]-vecPolyTest[1]); vecPlaneNormal.Normalize(); AddNode.m_vecPlaneNormal=vecPlaneNormal; AddNode.m_CollisionType=CT_CHRSIDE; m_CollisionList.Add(AddNode); } } } } else { for(int cChr=1;cChrGetPosition(vecChrPos.x,vecChrPos.y,vecChrPos.z); vecLens=m_vecSourcePoint-vecChrPos; if(vecLens.GetLens() > 500.0f) continue; for(int i=0;i<8;i++) { vecTransBoundBox[i]=vecBoundBox[i]+vecChrPos; } for(int cIndices=0;cIndices<8;cIndices++) { vecPolyTest[0]=vecTransBoundBox[wCollisionIndices[cIndices*3+0]]; vecPolyTest[1]=vecTransBoundBox[wCollisionIndices[cIndices*3+2]]; vecPolyTest[2]=vecTransBoundBox[wCollisionIndices[cIndices*3+1]]; for(i=0;i<8;i++) { if(CIntersection::PolygonRay(m_vecSourcePoint,m_vecSourcePoint+vecDirection[i]*m_vecRadius.x,vecPolyTest,fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; AddNode.m_vecIntersectionPoint=m_vecSourcePoint+vecDirection[i]*fIntersection; AddNode.m_vecPlanePoint=vecPolyTest[0]; vecPlaneNormal=(vecPolyTest[1]-vecPolyTest[0])^(vecPolyTest[2]-vecPolyTest[1]); vecPlaneNormal.Normalize(); AddNode.m_vecPlaneNormal=vecPlaneNormal; AddNode.m_CollisionType=CT_CHRSIDE; m_CollisionList.Add(AddNode); } } } } } */ } bool CCollisionDetection::CheckSectorWater(vector3 vecPos,bool bUpper) { for(int cSector=0;cSectorGetLSizeX()*m_HeightField->GetLSizeY();cSector++) { if( m_HeightField->m_SectorScene[cSector].m_AccumulateTM._41 <= m_vecSourcePoint.x && m_vecSourcePoint.x < m_HeightField->m_SectorScene[cSector].m_AccumulateTM._41+SECTORSIZE && m_HeightField->m_SectorScene[cSector].m_AccumulateTM._43 <= m_vecSourcePoint.z && m_vecSourcePoint.z < m_HeightField->m_SectorScene[cSector].m_AccumulateTM._43+SECTORSIZE) { if(m_HeightField->m_SectorScene[cSector].m_MapWater) { if(m_HeightField->m_SectorScene[cSector].m_MapWater->m_fWaterHeight - 180.0f > vecPos.y-100) { return true; /* if(bUpper) return true; return false; */ } return false; //return true; } return false; //return true; } } return false; } void CCollisionDetection::CheckBspCollision() { if(CSceneManager::m_pBspScene && CSceneManager::m_pBspScene->m_HouseObject->m_pBspObject) { CBspScene *pBsp=CSceneManager::m_pBspScene->m_HouseObject->m_pBspObject; matrix matBspTM=CSceneManager::m_pBspScene->m_AccumulateTM; matrix matInvTM,matTM; matTM.Translation(m_vecSourcePoint); matInvTM.Inverse(CSceneManager::m_pBspScene->m_AccumulateTM); matTM=matTM*matInvTM; pBsp->CullCollisionPoly(matTM.GetLoc()); vector3 vecSource=matTM.GetLoc(); DSurface *ds; int nCount=0; List CollPoly; for(int i=0;im_nDrawSurfaces;i++) { if(pBsp->m_SurfaceInc[i]==1) { ds=&pBsp->m_DrawSurfaces[i]; if(ds->m_SurfaceType!=0) continue; for(int cIndices=0;cIndicesm_nIndex;cIndices++) { CollPoly.Add( pBsp->m_DrawVerts[ds->m_FirstVert+pBsp->m_DrawIndex[ds->m_FirstIndex+cIndices]].v ); } } } vector3 vecNormal; vector3 p[3]; vector3 v1,v2; vector3 vecCheckDir; float fAngle; matrix matInBspPos; for(int cPoly=0;cPoly0.5f) { if(CIntersection::PolygonRay(vecSource,vecSource+vector3(0.0f,-1.0f,0.0f)*m_vecRadius.y,p,fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; matInBspPos.Translation(vecSource+vector3(0.0f,-1.0f,0.0f)*fIntersection); matInBspPos=matInBspPos*matBspTM; AddNode.m_vecIntersectionPoint=matInBspPos.GetLoc(); matrix matInBspRot=matBspTM; matInBspRot._41=matInBspRot._42=matInBspRot._43=0.0f; matInBspPos.Translation(vecNormal); matInBspPos=matInBspPos*matInBspRot; AddNode.m_vecPlaneNormal=matInBspPos.GetLoc(); AddNode.m_CollisionType=CT_BOTTOM; m_CollisionList.Add(AddNode); continue; } if(CIntersection::PolygonRay(vecSource+vector3(1.0f,0.0f,0.0f)*m_vecRadius.x, vecSource+vector3(1.0f,0.0f,0.0f)*m_vecRadius.x+vector3(0.0f,-1.0f,0.0f)*m_vecRadius.y, p, fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; matInBspPos.Translation(vecSource+vector3(0.0f,-1.0f,0.0f)*fIntersection); matInBspPos=matInBspPos*matBspTM; AddNode.m_vecIntersectionPoint=matInBspPos.GetLoc(); matrix matInBspRot=matBspTM; matInBspRot._41=matInBspRot._42=matInBspRot._43=0.0f; matInBspPos.Translation(vecNormal); matInBspPos=matInBspPos*matInBspRot; AddNode.m_vecPlaneNormal=matInBspPos.GetLoc(); AddNode.m_CollisionType=CT_BOTTOM; m_CollisionList.Add(AddNode); continue; } if(CIntersection::PolygonRay(vecSource+vector3(-1.0f,0.0f,0.0f)*m_vecRadius.x, vecSource+vector3(-1.0f,0.0f,0.0f)*m_vecRadius.x+vector3(0.0f,-1.0f,0.0f)*m_vecRadius.y, p, fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; matInBspPos.Translation(vecSource+vector3(0.0f,-1.0f,0.0f)*fIntersection); matInBspPos=matInBspPos*matBspTM; AddNode.m_vecIntersectionPoint=matInBspPos.GetLoc(); matrix matInBspRot=matBspTM; matInBspRot._41=matInBspRot._42=matInBspRot._43=0.0f; matInBspPos.Translation(vecNormal); matInBspPos=matInBspPos*matInBspRot; AddNode.m_vecPlaneNormal=matInBspPos.GetLoc(); AddNode.m_CollisionType=CT_BOTTOM; m_CollisionList.Add(AddNode); continue; } if(CIntersection::PolygonRay(vecSource+vector3(0.0f,0.0f,1.0f)*m_vecRadius.x, vecSource+vector3(0.0f,0.0f,1.0f)*m_vecRadius.x+vector3(0.0f,-1.0f,0.0f)*m_vecRadius.y, p, fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; matInBspPos.Translation(vecSource+vector3(0.0f,-1.0f,0.0f)*fIntersection); matInBspPos=matInBspPos*matBspTM; AddNode.m_vecIntersectionPoint=matInBspPos.GetLoc(); matrix matInBspRot=matBspTM; matInBspRot._41=matInBspRot._42=matInBspRot._43=0.0f; matInBspPos.Translation(vecNormal); matInBspPos=matInBspPos*matInBspRot; AddNode.m_vecPlaneNormal=matInBspPos.GetLoc(); AddNode.m_CollisionType=CT_BOTTOM; m_CollisionList.Add(AddNode); continue; } if(CIntersection::PolygonRay(vecSource+vector3(0.0f,0.0f,-1.0f)*m_vecRadius.x, vecSource+vector3(0.0f,0.0f,-1.0f)*m_vecRadius.x+vector3(0.0f,-1.0f,0.0f)*m_vecRadius.y, p, fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; matInBspPos.Translation(vecSource+vector3(0.0f,-1.0f,0.0f)*fIntersection); matInBspPos=matInBspPos*matBspTM; AddNode.m_vecIntersectionPoint=matInBspPos.GetLoc(); matrix matInBspRot=matBspTM; matInBspRot._41=matInBspRot._42=matInBspRot._43=0.0f; matInBspPos.Translation(vecNormal); matInBspPos=matInBspPos*matInBspRot; AddNode.m_vecPlaneNormal=matInBspPos.GetLoc(); AddNode.m_CollisionType=CT_BOTTOM; m_CollisionList.Add(AddNode); continue; } } else { if(CIntersection::PointFromPlane(vecNormal,p[0],vecSource)>=m_vecRadius.x) continue; if( CIntersection::PolygonRay(vecSource, vecSource+vector3(0.0f,1.0f,0.0f)*m_vecRadius.y,p,fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; matInBspPos.Translation(vecSource+vector3(0.0f,1.0f,0.0f)*fIntersection); matInBspPos=matInBspPos*matBspTM; AddNode.m_vecIntersectionPoint=matInBspPos.GetLoc(); matrix matInBspRot=matBspTM; matInBspRot._41=matInBspRot._42=matInBspRot._43=0.0f; matInBspPos.Translation(vecNormal); matInBspPos=matInBspPos*matInBspRot; AddNode.m_vecPlaneNormal=matInBspPos.GetLoc(); AddNode.m_CollisionType=CT_SIDE; matrix matWorldPos=matBspTM; matInBspPos.Translation(p[0]); matWorldPos=matInBspPos*matWorldPos; AddNode.m_vecPlanePoint=matWorldPos.GetLoc(); m_CollisionList.Add(AddNode); continue; } if( CIntersection::PolygonRay(vecSource, vecSource+vector3(0.707f,0.0f,0.707f)*m_vecRadius.x, p, fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; matInBspPos.Translation(vecSource+vector3(0.707f,0.0f,0.707f)*fIntersection); matInBspPos=matInBspPos*matBspTM; AddNode.m_vecIntersectionPoint=matInBspPos.GetLoc(); matrix matInBspRot=matBspTM; matInBspRot._41=matInBspRot._42=matInBspRot._43=0.0f; matInBspPos.Translation(vecNormal); matInBspPos=matInBspPos*matInBspRot; AddNode.m_vecPlaneNormal=matInBspPos.GetLoc(); AddNode.m_CollisionType=CT_SIDE; matrix matWorldPos=matBspTM; matInBspPos.Translation(p[0]); matWorldPos=matInBspPos*matWorldPos; AddNode.m_vecPlanePoint=matWorldPos.GetLoc(); m_CollisionList.Add(AddNode); continue; } if( CIntersection::PolygonRay(vecSource, vecSource+vector3(-0.707f,0.0f,0.707f)*m_vecRadius.x, p, fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; matInBspPos.Translation(vecSource+vector3(-0.707f,0.0f,0.707f)*fIntersection); matInBspPos=matInBspPos*matBspTM; AddNode.m_vecIntersectionPoint=matInBspPos.GetLoc(); matrix matInBspRot=matBspTM; matInBspRot._41=matInBspRot._42=matInBspRot._43=0.0f; matInBspPos.Translation(vecNormal); matInBspPos=matInBspPos*matInBspRot; AddNode.m_vecPlaneNormal=matInBspPos.GetLoc(); AddNode.m_CollisionType=CT_SIDE; matrix matWorldPos=matBspTM; matInBspPos.Translation(p[0]); matWorldPos=matInBspPos*matWorldPos; AddNode.m_vecPlanePoint=matWorldPos.GetLoc(); m_CollisionList.Add(AddNode); continue; } if( CIntersection::PolygonRay(vecSource, vecSource+vector3(0.707f,0.0f,-0.707f)*m_vecRadius.x, p, fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; matInBspPos.Translation(vecSource+vector3(0.707f,0.0f,-0.707f)*fIntersection); matInBspPos=matInBspPos*matBspTM; AddNode.m_vecIntersectionPoint=matInBspPos.GetLoc(); matrix matInBspRot=matBspTM; matInBspRot._41=matInBspRot._42=matInBspRot._43=0.0f; matInBspPos.Translation(vecNormal); matInBspPos=matInBspPos*matInBspRot; AddNode.m_vecPlaneNormal=matInBspPos.GetLoc(); AddNode.m_CollisionType=CT_SIDE; matrix matWorldPos=matBspTM; matInBspPos.Translation(p[0]); matWorldPos=matInBspPos*matWorldPos; AddNode.m_vecPlanePoint=matWorldPos.GetLoc(); m_CollisionList.Add(AddNode); continue; } if( CIntersection::PolygonRay(vecSource, vecSource+vector3(-0.707f,0.0f,-0.707f)*m_vecRadius.x, p, fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; matInBspPos.Translation(vecSource+vector3(-0.707f,0.0f,-0.707f)*fIntersection); matInBspPos=matInBspPos*matBspTM; AddNode.m_vecIntersectionPoint=matInBspPos.GetLoc(); matrix matInBspRot=matBspTM; matInBspRot._41=matInBspRot._42=matInBspRot._43=0.0f; matInBspPos.Translation(vecNormal); matInBspPos=matInBspPos*matInBspRot; AddNode.m_vecPlaneNormal=matInBspPos.GetLoc(); AddNode.m_CollisionType=CT_SIDE; matrix matWorldPos=matBspTM; matInBspPos.Translation(p[0]); matWorldPos=matInBspPos*matWorldPos; AddNode.m_vecPlanePoint=matWorldPos.GetLoc(); m_CollisionList.Add(AddNode); continue; } if( CIntersection::PolygonRay(vecSource, vecSource+vector3(1.0f,0.0f,0.0f)*m_vecRadius.x, p, fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; matInBspPos.Translation(vecSource+vector3(1.0f,0.0f,0.0f)*fIntersection); matInBspPos=matInBspPos*matBspTM; AddNode.m_vecIntersectionPoint=matInBspPos.GetLoc(); matrix matInBspRot=matBspTM; matInBspRot._41=matInBspRot._42=matInBspRot._43=0.0f; matInBspPos.Translation(vecNormal); matInBspPos=matInBspPos*matInBspRot; AddNode.m_vecPlaneNormal=matInBspPos.GetLoc(); AddNode.m_CollisionType=CT_SIDE; matrix matWorldPos=matBspTM; matInBspPos.Translation(p[0]); matWorldPos=matInBspPos*matWorldPos; AddNode.m_vecPlanePoint=matWorldPos.GetLoc(); m_CollisionList.Add(AddNode); continue; } if( CIntersection::PolygonRay(vecSource, vecSource+vector3(-1.0f,0.0f,0.0f)*m_vecRadius.x, p, fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; matInBspPos.Translation(vecSource+vector3(-1.0f,0.0f,0.0f)*fIntersection); matInBspPos=matInBspPos*matBspTM; AddNode.m_vecIntersectionPoint=matInBspPos.GetLoc(); matrix matInBspRot=matBspTM; matInBspRot._41=matInBspRot._42=matInBspRot._43=0.0f; matInBspPos.Translation(vecNormal); matInBspPos=matInBspPos*matInBspRot; AddNode.m_vecPlaneNormal=matInBspPos.GetLoc(); AddNode.m_CollisionType=CT_SIDE; matrix matWorldPos=matBspTM; matInBspPos.Translation(p[0]); matWorldPos=matInBspPos*matWorldPos; AddNode.m_vecPlanePoint=matWorldPos.GetLoc(); m_CollisionList.Add(AddNode); continue; } if( CIntersection::PolygonRay(vecSource, vecSource+vector3(0.0f,0.0f,1.0f)*m_vecRadius.x, p, fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; matInBspPos.Translation(vecSource+vector3(0.0f,0.0f,1.0f)*fIntersection); matInBspPos=matInBspPos*matBspTM; AddNode.m_vecIntersectionPoint=matInBspPos.GetLoc(); matrix matInBspRot=matBspTM; matInBspRot._41=matInBspRot._42=matInBspRot._43=0.0f; matInBspPos.Translation(vecNormal); matInBspPos=matInBspPos*matInBspRot; AddNode.m_vecPlaneNormal=matInBspPos.GetLoc(); AddNode.m_CollisionType=CT_SIDE; matrix matWorldPos=matBspTM; matInBspPos.Translation(p[0]); matWorldPos=matInBspPos*matWorldPos; AddNode.m_vecPlanePoint=matWorldPos.GetLoc(); m_CollisionList.Add(AddNode); continue; } if( CIntersection::PolygonRay(vecSource, vecSource+vector3(0.0f,0.0f,-1.0f)*m_vecRadius.x, p, fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; matInBspPos.Translation(vecSource+vector3(0.0f,0.0f,-1.0f)*fIntersection); matInBspPos=matInBspPos*matBspTM; AddNode.m_vecIntersectionPoint=matInBspPos.GetLoc(); matrix matInBspRot=matBspTM; matInBspRot._41=matInBspRot._42=matInBspRot._43=0.0f; matInBspPos.Translation(vecNormal); matInBspPos=matInBspPos*matInBspRot; AddNode.m_vecPlaneNormal=matInBspPos.GetLoc(); AddNode.m_CollisionType=CT_SIDE; matrix matWorldPos=matBspTM; matInBspPos.Translation(p[0]); matWorldPos=matInBspPos*matWorldPos; AddNode.m_vecPlanePoint=matWorldPos.GetLoc(); m_CollisionList.Add(AddNode); continue; } } } } } void CCollisionDetection::CheckSectorHeightCollision() { m_bHeightGradient = false; List vecHeightList; m_HeightField->GetHeightFieldShadowPoly(m_vecSourcePoint,vecHeightList); vector3 v[6]; vector3 vecNormal,vecCompareNormal,vecMove; float fLens; float fAngle; vecCompareNormal=vector3(0.0f,1.0f,0.0f); float fHeight=m_HeightField->GetHeight(m_vecSourcePoint); float fMoveFactor; if(fHeight+m_vecRadius.y < m_vecSourcePoint.y) { return; } else { m_vecSourcePoint.y=fHeight+m_vecRadius.y; } bool bCheckHeight=false; for(int cPoly=0;cPoly ((3.14159/180.0f)*40.0f)) { vecMove=vecNormal-vecCompareNormal; vecMove.Normalize(); fMoveFactor=fabsf(vecMove.y); vecMove.y=0.0f; vecMove=vecMove*fMoveFactor*38.0f; m_vecVelocity+=vecMove; }*/ if(fAngle> ((3.14159/180.0f)*38.0f)) { vecMove=vecNormal-vecCompareNormal; vecMove.Normalize(); if(vecMove.y > 0.0f) vecMove.y *= -1.0f; fMoveFactor=fabsf(vecMove.y); //vecMove.y=0.0f; vecMove=vecMove*fMoveFactor*35.0f; m_vecVelocity+=vecMove; m_vecVelocity.y = -8.0f; m_bHeightGradient = true; } } /* vecNormal=(v[1]-v[0])^(v[2]-v[1]); vecNormal.Normalize(); fAngle=vecNormal*vecCompareNormal; fAngle=acosf(fAngle); if(fAngle> ((3.14159/180.0f)*35.0f)) { /* v[3]=v[0]+vector3(0.0f,300.0f,0.0f); v[4]=v[1]+vector3(0.0f,300.0f,0.0f); v[5]=v[2]+vector3(0.0f,300.0f,0.0f); vector3 vecPolyTest[3],vecPlaneNormal; float fIntersection; vecPolyTest[0]=v[0]; vecPolyTest[1]=v[1]; vecPolyTest[2]=v[3]; for(int i=0;i<8;i++) { if(CIntersection::PolygonRay(m_vecSourcePoint,m_vecSourcePoint+vecDirection[i]*m_vecRadius.x,vecPolyTest,fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; AddNode.m_vecIntersectionPoint=m_vecSourcePoint+vecDirection[i]*fIntersection; AddNode.m_vecPlanePoint=vecPolyTest[0]; vecPlaneNormal=(vecPolyTest[1]-vecPolyTest[0])^(vecPolyTest[2]-vecPolyTest[1]); vecPlaneNormal.Normalize(); AddNode.m_vecPlaneNormal=vecPlaneNormal; AddNode.m_CollisionType=CT_SIDE; m_CollisionList.Add(AddNode); return; } } vecPolyTest[0]=v[3]; vecPolyTest[1]=v[4]; vecPolyTest[2]=v[1]; for(i=0;i<8;i++) { if(CIntersection::PolygonRay(m_vecSourcePoint,m_vecSourcePoint+vecDirection[i]*m_vecRadius.x,vecPolyTest,fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; AddNode.m_vecIntersectionPoint=m_vecSourcePoint+vecDirection[i]*fIntersection; AddNode.m_vecPlanePoint=vecPolyTest[0]; vecPlaneNormal=(vecPolyTest[1]-vecPolyTest[0])^(vecPolyTest[2]-vecPolyTest[1]); vecPlaneNormal.Normalize(); AddNode.m_vecPlaneNormal=vecPlaneNormal; AddNode.m_CollisionType=CT_SIDE; m_CollisionList.Add(AddNode); return; } } vecPolyTest[0]=v[1]; vecPolyTest[1]=v[2]; vecPolyTest[2]=v[4]; for(i=0;i<8;i++) { if(CIntersection::PolygonRay(m_vecSourcePoint,m_vecSourcePoint+vecDirection[i]*m_vecRadius.x,vecPolyTest,fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; AddNode.m_vecIntersectionPoint=m_vecSourcePoint+vecDirection[i]*fIntersection; AddNode.m_vecPlanePoint=vecPolyTest[0]; vecPlaneNormal=(vecPolyTest[1]-vecPolyTest[0])^(vecPolyTest[2]-vecPolyTest[1]); vecPlaneNormal.Normalize(); AddNode.m_vecPlaneNormal=vecPlaneNormal; AddNode.m_CollisionType=CT_SIDE; m_CollisionList.Add(AddNode); return; } } vecPolyTest[0]=v[4]; vecPolyTest[1]=v[5]; vecPolyTest[2]=v[2]; for(i=0;i<8;i++) { if(CIntersection::PolygonRay(m_vecSourcePoint,m_vecSourcePoint+vecDirection[i]*m_vecRadius.x,vecPolyTest,fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; AddNode.m_vecIntersectionPoint=m_vecSourcePoint+vecDirection[i]*fIntersection; AddNode.m_vecPlanePoint=vecPolyTest[0]; vecPlaneNormal=(vecPolyTest[1]-vecPolyTest[0])^(vecPolyTest[2]-vecPolyTest[1]); vecPlaneNormal.Normalize(); AddNode.m_vecPlaneNormal=vecPlaneNormal; AddNode.m_CollisionType=CT_SIDE; m_CollisionList.Add(AddNode); return; } } vecPolyTest[0]=v[2]; vecPolyTest[1]=v[0]; vecPolyTest[2]=v[5]; for(i=0;i<8;i++) { if(CIntersection::PolygonRay(m_vecSourcePoint,m_vecSourcePoint+vecDirection[i]*m_vecRadius.x,vecPolyTest,fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; AddNode.m_vecIntersectionPoint=m_vecSourcePoint+vecDirection[i]*fIntersection; AddNode.m_vecPlanePoint=vecPolyTest[0]; vecPlaneNormal=(vecPolyTest[1]-vecPolyTest[0])^(vecPolyTest[2]-vecPolyTest[1]); vecPlaneNormal.Normalize(); AddNode.m_vecPlaneNormal=vecPlaneNormal; AddNode.m_CollisionType=CT_SIDE; m_CollisionList.Add(AddNode); return; } } vecPolyTest[0]=v[5]; vecPolyTest[1]=v[3]; vecPolyTest[2]=v[0]; for(i=0;i<8;i++) { if(CIntersection::PolygonRay(m_vecSourcePoint,m_vecSourcePoint+vecDirection[i]*m_vecRadius.x,vecPolyTest,fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; AddNode.m_vecIntersectionPoint=m_vecSourcePoint+vecDirection[i]*fIntersection; AddNode.m_vecPlanePoint=vecPolyTest[0]; vecPlaneNormal=(vecPolyTest[1]-vecPolyTest[0])^(vecPolyTest[2]-vecPolyTest[1]); vecPlaneNormal.Normalize(); AddNode.m_vecPlaneNormal=vecPlaneNormal; AddNode.m_CollisionType=CT_SIDE; m_CollisionList.Add(AddNode); return; } } } /* if(CIntersection::PolygonRay(vector3(vecMovePoint.x,0.0f,vecMovePoint.z),vector3(vecMovePoint.x,120000.0f,vecMovePoint.z),v,fLens)) { vecNormal=(v[1]-v[0])^(v[2]-v[1]); vecNormal.Normalize(); fAngle=vecNormal*vecCompareNormal; fAngle=acosf(fAngle); if(fAngle> ((3.14159/180.0f)*35.0f)) { return vecPos; } } */ } if(bCheckHeight==false) { } } void CCollisionDetection::CheckInHouseObject(CHouseObject *pHouse,matrix matParent) { vector3 vecBoundBox[8]; vector3 vecPolyTest[3]; vector3 vecPlaneNormal; matrix matTrans; float fIntersection; WORD wCollisionIndices[]= { 4,1,0, 1,4,5, 5,3,1, 3,5,7, 7,2,3, 2,7,6, 6,0,2, 0,6,4 }; vector3 vecDirection[8]; vecDirection[0]=vector3(0.707f,0.0f,0.707f); vecDirection[1]=vector3(0.707f,0.0f,-0.707f); vecDirection[2]=vector3(-0.707f,0.0f,0.707f); vecDirection[3]=vector3(-0.707f,0.0f,-0.707f); vecDirection[4]=vector3(1.0f,0.0f,0.0f); vecDirection[5]=vector3(-1.0f,0.0f,0.0f); vecDirection[6]=vector3(0.0f,0.0f,1.0f); vecDirection[7]=vector3(0.0f,0.0f,-1.0f); vector3 vecLens; matrix matTM; for(int cObject=0;cObjectm_ObjectList.num;cObject++) { matTM=pHouse->m_ObjectList[cObject]->m_TM*matParent; vecLens=matTM.GetLoc()-m_vecSourcePoint; if(vecLens.GetLens() > 300.0f) continue; vecBoundBox[0].x=pHouse->m_ObjectList[cObject]->m_vecMinBox.x; vecBoundBox[0].y=pHouse->m_ObjectList[cObject]->m_vecMinBox.y; vecBoundBox[0].z=pHouse->m_ObjectList[cObject]->m_vecMinBox.z; vecBoundBox[1].x=pHouse->m_ObjectList[cObject]->m_vecMaxBox.x; vecBoundBox[1].y=pHouse->m_ObjectList[cObject]->m_vecMinBox.y; vecBoundBox[1].z=pHouse->m_ObjectList[cObject]->m_vecMinBox.z; vecBoundBox[2].x=pHouse->m_ObjectList[cObject]->m_vecMinBox.x; vecBoundBox[2].y=pHouse->m_ObjectList[cObject]->m_vecMinBox.y; vecBoundBox[2].z=pHouse->m_ObjectList[cObject]->m_vecMaxBox.z; vecBoundBox[3].x=pHouse->m_ObjectList[cObject]->m_vecMaxBox.x; vecBoundBox[3].y=pHouse->m_ObjectList[cObject]->m_vecMinBox.y; vecBoundBox[3].z=pHouse->m_ObjectList[cObject]->m_vecMaxBox.z; vecBoundBox[4].x=pHouse->m_ObjectList[cObject]->m_vecMinBox.x; vecBoundBox[4].y=pHouse->m_ObjectList[cObject]->m_vecMaxBox.y+50.0f; vecBoundBox[4].z=pHouse->m_ObjectList[cObject]->m_vecMinBox.z; vecBoundBox[5].x=pHouse->m_ObjectList[cObject]->m_vecMaxBox.x; vecBoundBox[5].y=pHouse->m_ObjectList[cObject]->m_vecMaxBox.y+50.0f; vecBoundBox[5].z=pHouse->m_ObjectList[cObject]->m_vecMinBox.z; vecBoundBox[6].x=pHouse->m_ObjectList[cObject]->m_vecMinBox.x; vecBoundBox[6].y=pHouse->m_ObjectList[cObject]->m_vecMaxBox.y+50.0f; vecBoundBox[6].z=pHouse->m_ObjectList[cObject]->m_vecMaxBox.z; vecBoundBox[7].x=pHouse->m_ObjectList[cObject]->m_vecMaxBox.x; vecBoundBox[7].y=pHouse->m_ObjectList[cObject]->m_vecMaxBox.y+50.0f; vecBoundBox[7].z=pHouse->m_ObjectList[cObject]->m_vecMaxBox.z; for(int i=0;i<8;i++) { matTrans.Translation(vecBoundBox[i]); matTrans=matTrans*matTM; vecBoundBox[i]=matTrans.GetLoc(); } // //vecPolyTest[0]=vecBoundBox[4]; //vecPolyTest[1]=vecBoundBox[0]; //vecPolyTest[2]=vecBoundBox[1]; bool bAlready=false; for(int cIndices=0;cIndices<8;cIndices++) { vecPolyTest[0]=vecBoundBox[wCollisionIndices[cIndices*3+0]]; vecPolyTest[1]=vecBoundBox[wCollisionIndices[cIndices*3+1]]; vecPolyTest[2]=vecBoundBox[wCollisionIndices[cIndices*3+2]]; for(i=0;i<8;i++) { if(CIntersection::PolygonRay(m_vecSourcePoint,m_vecSourcePoint+vecDirection[i]*m_vecRadius.x,vecPolyTest,fIntersection)) { CCollisionList AddNode; AddNode.m_fDistance=fIntersection; AddNode.m_vecIntersectionPoint=m_vecSourcePoint+vecDirection[i]*fIntersection; AddNode.m_vecPlanePoint=vecPolyTest[0]; vecPlaneNormal=(vecPolyTest[1]-vecPolyTest[0])^(vecPolyTest[2]-vecPolyTest[1]); vecPlaneNormal.Normalize(); AddNode.m_vecPlaneNormal=vecPlaneNormal; AddNode.m_CollisionType=CT_SIDE; m_CollisionList.Add(AddNode); bAlready=true; break; } } if(bAlready) break; } } } // Zone Bound func (Zone Info ÆÄÀÏ¿¡¼­ setting) void CCollisionDetection::SetZoneBound(float fMin,float fMax) { m_fMinYBound = fMin; m_fMaxYBound = fMax; } void CCollisionDetection::ZoneBoundApply(vector3 &vecPoint,CollisionType &CT) { if(m_fMinYBound != -123.0f) if(vecPoint.y <= m_fMinYBound) { vecPoint.y = m_fMinYBound; CT = CT_BOTTOM; // ¹Ù´ÚÀ¸·Î setting } if(m_fMaxYBound != -123.0f) if(vecPoint.y >= m_fMaxYBound) vecPoint.y = m_fMaxYBound; }