2016-07-04 6 views
2

필자가 만들고있는 프로그램은 사용자가 3D 모델 (fbx 또는 obj)을 가져올 수있게합니다. 그런 다음 OpenGL을 사용하여 창에 렌더링되므로 사용자는 모델에 점을 배치 할 수 있습니다.두 지점 간의 충돌 검사는 어떻게합니까? (C++)

내 문제는 어떻게 이러한 두 지점 사이의 충돌 검사를 할 수 있습니다. 예를 들어, 한 점에서 다른 점으로 직선이 그려지는 경우 3D 모델에 전혀 도달하면 '참'을 반환 할 수 있습니다. 모델을 전혀 통과하지 않으면 'false'가 반환됩니다.

아래 이미지는 어떻게 적용 할 것인지 보여줍니다. (이 모델과 충돌 후 라인 추적 아래의 그림에서, 난 그냥 무슨 뜻인지 설명하는 데 도움 믹서 이미지를 만든 녹색으로 바뀝니다.) Example of the use

+0

다각형 간의 충돌 감지를 가장 효과적으로 수행하는 방법에 대한 전체 서적이 작성되었습니다. –

+0

프로그래밍보다는 수학 문제가 더 좋아 보입니다. IMHO 오프 - 주제 stackoverflow. 다른 스택 교환을 시도해보십시오. –

답변

2

의사 코드 :

function rayhitsmodel(model, pointA, pointB): 

    max-distance <- distance-between(pointA, pointB) 
    ray-source <- pointA 
    ray-direction <- normalize-vector(pointB - pointA) 

    for each triangle-index in model.triangle-indices: 

     p1 <- model.points[triangle-index.point1] 
     ... similarly for p2, p3 

     triangle <- p1, p2, p3 
     intersection <- intersect-with-triangle(ray-source, ray-direction, triangle) 

     if intersection is not nothing 
      and distance-between(intersection.point, ray-source) <= max-distance 
       return true 

    return false 

레이 사각형 교차점 : https://en.wikipedia.org/wiki/M%C3%B6ller%E2%80%93Trumbore_intersection_algorithm.

과도하게 최적화 할 수 있습니다. 모델을 팔레트으로 분할하여 교차점은 O (n) 대신 O (log n)이됩니다. 레이 - 옥트리 교차로에 대해서는 Ray - Octree intersection algorithms을 참조하십시오.