CG Programming (Modeling)

Slides:



Advertisements
Similar presentations
03 변수와 자료형 세종대학교 최옥경 교수 참고 : 한빛미디어 뇌를 자극하는 C, INFINITY Perfect C.
Advertisements

YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
Chapter 3. 뷰잉(Viewing).
Efl을 이용한 타이젠 네이티브 웨어러블 앱 만들기
Computer Graphics 한신대학교 컴퓨터공학부 류승택 2017년 2학기.
CG Programming (Modeling)
Implement of Input and Interaction
OpenGL 실습 12 로봇.
Computer Graphics 한신대학교 컴퓨터공학부 류승택 2015년 2학기.
OpenGL Programming (III) 1. Drawing in 3D 2. Manipulating 3D Space
GTK+ 프로그래밍 (2) SNSLAB 발표 : 문동규.
OpenGL 실습 1주차.
OpenGL 시작하기.
블렌딩 안티앨리어싱, 안개효과 그리고 폴리곤 오프셋
Lecture #7 제 4 장. 기하학적 객체와 변환 (2).
기하학적 객체와 변환.
4장 기하학적 객체와 변환 – OpenGL 변환 학습목표 OpenGL 에서 어떻게 변환을 수행하는지 OpenGL 행렬모드 회전
Chapter 5. 라이팅(Lighting)
7장 디스플레이 리스트.
2014 ITA 8월 강의 C Programming -1주차- C언어 기초 정대진 ( )
C 프로그래밍 소개 숙명여대 창병모 2011 가을.
Linux System Programming
1장 – 그래픽스 시스템과 모델 2장 – 그래픽스 프로그래밍 3장 – 입력과 상호작용 4장 – 기하학적 객체와 변환 5장 관측
제3장 추가 실습 3장 관련 C 언어 프로그래밍 실습.
쉽게 풀어쓴 C언어 Express 제18장 입출력과 라이브러리 함수 C Express.
OpenGL Programming (II) 3D Graphics Fundamentals
제15장 파일 입출력 문자열을 출력하는 여러가지 방법 (15-2쪽) 문자열만 처리하는 입출력 함수
제 12장 I/O멀티플렉싱(Multiplexing)
Sang Il Park Sejong University
openGL Project 제안서 - 해상 전투
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express.
Lecture #9 제 6장. 음영법(Shading).
제15장 전처리 및 비트연산.
누구나 즐기는 C언어 콘서트 제2장 기초 사항.
openGL Project 제안서 야구 시구 시뮬레이션
openGL Project 결과보고서 야구 시구 시뮬레이션
제 2 장 변수와 상수.
UniSQL/X 실습과제 (1) ■ 실습 기간: ~
프로그래밍 랩 – 7주 리스트.
Hanyang University Jungsik Park
OpenGL PROJECT 우광식 성기영 서창수 이인주.
openGL Project 제안서 비 오는 정류장에서
제 11 장 전처리기.
Computer Graphics OpenGL 설치 및 설정
핸드폰 시뮬레이션 김 형 도 송 미 경.
광원 제어 하기.
이름 : 황 상 두 전화번호 : 이메일 : PinTool 이름 : 황 상 두 전화번호 : 이메일 :
OpenCV 설치 및 구성 OpenCV
강의 소개, 자료구조의 개념, SW 개발과 자료구조
Flash를 이용한 벡터 애니메이션 제작.
Draw the basic Geometry Objects
Chapter 4 MPEG-2 부호기 전체 구조와 알고리즘 ( 4.6 ~ 4.10 )
컴퓨터 프로그래밍 기초 - 4th : 수식과 연산자 -
쉽게 풀어쓴 C언어 Express 제15장 전처리 및 비트연산 C Express Slide 1 (of 29)
Chapter 4 컬러( COLOR ).
쉽게 풀어쓴 C언어 Express 제2장 프로그램 작성 과정 C Express.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
Operating System Multiple Access Chatting Program using Multithread
OpenGL Introduction 컴퓨터 그래픽스 김 창 헌.
OpenGL 프로젝트 김병욱 김상진 김성환.
누구나 즐기는 C언어 콘서트 제2장 기초 사항 IT응용시스템공학과 김형진 교수.
쉽게 풀어쓴 C언어 Express 제2장 프로그램 개발 과정 C Express.
openGL Project 제안서 - 해상 전투
^^ Computer Programming 2 dmpr.cnu.ac.kr/~daygax.
OpenGL Project.
C언어 개론.
LOGOTYPE 춤추는 풍선 팀장 : 이준호 팀원 : 장원진.
뇌를 자극하는 C 프로그래밍.
실습과제 1번 생성된 파일 basic.txt를 프로젝트 폴더에서 메모장으로 열고 내용을 확인
C.
Presentation transcript:

