2014-04-11 5 views
1

공간에서 주어진 위치 (x, y, z)를 가진 벡터로 정의 된 두 개의 유사한 점 구름이 있으며 두 구름을 동시에 렌더링하고 두 점 간의 차이를 평가하고자합니다. . 이것은 OpenGL을 사용하는 첫 번째 응용 프로그램이므로 아직 사용하지 않고 있습니다.OpenGL의 두 점 구름 사이의 교차점 그리기

그러나
glBegin(GL_POINTS);GLfloat green[] = { 0.f, 1.0f, .0f, alpha[1]/10 }; 
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, green); 
    glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, low_shininess); 
    //glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular); 
    for (std::vector<Point3D>::iterator moit = morig_cloud.begin(); moit != morig_cloud.end(); ++moit){ 
     if ((moit - f_cloud.begin()) % (ptd[1]) == 0){ 
      glVertex3f(moit->x, moit->y, moit->z); 
     } 
    } 
    glEnd(); 

I 모두 중첩되면, 결과적인 이미지는 다음과 같다 : 1

어디에

I 같은 별도로 각 벡터를 처리하여 양자를 렌더링하는 처리했다 빨간색과 파란색 구름은 모두 완벽하게 일치해야합니다. 포인트를 "병합"할 수있는 방법이 있습니까? 즉, 점 위치가 일치하는 것을 고려하여 일치하는 위치의 색상을 변경할 수 있습니까? 렌더링은 메쉬가없는 점을 사용하여 수행됩니다.

렌더링하기 전에 두 벡터를 비교해 보았지만 알고리즘이 너무 느려졌는데 점 구름이 너무 큽니다.

답변

2

시각적으로 병합하려면 겹치는 부분이 빨간색과 파란색 (자주색)의 혼합으로 채색되므로 알파 블렌딩을 활성화하고 적절한 블렌드 기능을 사용할 수 있습니다. 힌트는 here을 참조하십시오.

+0

현재로서는 내가 사용했던 답변이므로 정확한 답변으로 표시하고 있습니다. 둘 다 그래 보인다. – Ishida

3

확실히 할 수있는 일이지만 OpenGL을 사용하면 이미지에만 병합 할 수 있습니다. OpenGL은 단순한 드로잉 API이며, 기하학 조작을위한 고급 메소드를 제공하지 않습니다.

순수한 이미지 공간 합병으로 충분하다면 스텐실 버퍼를 사용할 수 있습니다. 컬러 쓰기를 수행하지 않고 첫 번째 포인트 클라우드를 렌더링 glColorMask(0,0,0,0) 및 스텐실 버퍼에 비트를 설정합니다. 그런 다음 스텐실 테스트를 통과 한 곳에서만 컬러 쓰기가 활성화 된 두 번째 점 구름을 렌더링합니다.

화면 이미지 공간에서 OpenGL을 사용하는 것이 좋습니다.


그러나 포인트 클라우드를 기하학적으로 병합하고 싶습니다. 좋아요, 여기 있습니다 : 점은 무한히 작기 때문에 두 점 구름의 교차점은 그 점입니다. 에 정확히에있는 점이 다른 점 구름에서 찾을 수 있습니다. 이것은 Kd 트리를 사용하여 3 차원에서 상당히 잘 수행 될 수있는 가장 근접한 이웃 탐색으로 귀결됩니다 (더 높은 차원에서 지수 적으로 더 힘들어집니다).

하지만 실제로 점 구름을 교차시키고 싶지는 않지만 그 (것)들에 의해 생성 된 암시 적 표면이라고 생각합니다. 각 점은 그 주위에 특정 반경 r으로 스칼라 필드를 생성한다고 가정합니다. 1 점 구름의 전체 필드는 각 구성 점의 필드의 포화 된 합계입니다. 각 점 구름의 필드를 곱함으로써 교차점을 얻습니다. 각 포인트 클라우드의 모든 포인트에 대해 필드를 샘플링하고 필드가 임계점 아래에있는 모든 포인트를 버리면 두 포인트 구름의 교차점을 얻게됩니다.