블로그 이미지
.
속눈썹맨

공지사항

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

calendar

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

'지식나누기/CG'에 해당되는 글 19

  1. 2006.04.01 Atan2 - Arc tangent
  2. 2006.04.01 OpenGL - Tessellation
  3. 2006.03.30 Escherization
  4. 2006.03.21 MFC OpenGL Cube 그리기 + Maya Control 기능
  5. 2006.03.19 CSG, ASV
  6. 2006.02.14 CG - Texture
  7. 2006.01.25 Bezier curve
  8. 2006.01.25 Visual Studio .NET MFC + OpenGL
  9. 2006.01.20 Visual Studio .NET 2003 + FLTK + OpenGL

Atan2 - Arc tangent

2006. 4. 1. 15:22 | Posted by 속눈썹맨
atan2(y, x);
좌표상 원점(0, 0)을 기준으로 (x, y)가 x축가 이루는 각 theta를 구해준다.
x-y coordinate를 polar coordinate로 바꿀 때나 원을 그릴 때 사용한다.

. atan(x) 대신 atan2(y, x)를 쓰는 이유
x가 0일 때 분모가 0이 되므로 atan(x)로는 모든 각을 계산할 수가 없다.

(x, y)
. 1사분면일때 : 0 ~ Pi/2 (0 ~ 1.5708)
. 2사분면일때 : Pi/2 ~ Pi (0 ~ 3.14159)
. 3사분면일때 : -Pi ~ -Pi/2 (-3.14159 ~ -1.5708)
. 4사분면일때 : -Pi/2 ~ 0 (-1.5708 ~ 0)
. (x, y)가 원점을 기준으로 반시계방향으로 돌 때
atan2(y, x)의 값은 2사분면에서 3사분면으로 넘어가는 순간 -2Pi가 되고
나머지 구간에서는 항상 증가한다.

. atan2(y, x) 컴파일시 에러가 날때
. 오버로드된 함수에 대한 호출이 모호합니다.
=> y, x의 type을 float나 double로 통일해준다.
int type으로 하거나 float, double을 섞으면 안된다.

. 예제 프로그램
#include
#include
using namespace std;

void print(int x, int y)
{
cout << "atan2(" << y << ", " << x << ") : " << atan2(y, x) << endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
print(0, 0); // 0
print(10, 0); // 0
print(10, 10); // Pi/4
print(0, 10); // Pi/2
print(-10, 10); // 3*Pi/4
print(-10, 0); // Pi
print(-10, -10); // -3*Pi/4
print(0, -10); // -Pi/2
print(10, -10); // -Pi/4

return 0;
}

. radian(0~Pi)을 degree(0~180)로 바꾸기
0 -> 0
Pi/4 -> 45
Pi/2 -> 90
Pi -> 180

즉) radian * 180 / Pi = degree

OpenGL - Tessellation

2006. 4. 1. 03:18 | Posted by 속눈썹맨
nonconvex polygon을 triangles로 break down하여
convex polygons(Tessellation)으로 만든다.

. Nonconvex polygon
. concave - 180도 이상의 각이 있음.
. complex - hole 같은 것이 있음.

. Contour(외곽선)
. convec, concave polygon의 경우 1개 이상있음.
. hole 1개당 contour 1개가 추가됨.
. Nested Contour - holes 안에 holes가 있음.

. OpenGL에서 Polygon을 그릴 때 convex가 아닌 경우(concave) 모양이 이상하게 그려질 수가 있다.
. OpenGL은 performance를 위해 입력이 convex임을 가정하기 때문이다. 따라서 tessellation을 해서 concave를 convex 여러개로 나눈다.

예제)
void CALLBACK tessVertexCallback(GLvoid *vertex)
{
GLdouble *ptr;
ptr = (GLdouble *) vertex;
glVertex3dv((GLdouble *) ptr);
// glColor3dv((GLdouble *) ptr + 3);

cout << "vertex[0] : " << ptr[0] << endl;
cout << "vertex[1] : " << ptr[1] << endl;
cout << "vertex[2] : " << ptr[2] << endl;
}

