2006년 3월 21일 화요일

MFC OpenGL Cube 그리기 + Maya Control 기능

. MDI는 복잡하므로 SDI로 할 것.
. seperate window로 화면을 2개로 나눌 것.
. viewport를 2개 저장해 놓고 2D, 3D image를 잘 찍을 것.
. OpenGL을 2개 띄울 수 있는 지 찾아 볼 것.

. MSDN -> Search
키워드 : SDI MFC Opengl
CUBE Sample : Demonstrates an OpenGL Application

. 클래스 뷰 -> CCubeView -> 마우스 오른쪽 -> 속성
-> WM_MOUSEMOVE -> OnMouseMove

. 추가할 멤버변수
CCubeView Class의
float m_fPosX;
float m_fPosY;
float m_fZoom;
float m_fRotX;
float m_fRotY;
float m_fLastX;
float m_fLastY;
(Wizard를 안 써도 class view에 잘 추가된다.)

. 멤버함수 수정
OnMouseMove(UINT nFlags, CPoint point)
{
int diffX = (int)(point.x - m_fLastX);
int diffY = (int)(point.y - m_fLastY);
m_fLastX = (float)point.x;
m_fLastY = (float)point.y;

// Left mouse button
if (nFlags & MK_LBUTTON)
{
m_fRotX += (float)0.5f * diffY;

if ((m_fRotX > 360.0f) || (m_fRotX < -360.0f))
{
m_fRotX = 0.0f;
}

m_fRotY += (float)0.5f * diffX;

if ((m_fRotY > 360.0f) || (m_fRotY < -360.0f))
{
m_fRotY = 0.0f;
}
}

// Right mouse button
else if (nFlags & MK_RBUTTON)
{
m_fZoom -= (float)0.1f * diffY;
}

// Middle mouse button
else if (nFlags & MK_MBUTTON)
{
m_fPosX += (float)0.05f * diffX;
m_fPosY -= (float)0.05f * diffY;
}

OnDraw(NULL);
// 위 내용을 추가

// 원래 내용 유지
}

. 생성자에서 맴버 변수를 모두 0으로 초기화

. Cubeview.h 파일에서
CubeView class 형식 재정의 에러가 날 때.
-> 첫 줄에 #pragma once 라고 적는다.

. pan (축의 방향으로 카메라만 움직이는 것)

. Visual Studio - solution > project보다 상위 개념, solution이 project를 포함한다.

. 단축키를 만들어서 그것을 누르면 가장 기본좌표(0,0,0) + 기본 카메라 뷰로 돌아오는 기능을 넣는 다.

. panning
. 도형과 카메라가 이루는 vector를 먼저 구한다.
적당한 up vector를 정한다.
위 두 vector를 cross product하면 left, right로 panning 할 수 있다.
up vector 방향을 이용하면 up, down으로 panning 할 수 있다.

. pan과 translate는 다르다.

. 리소스 뷰
-> Menu -> IDR_MAINFRAME - 메뉴를 추가한다.
-> Menu 이름에서 마우스 오른쪽을 클릭하면 이벤트 처리기를 추가할 수 있다.
-> Menu이름\tCtrl+Y(&O) : \t를 누르면 탭으로 적절한 간격으로 벌어지고 &를 누르면
-> Accelerator -> IDR_MAINFRAME - 추가한 메뉴 ID에 대해 키를 넣는 다.
예) ctrl + Y : Redo
ctrl + Z : Undo

. toolbar에 새로운 dialog 추가하기
. 프로젝트명.rc -> Dialog -> IDD_DIALOGBAR를 추가한다.
. 적당히 버튼들을 추가한다.
. 동적으로 위의 dialog를 추가한다.
. 그림 그리는 곳에서 마우스 오른쪽 클릭 -> 클래스 추가
. MainFrm.h의 include에 새로 만든 header를 추가

. 현재 solution 파일이 있는 경로 : $(SolutionDir)
(include시 유용하게 쓰인다.)
속성 -> C/c++ -> 일반 -> 추가 포함 디렉터리 -> $(SolutionDir)

참고)
http://www.codeguru.com/cpp/g-m/opengl/openfaq/article.php/c10975__2/

댓글 없음:

댓글 쓰기