CG Programming (Modeling) Fall, 2016

What is GLUI? OpenGL User Interface Library(GLUI) a GLUT-based C++ user interface library which provides controls such as buttons, checkboxes, radio buttons, and spinners to OpenGL applications. It is window-system independent, relying on GLUT to handle all system-dependent issues, such as window and mouse management.

What is GLUI? Features of the GLUI Complete integration with GLUT toolkit Simple creation of a new user interface window with a single line of code Support for multiple user interface windows Standard user interface controls such as: Buttons , Checkboxes, Radio Buttons, Editable text boxes Spinners, Static text fields, Panels Separator lines Controls can generate callbacks when their values change

What does GLUI look like?

Installing GLUI using VC++ on windows To install the glui, the glut must be installed first Download glui library from http://glui.sourceforge.net/ Under src directory u will find msvc directory, then open glui.sln file. Convert the solution (if needed) Converting the project solution into VC++ project Select the _glui library and build the library After building the library, the lib file (glui32d.lib), glui32d.lib – ‘d’ for debug, will be stored in the msvc\lib directory Put the glui32.lib file into C:\Program Files\Microsoft Visual Studio 10.0\VC\lib directory Put the glui.h file into C:\Program Files\Microsoft Visual Studio 10.0\VC\include\GL directory

Setup GLUI Setup GLUI http://sourceforge.net/projects/glui/ Download GLUI : glui-2.36.zip http://sourceforge.net/projects/glui/ Copy header (glui.h) C:\Program Files\Microsoft Visual Studio 10.0\VC\Include\GL Copy lib (glui32.lib) C:\Program Files\Microsoft Visual Studio 10.0\VC\lib Test Examples

For VS 2010 Link Error fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt This issue occurred after Visual Studio 2012 installation Solution 1 프로젝트 속성에서 Manifest Tool > Input and Output > Embed Manifest 의 설정을 No 로 바꿔주면 된다. Solution 2 아래 링크를 통해서 Visual Studio 2010 ServicePack 1을 설치하면 된다.   https://www.microsoft.com/en-us/download/details.aspx?id=23691

For VS 2010

List of Controls List of Controls

List of Controls

GLUI Reference Reference http://sourceforge.net/projects/glui/ http://glui.sourceforge.net/ http://jaist.dl.sourceforge.net/project/glui/Documentation/GLUI%202/glui_manual_v2_beta.pdf