void CALLBACK tessCombineCallback(GLdouble coords[3], GLdouble *vertex_data[4],
GLfloat weight[4], GLdouble **dataOut)
{
GLdouble *vertex;
vertex = new GLdouble[6];
vertex[0] = coords[0];
vertex[1] = coords[1];
vertex[2] = coords[2];

for (int i = 3; i < 6; i++)
{
// vertex에 color 값을 주지 않았다면
// 메모리 오류가 난다.
// 그 때는 vertex[i] = 0; 이라고 적당히 적어주자.
vertex[i] = weight[0] * vertex_data[0][i] +
weight[1] * vertex_data[1][i] +
weight[2] * vertex_data[2][i] +
weight[3] * vertex_data[3][i];
}
*dataOut = vertex;

}

void CALLBACK tessError(GLenum error)
{
const GLubyte* szError = gluErrorString(error);

cerr << "tessError : " << szError << endl;
}

GLUtesselator *tobj;
tobj = gluNewTess();
gluTessCallback(tobj, GLU_TESS_VERTEX, (GLvoid(__stdcall*) ())&tessVertexCallback);
gluTessCallback(tobj, GLU_TESS_COMBINE, (GLvoid(__stdcall*) ())&tessCombineCallback);
gluTessCallback(tobj, GLU_TESS_BEGIN, (GLvoid(__stdcall*) ())&glBegin);
gluTessCallback(tobj, GLU_TESS_END, (GLvoid(__stdcall*) ())&glEnd);
gluTessCallback(tobj, GLU_TESS_ERROR, (GLvoid(__stdcall*) ())&tessError);

gluTessBeginPolygon(tobj, NULL);
gluTessBeginContour(tobj);

for(적절히 i의 loop를 돌면 됨)
{
gluTessVertex(tobj, polygon2[i], polygon2[i]);
++i;
}

gluTessEndContour(tobj);
gluTessEndPolygon(tobj);
gluDeleteTess(tobj);

delete polygon2를 지움.

. 아무 것도 찍지 않을 때.
. 값을 잘 넣었는 지 확인
. error callback을 등록
. callback들에서 어느 vertex를 이용해 나눴는 지 출력해본다.

. combine callback을 등록하지 않을 때 나는 에러 메시지
: Need combine callback

. combine callback이 불리는 경우 오목한 정도가 심해서 나누려면 새로운 vertex가 필요할 때

. callback 함수 type casting
. Visual Studio 2003 .NET의 경우 위 처럼 적어줘야 한다.
책에서 다른 방식으로 적는 경우가 있는 데, 컴파일 에러(타입 오류)가 난다.

. callback 함수는 일반  function이거나 state member function 이어야만 한다.
  non-static member function일 때는 callback으로 등록할 수 없다.
  따라서 global variable 등을 동원하는 다른 꽁수를 써야 한다.

참고)
OpenGL Super Bible P.508
http://www.flipcode.com/articles/article_tesselating.shtml
http://www.songho.ca/opengl/gl_tessellation.html

Escherization

2006. 3. 30. 11:48 | Posted by 속눈썹맨
. M.C. Escher (Maurits Cornelis Escher)
Dutch graphic artist. 책 'Godel, escher, bach, '미학 오디세이'에 나오는 화가.

. Tessellation
동일한 모양을 이용해 틈이나 포개짐 없이 평면이나 공간을 완전하게 덮는 것

. Escherization
Escher의 그림처럼 plane을 tessellation해서 tiling함.
source S가 있을 때 최대한 적게 바꿔서 tiling되는 T로 만들어 붙이기.
http://www.cgl.uwaterloo.ca/~csk/projects/escherization/

. isohedral
. dihedral Escherization
. tiling two different shapes
. Aperiodic Escherization
. period가 없음.
. Non-Euclidean Escherization
. Escher의 작품
. Sky and water

MFC OpenGL Cube 그리기 + Maya Control 기능

2006. 3. 21. 23:01 | Posted by 속눈썹맨
. 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/

CSG, ASV

2006. 3. 19. 18:16 | Posted by 속눈썹맨
CSG : Constructive Solid Geometry
ASV : Alternating Sum of Volumes

. 구글 검색어 : CSG tree alternating sum
-> http://www.citidel.org/?op=getobj&identifier=oai:ACMDL:articles.267754

. 관련 논문
K. Tang and T. Woo. Algorithmic aspects of alternating sum of volumes. Part 1: Data structure and difference operation. CAD, 23(5):357- 366, 1991. (Citation)

K. Tang and T. Woo. Algorithmic aspects of alternating sum of volumes. Part 2: Nonconvergence and its remedy. CAD, 23(6):435- 443, 1991. (Citation)
-> http://portal.acm.org/citation.cfm?id=124974
-> Display Format -> ACM Ref ->
-> http://dx.doi.org/10.1016/0010-4485(91)90011-K
-> PDF (700 K)

