2013-02-17 4 views
0

현재 3D 개체의 실루엣 가장자리를 감지하려고합니다. 나는 당신이 먼저 얼굴이 한 위치를보고있는 날씨를 결정해야만한다는 것을 알고 있습니다. 그리고 나서 앞면과 뒷면을 공유하는 가장자리를 찾습니다. 앞뒤로 향한 것들을 알아낼 수 있었지만, if 문없이 ALT가 공유되는지 찾는 방법을 찾을 수 없습니다. 내 정점 데이터는 모든 다각형에 대해 x1, z1, y1, x2, z2, y2, x3, z3, y3에 저장됩니다. 만약 누군가가 내 쓰레기 줄을 풀 수 있다면 큰 도움이 될 것입니다.3 차원 모서리가 동일한 지 확인하는 방법?

감사합니다.

+0

두 줄의 세그먼트가 같은 줄에 있는지 확인하는 방법을 묻는 중입니까? –

+0

@ Code-Guru 정확히 2 행 구분이 같은 줄인 경우 아닙니다. – BlueSpud

+0

@BlueSpud는 자신이 모호하지 않게하기 위해 "라인"이라는 용어를 사용하지 않습니다. "2 개의 선분이 같은 선분이라면"사람들을 혼란스럽게 만들 것입니다. :) ... 그래서, 당신은 무엇을 했습니까? "선분"수업이 있습니까? (어휘 적으로) 낮은 쪽이 항상 '첫 번째'가되도록 시작/끝 지점을 정렬 했습니까? 귀하의 설명을 읽으면서, 당신의 폴리곤은 실제로 삼각형입니다 - 이것이 사실입니까? – Yakk

답변

0

두 줄의 세그먼트가 같은 줄에 있는지 확인하는 방법을 묻는다면, 유클리드 기하학을 조금 사용할 수 있습니다. 몇 가지 정의를 살펴 보겠습니다.

A는 실수의 n-tuple (a1, a2, ..., an)입니다. 3D 경우에는 n=3입니다.

스칼라의 한 점 A의 곱셈과 실수 t이 두 아이디어를

tA = (t*a1, t*a2, ..., t*an) 

으로 정의된다, 우리는 아주 쉽게 선을 나타낼 수 있습니다. 두 지점 및 AB,

P = tA + (1-t)B 

t가 실수 인 라인 AB에 식을 만족하는 점 P 들어.

0 <= t <= 1PP=At=1t=0P=B으로 AB 사이에있는 경우.

프로그래밍 관점에서이 클래스를 만들려면 PointLine의 두 클래스를 만들면됩니다. 위에 주어진 방정식을 사용하면 Point이 주어진 Line에 있는지 쉽게 판단 할 수 있습니다. 두 선분이 같은 선상에 있는지 확인하려면 두 개의 Point을 정의하고 두 개의 선분이 Line이고 두 개의 선분이 다른 Line에 있는지 확인하기 만하면됩니다.

+0

다시 두 줄이 정확히 같은지, 동일한 위치인지 확인해야합니다. – BlueSpud

0

경우 2 선분은 동일한 점 좌표 또는 동일 시점 인덱스를 사용하는 경우

두 선분이 동일하다 같은 라인이다. 그들이 같은 선상에 있는지 아닌지를 테스트하는 것은 실루엣을 찾기 위해 풀 필요가없는 완전히 다른 문제입니다.

  1. 색인 된 프리미티브를 사용하십시오.
  2. 미리 모델을로드하는 동안 에지 및 필요한 토폴로지 테이블의 목록을 미리 계산하십시오.
  3. 그림자를 그리려는 경우 섀도우 맵을 사용하십시오. 이해하기가 훨씬 간단합니다.

색인 된 프리미티브는
1을 의미합니다.모든 점을 배열에 저장합니다 (std::vector<vector3> points; 또는 유사한 점, vector3은 xyz 좌표를 저장하는 데이터 유형 임). 모든 점은 고유합니다.
2.면과 에지는 정수 점 지수를 사용하여 점을 참조합니다.

e.e. 당신이 모델을로드 할 때

struct Vec3{ 
    float x, y, z; 
}; 

typedef unsigned int Index; 

struct Face{ 
    enum{vertsPerFace=3}; 
    Index verts[vertsPerFace]; 
}; 

struct Edge{ 
    enum{vertsPerEdge=2}; 
    Index verts[vertsPerEdge]; 
}; 

, 당신은 점의 목록을 구축하고 std::setstd::map 또는 유사한 구조를 사용하여 인덱스 프리미티브에 모든 얼굴을 변환합니다. 일단 primit를 인덱스하면, 인덱스를 얼굴 목록 std::multimap<std::pair<Index, Index>, FaceIndex>에 매핑하고, 해당 에지를 사용하는면 인덱스에 에지를 매핑하는 연관 테이블 (std :: map 사용)을 빌드 할 수 있습니다. std::map<std::pair<VertexIndex, VertexIndex>, FaceIndex> 등등.