OpenGL 실습 12 로봇.

Slides:



Advertisements
Similar presentations
LOGO OpenGL Project ( 해 결 사 ) 여태기 이수원 정화영 정유나 여태기 이수원 정화영 정유나.
Advertisements

School of Computer, Information and Communication Engineering
Chapter 3. 뷰잉(Viewing).
제 3 장 변수와 자료형.
2.1 The Sierpinski Gasket.
CG Programming (Modeling)
Implement of Input and Interaction
텍스쳐 매핑 실습.
OpenGL Programming (III) 1. Drawing in 3D 2. Manipulating 3D Space
대림대학교 2017년도 1학기 강의 왕보현 순서도와 스크래치 5주차 대림대학교 2017년도 1학기 강의 왕보현
2016 ITA 1월 강의 C Programming -4일차- 포인터배열 및 이중포인터 정대진 ( )
OpenGL 실습 1주차.
OpenGL 시작하기.
C++ Espresso 제2장 제어문과 함수.
블렌딩 안티앨리어싱, 안개효과 그리고 폴리곤 오프셋
Lecture #7 제 4 장. 기하학적 객체와 변환 (2).
기하학적 객체와 변환.
4장 기하학적 객체와 변환 – OpenGL 변환 학습목표 OpenGL 에서 어떻게 변환을 수행하는지 OpenGL 행렬모드 회전
Chapter 5. 라이팅(Lighting)
Lecture #8 제 5 장. 관측(viewing).
7장 디스플레이 리스트.
5.2 애니메이션 Page 283 ~ 295.
Practice - texture mapping
Mesh Saliency 김 종 현.
OpenGL 이란 그래픽스 하드웨어에 대한 소프트웨어 인터페이스 OpenGL의 전신은 실리콘그래픽스사의 IRIS GL
C로 쉽게 풀어쓴 자료구조 © Copyright 생능출판사 2011
선 택 과 피 드 백.
8. 객체와 클래스 (기본).
1장 – 그래픽스 시스템과 모델 2장 – 그래픽스 프로그래밍 3장 – 입력과 상호작용 4장 – 기하학적 객체와 변환 5장 관측
제9장. 모바일 3D 그래픽스 기술.
Department of Computer Engineering
제 2 장. 그래픽스 프로그래밍 : OpenGL 개요/ 예제 프로그램
CHAP 3:배열, 구조체, 포인터.
MicroC/OS-II Lab. 경희대학교 컴퓨터공학과 조 진 성.
Sang Il Park Sejong University
Department of Computer Engineering
계층적, 객체지향적 그래픽스 최 수 미
테 셀 레 이 션 과 이차 곡 면.
Term Project Team Member
학습목표 학습목차 다른 홈페이지의 HTML 파일 코드를 보는 방법에 대해 알아봅니다.
1장 – 그래픽스 시스템과 모델 2장 – 그래픽스 프로그래밍 3장 – 입력과 상호작용 4장 – 기하학적 객체와 변환
Hanyang University Jungsik Park
스크래치 언어 이해 스크래치 이용법 습득 고양이가 말을 하며 움직이는 예제 작성
OpenGL PROJECT 우광식 성기영 서창수 이인주.
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
프 레 임 버 퍼.
adopted from KNK C Programming : A Modern Approach
Computer Graphics OpenGL 설치 및 설정
광원 제어 하기.
Draw the basic Geometry Objects
CSS2(Cascading Style Sheets)
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
19. 함수 포인터와 void 포인터.
햄스터 미로찾기 광운대학교 로봇학부 박광현.
2D게임 프로그래밍 1차 발표 자료 정재훈.
Chapter 4 컬러( COLOR ).
Lab 8 Guide: 멀티스레딩 예제 2 * Critical Section을 이용한 멀티스레딩 동기화 (교재 15장, 쪽)
Tween Animation 천승현.
OpenGL Introduction 컴퓨터 그래픽스 김 창 헌.
OpenGL 프로젝트 김병욱 김상진 김성환.
3D Shapes 3개 핵심 Properties가 존재 1.Material 표면의 재질을 설정합니다.
WPF 3D 그래픽 발표자 : 조 현 민.
Department of Computer Engineering
Part III 애니메이션 Chapter 9 곡선.
컴퓨터 구성요소와 사용 컴퓨터 문서 작업 인터넷 활용
자료구조 세미나 발표 주제: 자료구조 기초 - 1회 차: 자료구조의 정의, 기초 지식 (함수, 포인터, 레퍼런스)
서울, 1964년 겨울 -김승옥.
서울, 1964년 겨울 -김승옥.
서울, 1964년 겨울 -김승옥.
argc, argv 의 사용방법 #include <stdio.h>
Presentation transcript:

OpenGL 실습 12 로봇

GLU Library를 이용한 이차곡면 렌더링 절차 GLUquadricObj* gluNewQuadric (); 새로운 이차곡면 객체를 만들고 객체의 포인터를 반환한다. This object must be referred to when calling quadrics rendering and control functions. A return value of 0 means that there is not enough memory to allocate the object.

void gluQuadricDrawStyle (GLUquadricObj *quad , GLenum drawStyle ); drawStyle을 사용하여 이차원 곡면 quad의 제작 스타일을 조절한다. quad : quadrics object (created with gluNewQuadric). drawStyle : the desired draw style. Valid values are GLU_FILL, GLU_LINE, GLU_SILHOUETTE, and GLU_POINT. GLU_FILL : Quadrics are rendered with polygon primitives. GLU_LINE : rendered as a set of lines. GLU_SILHOUETTE : rendered as a set of lines, except that edges separating coplanar faces will not be drawn. GLU_POINT ; rendered as a set of points.

void gluCylinder (GLUquadricObj void gluCylinder (GLUquadricObj* quad , GLdouble base , GLdouble top , GLdouble height , GLint slices , GLint stacks ); draw a cylinder quad : the quadrics object (created with gluNewQuadric). base :the radius of the cylinder at z=0. top : the radius of the cylinder at z=height. height : the height of the cylinder. slices : the number of subdivisions around the z axis. stacks : the number of subdivisions along the z axis.

gluCylinder draws a cylinder oriented along the z axis gluCylinder draws a cylinder oriented along the z axis. The base of the cylinder is placed at z=0, and the top at z=height. Like a sphere, a cylinder is subdivided around the z axis into slices, and along the z axis into stacks. Note that if top is set to 0.0, this routine generates a cone.

gluDisk (quad , inner , outer , slices , loops ) renders a disk on the z = 0 plane. The disk has a radius of outer, and contains a concentric circular hole with a radius of inner. gluSphere (quad , radius , slices , stacks ) draws a sphere of the given radius centered around the origin. gluPartialDisk (quad , inner , outer , slices , loops , start , sweep ) renders a partial disk on the z=0 plane. A partial disk is similar to a full disk, except that only the subset of the disk from start through start + sweep is included.

로봇 팔 메뉴에서 마우스로 선택한 부분이 키보드에서 p를 입력하면 양의 방향, n을 입력하면 음의 방향으로 회전하도록 프로그램 하라. Base는 y축을 중심으로 회전, ARM은 z축을 중심으로 회전함 BASE_HEIGHT 2.0 BASE_RADIUS 1.0 LOWER_ARM_HEIGHT 5.0 LOWER_ARM_WIDTH 0.5 UPPER_ARM_HEIGHT 3.0 UPPER_ARM_WIDTH 0.5

#include <gl/glut.h> #include <iostream> static GLfloat theta[] = {0.0,0.0,0.0}; static GLint axis = 0; GLUquadricObj *p; /* pointer to quadric object */ /* Define the three parts */ void base(){ // gluCylinder(…)을 이용해서 이곳에서 모델링 } void upper_arm(){ //glutWireCube(1.0);을 이용해서 작성 void lower_arm(){ //glutWireCube(1.0); 을 이용해서 작성

void base(){ glPushMatrix(); glRotatef(-90.0, 1.0, 0.0, 0.0); gluCylinder(p, BASE_RADIUS, BASE_RADIUS, BASE_HEIGHT, 5, 5); glPopMatrix(); } void upper_arm(){ glPushMatrix(); glTranslatef(0.0, 0.5*UPPER_ARM_HEIGHT, 0.0); glScalef(UPPER_ARM_WIDTH, UPPER_ARM_HEIGHT, UPPER_ARM_WIDTH); glutWireCube(1.0); glPopMatrix(); } void lower_arm() 작성할 것

glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); void display(void){ /* Accumulate ModelView Matrix as we traverse tree */ glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); glColor3f(1.0, 0.0, 0.0); //base의 모델-관측 행렬 base(); // lower_arm 의 모델-관측 행렬 lower_arm(); // upper_arm 의 모델-관측 행렬 upper_arm(); glutSwapBuffers(); }