CG - Texture

2006. 2. 14. 18:27 | Posted by 속눈썹맨
Texture라는 것은 상당히 특이한 기법인 것 같다.
요즘 웹게시판이나 GUI에서 말하는 skin과 꽤 비슷하다.
일단 기하학적인 물체의 모양을 모두 그린 후 질감을 입히는 것이다.

음악으로 말하자면 midi와 비슷하다.
midi 방식은 거시적인 파장만 저장한 후 각 악기의 음을 녹음해서
음색을 입히는 방식이다. (악보 + 음색이라고 볼 수 있다.)

음색, texture 같은 기법들은 인간의 인식에 의해 사용되는 추상적인 모델을 이용한 손실 decomposition이라고 할 수 있겠다.

아무튼 상당히 훌륭한 생각이다. 일반적으로 같은 물체는 같은 질감을 가지니까.

. decal - 전사인쇄 방식
프라모델(plastic model)을 만들 때도 쓰인다. 판박이라고도 부른다.
일단 종이나 어떤 표현에 물감 등을 묻힌 후 그것을 입체 도형에 입히는 기법.

Bezier curve

2006. 1. 25. 16:52 | Posted by 속눈썹맨
. Bezier가 parametric curve를 만듬.
. control points가 magnetic처럼 curve를 잡아당김
. order : control point의 갯수
. degree : control point의 갯수 - 1
. order 2 : straight
. order 3 : quadratic curve
. order 4 : cubic
. 점이 5개 이상이면 control이 잘 안 되므로 힘들어서 잘 안 쓰임.
(심하게 oscillation함)

. Continuity
. Bezier curves를 여러개 놓고 생각
. None : 두 선이 not meet
. C0-Positional : Meet(share a common endpoint)
. C1-Tangent : same tangent at the breakpoint
. C2-Curvature : same tangent at the breakpoint, same rate of change

. OpenGL
. Control points를 정하고 그것들을 이용해서 bezier curve를 grid로 나누어 중간 vertecies n개를 계산하고 모두 이어서 출력
. Bezier surface도 같은 방식으로 가능.

. Bezier curve -> B-spline -> NURBS 로 발전된다.

참고)
Open Superbible, ch.10.
http://en.wikipedia.org/wiki/B%C3%A9zier_curve

Visual Studio .NET MFC + OpenGL

2006. 1. 25. 12:07 | Posted by 속눈썹맨
1. Create Project
File -> New -> Project -> Visual C++ Projects -> MFC Application
Project Name : oglMFCDialog
Application Type -> Dialog based -> Finish Button

2. Create the Control
Solution Explorer tabl -> Resource View(top right view들 중에 있음)
-> oglMFCDialog.rc -> Dialog -> IDD_OGLMFCDIALOG_DIALOG

View -> Toolbox -> Picture Control -> Drag하여 dialog window에 drop
(resize accordingly)
(사각형의 가장자리를 선택해야 선택이되고 사각형의 내부를 누르면 선택이 안되므로 주의)

Properties window (bottom right)
-> Behavior -> Visible -> False
-> ID -> (IDC_STATIC -> IDC_OPENGL로 바꿈)
(Visible을 true로 하면 이것이 OpenGL에서 그린것을 가려버리므로 false로 함)

3. Add the OpenGL Class
Class view -> oglMFCDialog + mouse right click -> Add Class
-> Add class wizard -> Generic C++ class -> Open button
Class name: COpenGLControl
Base class: CWnd
Access: public
Check Virtual destructor
Finish Button

OpenGLControl.h, OpenGLControl.cpp가 생성됨
afxwin.h가 include되고 cpp에 h가 include됨
class declaration과 definition이 됨.(이제 채워 넣으면 됨)

4. Add libraries
Class view -> oglMFCDialog + mouse right click -> Property
-> Linker -> Input -> opengl32.lib glu32.lib
(lib파일 사이에는 공백을 한 칸만 넣을 것)

5. Add member varible
#include
#include

