반응형

프로그래밍/OpenGl

반응형
반응형

* Cylinder를 화면에 띄워주는 코드입니다. 

/*Display List를 사용하여 갈색 Cylinder를 600*600 window의 중앙에 viewport를 설정하여 띄워줍니다.*/
#include <gl/glut.h>
#include <gl/glu.h>
#include <gl/gl.h>

int MyListID; // Display List를 사용합니다.
GLUquadricObj* qobj = gluNewQuadric(); // 새로운 Quadric 생성합니다.

/*1.처음 윈도우를 열 때
* 2. 윈도우 위치를 옮길 때
* 3. 윈도우 크기를 조정할 때
* Reshape Event를 발생시킵니다.*/
void Reshape(int w, int h) { //w와 h는 각각 변경도니 윈도우의 폭과 높이입니다.
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-2.5, 2.5, -2.5 * (GLfloat)h / (GLfloat)w, 2.5 * (GLfloat)h / (GLfloat)w, -10.0, 10.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

/*빛과 재질과 관련된 설정들을 해줍니다.*/
void MyInit(void) {
    GLfloat mat_ambient[] = { 0.5, 0.4, 0.3, 1.0 }; //주변광
    GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 }; //반사광
    GLfloat mat_shininess[] = { 50.0 }; //선명도
    GLfloat light_position[] = { 0.3, 0.3, 0.5, 0.0 }; //조명 위치
    GLfloat model_ambient[] = { 0.6, 0.4, 0.2, 1.0 };
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, model_ambient);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_DEPTH_TEST);
}

/*Display List를 생성하는 함수입니다.*/
void MyCreateList()
{
    MyListID = glGenLists(1);//새로운 리스트 생성합니다.

    glNewList(MyListID, GL_COMPILE);//compile만 되는 것으로 설정합니다.

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glRotatef(40.0, 1.0, 1.0, 0.0); //40도만큼 x축, y축으로 회전합니다.
    glEnable(GL_LIGHTING);
    glShadeModel(GL_SMOOTH);
    gluCylinder(qobj, 0.5, 0.5, 1, 50, 50);
    glutSwapBuffers();

    glEndList();
}

void MyDisplay()
{
    glClear(GL_COLOR_BUFFER_BIT);//색을 초기화합니다.
    glViewport(50, 50, 500, 500); // 600 * 600 화면의 중앙에 나오도록 view port를 설정합니다.
    glCallList(MyListID);//Dipslay list를 불러옵니다.
    glFlush();
}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB);
    glutInitWindowSize(600, 600);
    glutInitWindowPosition(300, 200); //모니터에서 300, 200 위치에 창이 뜨도록 설정합니다.
    glutCreateWindow("Brown Cylinder");
    MyInit(); //재질과 빛과 관련된 값을 초기화합니다.
    glutDisplayFunc(MyDisplay); // 화면에 띄워줄 값들을 불러옵니다.
    glutReshapeFunc(Reshape); // 화면의 값들이 변경될 때 이 함수를 불러와서 sphere의 크기를 같이 조정해줍니다.
    MyCreateList();
    glutMainLoop();
    return 0;
}

 

* 초록색 Wire Spherer를 기울여서 화면 중앙에 띄워줍니다.

 

/*Display List를 사용하여 초록색 Wire Sphere를 600*600 window의 중앙에 viewport를 설정하여 띄워줍니다.
* 66.5도만큼 x축, y축으로 기울였습니다. */
#include <gl/glut.h>
#include <gl/glu.h>
#include <gl/gl.h>

int MyListID; // Display List를 사용합니다.
GLUquadricObj* qobj = gluNewQuadric(); // 새로운 Quadric 생성합니다.

/*1.처음 윈도우를 열 때
* 2. 윈도우 위치를 옮길 때
* 3. 윈도우 크기를 조정할 때
* Reshape Event를 발생시킵니다.*/
void Reshape(int w, int h) { //w와 h는 각각 변경도니 윈도우의 폭과 높이입니다.
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-2.5, 2.5, -2.5 * (GLfloat)h / (GLfloat)w, 2.5 * (GLfloat)h / (GLfloat)w, -10.0, 10.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

/*빛과 재질과 관련된 설정들을 해줍니다.*/
void MyInit(void) {
    GLfloat mat_ambient[] = { 0.5, 0.4, 0.3, 1.0 }; //주변광
    GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 }; //반사광
    GLfloat mat_shininess[] = { 50.0 }; //선명도
    GLfloat light_position[] = { 0.3, 0.3, 0.5, 0.0 }; //조명 위치
    GLfloat model_ambient[] = { 0.2, 0.8, 0.2, 1.0 };
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, model_ambient);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_DEPTH_TEST);
}

