#include "StdAfx.h" #include "EterLib/lineintersect_utils.h" #include "GameUtil.h" bool DetectCollisionDynamicZCylinderVSDynamicZCylinder(const CDynamicSphereInstance & c_rSphere1, const CDynamicSphereInstance & c_rSphere2) { CDynamicSphereInstance c_rCylinder1=c_rSphere1; CDynamicSphereInstance c_rCylinder2=c_rSphere2; c_rCylinder1.v3Position.z=0; c_rCylinder1.v3LastPosition.z=0; c_rCylinder2.v3Position.z=0; c_rCylinder2.v3LastPosition.z=0; float r = c_rCylinder1.fRadius+c_rCylinder2.fRadius; float rsq = r*r; // AABB check D3DXVECTOR3 mi1=c_rCylinder1.v3LastPosition, mi2 = c_rCylinder1.v3Position; D3DXVECTOR3 mi3=c_rCylinder2.v3LastPosition, mi4 = c_rCylinder2.v3Position; if (mi1.x>mi2.x) std::swap(mi1.x,mi2.x); if (mi1.y>mi2.y) std::swap(mi1.y,mi2.y); if (mi1.z>mi2.z) std::swap(mi1.z,mi2.z); if (mi3.x>mi4.x) std::swap(mi3.x,mi4.x); if (mi3.y>mi4.y) std::swap(mi3.y,mi4.y); if (mi3.z>mi4.z) std::swap(mi3.z,mi4.z); mi1.x -= c_rCylinder1.fRadius; mi1.y -= c_rCylinder1.fRadius; mi1.z -= c_rCylinder1.fRadius; mi2.x += c_rCylinder1.fRadius; mi2.y += c_rCylinder1.fRadius; mi2.z += c_rCylinder1.fRadius; mi3.x -= c_rCylinder2.fRadius; mi3.y -= c_rCylinder2.fRadius; mi3.z -= c_rCylinder2.fRadius; mi4.x += c_rCylinder2.fRadius; mi4.y += c_rCylinder2.fRadius; mi4.z += c_rCylinder2.fRadius; if (mi4.xmi2.x) std::swap(mi1.x,mi2.x); if (mi1.y>mi2.y) std::swap(mi1.y,mi2.y); if (mi1.z>mi2.z) std::swap(mi1.z,mi2.z); if (mi3.x>mi4.x) std::swap(mi3.x,mi4.x); if (mi3.y>mi4.y) std::swap(mi3.y,mi4.y); if (mi3.z>mi4.z) std::swap(mi3.z,mi4.z); mi1.x -= c_rSphere1.fRadius; mi1.y -= c_rSphere1.fRadius; mi1.z -= c_rSphere1.fRadius; mi2.x += c_rSphere1.fRadius; mi2.y += c_rSphere1.fRadius; mi2.z += c_rSphere1.fRadius; mi3.x -= c_rSphere2.fRadius; mi3.y -= c_rSphere2.fRadius; mi3.z -= c_rSphere2.fRadius; mi4.x += c_rSphere2.fRadius; mi4.y += c_rSphere2.fRadius; mi4.z += c_rSphere2.fRadius; if (mi4.x (begin - end)); } bool IsCCWAcuteAngle(float begin, float end) { // abs(360 - dest + src) // 시계 방향 // dest - src // 시계 반대 방향 int fValue = abs((int) (360.0f - end + begin)); return fValue >= (end - begin) ? true : false; } bool IsCWRotation(float begin, float end) { return !IsCCWRotation(begin, end); } bool IsCCWRotation(float begin, float end) { // 180 // 270 90 // 0 // // 시계 반대 return (begin - end < 0); } float GetInterpolatedRotation(float begin, float end, float curRate) { if (IsCCWRotation(begin, end)) { if (IsCCWAcuteAngle(begin, end)) return GetLinearInterpolation(begin, end, curRate); return (360.0f + GetLinearInterpolation(begin, end - 360.0f, curRate)); } if (IsCWAcuteAngle(begin, end)) return GetLinearInterpolation(begin, end, curRate); return GetLinearInterpolation(begin, end + 360.0f, curRate); } float GetDegreeFromPosition(float x, float y) { D3DXVECTOR3 vtDir(floor(x), floor(y), 0.0f); D3DXVec3Normalize(&vtDir, &vtDir); D3DXVECTOR3 vtStan(0, -1, 0); float ret = D3DXToDegree(acosf(D3DXVec3Dot(&vtDir, &vtStan))); if (vtDir.x < 0.0f) ret = 360.0f - ret; return ret; } float GetDegreeFromPosition2(float sx, float sy, float ex, float ey) { return GetDegreeFromPosition(ex - sx, ey - sy); } float GetDegreeDifference(float fSource, float fTarget) { if (fSource < 180.0f) { if (fTarget < fSource) return fSource - fTarget; else if(fTarget - fSource > 180.0f) return (360.0f - (fTarget - fSource)); return fTarget - fSource; } else { if (fTarget > fSource) return fTarget - fSource; else if (fSource - fTarget > 180.0f) { return (360.0f - (fSource - fTarget)); } return fSource - fTarget; } } int GetRotatingDirection(float fSource, float fTarget) { if (fSource < 180.0f) { if (fTarget < fSource) return DEGREE_DIRECTION_RIGHT; else if((360.0f - fTarget) + fSource < 180.0f) return DEGREE_DIRECTION_RIGHT; return DEGREE_DIRECTION_LEFT; } else { if (fTarget > fSource) { return DEGREE_DIRECTION_LEFT; } else if ((360.0f - fSource) + fTarget < 180.0f) { return DEGREE_DIRECTION_LEFT; } return DEGREE_DIRECTION_RIGHT; } } /////////////////////////////////////////////////////////////////////////////////////////////////// float CameraRotationToCharacterRotation(float fCameraRotation) { return fmod((540.0f - fCameraRotation), 360.0f); } float CharacterRotationToCameraRotation(float fCharacterRotation) { return fmod((540.0f - fCharacterRotation), 360.0f); }