class COpenGLControl : public CWnd
{
public:
/******************/
/* PUBLIC MEMBERS */
/******************/
// Timer
UINT_PTR m_unpTimer;

private:
/*******************/
/* PRIVATE MEMBERS */
/*******************/
// Window information
CWnd *hWnd;
HDC hdc;
HGLRC hrc;
int m_nPixelFormat;
CRect m_rect;
CRect m_oldWindow;
CRect m_originalRect;

6. Add the oglCreate Function
Class view -> COpenGLControl + mouse right -> Add -> Add function
void oglCreate(CRect rect, CWnd *parent);

7. Add the OnPaint()
Properties -> Messages button(Mouse hovering하면 bubble에 설명이 나옴, lightning bolt(번개) 아이콘 옆에 있음)
-> WM_PAINT -> "OnPaint"

COpenGLControl에 afx_msg void OnPaint() member function이 생긴다.

void COpenGLControl::OnPaint()
{
//CPaintDC dc(this); // device context for painting
ValidateRect(NULL);
}

8. Add the OnCreate()
Properties -> Messages button(Mouse hovering하면 bubble에 설명이 나옴, lightning bolt(번개) 아이콘 옆에 있음)
-> WM_CREATE -> "OnCreate"

int COpenGLControl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;

oglInitialize();

return 0;
}

9. Add oglInitialize()
Class view -> COpenGLControl + mouse right -> Add -> Add function
void oglCreate(void);

void COpenGLControl::oglInitialize(void)
{
// Initial Setup:
//
static PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
32, // bit depth
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
16, // z-buffer depth
0, 0, 0, 0, 0, 0, 0,
};

// Get device context only once.
hdc = GetDC()->m_hDC;

// Pixel format.
m_nPixelFormat = ChoosePixelFormat(hdc, &pfd);
SetPixelFormat(hdc, m_nPixelFormat, &pfd);

// Create the OpenGL Rendering Context.
hrc = wglCreateContext(hdc);
wglMakeCurrent(hdc, hrc);

// Basic Setup:
//
// Set color to use when clearing the background.
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClearDepth(1.0f);

// Turn on backface culling
glFrontFace(GL_CCW);
glCullFace(GL_BACK);

// Turn on depth testing
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);

// Send draw request
OnDraw(NULL);
}

10. Add the OnDraw()
-> 일종의 Message function이지만 OnPaint()와 달리 Properties에서 추가하지 않고 Add -> Add function으로 추가함.

afx_msg void OnDraw(CDC *pDC);

void COpenGLControl::OnDraw(CDC *pDC)
{
// TODO: Camera controls.
}

11. Add OnTimer()
Properties -> Messages button(Mouse hovering하면 bubble에 설명이 나옴, lightning bolt(번개) 아이콘 옆에 있음)
-> WM_TIMER -> "OnTimer"

void COpenGLControl::OnTimer(UINT nIDEvent)
{
switch (nIDEvent)
{
case 1:
{
// Clear color and depth buffer bits
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// Draw OpenGL scene
// oglDrawScene();

// Swap buffers
SwapBuffers(hdc);

break;
}

default:
break;
}

CWnd::OnTimer(nIDEvent);
}

12. Add OnSize()
Properties -> Messages button(Mouse hovering하면 bubble에 설명이 나옴, lightning bolt(번개) 아이콘 옆에 있음)
-> WM_SIZE -> "OnSize"

void COpenGLControl::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);

// TODO: Add your message handler code here
if (0 >= cx || 0 >= cy || nType == SIZE_MINIMIZED) return;

// Map the OpenGL coordinates.
glViewport(0, 0, cx, cy);

// Projection view
glMatrixMode(GL_PROJECTION);

glLoadIdentity();

// Set our current view perspective
gluPerspective(35.0f, (float)cx / (float)cy, 0.01f, 2000.0f);

// Model view
glMatrixMode(GL_MODELVIEW);
}

13.
Class View -> CoglMEFDialogDlg + Mouse right -> Add -> Add function
private:
COpenGLControl m_oglWindow;

oglMFCDialogDlg.cpp::OnInitDialog()에 다음 내용 추가(retun 바로 앞에)

CRect rect;

// Get size and position of the picture control
GetDlgItem(IDC_OPENGL)->GetWindowRect(rect);

// Convert screen coordinates to client coordinates
ScreenToClient(rect);

// Create OpenGL Control window
m_oglWindow.oglCreate(rect, this);

// Setup the OpenGL Window's timer to render
m_oglWindow.m_unpTimer = m_oglWindow.SetTimer(1, 1, 0);


14. F5를 눌러 컴파일하면 됨, 그냥 까만 화면이 나옴

