반응형
프로그래밍/OpenGl
반응형
-
OpenGl 4편 - 3d 모형 반사광 재질 viewport Example2020.09.26
OpenGl 4편 - 3d 모형 반사광 재질 viewport Example
2020. 9. 26. 15:10
반응형
* 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를 수정해주시면 됩니다.
반응형
'프로그래밍 > OpenGl' 카테고리의 다른 글
OpenGl 3편 - 3d 정육면체 그리는 코드 (2) | 2020.09.13 |
---|---|
OpenGl 2편 - 키보드 반응 callback 주기 (0) | 2020.09.13 |
OpenGl 1편 - 화면 위에 여러 점 만들기 (0) | 2020.09.13 |