/*Display List를 생성하는 함수입니다.*/
void MyCreateList()
{
    MyListID = glGenLists(1);//새로운 리스트 생성합니다.

    glNewList(MyListID, GL_COMPILE);//compile만 되는 것으로 설정합니다.

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glRotatef(66.5, 1.0, 1.0, 0.0); //지구의 자전축인 66.5도만큼 x축, y축으로 회전합니다.
    glEnable(GL_LIGHTING);
    glShadeModel(GL_SMOOTH);
    glutWireSphere(1.5, 50, 50);
    glutSwapBuffers();

    glEndList();
}

void MyDisplay()
{
    glClear(GL_COLOR_BUFFER_BIT);//색을 초기화합니다.
    glViewport(50, 50, 500, 500); // 600 * 600 화면의 중앙에 나오도록 view port를 설정합니다.
    glCallList(MyListID);//Dipslay list를 불러옵니다.
    glFlush();
}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB);
    glutInitWindowSize(600, 600);
    glutInitWindowPosition(300, 200); //모니터에서 300, 200 위치에 창이 뜨도록 설정합니다.
    glutCreateWindow("Wire Sphere with rotation");
    MyInit(); //재질과 빛과 관련된 값을 초기화합니다.
    glutDisplayFunc(MyDisplay); // 화면에 띄워줄 값들을 불러옵니다.
    glutReshapeFunc(Reshape); // 화면의 값들이 변경될 때 이 함수를 불러와서 sphere의 크기를 같이 조정해줍니다.
    MyCreateList();
    glutMainLoop();
    return 0;
}

 

* Disk를 약간 회전시켜서 화면에 띄워줍니다.

/*Display List를 사용하여 보라색 Disk를 600*600 window의 중앙에 viewport를 설정하여 띄워줍니다.*/
#include <gl/glut.h>
#include <gl/glu.h>
#include <gl/gl.h>

int MyListID; // Display List를 사용합니다.
GLUquadricObj* qobj = gluNewQuadric(); // 새로운 Quadric 생성합니다.

/*1.처음 윈도우를 열 때
* 2. 윈도우 위치를 옮길 때
* 3. 윈도우 크기를 조정할 때
* Reshape Event를 발생시킵니다.*/
void Reshape(int w, int h) { //w와 h는 각각 변경도니 윈도우의 폭과 높이입니다.
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-2.5, 2.5, -2.5 * (GLfloat)h / (GLfloat)w, 2.5 * (GLfloat)h / (GLfloat)w, -10.0, 10.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

/*빛과 재질과 관련된 설정들을 해줍니다.*/
void MyInit(void) {
    GLfloat mat_ambient[] = { 0.5, 0.4, 0.3, 1.0 }; //주변광
    GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 }; //반사광
    GLfloat mat_shininess[] = { 50.0 }; //선명도
    GLfloat light_position[] = { 0.3, 0.3, 0.5, 0.0 }; //조명 위치
    GLfloat model_ambient[] = { 0.0, 0.0, 1.0, 1.0 };
    glClearColor(1.0, 1.0, 1.0, 0.0); // 배경색을 하얀색으로 설정합니다.
    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, model_ambient);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_DEPTH_TEST);
}

/*Display List를 생성하는 함수입니다.*/
void MyCreateList()
{
    MyListID = glGenLists(1);//새로운 리스트 생성합니다.

    glNewList(MyListID, GL_COMPILE);//compile만 되는 것으로 설정합니다.

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glRotatef(45, 1.0, 1.0, 0.0); //지구의 자전축인 66.5도만큼 x축, y축으로 회전합니다.
    glEnable(GL_LIGHTING);
    glShadeModel(GL_SMOOTH);
    //glutWireSphere(1.5, 50, 50);
    gluDisk(qobj, 0.2, 1.6, 50, 50);
    
    glutSwapBuffers();

    glEndList();
}