GLUT Main() int main(int argc, char **argv) { glutInit(&argc, argv); glutInitWindowSize(800,600); glutInitWindowPosition(100,100); // 더블 버퍼 사용(화면 버퍼와 백버퍼), RGB칼라모델, 깊이버퍼 사용 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutCreateWindow("Simple Modeling"); // display(): Rendering Loop 에서 계속 불림 glutDisplayFunc(display); // reshape(): 윈도우 크기변화 이벤트 처리 glutReshapeFunc(reshape); // keyboard(): 키보드 이벤트 처리 glutKeyboardFunc(keyboard); // mouse(): 마우스 이벤트 처리 glutMouseFunc(mouse); // motion(): 포인트 위치(x, y) 움직임 이벤트 처리 (절대 좌표) glutMotionFunc(motion); // ReadModel(): 파일로부터 물체를 읽어드리는 함수 ReadModel(); // GLSetupRC(): OpenGL를 사용하여 빛설정, 시각좌표계설정, 프로젝션 설정 GLSetupRC(); glutMainLoop(); return 0; /* ANSI C requires main to return int. */ }

GLUT 이벤트 처리 키보드 이벤트 마우스 이벤트 포인트 움직임 이벤트 void keyboard(unsigned char key, int x, int y) key 변수: 눌려진 문자 값 x, y 변수: 포인트 위치 마우스 이벤트 void mouse(int button, int state, int x, int y) button 변수: GLUT_LEFT_BUTTON, GLUT_RIGHT_BUTTON, GLUT_MIDDLE_BUTTON state 변수: GLUT_UP, GLUT_DOWN x, y 변수: window-relative mouse position 포인트 움직임 이벤트 void motion(int x, int y)

OpenGL 환경 설정 관련 함수 void GLSetupRC(void) { /* Enable a single OpenGL light. */ // LIGHT0 : 설정한 조명의 이름, GL_LIGHT1, GL_LIGHT2, … 로 조명 추가 가능 glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); // 난반사 설정 glLightfv(GL_LIGHT0, GL_POSITION, light_specular); // 정반사 설정 glLightfv(GL_LIGHT0, GL_POSITION, light_ambient); // 주변광 설정 glLightfv(GL_LIGHT0, GL_POSITION, light_position); // 조명의 위치 설정 glEnable(GL_LIGHT0); // 설정한 LIGHT0를 사용 가능 glEnable(GL_LIGHTING); // 설정한 조명들을 켬  glDisable(…): 조명들을 끔 /* Use depth buffering for hidden surface elimination. */ glEnable(GL_DEPTH_TEST); // 깊이 테스트 켬 /* Setup the view */ glMatrixMode(GL_PROJECTION); // 프로젝션 설정 glLoadIdentity(); // 프로젝션 행렬 초기화  단위 행렬로 대치 gluPerspective( 40.0, // field of view in degree 1.0, // aspect ratio 1.0, // Z near 2000.0); // Z far glMatrixMode(GL_MODELVIEW); // 시각좌표계 UVN 설정 glLoadIdentity(); gluLookAt(400.0, 400.0, 400.0, // eye is at (400,400,400) 0.0, 0.0, 0.0, // center is at (0,0,0) 0.0, 1.0, 0.); // up is in positive Y direction }

GLUT Display 함수 void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); MakeGL_Model(); // 물체 모델링 if (status==WIRE) DrawWire(); // 물체 렌더링 (선구조형상) else DrawShade(); // 물체 렌더링 (쉐이딩) }

Read File(모델링 파일) Cube.dat void ReadModel() { FILE *f1; char s[81]; int i; if ((f1 = fopen(fname, "rt"))== NULL) { printf("No file\n"); exit(0); } fscanf(f1,"%s",s); printf( "%s", s ); // 문자열 “VERTEX”읽음 fscanf(f1,"%s",s); printf( "%s", s ); // 문자열 “=“ 읽음 fscanf(f1,"%d",&pnum); printf( "%d\n", pnum); // 버텍스의 개수 읽음 mpoint = (Point*)malloc(sizeof(Point)*pnum); // 버텍스 개수 만큼 POINT배열 설정 for (i=0; i<pnum; i++){ fscanf(f1,"%f",&mpoint[i].x); // 버텍스 읽음 (x좌표) fscanf(f1,"%f",&mpoint[i].y); // 버텍스 읽음 (y좌표) fscanf(f1,"%f",&mpoint[i].z); // 버텍스 읽음 (z좌표) printf( "%f %f %f\n", mpoint[i].x, mpoint[i].y,mpoint[i].z); } fscanf(f1,"%s",s); printf( "%s", s ); // 문자열 “FACE”읽음 fscanf(f1,"%s",s); printf( "%s", s ); // 문자열 “=”읽음 fscanf(f1,"%d",&fnum); printf( "%d\n", fnum); // 면의 개수 읽음 mface = (Face*)malloc(sizeof(Face)*fnum); // 면 개수 만큼 FACE배열 설정 for (i=0; i<fnum; i++){ fscanf(f1,"%d",&mface[i].ip[0]); // 1번째 점의 인덱스 읽음 fscanf(f1,"%d",&mface[i].ip[1]); // 2번째 점의 인덱스 읽음 fscanf(f1,"%d",&mface[i].ip[2]); // 3번째 점의 인덱스 읽음 printf("%d %d %d\n", mface[i].ip[0], mface[i].ip[1], mface[i].ip[2]); fclose(f1); VERTEX = 8 -100.0 -100.0 -100.0 100.0 -100.0 -100.0 100.0 100.0 -100.0 -100.0 100.0 -100.0 -100.0 -100.0 100.0 100.0 -100.0 100.0 100.0 100.0 100.0 -100.0 100.0 100.0 FACE = 12 7 5 6 7 4 5 3 2 1 3 1 0 2 6 5 2 5 1 3 7 6 3 6 2 0 4 7 0 7 3 1 5 4 1 4 0 Cube.dat typedef struct { float x; float y; float z; } Point; typedef struct { unsigned long ip[3]; } Face;

OpenGL Modeling PushMatrix PopMatrix void MakeGL_Model(void) { int i; Point norm; // 폴리건의 노말 벡터 glShadeModel(GL_SMOOTH); // Gouraud 쉐이딩 // GL_FLAT  Constant 쉐이딩 if (glIsList(1)) glDeleteLists(1,1); // 모델 리스트 설정 glNewList(1, GL_COMPILE); glPushMatrix(); // 행렬 스택에 푸쉬 glTranslatef(xloc, yloc, zloc); // 물체 이동 변환 glMultMatrixf (rotation_matrix); // 물체 회전 변환 행렬 glRotatef(angle, 0.0, 1.0, 0.0); // 물체 회전 변환 glScalef(scalefactor, scalefactor, scalefactor); // 물체 크기 변환 for (i = 0; i < fnum; i++) { norm = cnormal(mp[mf[i].ip[2]], mp[mf[i].ip[1]], mp[mf[i].ip[0]]); // 면 노말 계산 glBegin(GL_TRIANGLES); // 삼각형으로 면 생성 glNormal3f(norm.x, norm.y, norm.z); // 면 노말 설정 glVertex3f(mp[mf[i].ip[0]].x, mp[mf[i].ip[0]].y, mp[mf[i].ip[0]].z); // 1번째 점 설정 glVertex3f(mp[mf[i].ip[1]].x, mp[mf[i].ip[1]].y, mp[mf[i].ip[1]].z); // 2번째 점 설정 glVertex3f(mp[mf[i].ip[2]].x, mp[mf[i].ip[2]].y, mp[mf[i].ip[2]].z); // 3번째 점 설정 glEnd(); } glPopMatrix(); // 행렬 스택에서 팝 glEndList();

SOR Model void MakeSORModel() { int i; int IncAngle=10; // 회전 증가 변수 (10도씩 회전) pnum=(360/IncAngle)*2; // 점의 개수 mpoint = (Point*)malloc(sizeof(Point)*pnum); // 점의 개수 할당 mpoint[0].x=100; mpoint[0].y=-100; mpoint[0].z=100; // 첫번째 점의 초기 위치 mpoint[1].x=100; mpoint[1].y=100; mpoint[1].z=100; // 두번째 점의 초기 위치 for (i=0; i<pnum-2; i++){ // 회전에 의한 점 위치 계산 mpoint[i+2].x= cos(IncAngle*PI/180)*mpoint[i].x-sin(IncAngle*PI/180)*mpoint[i].z; mpoint[i+2].y= mpoint[i].y; mpoint[i+2].z= sin(IncAngle*PI/180)*mpoint[i].x+cos(IncAngle*PI/180)*mpoint[i].z; } fnum=2*360/IncAngle; // 면의 개수 mface = (Face*)malloc(sizeof(Face)*fnum); // 면의 개수 할당 for (i=0; i<pnum; i+=2) { // 계산된 점들로 면 구성 mface[i].ip[0]=i%pnum; mface[i].ip[1]=(i+1)%pnum; mface[i].ip[2]=(i+1+2)%pnum; mface[i+1].ip[0]=i%pnum; mface[i+1].ip[1]=(i+1+2)%pnum; mface[i+1].ip[2]=(i+2)%pnum; #define PI 3.141592 typedef struct { float x; float y; float z; } Point; typedef struct { unsigned long ip[3]; } Face;

OpenGL Shading void Draw……(void) { // glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // 화면 배경 색 흰색으로 설정 // 칼라 버퍼와 깊이 버퍼 초기화 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable (GL_DEPTH_TEST); // 깊이 테스트 켬 glEnable(GL_COLOR_MATERIAL); // 물체의 재질 패러미터 사용 if (cull) glEnable(GL_CULL_FACE); // Culling 사용 else glDisable(GL_CULL_FACE); if (light) glEnable(GL_LIGHTING); // 조명 켬 else glDisable(GL_LIGHTING); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); // 선구조형상으로 표현 // glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); // 쉐이딩으로 표현 // 모델링단계에서 설정한 모델링 리스트의 1번을 부름 glCallList(1); // 더블 버퍼 사용: 화면 버퍼와 백버퍼를 교환  속도향상 glutSwapBuffers(); }