15, 16도 하면 화면이 나옴.
. 참고
http://www.codeguru.com/cpp/g-m/opengl/openfaq/article.php/c10975/

Visual Studio .NET 2003 + FLTK + OpenGL

2006. 1. 20. 15:56 | Posted by 속눈썹맨
. fltk 설치하기
. fltk-1.1.x-r.4721을 다운로드 받는 다.
. Visual Studio project directory 밑에 푼다.
. fltk-1.1.x-r4721\vcnet\fltk.sln을 연다.
. F5를 눌러 컴파일을 한다.


. fltk 사용하기
. Win32 Console application을 새로 만든다.

. Project -> Property -> C/C++ -> Code Generation -> Runtime Library -> Multi-threaded DLL(/MD)
. 위 설정을 빼먹었을 때 나는 에러
-------------------------------------
private: __thiscall
private:
__stdup
__stricmp
_exit
_free
.. 에 이미 정의되어 있습니다.
여러 번 정의된 기호가 있습니다.
-------------------------------------


. header file copy
fltk-1.1.x-r4721\FL을 현재 만드는 프로젝트 디렉토리로 복사한다.
(FL directory를 유지할 것)
(boost 같은 library도 같은 식으로 설정한다.)

. library file copy
fltk-1.1.x-r4721\lib\*.lib을 현재 만드는 프로젝트 디렉토리로 복사한다.

. stdafx.h에 추가할 내용
// TODO: 프로그램에 필요한 추가 헤더는 여기에서 참조합니다.
#include >math.h<
#include >string<
#include >vector<
#include >fstream<

// FLTK
#include >FL/Fl.H<
#include >FL/Fl_Window.H<
#include >FL/Fl_Box.H<
#include >FL/Fl_Double_Window.H<
#include >FL/Fl_Menu_Bar.H<
#include >FL/fl_message.H<
#include >FL/Fl_Input.H<
#include >FL/Fl_Button.H<
#include >FL/Fl_Return_Button.H<
#include >FL/Fl_Text_Buffer.H<
#include >FL/Fl_Text_Editor.H<
#include >FL/fl_ask.H<
#include >FL/Fl_Group.H<
#include >FL/Fl_File_Chooser.H<

// FLTK + OpenGL
#include >FL/gl.h<
#include >FL/Fl_Gl_Window.H<
#include >Gl/glu.h<

. 프로젝트 -> 속성 -> 구성 속성 -> C/C++ -> 일반 -> 추가 포함 디렉터리
$(SolutionDir)
. 프로젝트 -> 속성 -> 구성 속성 -> C/C++ -> 미리 컴파일된 헤더
-> 미리 컴파일된 헤더 사용 안함
. 프로젝트 -> 속성 -> 구성 속성 -> 링커 -> 추가 종속성
-> fltkd.lib wsock32.lib comctl32.lib fltkgld.lib opengl32.lib glu32.lib
(debug mode일 때)

. Main source code 예제
// w라는 window를 찍고
// 메뉴 o와 opengl 창 g_mainWindow를 찍는 다.
(g_mainWindow라는 global variable을 통해
g_mainWindow->redraw() 같은 식으로 부르면
draw()가 호출되어 그려진다.)

int _tmain(int argc, _TCHAR* argv[])
{
Fl_Double_Window* w = new Fl_Double_Window(g_screenX + 60, g_screenY + 60, "MainMenuBar");
Fl_Menu_Bar* o = new Fl_Menu_Bar(0, 0, g_screenY, 20);
o->menu(menu_);
g_mainWindow = new MyWindow1(0, 40, g_screenX - 20, g_screenY + 40, "CS580 PA1 - liyam, ilashman");

w->end();

w->show(argc, argv);

return Fl::run();
}

. 디버깅
console 창이 같이 뜨므로 printf() 등을 이용해서 값을 찍는 다.
debugger를 이용하여 stop point를 잡을 수도 있지만
event driven의 경우 너무 자주 stop될 수도 있다.

. 참고
GLUT와 FLTK가 같이 있을 때 FLTK가 event loop를 도는 편이 낫다.
GLUT도 evnet loop가 있지만
GLUT가 event loop를 돌게 해야 문제가 더 적다.
장점
. 창 속에 OpenGL창을 내장할 수 있다.
. 여러개의 OpenGL 창을 쉽게 관리할 수 있다.

. FLTK의 장점
MFC에 비해 사용법이 훨씬 단순하다.
이전 1 2 다음