Қазақша презентация — OpenGL ортасының анимацияланған кескіндеріндегі синтезделген камераның моделі
OpenGL ортасының анимацияланған кескіндеріндегі синтезделген камераның моделі Қазақша слайд — — презентация
КІРІСПЕ
Ғылыми-техникалық прогресс компьютерлік өнеркәсіптің дамуына үлкен түрткі болды. Компьютерлердің қарқынды дамуы ақпараттық технологияның жаңа бағыты компьютерлік графиканы қолдануға мүмкіндік берді. Компьютерлік графика – бұл компьютерлер көмегімен суреттерді өңдеудің барлық аспектілерін қамтитын информатика облысы. Қазіргі кезде компьютерлік графика программалық қамтамасыз етуде және жалпы компьютерлік жүйелерде стандарт болып табылады.
OpenGL графикалық жүйесі – бұл графикалық құрылғыларға арналған программалық интерфейс. Ол қозғалатын объектілерді екі өлшемді және үш өлшемді кеңістікте бейнелейтін интерактивті қосымшаны өңдеуге мүмкіндік береді.
Берілген жұмыс компьютерлік графикадағы шыншыл суреттерді жасауға арналған. Графикалық редакторда шыншыл суреттерді жасау үшін сол сурет пішінін құру керек және текстура объектісіне дұрыс жарық түсіруді қамтамасыз ету керек. Динамикалық суреттерді жасау жайындағы объектінің интерактивті режимін және де артқы жағынан объектіні қарағанда қозғалатын камералар сахнасының пішінін жасау керек.
OpenGL-дің қысқаша артықшылықтарын атап көрсетуге болады:
Түрлік және модельдік түрлендірулер;
Геометриялық және растрлық примитивтер;
Безье қисықтарын қолдану;
Түспен жұмыс жасау;
Камерамен жұмыс;
Текстура салу;
Жарықтандыру;
Атмосфералық эффектілер;
Көп адамдар 3D әлемін камерадан қарайтын кеңістік ретінде танып біледі. Бірақ OpenGLда шынайы камера жоқ болып саналады. Қозғалыс иллюзиясы үшін (0,0,0) нүктесіне қатысты кинодағыдай камера емес, объекттер жылжиды.
Бұндай процесс қиын көрінуі мүмкін, бірақ бұл қиын емес. Қосымшадан тәуелді бұл есепті шешудің көптеген жолдары бар. Шынайы үлкен әлемдер үшін оптимизациялар одан да көп.
ОБЪЕКТ ЖӘНЕ БАҚЫЛАУШЫ
Компьютермен қалыптастырылған бейне өзіңің табиғаты жағынан жасанды синтезделген болып келеді, сондықтан ол көбінесе физикалық жағынан жоқ болып табылады.
Бейнелерді құру процесінде – физикалық немесе формалдық (математикалық) – екі маңызды тұлға қатысады: объект және бақылаушы.
. Объект кеңістікте бейненің жасалу процесінен тәуелсіз бар болады. Компьютерлік графикада біз нақты физикалық объектімен емес, қиялдағы, синтезделген компьютерлік бағдарламамен жұмыс істейміз. Мұндай қиялдағы объект кеңістікте әр түрлі геометриялық примитивтер — нүкте, кесінділер және көпбұрыштардың орналасу спецификациясы арқылы қалыптасады. Көптеген графикалық жүйелерде объекттерді суреттеуге немесе аппроксимациялауға арналған кеңістікте өте көп нүктелердің суреттелуі бар, мысалы, шыңдар (vertices).
Бір сахнаны үш әртүрлі бақылаушының қалай көретіндігі: а – бақылаушы А; б – бақылаушы В; в – бақылаушы С;
Мына суретте фотокамера пленкасында ғимарат бейнесінің қалыптасуы көрсетілген. Бірақ бақылаушы және бақыланушы объект сол бір үш өлшемді әлемде болғанымен, пленка жазықтығандағы пайда болған бейне екі өлшемді болып табылады. Бейненің құрылу процесінің мәні: бақылаушының және объекттің орнын (сипаттамасын) біле отырып, пайда болған екі өлшемді бейнені сипаттау.
Фотокамерада бейненің құрылуы
Объекттің кез-келген бір нүктесінің бейнесін құру үшін біз осы нүктеден объектив центріне проециалайтын сәуле жүргіземіз. Назар аударыңыз, барлық проециаланатын сәулелер проециалау центріне жинақталады. Біздің синтезделген камерамызда объектив алдына жылжытып орналастырылған светоприемник жазықтығы — суреттік жазықтық немесе проекция жазықтығы (projection plane) деп аталады.
Синтезделген камера
Кесу рамкасы: а — рамканың алдыңғы орны; б – рамка жылжыған;
Қолданбалы программалар интерфейсі
Қолданбалы программа және графикалық жүйе арасындағы интерфейс бұл — жиынтықта графикалық кітапхананы құрайтын функциялардың жиыны. Бұл функциялардың қызметі біз атайтындай қолданбалы программалар интерфейсі (АРІ- application programmer ‘ s interface ).
Синтезделген камераның концепция пішініне ерсек, онда АРІ негізінде төмендегілерді сипаттайтын функциялар болу керек:
Объектілер;
Бақылаушы;
Жарық көздері;
Объекті материалдарының қасиеттері;
Камерада ол арқылы құрылатын бейнені суреттейтін төрт түрлі параметрлері бар:
1. Камераның орналасуы проекция центрінің орналасуымен беріледі.
2. Бағдарлау. Проекция центрін кеңістіктің айқын нүктесіне орналастырып, камераның бастапқы жергілікті координаталар жүйесімен сәйкестендіріп, осындай жолмен объективтің бағдарын өзгерте отырып айналдыруға болады.
3. Камера объективінің фокустік ара-қашықтығы проекция жазықтығында бейнені нақты анықтайды.
4. Светоприемник жазықтығы. Камераның артқы қабырғасы биіктігінде және енінде ақырғы мөлшерлерге ие. Кейбір АРІ светоприемник жазықтығының бағдарын объектив бағдарынан тәуелсіз дем беруге рұқсат береді.
КАМЕРАНЫ ОРНАЛАСТЫРУ
Фрейм (англ. frame — кадр, рамка) —жалпы жағдайда қандайда бір ақпаратты сақтайтын структура.
OpenGL-дың үшөлшемді объектілерді бейнелеуді қолдайтын қандай функциялар бар екенін қарасырайық. Біз сонымен қатар осындай тәсілдердің басқа графикалық жүйелерден қаншалықты айырмашылығы бар екенін көреміз. Бұл бөлімде камера орналасу тәсілдерін пішіндеу туралы айтамыз. OpenGL да түр матрицалары және проециалаулар көбейтіледі және барлық геометриялық объекттердің шыңдарына қолданылатын түрлендіру бірлік матрицасы пайда болады.
Камера фреймін жүлдемелеу
Үндеусіз OpenGL камераны әлемдік фреймның координаталар басына орналастырады, және де проециалаушы осі әлемдік фреймнің z осіне қарама-қарсы бағытталады. Көптеген қосымшаларда пішіндеу барысында объекттер координаттар басының төңірегінде орналасады, демек, камера орналасуының бастапқы моментінде сахнаның барлық объектілерін көрмейді. Осылайша, барлық объектілер камераның көру облысына түсу үшін оны қалайда жылжыту керек, немесе объектілерді камераның алдына кеп тұратындай қылып жылжыту. Мұның программалық мәні — эквиваленттік операциялар.
Пішіндеу барысында құрылған сахна бірлік түр матрицасына ие деп есептеуге болады, және оның барлық шындарын glVertex() функциясы арқылы беруге болады. Түр матрицасының кейінгі өзгертулері әлемдік фреймді камераға қатысты жылжытады, осылайша ақыр аяғында камерада көрінуіне ықпал етеді, себебі шыңдар өзгертілген әлемдік фреймге қатысты берілген.
Камераның алғащқы орны
Алдымен түр матрицасында бұрылыс пен жылжулар жанама тізбегі арқылы камера орналасуын береміз.
Центрі координаталар басында орналасатын объектті қарастырайық. Камера бастапқы орнында — координаталар басында орналасқан, ал оның оптикалық осі z теріс жарты осі бойымен бағытталған. Бізге оң х жарты осі жағынан көрінетін объекттің жазықтығын көру керек болсын. Демек, камераны координаталар басынан жылжыту керек. Егер камераның ориентациясын өзгертпейтін болсақ, онда оны оң z жарты осімен жылжыту керек. Сәйкес түрлендірулер glTranslatef (0.0,0.0,- d) функциясы арқылы жүзеге асады. Мұндағы d — оң сан.
Компьютерлік графикада басқа әдістеме кең тараған — объект бекітілген фреймде орнатылған деп есептеледі, ал бақылаушы лайық ракурсты іздеп, оның айналасында жүгіреді. Визуализация концептулды былай орындалады: біз объектті аламыз, бізге қалай қажет солай бағдарлаймыз да керекті орынға жылжытып қоямыз.
Енді бұл объектке х оң жарты осі жағынан қалай қарау керектігін қарастырайық. Ол үшін камераны объекттен алшақтату ғана жеткіліксіз, оны суретте көрсетілгендей у осі бойынша бұру қажет.Жылжытуды у осі бойынша 90 градусқа айналдырғаннан кейін барып орындаған жөн. Программа кодында мұндай функциялардың шақырылуы кері ретте жүргізілуі қажет. Сондықтан программаның сәйкес бөлігі мынадай болып көрінеді:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0,0.0,-d);
glRotatef(-90.0,0.0,1.0,0.0);
ПРОЕЦИАЛАУ
OpenGLда проециалаудың бірнеше түрі бар, солардың негізгілері мыналар:
Перспективтік – шыншылға жақын
Ортогональдық – экранға тікелей қатысты, оның шындық өлшемін есептемегенде. Бұл жай чертеждік проекция болуы мүмкін.
Перспективтік проекциялар
Ортогональдық проекция
Ортогональдық проекция – бұл параллельдік проекцияның дара түрі. Бұл жағдайда проециаланатын сәулелер суреттің жазықтағына ортогональді. Ортогональдік проекция объективінің өте үлкен фокустық аралығы бар камераларда пайда болатынын үлкен дәлдікпен айтуға болады. Бұл жағдайда камераның суреттік жазықтығы оның объективінің оптикалық осіне ортогональді.
Суретте z=0 суреттік жазықтығына ортогональдік проекция көрсетілген. Нүктенің бұл жазықтыққа проециалаған кезде оның х және у компоненттерінің мәндері сақталады, ал проециалау теңдеулері енді мынадай түрге келеді:
xp=x, yp=y, zp=0;
Ортогональдік проекциалар
Шешімін біртекті координаталардың матрицасы түрінде жазайық:
Жай жағдайларға пайда болған нәтижелерді ортақ түрдегі перспективтік және параллельдік проециаларға дейін жылжу мен бұрылу түрлендірулерінің тізбкетерін қосу арқылы кеңейтуге болады.
ПРАКТИКАЛЫҚ БӨЛІМ
3D әлемінің басты проблемасы – бұл екі өлшемді экран жазықтығына үшөлшемді объекттерді сәйкес конвертация жасау. Ол үшін келесі басты операциялар орындалады.
Transformations – олар multiplication түрінде келтірілген:
modeling, viewing, projection operations, және де rotation, translation, scaling, reflecting, orthographic projection,
Клиппинг – яғни, монитор шекарасына түспейтін объекттерді немесе олардың бөліктерін қиып алу.
Түрлендірілген 2D координаталар пайда болғаннан кейін оларды экрандық координаталарға сәйкес келтіру керек, яғни viewport transformation жасау керек.
Transformation процесі камерадан сурет алу процесіне пара-пар. Камера келесі операцияларды жүзеге асырады:
Камера орнатамыз – viewing transformation.
Сахна жасаймыз – modeling transformation.
Камера линзасын дұрыстаймыз — projection transformation.
Сурет өлшемін таңдаймыз — viewport transformation
Алдымен 4х4 М матрицасын инициализация жасаймыз. Оны кейін сахнаның әр шыңына көбейтеміз. Әр шыңның 4 координатасы бар (x, y, z, w) , мұнда w=1 и z=0 . Әр фреймнен кейін glLoadIdentity() шақырылады.
Берілген бөлімде OpenGL проект жасаудың программалық коды кезеңдеп басылған. Басынан бастап Visual C++ жобасын жасаған жөн, ол үшін келесі әрекетті жасайды:
MSVisualC++6.0 іске қосу.
File-> New-> Win32 Console Application мәзірін басу
Жоба каталогы мен атын таңдау, ОК басу
An Empty Project таңдап, Finish басу.
MSVisualC++ жаңа Win32 қосымшасын жасаған соң, жобаны жинақтау үшін OpenGL кітапханасын қосқан жөн. Project/Settings менюында, LINK белгілемесін тандаңыз. “Object/Library Modules” жолағында “OpenGL32.lib Glu32.lib GLaux.lib” қосыңыз. Кейін ОК басыңыз. OpenGL программасын жасауға бәрі де дайын.
Шолу камерасы операцияларын инициализациялау
Шолу камерасының класс анықтамасы екі бөлікке бөлінген, олардың әрбіреуі жеке файлда сақталады: тақырып файлында класс қолдайтын операциялардың сипатталуы болады; ал бағдарлама мәтіні болатын файлда бұл операциялардың жүзеге асырылуы сақталады.
Алдымен, файлындағы операцияларды сипаттаймыз. Тақырыптық файл құрамыз, ол үшін келесі әрекеттерді орындау керек:
Project->Add To Project->New . . . мәзірін шерту
Тізімнен С/С++ Header File таңдау
Файл атауын таңдап, ОК басыңыз.
Бұл операциялардың барлығын орындап, жобаға camera.h файлын қосамыз. Қосу кілттерін қосамыз, олар тақырыптық файлдарының қайта қосылуын болдырмау үшін тағайындалған.
#ifndef_CAMERA_H
#define_CAMERA_H
Кейін OpenGL-дың стандартты кітапханаларын қосамыз.
#include<windows.h>
#include<glgl.h>
#include<glglu.h>
#include<glglut.h>
Бұл кітапханаларды қосу керек, себебі GL* типтес кітапхана бұл жерде тиімді.
Кодтың келесі секциясы typedef көмігімен мәліметтер типінің құрамды жаңа атауын құрады, бірақ бұл мәліметтердің жаңа типінің пайда болуына әкелмейді. Struct кілтті сөзі құрылымның сипаттамасын береді. Құрылым – бұл басқа типтерді қолдана отырып, құрылған мәліметтердің құрамды типтері. SF3dVector идентификаторы – құрылым тегі (белгіленуі, атауы-этикетка). Құрылым тегі берілген типтің айнымалы құрылымын жариалау кезінде қолданылады.
typedef struct SF3dVector
{
Кодтың берілген секциясында GLfloat типінің x, y, z айнымалылары сипатталады, олар үшөлшемді кеңістікте вектор координаттары болып келеді.
GLfloat x, y, z;
};
Камера класын жүзеге асыру class кілтті сөзінен басталады, оның артынан класс атауы, оны CCamera деп анықтайық. Классты анықтау, оны хабарлау, және одан кейіңгі класс денесі жақшаға алынып, соңына нүктелі үтір қойылады. Класс денесіндегі public және private кілтті сөздері класс мүшелеріне рұқсатты басқару үшін қолданылады. рublic (жаңалық) сияқты анықталған мүшелер программаның кез-келген жерінен алынады.
class CCamera
{
private:
SF3dVector Position;
SF3dVector ViewDir; // камераны беру ұшін қолданылмайды, «moveforwards« үшін //қолданылады. Сондықтан оны әрқашан шақырудың қажеті жоқ.Оны тек ViewDirChanged //ақиқат шақырылған кезде ғана қолдану
bool ViewDirChanged;
GLfloat RotatedX, RotatedY, RotatedZ;
void GetViewDir ( void );
public:
//мәндері (орны (0 | 0 | 0) мәні: (0 | 0 | -1))
//кейбір glRotates және glTranslate командалары орындалады
CCamera();
void Render ( void );// бұны шақырғанның алдында glLoadIdientyti() шықыру керек
void Move ( SF3dVector Direction );
void RotateX ( GLfloat Angle );
void RotateY ( GLfloat Angle );
void RotateZ ( GLfloat Angle );
void RotateXYZ ( SF3dVector Angles );
void MoveForwards ( GLfloat Distance );
void StrafeRight ( GLfloat Distance );
};
Шолу камерасы операцияларын жүзеге асыру
Класс хабарламасын тақырыптық файлға, классты қолдана алатын кез-келген клиентке оңай тиетін тақырыптық файлға орналастырамыз. Бұл кластың ашық интерфейсін құрастырады. Функция – элементтердің анықтамаларын ағымдағы файлға орналастырамыз, соның нәтижесінде класс жасалуын аламыз. Енді camera.cpp файлындағы класс операцияларының жасалуын сипаттаймыз. Класс анықтамасымен берілген тақырыптық файлды қосамыз.
#include “camera.h”
#include <math.h>
#include <iostream.h>
#include <windows.h>
Келесі код мәліметтердің құрылған құрамды типі сияқты элемент-функцияға ие (атаулары бірдей). Ол конструктор деп аталады. Конструктор – берілген мәліметтер типі объектісінің берілім-элементтерінің құратын арнайы функция-элемент. Конструктор автоматты түрде шақырылады, мәндері берілген мәліметтер типінің объектісін анықтағанда беріледі. Конструкторды қайта жасауға болады. Бірінші жазба конструкторды берілген мән бойынша жасайды, ал екіншісі – үшаргументті конструктор болып келеді.
CCamera::CCamera()
Біздің орналасудың векторын ноьдік координаталарға инициализация жасаймыз:
{
Position = F3dVector ( 0.0, 0.0,0.0);
ViewDir = F3dVector( 0.0,0.0,-1.0);
ViewDirChanged = false;
RotatedX = RotatedY = RotatedZ = 0.0;
}
Камераның орналасуын, қарау бұрышын орнатамыз
SF3dVector Step1, Step2;
//у бойынша айналдырамыз
Step1.x = cos( (RotatedY + 90.0) * PIdiv180);
Step1.z = -sin( (RotatedY + 90.0) * PIdiv180);
// у бойынша айналдырамыз
double cosX = cos (RotatedX * PIdiv180);
Step2.x = Step1.x * cosX;
Step2.z = Step1.z * cosX;
Step2.y = sin(RotatedX * PIdiv180);
//z бойынша айналдыру әлі де болған жоқ сондықтан:
ViewDir = Step2;
Камераның жылжуы:
void CCamera::Move (SF3dVector Direction)
{
AddF3dVectorToVector(&Position, &Direction );
}
void CCamera::MoveForwards( GLfloat Distance )
{
if (ViewDirChanged) GetViewDir();
SF3dVector MoveVector;
MoveVector.x = ViewDir.x * -Distance;
MoveVector.y = ViewDir.y * -Distance;
MoveVector.z = ViewDir.z * -Distance;
AddF3dVectorToVector(&Position, &MoveVector );
}
void CCamera::StrafeRight ( GLfloat Distance )
{
if (ViewDirChanged) GetViewDir();
SF3dVector MoveVector;
MoveVector.z = -ViewDir.x * -Distance;
MoveVector.y = 0.0;
MoveVector.x = ViewDir.z * -Distance;
AddF3dVectorToVector(&Position, &MoveVector );
}
Объекттің реалистігін жоғарлату үшін жарық көздерін қосу, материал, текстура секілді қосымша әдістер қолданылған.
static GLfloat MatSpec[] = {1.0,1.0,1.0,1.0};
Материал сапасы
static GLfloat MatShininess[] = {45.0};
Материал шағылыстырылуы
static GLfloat LightPos[] = {-2.0,1.5,1.0,0.0};
Жарық көзінің орны
glLightfv(GL_LIGHT0,GL_POSITION,LightPos);
Жарық позициясы
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, MatSpec);
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, MatShininess);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ModelAmb); жарық көзі мен материалдың қасиеттері
Интерактивтілік эдементтері қосылған. Біз камераны клавиатура және тышқан көмегі арқылы жылжыта аламыз.
w : алға
s : артқа
a : солға бұрылу
d : оңға бұрылу
x : жоғары
y : төмен
v : оңға жылжу
c : солға жылжу
r : жоғары жылжу
f : төмен жылжу
void KeyDown(unsigned char key, int x, int y)
{
switch(key)
{
case 27:
exit(0);
break;
case ‘a’:
Camera.RotateY(5.0);
Display();
break;
case ‘d’:
Camera.RotateY(-5.0);
Display();
break;
case ‘w’:
Camera.MoveForwards( -0.3 ) ;
Display();
break;
case ‘s’:
Camera.MoveForwards( 0.3 ) ;
Display();
break;
case ‘x’:
Camera.RotateX(5.0);
Display();
break;
case ‘y’:
Camera.RotateX(-5.0);
Display();
break;
case ‘c’:
Camera.StrafeRight(-0.3);
Display();
break;
case ‘v’:
Camera.StrafeRight(0.3);
Display();
break;
case ‘f’:
Camera.Move(F3dVector(0.0,-0.3,0.0));
Display();
break;
case ‘r’:
Camera.Move(F3dVector(0.0,0.3,0.0));
Display();
break;
}
}
void mouse(int btn, int state, int x, int y)
{
if(btn==GLUT_LEFT_BUTTON && state==GLUT_DOWN) Camera.RotateY(5.0);
if(btn==GLUT_MIDDLE_BUTTON && state==GLUT_DOWN) Camera.MoveForwards( -0.3 ) ;
if(btn==GLUT_RIGHT_BUTTON && state==GLUT_DOWN) Camera.RotateY(-5.0);
display();
}
Сахнаның алдынан қарағандағы көрініс
Сахна ішінің көрінісі
Жанынан қарағандағы көрініс
Үстінен қарағандағы көрініс
Назар салып тыңдағандарыңызға РАХМЕТ!!!