Урок 11. Создаем 3D-модель с текстурой (кубик)

Содержание

Слайд 2

Создадим 3D-модель куба, центр которого находится в начале координат, а длина грани

Создадим 3D-модель куба, центр которого находится в начале координат, а длина грани
равна 2 единицам (так проще вычислять координаты всех вершин).

Обход вершин будем делать против часовой стрелки, чтобы грани куба были лицевыми.

Слайд 3

Подготовим текстуру (текстура прикреплена ниже) размером 512х1024 пикселей в формате ВМР (Paint

Подготовим текстуру (текстура прикреплена ниже) размером 512х1024 пикселей в формате ВМР (Paint
вам в помощь). Находим координаты вершин будущей текстуры (опять Paint вам в помощь).

Слайд 4

Приступаем к написанию программы.

#include
#include
#include
#include
#include
#include "glaux.h"
using namespace std;
#pragma

Приступаем к написанию программы. #include #include #include #include #include #include "glaux.h" using
comment (lib,"opengl32.lib")
#pragma comment (lib,"glu32.lib")
#pragma comment (lib, "glaux.lib")
//#pragma comment(lib, "legacy_stdio_definitions.lib")// раскоментировать для версий выше VS12

Слайд 5

GLuint texture[1];// Массив для хранения индексов текстур
//Функция для загрузки текстур
void LoadBMP(GLuint* texture,

GLuint texture[1];// Массив для хранения индексов текстур //Функция для загрузки текстур void
const char* filename)
{
AUX_RGBImageRec* txt;
txt = auxDIBImageLoad(filename);
glGenTextures(1, texture);
glBindTexture(GL_TEXTURE_2D, *texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 3, txt->sizeX, txt->sizeY, 0,
GL_RGB, GL_UNSIGNED_BYTE, txt->data);
delete txt;
}

Слайд 6

void CALLBACK resize(int width,int height)
{
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, (GLfloat)width / height,

void CALLBACK resize(int width,int height) { glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity();
1.0, 1000.0);
gluLookAt( 0,0,10, 0,0,0, 0,1,0 );
glMatrixMode(GL_MODELVIEW);
}

Слайд 7

float tx1=0,ty1=0,tx2=0,ty2=0,tx3=0,ty3=0,tx4=0,ty4=0;// Переменные(глобальные) для хранения текстурных координат(будут вычисляться для каждой грани)
//Функция рисования

float tx1=0,ty1=0,tx2=0,ty2=0,tx3=0,ty3=0,tx4=0,ty4=0;// Переменные(глобальные) для хранения текстурных координат(будут вычисляться для каждой грани) //Функция
грани
void DrawQuadT(float x1, float y1, float z1, float x2, float y2, float z2, float x3, float y3, float z3, float x4, float y4, float z4)
{
glEnable(GL_TEXTURE_2D);//Разрешение на использование текстур
glBindTexture(GL_TEXTURE_2D, texture[0]);//Выбор текстуры
glBegin(GL_QUADS);
glTexCoord2f(tx1, ty1); glVertex3f(x1, y1, z1);
glTexCoord2f(tx2, ty2); glVertex3f(x2, y2, z2);
glTexCoord2f(tx3, ty3); glVertex3f(x3, y3, z3);
glTexCoord2f(tx4, ty4); glVertex3f(x4, y4, z4);
glEnd();
glDisable(GL_TEXTURE_2D);//Запрет на использование текстур
}

Слайд 8

//функция рисования кубика с текстурой
void DrawRubik()
{
//1 – передняя грань
glNormal3d(0,0,1);
tx1 =

//функция рисования кубика с текстурой void DrawRubik() { //1 – передняя грань
335/1024.f;
ty1 = (512-342)/512.f;
tx2 = 506/1024.f;
ty2 = ty1;
tx3 = tx2;
ty3 = (512-170)/512.f;
tx4 = tx1;
ty4 = ty3;
DrawQuadT(-1,-1,1, 1,-1,1, 1,1,1, -1,1,1);

Функция рисования кубика. Каждую грань рисуем отдельно, перед гранью вычисляем текстурные координаты, вектор нормали к поверхности грани. Текстурные координаты и координаты вершин грани обходим против часовой стрелки.

Слайд 9

//2 – левая грань
glNormal3d(-1,0,0);
tx1 = 164/1024.f;
ty1 = (512-342)/512.f;
tx2 = 335/1024.f;
ty2

//2 – левая грань glNormal3d(-1,0,0); tx1 = 164/1024.f; ty1 = (512-342)/512.f; tx2
= ty1;
tx3 = tx2;
ty3 = (512-170)/512.f;
tx4 = tx1;
ty4 = ty3;
DrawQuadT(-1,-1,-1, -1,-1,1, -1,1,1, -1,1,-1);
//3 – правая грань
glNormal3d(1,0,0);
tx1 = 506/1024.f;
ty1 = (512-342)/512.f;
tx2 = 678/1024.f;
ty2 = ty1;
tx3 = tx2;
ty3 = (512-170)/512.f;
tx4 = tx1;
ty4 = ty3;
DrawQuadT(1,-1,1, 1,-1,-1, 1,1,-1, 1,1,1);

Слайд 10

//4 – задняя грань
glNormal3d(0,0,-1);
tx1 = 676/1024.f;
ty1 = (512-342)/512.f;
tx2 = 850/1024.f;
ty2 =

//4 – задняя грань glNormal3d(0,0,-1); tx1 = 676/1024.f; ty1 = (512-342)/512.f; tx2
ty1;
tx3 = tx2;
ty3 = (512-170)/512.f;
tx4 = tx1;
ty4 = ty3;
DrawQuadT(1,-1,-1, -1,-1,-1, -1,1,-1, 1,1,-1);
//5 – верхняя грань
glNormal3d(0,1,0);
tx1 = 335/1024.f;
ty1 = (512-170)/512.f;
tx2 = 506/1024.f;
ty2 = ty1;
tx3 = tx2;
ty3 = 1;
tx4 = tx1;
ty4 = ty3;
DrawQuadT(-1,1,1, 1,1,1, 1,1,-1, -1,1,-1);

Слайд 11

//6 – нижняя грань
glNormal3d(0,-1,0);
tx1 = 335/1024.f;
ty1 = 0;
tx2 = 506/1024.f;
ty2 =

//6 – нижняя грань glNormal3d(0,-1,0); tx1 = 335/1024.f; ty1 = 0; tx2
ty1;
tx3 = tx2;
ty3 = (512-342)/512.f;
tx4 = tx1;
ty4 = ty3;
DrawQuadT(-1,-1,1, 1,-1,1, 1,-1,-1, -1,-1,-1);
}

//Функция Draw рисует вращающийся кубик
void Draw()
{
glLoadIdentity();
glRotated(GetTickCount() % 36000 / 10.f, 1, 1, 1);
DrawRubik();
}
void CALLBACK display(void)
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
Draw();//Вызываем рисование вращающегося кубика в display
auxSwapBuffers();
}

Слайд 12

void main()
{
auxInitPosition( 0, 0, 600, 600);
auxInitDisplayMode( AUX_RGB | AUX_DEPTH |

void main() { auxInitPosition( 0, 0, 600, 600); auxInitDisplayMode( AUX_RGB | AUX_DEPTH
AUX_DOUBLE );
auxInitWindow( "Glaux Template" );
auxReshapeFunc(resize);
auxIdleFunc(display);
glClearColor(0.2f, 0.3f, 0.4f, 0.0f);//Цвет фона окна
glEnable(GL_DEPTH_TEST);
LoadBMP(&texture[0], "rubik.bmp");//Загрузка текстуры
auxMainLoop(display);
}
Имя файла: Урок-11.-Создаем-3D-модель-с-текстурой-(кубик).pptx
Количество просмотров: 28
Количество скачиваний: 0