2016-08-03 2 views
1

삼각형 (꼭지점과 법선으로 지정됨)이 true이면 'True'를 반환하는 함수를 작성하고 싶습니다. 공간에서 다른 삼각형이 점에서 지정된 삼각형을 보지 못하도록하는 '차단 자'역할을 할 수 있다고 가정 할 때, 3D 공간에서 주어진 점으로부터 (x, y 및 z 좌표로 지정된) 3D 공간에서 볼 수 있습니다. '보고'에 의해3 차원 공간의 특정 삼각형이 잠재적으로 다른 삼각형이있는 임의의 점에서 특정 점에서 볼 수 있는지 알아보십시오

내가 어떤 차단 삼각형 교차하지 않는 직선 선으로 관찰 지점에있는 삼각형에 어떤 점을 연결할 수 있습니다 의미 '볼'.

나는, 'Z 버퍼링'과 '가시성 문제'를 해결하기위한 다른 기술 살펴 보았다 hopefully this shows what I mean 나는 내가 믿는 특정 뷰 포트를 통해 화면에 표시하기 위해 픽셀에 삼각형을 렌더링하고 있지 않다 그러나 이후 이것들은 관련이 없습니다.

내 두 가지 접근 방법은 다음과 같습니다.

1) 잠재적 인 '차단'삼각형의 각 꼭지점을 관측점에서부터 매우 큰 반경까지 투영하십시오 (내 응용 프로그램의 경우 삼각형은 관측점에서 1000 단위 이상 떨어지지 않습니다. 1001 단위 선택). 그런 다음 오브젝트가 보이지 않는 곳에 투영 된 선에 의해 설명 된 모서리가있는 단차 뒤에있는 영역을 갖게됩니다. 모든 차단제에 대해이 작업을 수행 한 다음이 모든 영역의 조합을 찾고 테스트중인 삼각형이 (잠재적으로 많은) 영역 중 하나에 속하는지 확인합니다.

또는

2

) 다시 말하지만, 모든 차단 삼각형의 정점에 선 촬영이 선이 테스트중인 삼각형 평면에서 각 차단제의 예상 삼각형을 얻을 위치한 평면을 교차하는 지점을 찾을 수 있습니다. 겹쳐진 투영 된 삼각형을 단일 다각형으로 융합하십시오. 그런 다음 테스트중인 삼각형이 투영 된 삼각형 또는 융합 된 다각형 안에 완전히 들어 있지 않은지 확인하십시오.

방법 1)의 문제점은 모양이 3D 볼륨으로 완전히 둘러싸여 있고 교차하는 3D 볼륨을 하나의 큰 3D 볼륨으로 결합하는 것이 더 어렵다는 것입니다.

방법 2)의 문제는 삼각형의 꼭지점을 가로 지르는 투영 된 선이 삼각형의 평면에 결코 부딪치지 않는 경우가 있습니다. 이 중 하나를 무시할 수는 없으며, 관심있는 삼각형을 여전히 가릴 수 있습니다. 비행기에서 무한히 긴 그림자를 드리 우게됩니다.

나는 방법 2에 의지하고있다. 그러나 나는이 방법이 조금 순진 해 보인 것처럼 누군가가 더 훌륭한 해결책을 제안 할 수 있다면 나에게 큰 관심이 될 것이라고 말한다. 설명이나 의사 코드가 이상적입니다, 결국 나는 이것을 matlab 또는 C++에서 구현하기를 희망합니다.하지만 지금은 일반적인 것들을 유지할 수 있습니다!

답변

0

2 차 접근 방식에도 적용 할 수 있습니다.

먼저, 평면에 삼각형을 투영한다고 가정 해 보겠습니다. 여기서 선택할 수있는 비행기가 있지만 어느 것이 더 좋을지 잘 모르겠습니다.

테스트 한 삼각형 평면에 모든 삼각형을 투영 할 수 있습니다. 오클 루어 삼각형이 테스트 된 것의 앞이나 뒤쪽에 있으면이 방법으로 정보를 쉽게 얻을 수 있습니다. 단점은 테스트 삼각형의 방목 각도를 볼 때 수치 오류가 커지고 솔루션이 손상 될 수 있다는 것입니다.

다음 옵션은 계획 할 6 개의 축으로 정렬 된 평면 중 하나를 선택하는 것부터 시작합니다. 그것들을 하늘 상자의 벽으로 상상해보십시오. 관찰자와 삼각형의 상대적 위치에 따라 가장 먼 거리의 축을 따라 하나를 선택할 수 있습니다. 또한 축 정렬 평면을 선택하면 수학이 간단해질 수 있습니다.

다음 옵션은 관찰자와 삼각형 중심 사이의 선에 수직 인 평면을 사용할 수 있습니다. 이 옵션을 사용하면 극단적 인 각도로 삼각형을 배치 할 때 오류를 최소화 할 수 있지만 직접 테스트해야합니다.

테스트 된 삼각형을 투영했을 때 경계 사각형을 계산할 수 있습니다. 이것은 관심 분야이므로 아무 것도 알 필요가 없습니다. 관측자를 관통하는 4 개의 평면과 전형적인 뷰 frustum과 같은 직사각형 경계를 계산할 수 있습니다.

당신이 폐색 삼각형을 투영 할 때 하나의 거대한 다각형으로 그것들을 합칠 것을 제안했지만, 이렇게하면 정말 복잡한 폴리 우레탄으로 끝날 수 있습니다. 나는 반대 방향으로 가서 투영 삼각형에서 투영 된 오 클루 더를 뺍니다. 이 접근법에서는 모든 삼각형 조합을 테스트 할 필요가 없습니다. 투영 된 삼각형이 빈 삼각형으로 줄어들면 이미 닫혀 있음을 의미하므로 나머지 폐색 선을 테스트 할 필요가 없습니다.

그리고 여기에 가장 중요한 부분이다 : (정확히 옆으로 또는) 관찰자 뒤에 적어도 하나 개의 정점이이 방법을 투사 할 수없는 사람입니다 만 삼각형, AFAIK

은. 따라서 자음 절편기로자를 수 있습니다. 하나의 삼각형을 클리핑 한 결과는 새로운 것을 포함하지 않을 수 있지만, 모두 위에 정의 된 관심 영역에 맞을 것입니다.

이 모든 작업을 수행하기로 결정한 경우 오클 루어가 테스트 된 삼각형 뒤에있을 수 있으므로이를 고려해야합니다. 가장 간단한 해결책은 테스트 된 삼각형 평면으로 클립을 잘라서 앞에있는 것만 남겨 두는 것입니다.

관련 문제