void MyDisplay()
{
    glClear(GL_COLOR_BUFFER_BIT);//색을 초기화합니다.
    glViewport(50, 50, 500, 500); // 600 * 600 화면의 중앙에 나오도록 view port를 설정합니다.
    glCallList(MyListID);//Dipslay list를 불러옵니다.
    glFlush();
}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB);
    glutInitWindowSize(600, 600);
    glutInitWindowPosition(300, 200); //모니터에서 300, 200 위치에 창이 뜨도록 설정합니다.
    glutCreateWindow("Disk with rotation");
    MyInit(); //재질과 빛과 관련된 값을 초기화합니다.
    glutDisplayFunc(MyDisplay); // 화면에 띄워줄 값들을 불러옵니다.
    glutReshapeFunc(Reshape); // 화면의 값들이 변경될 때 이 함수를 불러와서 sphere의 크기를 같이 조정해줍니다.
    MyCreateList();
    glutMainLoop();
    return 0;
}

 

 

* Partial Disk를 화면에 띄워줍니다.

/*Display List를 사용하여 배경이 노란색이고 검은색 Partial Disk를 600*600 window의 중앙에 viewport를 설정하여 띄워줍니다.*/
#include <gl/glut.h>
#include <gl/glu.h>
#include <gl/gl.h>

int MyListID; // Display List를 사용합니다.
GLUquadricObj* qobj = gluNewQuadric(); // 새로운 Quadric 생성합니다.

/*1.처음 윈도우를 열 때
* 2. 윈도우 위치를 옮길 때
* 3. 윈도우 크기를 조정할 때
* Reshape Event를 발생시킵니다.*/
void Reshape(int w, int h) { //w와 h는 각각 변경도니 윈도우의 폭과 높이입니다.
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-2.5, 2.5, -2.5 * (GLfloat)h / (GLfloat)w, 2.5 * (GLfloat)h / (GLfloat)w, -10.0, 10.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

/*빛과 재질과 관련된 설정들을 해줍니다.*/
void MyInit(void) {
    GLfloat mat_ambient[] = { 0.5, 0.4, 0.3, 1.0 }; //주변광
    GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 }; //반사광
    GLfloat mat_shininess[] = { 50.0 }; //선명도
    GLfloat light_position[] = { 0.3, 0.3, 0.5, 0.0 }; //조명 위치
    GLfloat model_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
    glClearColor(1.0, 1.0, 0.0, 0.0); // 배경색을 노란색으로 설정합니다.
}

/*Display List를 생성하는 함수입니다.*/
void MyCreateList()
{
    MyListID = glGenLists(1);//새로운 리스트 생성합니다.

    glNewList(MyListID, GL_COMPILE);//compile만 되는 것으로 설정합니다.

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glRotatef(0, 1.0, 1.0, 0.0);
    glEnable(GL_LIGHTING);
    glShadeModel(GL_SMOOTH);
    gluPartialDisk(qobj, 0.2, 1.6, 50, 50, 0, 60); //시작각도, 각도변위
    gluPartialDisk(qobj, 0.2, 1.6, 50, 50, 120, 60); //시작각도, 각도변위
    gluPartialDisk(qobj, 0.2, 1.6, 50, 50, 240, 60); //시작각도, 각도변위

    glutSwapBuffers();

    glEndList();
}

void MyDisplay()
{
    glClear(GL_COLOR_BUFFER_BIT);//색을 초기화합니다.
    glViewport(50, 50, 500, 500); // 600 * 600 화면의 중앙에 나오도록 view port를 설정합니다.
    glCallList(MyListID);//Dipslay list를 불러옵니다.
    glFlush();
}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB);
    glutInitWindowSize(600, 600);
    glutInitWindowPosition(300, 200); //모니터에서 300, 200 위치에 창이 뜨도록 설정합니다.
    glutCreateWindow("Partial Disk");
    MyInit(); //재질과 빛과 관련된 값을 초기화합니다.
    glutDisplayFunc(MyDisplay); // 화면에 띄워줄 값들을 불러옵니다.
    glutReshapeFunc(Reshape); // 화면의 값들이 변경될 때 이 함수를 불러와서 sphere의 크기를 같이 조정해줍니다.
    MyCreateList();
    glutMainLoop();
    return 0;
}

 

*특징

 - 모든 코드는 Display List를 사용했습니다. 

 - #include하는 gl, glu, glut의 헤더 파일의 위치는 프로그래머마다 조금식 다를 수 있습니다.

 - glu는 Quadric(GLUquadricObj*) 변수를 사용하지만, glut는 Quadric 변수가 필요하지 않습니다.

 - viewport, WindowSize로 Window 창 내의 View를 수정할 수 있습니다.

 - Window가 뜨는 곳의 위치를 바꾸고 싶다면 glutInitWindowPosition의 parameter를 수정해주시면 됩니다.

반응형

+ Recent posts