void myinit() { glClearColor(1.0, 1.0, 1.0, 1.0); glColor3f(1.0, 0.0, 0.0); /* allocate quadric object */ p=gluNewQuadric(); /* render it as wireframe */ gluQuadricDrawStyle(p, GLU_LINE); }

void menu(int id){ if(id == 1 ) axis=0; if(id == 2) axis=1; if(id == 3 ) axis=2; if(id ==4 ) exit(0); } void myReshape(int w, int h){ glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w <= h) glOrtho(-10.0, 10.0, -5.0 * (GLfloat) h / (GLfloat) w, 15.0 * (GLfloat) h / (GLfloat) w, -10.0, 10.0); else glOrtho(-10.0 * (GLfloat) w / (GLfloat) h, 10.0 * (GLfloat) w / (GLfloat) h, -5.0, 15.0, -10.0, 10.0); glMatrixMode(GL_MODELVIEW);

//p: 양의 방향으로 5도 회전 n 음의 방향으로 5도 회전 void keyboard(unsigned char key, int x, int y) { switch(key){ case 'p': theta[axis] += 5.0; if( theta[axis] > 360.0 ) theta[axis] -= 360.0; } break; case 'n': theta[axis] -= 5.0; if( theta[axis] <- 360.0 ) theta[axis] += 360.0; display();

void main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(500, 500); glutCreateWindow("robot"); myinit(); glutReshapeFunc(myReshape); glutDisplayFunc(display); glutKeyboardFunc(keyboard); glutCreateMenu(menu); glutAddMenuEntry("base", 1); glutAddMenuEntry("lower arm", 2); glutAddMenuEntry("upper arm", 3); glutAddMenuEntry("quit", 4); glutAttachMenu(GLUT_MIDDLE_BUTTON); glutMainLoop(); }

로봇 TORSO_HEIGHT 5.0 UPPER_ARM_RADIUS 0.5 LOWER_ARM_RADIUS 0.3 UPPER_ARM_HEIGHT 3.0 LOWER_ARM_HEIGHT 2.0 UPPER_LEG_RADIUS 0.5 LOWER_LEG_RADIUS 0.3 UPPER_LEG_HEIGHT 3.0 LOWER_LEG_HEIGHT 2.0 TORSO_RADIUS 1.0 HEAD_HEIGHT 1.5 HEAD_RADIUS 1.0

프로그램 figure.cpp 참조 각 부분의 동작 동작제어 torso: y축을 중심으로 좌우로 5도씩 회전 head: 1) x축 중심으로 앞뒤로 5도씩 회전 2) y축 중심으로 좌우로 5도씩 회전 나머지 부분은 x축 중심으로 앞뒤로 5도씩 회전 동작제어 메뉴로 동작할 부분 선택 p는 +방향, n은 –방향으로 회전하도록

로봇 애니메이션

동작제어 마우스 왼쪽버튼=> x의 양의 방향으로 이동 마우스 오른쪽 버튼=> 이동을 멈춘다. 윈도우 오른쪽으로 사라지면 윈도우 왼쪽으로 다시 나타나도록 팔과 다리는 좌우로 30도씩 움직이도록

TORSO_HEIGHT 5.0 UPPER_ARM_HEIGHT 2.5 LOWER_ARM_HEIGHT 2.0 UPPER_LEG_RADIUS 0.5 LOWER_LEG_RADIUS 0.3 UPPER_LEG_HEIGHT 3.0 LOWER_LEG_HEIGHT 2.0 TORSO_RADIUS 1.0 UPPER_ARM_RADIUS 0.5 LOWER_ARM_RADIUS 0.3 HEAD_HEIGHT 1.5 HEAD_RADIUS 1.0

static GLfloat theta[11] = { 70.0, 0.0, 0.0, 180.0, 0.0, 180.0, 0.0, 180.0, 0.0, 180.0, 0.0}; static GLfloat posx=0; float chain=0; void idle(void){ if(chain==0) //플래그를 두어 양다리를 번갈아 가게 구현 // 이동에 대하여 생각해 작성할 것 display(); } void mouse(int btn, int state, int x, int y){ if(btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN) //작성할 것