Статья будет о программирование 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/
Добавить комментарий