2011-04-05 4 views
2

나는 (그래서 기본적으로 OpenGL을, openTK에) 간단한 3D 환경을 개발하기 위해 노력하고 간단한 충돌 감지를 구현하고 있습니다. 나는 바운딩 큐브와 삼각형과 쿼드로 가득 찬 세상을 가질 카메라 객체를 가질 것이다. 나는 경계 큐브 (또는 경계가 쉽게인지 영역) 및 다각형의 목록을 제공하고있어 경우C#을 간단한 3D 충돌 감지

기본 충돌 감지를 할 수있는 신속하고 더러운 방법은 무엇입니까? 간단한 경계 상자 충돌에 대한

답변

4

좋아 어떤 도움을위한

덕분에, 나는 BoundingBox 객체를 받아 그것이 BoundingBox의 현재 인스턴스 내부에 있는지 확인합니다 다음과 같은 방법을 썼다.

테두리 상자는 테두리 상자의 가운데에 대한 Point3D 개체 (Point 클래스와 동일하지만 Z 좌표가 있음)와 상자의 높이, 너비 및 깊이로 구성됩니다. 그 4 개체, 그것은 왼쪽 (분 X), 우 (최대 X), 아래쪽 (최소 Y), 최고 (최대 Y), 전면 (최소 Z)를 ​​상자로 돌아 가기 (최대 Z)을 (상자는 계산 축 정렬. 이것은 단순한 충돌입니다.) 한 상자가 다른 상자 안에 있는지 감지하고, 그렇다면 상자를 바깥쪽으로 이동하는 방법입니다. meshData 장면에서 기하학의 어떤 종류이고 camera 현재 사용자의 관점에 대한 개체입니다 meshData.Box.Intersection(ref camera.box); :

public void Intersection(ref BoundingBox box) 
    { 
     double lr = Left - box.Right; 
     double rl = box.Left - Right; 
     double bt = Bottom - box.Top; 
     double tb = box.Bottom - Top; 
     double fb = Front - box.Back; 
     double bf = box.Front - Back; 

     if (lr > 0 || rl > 0 || bt > 0 || tb > 0 || bf > 0 || fb > 0) 
      return; 

     double max = Math.Max(lr, Math.Max(rl, Math.Max(bt, Math.Max(tb, Math.Max(bf, fb))))); 

     if (_complex) 
     { 
      if (ComplexIntersection(ref box)) 
       return; 
     } 

     if (max == lr) 
      box.Center.X += max; 
     else if (max == rl) 
      box.Center.X -= max; 
     else if (max == bt) 
      box.Center.Y += max; 
     else if (max == tb) 
      box.Center.Y -= max; 
     else if (max == fb) 
      box.Center.Z += max; 
     else if (max == bf) 
      box.Center.Z -= max; 
    } 

당신은 같은 일을하여 호출합니다.

희망이 다른 사람에 유용합니다!