Программирование на OpenGl, рисование 3D объектов

от автора

Здравствуй дорогой Хабр. Вот наступила пора праздников, и у меня появилось свободное время. Я решил написать статью о программировании на OpenGl. Данная статья больше подойдет для новичков.

Статья будет о программирование 3D объектов. Я постараюсь на примерах показать как нарисовать куб и сферу, при этом используя простую анимацию. И так начнем.

Куб

#include "stdafx.h" #include <GL/glut.h> GLfloat xRotated, yRotated, zRotated; void init(void) { 	glClearColor(0,0,0,0); }  void DrawCube(void) {     glMatrixMode(GL_MODELVIEW);     // очистить буфер рисования.     glClear(GL_COLOR_BUFFER_BIT);     glLoadIdentity();     glTranslatef(0.0,0.0,-10.5);     glRotatef(yRotated,0.0,1.0,0.0); 	glBegin(GL_QUADS);         		glColor3f(0.0f,1.0f,0.0f);    / 		glVertex3f( 1.0f, 1.0f,-1.0f);     		glVertex3f(-1.0f, 1.0f,-1.0f);      		glVertex3f(-1.0f, 1.0f, 1.0f);      		glVertex3f( 1.0f, 1.0f, 1.0f);      		glColor3f(1.0f,0.5f,0.0f);    		glVertex3f( 1.0f,-1.0f, 1.0f);     		glVertex3f(-1.0f,-1.0f, 1.0f);     		glVertex3f(-1.0f,-1.0f,-1.0f);     		glVertex3f( 1.0f,-1.0f,-1.0f);     		glColor3f(1.0f,0.0f,0.0f);       		glVertex3f( 1.0f, 1.0f, 1.0f);     		glVertex3f(-1.0f, 1.0f, 1.0f);     		glVertex3f(-1.0f,-1.0f, 1.0f);     		glVertex3f( 1.0f,-1.0f, 1.0f);     		glColor3f(1.0f,1.0f,0.0f);     		glVertex3f( 1.0f,-1.0f,-1.0f);     		glVertex3f(-1.0f,-1.0f,-1.0f);     		glVertex3f(-1.0f, 1.0f,-1.0f);     		glVertex3f( 1.0f, 1.0f,-1.0f);     		glColor3f(0.0f,0.0f,1.0f);     		glVertex3f(-1.0f, 1.0f, 1.0f);     		glVertex3f(-1.0f, 1.0f,-1.0f);     		glVertex3f(-1.0f,-1.0f,-1.0f);     		glVertex3f(-1.0f,-1.0f, 1.0f);     		glColor3f(1.0f,0.0f,1.0f);     		glVertex3f( 1.0f, 1.0f,-1.0f);     		glVertex3f( 1.0f, 1.0f, 1.0f);     		glVertex3f( 1.0f,-1.0f, 1.0f);     		glVertex3f( 1.0f,-1.0f,-1.0f);     	glEnd();             glFlush(); }   void animation(void) {      yRotated += 0.01;      xRotated += 0.02;      DrawCube(); }  void reshape(int x, int y) {     if (y == 0 || x == 0) return;       // Устанавливаем новую проекционную матрицу     glMatrixMode(GL_PROJECTION);       glLoadIdentity();     // Угол обзора: 40 градусов     // Возле плоскости отсечения расстояние: 0,5     // Дальний отсечения плоскости расстояние: 20,0     gluPerspective(40.0,(GLdouble)x/(GLdouble)y,0.5,20.0);     glMatrixMode(GL_MODELVIEW);     glViewport(0,0,x,y);  // Использование всего окна для rendering }  int main(int argc, char** argv) { 	glutInit(&argc, argv); 	glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); 	glutInitWindowPosition(100, 100); 	glutCreateWindow(argv[0]); 	init(); 	glutDisplayFunc(DrawCube); 	glutReshapeFunc(reshape); 	glutIdleFunc(animation); 	glutMainLoop(); 	return 0; } 

Результат

А теперь пройдемся по некоторым функциям.
glTranslatef( GLfloat x, GLfloat y, GLfloat z ) — перемещает оси координат на указанные значения.
glRotatef( GLfloat angle, GLfloat x, GLfloat y, GLfloat z ) — функция поворота,
где первый аргумент это угол поворота против часовой стрелки, а остальные три показывают относительно
каких осей координат будет производится поворот на заданный угол. В последних 3-х аргументах имеет
значение только знак, абсолютное значение роли не играет.
glScalef( GLfloat x, GLfloat y, GLfloat z ) — команда масштабирования.
glutSolidSphere(GLdouble radius, GLint slices, GLint stacks) — строит сферу.
gluPerspective() — Задание перспективной проекции.

С кубом разобрались, давайте приступим к построению сфери.

Сфера

Начну сразу с кода

#include <Gl/glut.h>  GLfloat xRotated, yRotated, zRotated; GLdouble radius=1;  void redisplayFunc(void) {     glMatrixMode(GL_MODELVIEW);     // очистить буфер рисования.     glClear(GL_COLOR_BUFFER_BIT);     // очистить единичную матрицу     glLoadIdentity();     glTranslatef(0.0,0.0,-4.5);     //  используется для рисования красный цвет     glColor3f(0.8, 0.2, 0.1);         //  поворот по Х     glRotatef(xRotated,1.0,0.0,0.0);     // Поворот по Y      glRotatef(yRotated,0.0,1.0,0.0);     // поворот по Z      glRotatef(zRotated,0.0,0.0,1.0);     // масштабирование      glScalef(1.0,1.0,1.0);     // функция рисования сферы     glutSolidSphere(radius,20,20);     glFlush();            // glutSwapBuffers(); }  void reshapeFunc(int x, int y) {     if (y == 0 || x == 0) return;       // Установлюемо новую проекционную матрицу     glMatrixMode(GL_PROJECTION);       glLoadIdentity();     // Угол обзора: 40 градусов     // Возле плоскости отсечения расстояние: 0,5     // Дальний отсечения плоскости расстояние: 20,0     gluPerspective(40.0,(GLdouble)x/(GLdouble)y,0.5,20.0);     glMatrixMode(GL_MODELVIEW);     glViewport(0,0,x,y);  // Использование всего окна для rendering }  void idleFunc(void) {     yRotated += 0.01;     redisplayFunc(); }  int main (int argc, char **argv) {     glutInit(&argc, argv);     glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);       glutInitWindowSize(400,350);        glutCreateWindow("Сфера");     glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);     xRotated = yRotated = zRotated = 30.0;      xRotated=33;      yRotated=40;     glClearColor(0.0,0.0,0.0,0.0);     glutDisplayFunc(redisplayFunc);     glutReshapeFunc(reshapeFunc);     glutIdleFunc(idleFunc);     glutMainLoop();     return 0; } 

Результат

ссылка на оригинал статьи http://habrahabr.ru/post/164715/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *