2014-04-09 3 views
2

나는 (동적 위치에) 원과유니티 레이 캐스트 문제

아래 이미지처럼 --- 첫 번째 통해 내가이 일을하고 이유를 통과하지 않아야 다른 원을 만들려고 노력하고있어 음 왜냐하면 큰 개체에는 많은 다른 개체가있을 수 있기 때문입니다.

circle image

하지만 문제는 Physics.Raycast 항상 내 영역 감지되지 않는 것입니다 :

broken circle image

을 파란색 선은 raycasts 있습니다

기본적으로 내가 뭘하면을 통해 레이 캐스트입니다 전체 큰 원과 작은 하나가 어디인지 알아보십시오.

void GetCollisions() { 
    Angle FixedRenderAngle, k; 
    RaycastHit hit; 
    Vector3 p1, p2; 
    float d, d1, radius; 

    for (int i = 0; i < Radiuses.Count; i++) { 
     if (Angles[i] == null) 
      Angles[i] = new List<Angle>(); 

     radius = Radiuses[i]; 
     FixedRenderAngle = 360f/(float)NumberOfCalls; 
     AnglesLast[i] = 0; 
     Angle j = 0f, pj; 
     bool exception = false; 

     for (int l = 0; l < NumberOfCalls; l++) { 
      j+= FixedRenderAngle; 
      pj = j - FixedRenderAngle; 
      p1 = pj.PointByRadius (radius); 
      p2 = j.PointByRadius (radius); 
      Debug.DrawRay (p1, p2 - p1, Color.cyan, 3f); 
      if (Physics.Raycast (p1, p2 - p1, out hit, Vector3.Distance (p1, p2))) { 
       d = Vector3.Distance (p1, p2); 
       d1 = Vector3.Distance (p1,hit.point); 
       k = pj + (j -pj) * (d1/d); 

       AddToAngles (ref k, i); 
      } 

      if (Physics.Raycast (p2, p1 - p2, out hit, Vector3.Distance (p1, p2))) { 
       if (AnglesLast[i] == 0) exception = true; 

       d = Vector3.Distance (p1, p2); 
       d1 = Vector3.Distance (p1,hit.point); 
       k = pj + (j -pj) * (d1/d); 

       AddToAngles (ref k, i); 
      } 
     } 

     if (exception == true) { 
      Angle tmp = Angles[i][AnglesLast[i] - 1]; 
      for (int l = AnglesLast[i] - 1; l > 0 ; l--) 
       Angles[i][l] = Angles[i][l-1]; 
      Angles[i][0] = tmp; 
     } 
    } 
} 

각도 플로트 번호 (360-0) 학위를 대표하고 기능 PointByRadius 정상적으로 위치를 나타내는 Vector3를 반환의가있는 클래스 : 여기

큰 원의 객체를 검출 내 코드입니다 각도와 주어진 반경을 기준으로 원이됩니다.

내가 뭔가 잘못했거나 레이 캐스트에 대해 알지 못하는 것이 있습니까? 어떤 도움을 주시면 감사하겠습니다. (물론 다른 방법이 도움이 될 것입니다)

+0

거기에 작은 원을 "묻고 싶지 않은 이유가 무엇입니까?" – Tom

+0

@Tom 기본적으로 원형 위치를 사용하여이 모든 작업을 일반 메시 (구형, 정육면체, 등 ...)에만 적용 할 수 있지만 불규칙한 메쉬에서는 작동하지 않습니다. – Vali

+0

@Kay 설명해 주시겠습니까? 나는 그게 무슨 뜻인지 이해하지 못했습니다. – Vali

답변

0

Physics.SphereCast? 그것은 OverlapSphere와 다소 유사하지만 어쩌면 당신이 필요로하는 것이 더 있을까요? (정확히 말하자면 당신이 무엇을하려고하는지 정확하게 말하기가 어렵습니다 ... 예를 들어 원을 말할 때 XY에서만 움직이는 실제 원 또는 Z를 통해 움직이는 실제 원을 의미합니까? 어떤 원이 당신을 숨기려고합니까? 큰 또는 작은 하나의 큰 원의 세그먼트를 시각적으로 숨기려고합니까?)

개체가 이동하는 속도와 크기에 따라 레이 캐스트 (일반적으로 PhysX 충돌기)는 적어도 내 경험. 또한 문제의 일부인지 확인하기 위해 물리 타임 스탬프 길이를 망칠 수도 있습니다. 예를 들어 문제가 더 자주 발생하고 문제가 계속 발생하는지 확인하는 것과 같습니다. 잘 모르겠다. 아이디어를 내고있다.