2013-07-09 3 views
4

그래서 임의의 회전 및 크기의 두 큐브가 교차 하는지를 결정할 수있는 함수를 찾고 싶습니다.3d에서 2 개의 임의의 입방체의 교차점 찾기

큐브의 회전이 임의적이지는 않지만 (특정 축에 고정 된 경우) 교차가 간단합니다. 3 차원에서 서로 엇갈 리는지 경계를 확인하여 3 차원에서 교차하는지 확인합니다. 십자가가 두 개 밖에 없거나 교차하는 경우 교차하지 않습니다. 이 방법을 사용하여 임의의 큐브가 교집합 후보인지 여부를 결정할 수 있습니다. 최고/최저 x, y 및 z를 사용하여 외부 경계를 만들 수 있습니다.

이것이 첫 번째 단계입니다. 이론적으로, 그 정보로부터 우리는 그들이 어떤면에 있는지를 알 수 있습니다. 이것은 우리가 교차로에서 몇 개의 측면 (quad)을 제거 할 수 있음을 의미합니다. 그러나 큐브의 회전으로 인해 간단하게 결정하기가 어려울 수 있기 때문에 그 정보가 있다고 가정 할 수는 없습니다.

제 생각에 각 쌍의 쿼드를 가져 와서 평면의 교차점을 찾은 다음 그 선이 각 쌍의 측면 중 적어도 하나의 에지와 교차하는지 확인해야합니다. 어떤 쌍의면에 교차 선이 있고 그 모서리 중 하나와 교차하면 사면이 교차합니다. 교차하지 않으면 두 개의 큐브가 교차하지 않습니다.

그러면 우리는 평면 교차 선이 그 모서리와 교차하는 곳에서 두 번째 정육면체의 교차점의 깊이를 결정할 수 있습니다.

그러나 이것은 단순히 추측입니다. 이 두 가지 큐브의 교차점을보다 효율적으로 결정할 수있는 방법이 있습니까? 이 작업을 수행하는 여러 가지 방법을 생각해 볼 수 있으며 필요한 계산량 측면에서 매우 다를 수 있음을 알 수 있습니다.

나는 자바로 작업하고 있지만 C/C++ 솔루션도 멋지다 (나는 이식 할 수있다). 그것은 아마도 큰 질문이기 때문에 심지어 psuedocode.

+1

않습니다하지에서 내가 C#을이 라이브러리를 포팅 한 당신이

http://evanw.github.io/csg.js/docs/

에있는 CSG을 수행하는 자바 스크립트 라이브러리를 볼 수있는 옵션입니다 [분리 축 Theorm] (http://en.wikipedia.org/wiki/Hyperplane_separation_theorem)은 2D에서와 같이 3D에서도 작동합니까? –

+0

아마도 그렇게 생각합니다.나는 그 생각을하지 않았다. 나는 이미 3D 버전을 3D의 3 세트로 사용하고 있습니다. 이것은 내가 생각했던 것보다 더 간단 할 수도 있습니다! –

+0

나는 그것이 당신을 위해 일할 것이라고 생각합니다. 꽤 확신 해요, 제가 2 차원 다각형 교차점을 연구 할 때 읽었습니다. –

답변

0

분리 축 정리를 사용해보십시오. 2d에서와 같이 3d에서 적용해야합니다.

+0

분명히, 각 입방체의 각면에 다른 입방체의 8 점에 대해 SAT를 적용해야합니다. 나는 기하학적 인 예를 많이 보았지만, 코드 측면에서는 아무 것도 보지 못했다. –

1

컴퓨터 그래픽 분야를 살펴 봐야합니다. 그들은 많은 수단을 가지고있다. 예 : Weiler–Atherton clipping algorithm. 또한 프로세스를 쉽게 처리 할 수있는 많은 데이터 구조가 있습니다. AABB에 관해서는 (Axis-aligned bounding boxes).

+0

예, 저는 AABB를 제 질문에 사용하고 설명합니다. –

+0

예, 종류가 있습니다. AABB를 사용하면 해당 AABB가 교차하지 않는 경우 임의의 모양이 교차하지 않는지 확인할 수 있습니다. 만약 그렇다면 추가 테스트를해야합니다. 컴퓨터 그래픽을 읽으십시오. 적절한 해결책을 찾을 수있을 것입니다. – mike

0

큐브의 측면에서 다각형을 만드는 경우 다른 방법은 CSG (Constructive Space Geometry) 작업을 사용하는 것입니다. 각 큐브의 BSP (Binary Space Partitioning) 트리를 작성하여 교차를 수행 할 수 있습니다. 교차점의 결과는 교차점을 나타내는 다각형 집합입니다. 폴리곤 수가 0이면 큐브가 교차하지 않습니다.

이 접근법은 아마도 좋은 실시간 솔루션이 아니지만 프레임 새로 고침 시간에 발생해야하는지 여부를 나타내지는 않았습니다. 이식 이후

https://github.com/johnmott59/CGSinCSharp