ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 3차원 좌표점 얻기
    Programming 2011. 7. 31. 02:31

    지난번 포스팅에선 MFC와 OpecCASCADE간의 연동에 대해서 살펴봤다.(사실 예제를 따온게 전부라...)
     
    2011/05/24 - [ComPuter/OpenCASCADE] - OpenCASCADE Connecting View


    이번에는 만들어진 뷰를 통해서 보여지는 객체상의 지점을 마우스로 클릭했을때 그 좌표점을 찾는 것을 고민해 보겠다.(예전에 했었는데 날려먹었으니 하하~)

    OCC 포럼의 아래글을 참고했다.

    http://www.opencascade.org/org/forum/thread_9368


    자, 생각을 해보자.

    화면상의 좌표점을 찾아내는 것은 아주 간단하다.

    MFC에서 마우스 클릭 이벤트 등을 설정해주면 CPoint point 라는 변수를 얻을 수 있고
    point.x, point.y를 통해서 화면상의 x, y 좌표는 얻어낼 수 있다.

    문제는 이 2D 상의 좌표를 3D 상의 좌표값으로 변환해야 한다는 것.


    위와 같이 간단한 실린더 개체가 삽입되어 있을 경우 마우스를 클릭했을때 개체 위의 점을 선택하는 것이 문제.

    포럼을 참고한 결과(http://www.opencascade.org/org/forum/thread_2728/)
    해당 글에 있는대로 함수를 작성해보았지만 문제가 발생하였다.
    Z값이 보다 작게 나오는 것.


    원점 근처를 클릭했음에도 불구하고 (뷰를 프론트 뷰로 바꾼 상태였다) Z 값은 음수가 나왔다.

    확인결과 Z축의 이상은 아니고, 단순의 위쪽 방향의 축의 값이 일부 본래보다 적게 나오는 증상이었다.

    Y축을 위로하고 다시 픽킹한 결과 이번엔 Y값이 모자라게 나왔다.

    그러나 원인을 파악하기 힘드므로 일단 위의 함수는 보류...


    원인파악 성공!

    윈도우 창 상의 좌표값을 사용한 것이 문제.

    창의 사이즈 변경에 따라 상하좌우의 오차가 발생함

    초기에 상하 길이의 오차만 발생했던 것은 좌우의 창 사이즈가 최대로 되어있었기 때문...

    그러나 상단에는 리본메뉴가 있기때문에 최대 사이즈가 아니어서 문제가 발생했던것

    즉,

    CRect rc;
    this->GetWindowRect(&rc);
    를 통해서 윈도위의 Top과 Left 좌표를 구한 뒤에
    point.x - rc.left
    point.y - rc.top
    를 x, y의 좌표값으로 위의 함수에 넣어주면 정상적으로 해당 포인트를 찾아낼 수 있다.


    네모 부근 근처를 클릭한 결과 구가 제위치에 생성됨을 확인했다.

    자, 그러나 이것은 3차원에서 바로 좌표를 구한것...

    가상의 Plane을 생성하여 거기에 Projection되는 지점을 찾는 것이므로 사용자가 원하는 대로 좌표점을 선택하기에는 용이하지 않다.

    위의 함수를 조금 수정하여서 Grid Plan에서 좌표점을 찾아보자.
    이는 대부분의 CAD 시스템에서 사용하고 있는 방식으로, 사용자가 원하는 평면의 좌표를 선택하여 보다 정확한 모델링이 가능하게 한다.






    'Programming' 카테고리의 다른 글

    View 이벤트 설정  (0) 2011.07.31
    축표시 생성하기  (0) 2011.07.31
    Silverlight 시작...  (0) 2011.07.05
    QT 정리-3 다이얼로그 만들기  (0) 2011.06.30
    QT 정리2- Button 만들기, 시그널, 슬롯  (0) 2011.06.30
Designed by Tistory.