ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • View 이벤트 설정
    Programming 2011. 7. 31. 03:32
    MFC와 연동되는 View도 생성했고,

    색도 멋진 축도 한쪽 구석에 넣어주었고, 3차원 좌표까지 얻어올 수 있다! 자, 그러면 이제 무엇을 해야할까?

    그렇다! 바로 화면의 회전!

    마우스의 이벤트를 입력받아 맛깔나는 회전을 일으켜보자!

    마우스 이벤트등 통해 발생할 화면전환에는 크게 네가지의 종류가 있을 것이다.

    Rotate, Pan, Zoom, 각각의 View(Front View, Back View, Bottom View, Top View 등)

    1) Rotate

    먼저, Rotate부터 살펴보자.

    코드 부터 보면,


    int CJeepersCADView::Rotate(int pointx, int pointy)
    {
    	myView->Rotation(pointx, pointy);
    	myView->Redraw();
    	return 0;
    }

    간단하다? 단순히 V3d_View의 메서드 중 하나인 Rotation을 사용하면 그만이다. pointx, pointy는 마우스 클릭 이벤트에서 받으면 그만이고...
    그러나! 한가지 주의할 점이 있다. 위의 코드만을 사용할 경우 마우스를 클릭하는 순간! 화면에 이상한 움직임을 보이게 된다.

    자연스러운 회전을 위해서는 한가지 절차를 거쳐야 한다.
    절차라고 해도 간단하다. 함수 하나만 호출해주면 되니...


    myView->StartRotation(point.x, point.y);

    마우스가 클릭되는 순간에 위의 함수를 호출해주어야 한다.
    회전이 시작되었음을 알리고 초기의 좌표값을 미리 받아야 하기 때문이다.


    2) Pan
    Pan은 더욱 간단하다.
    먼저 초기 좌표값을 받고, 나중 좌표값을 다시 받아서 두 좌표값간의 거리를 구하여 이를 함수에 넣어주면 된다.


    int CJeepersCADView::Pan(int pointx, int pointy)
    {
    	int x = (pointx - m_point_x)/2;
    	int y = -(pointy - m_point_y)/2;
    	myView->Pan(x, y);
    	m_point_x = pointx;
    	m_point_y = pointy;
    	myView->Redraw();
    	return 0;
    }

    자, 위에서 m_point_x, m_point_y는 마우스를 클릭하는 순간에 받아둔다. 그렇게 하면 마우스가 이동할때마다 화면이 그 방향대로 이동하게 될 것이다.

    y에 -1을 곱해주는 것은 윈도우 스크린의 좌표는 위가 0이고 아래가 큰수이기 때문

    3) Zoom
    Zoom은 위의 두개보다 더 간단하다.

    void CJeepersCADView::zoom(short Type)
    {
    	Standard_Integer zDelta = 10;
    	if(Type >0)
    	{
    		//MessageBox(_T("UP"));
    		myView->Zoom(m_zoom_x, m_zoom_y, m_zoom_x+(zDelta/10), m_zoom_y+zDelta);
    		m_zoom_x = m_zoom_x+zDelta;
    		m_zoom_y = m_zoom_y+zDelta;
    	}
    	else
    	{
    		//MessageBox(_T("Down"));
    		myView->Zoom(-1*m_zoom_x, -1*m_zoom_y, -1*(m_zoom_x+zDelta), -1*(m_zoom_y+zDelta));
    		m_zoom_x = m_zoom_x + zDelta;
    		m_zoom_y = m_zoom_y + zDelta;
    	}
    	myView->Redraw();
    }

    마우스 휠을 움직일때마다 위의 함수가 호출되어 화면의 줌인 줌아웃을 수행한다.
    Type에는 마우스 휠이 위로 움직인 값을 넘겨주면 된다.
    (휠의 상하 움직임이 아닐경우 조금더 복잡해 질 수 있기는 하다...)

    4) 시점 전환
    앞에서 보고, 뒤에서 보고!

    void CJeepersCADView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
    	// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
     
    	CView::OnKeyDown(nChar, nRepCnt, nFlags);
    	if(IsCTRLPressed() == true)
    	{
    		if(nChar == 49)//Front
    		{
    			myView->SetProj(V3d_Xpos);
    		}
    		if(nChar == 50)//Back
    		{
    			myView->SetProj(V3d_Xneg);
    		}
    		if(nChar == 51)//Top
    		{
    			myView->SetProj(V3d_Zpos);
    		}
    		if(nChar == 52)//Bottom
    		{
    			myView->SetProj(V3d_Zneg);
    		}
    		if(nChar == 53)//Left
    		{
    			myView->SetProj(V3d_Ypos);
    		}
    		if(nChar == 54)//Right
    		{
    			myView->SetProj(V3d_Yneg);
    		}
    		if(nChar == 55) // See the axonometric View
    		{
    			myView->SetProj(V3d_XposYnegZpos);
    		}
    	}
    }


    SetProj 메서드를 사용하면 된다. 원하는 시점에서 저 함수로 시점을 바꾸어 준다.

    결과 화면도 넣고 싶지만 귀찮아서 패스...

    'Programming' 카테고리의 다른 글

    Doxygen을 이용한 레퍼런스 문서 생성  (0) 2011.08.04
    OGRE3D- 설치 : 1.7버전  (0) 2011.08.02
    축표시 생성하기  (0) 2011.07.31
    3차원 좌표점 얻기  (0) 2011.07.31
    Silverlight 시작...  (0) 2011.07.05
Designed by Tistory.