Ćwiczenie nr 1 Szkielet aplikacji wykorzystującej bibliotekę OpenGL dla środowiska Windows z wykorzystaniem Visual C++



Podobne dokumenty
Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Temat: Wprowadzenie do OpenGL i GLUT

Zegary. Zegary (timers) umożliwiają cykliczne w danych odstępach czasu wykonać określone operacje.

Janusz Ganczarski. OpenGL Pierwszy program

Tworzenie projektu asemblerowego dla środowiska Visual Studio 2008.

Programowanie Równoległe wykład, CUDA, przykłady praktyczne 1. Maciej Matyka Instytut Fizyki Teoretycznej

Temat: Transformacje 3D

Podstawowy projekt OpenGL utworzony przy użyciu środowisk programistycznych firmy Microsoft.

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

GRAFIKA CZASU RZECZYWISTEGO Wprowadzenie do OpenGL

Microsoft Foundation Classes

OpenGL - charakterystyka

GRAFIKA CZASU RZECZYWISTEGO Wstęp do programowania grafiki czasu rzeczywistego.

Politechnika Gdańska Wydział Elektrotechniki i Automatyki Katedra Inżynierii Systemów Sterowania

IFiZR Laboratorium 5 Info

Podstawy wykorzystania bibliotek DLL w skryptach oprogramowania InTouch

Politechnika Gdańska Katedra Optoelektroniki i Systemów Elektronicznych

Wprowadzenie do klas w C++ oraz biblioteki opengl

Wprowadzenie do programowania z wykorzystaniem biblioteki OpenGL. Dorota Smorawa

Podłączanie bibliotek Zapis danych do pliku graficznego Generowanie promienia pierwotnego Import sceny z pliku Algorytm ray tracingu

Prosty program- cpp. #include <GL/glut.h>

Laboratorium Grafiki Komputerowej i Animacji. Ćwiczenie III. Biblioteka OpenGL - wprowadzenie, obiekty trójwymiarowe: punkty, linie, wielokąty

Pobieranie argumentów wiersza polecenia

The Graphics View Framework. Oprogramowanie i wykorzystanie stacji roboczych. Wykład 5. he Graphics View Framework - architektura

SFML. (Simple and Fast Multimedia Library)

Projektowanie i programowanie aplikacji biznesowych. Wykład 2

Modelowanie numeryczne w fizyce atmosfery Ćwiczenia 3

Fizyka laboratorium 1

Wykład 12. Wprowadzenie do malarstwa, str. 1 OpenGL Open Graphics Library. OpenGL składa się z

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

Co to jest OpenGL? Oprogramowanie i wykorzystanie stacji roboczych. Wykład 5. OpenGL - Achitektura. OpenGL - zalety. olas@icis.pcz.

Oprogramowanie i wykorzystanie stacji roboczych. Wykład 5

I - Microsoft Visual Studio C++

Programowanie 2. Język C++. Wykład 1.

Politechnika Gdańska Katedra Optoelektroniki i Systemów Elektronicznych

Wykład 12. Wprowadzenie do malarstwa, str. 1 OpenGL Open Graphics Library. OpenGL składa się z

Ćwiczenia 2 IBM DB2 Data Studio

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Sieciowa komunikacja procesów - XDR i RPC

Janusz Ganczarski. OpenGL Definiowanie sceny 3D

Wykład. Materiały bazują częściowo na slajdach Marata Dukhana

Ćwiczenia laboratoryjne. Oprogramowanie i badanie prostych metod sortowania w tablicach

Wykład :37 PP2_W9

Programowanie obiektowe

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Wykład 5 Okna MDI i SDI, dziedziczenie

Wstęp do programowania

Instrukcja laboratoryjna cz.3

Wykład IX. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

OpenGL model oświetlenia

Projektowanie klas c.d. Projektowanie klas przykład

Microsoft IT Academy kurs programowania

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

Przekształcenia geometryczne. Dorota Smorawa

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Wykład 12. Programowanie serwera MS SQL 2005 w C#

Programowanie obiektowe

Szybkie tworzenie grafiki w GcIde

Programowanie proceduralne w języku C++ Podstawy

Wybieramy File->New->Project Wybieramy aplikację MFC->MFC Application jak na rysunku poniżej:

Zaawansowane aplikacje WWW - laboratorium

Praca w środowisku Visual Studio 2008, Visual C

JAVA W SUPER EXPRESOWEJ PIGUŁCE

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Komputerowe systemy na rynkach finansowych. wykład 5. MQL4 - funkcje operujące na obiektach wykresu

Rzutowanie DOROTA SMORAWA

Zofia Kruczkiewicz, ETE8305_2 1

Druga aplikacja Prymitywy, alpha blending, obracanie bitmap oraz mały zestaw przydatnych funkcji wyświetlających własnej roboty.

Krótkie wprowadzenie do korzystania z OpenSSL

Laboratorium grafiki komputerowej i animacji. Ćwiczenie V - Biblioteka OpenGL - oświetlenie sceny

Wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

Laboratorium 1. Część I. Podstawy biblioteki graficznej OpenGL.

Materiał uzupełniający do ćwiczen z przedmiotu: Programowanie w C ++ - ćwiczenia na wskaźnikach

Signals + Threads: Qt vs. Boost

Aplikacja Sieciowa. Najpierw tworzymy nowy projekt, tym razem pracować będziemy w konsoli, a zatem: File->New- >Project

Projektowanie aplikacji internetowych laboratorium

Rysowanie punktów na powierzchni graficznej

Podstawy programowania w języku C dla środowiska Windows

Ekspert radzi. mechanizm w enova, umożliwiający wskazanie domyślnej drukarki dla danego stanowiska i wydruku. Strona 1 z 8. Ekspert radzi.

Wdrożenie modułu płatności eservice. dla systemu Zen Cart

C# /.NET. Copyright by 3bird Projects 2018,

- dodaj obiekt tekstowy: /** Maciej */ Stage { title : "First JavaFX App" scene: Scene { width: 300 height: 300 content: [ ] } }

Rozdział 3. Zapisywanie stanu aplikacji w ustawieniach lokalnych

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Wstęp do Programowania, laboratorium 02

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

Programowanie obiektowe

Bufor koloru cd. Czyszczenie bufora koloru glclearcolor( )

FAQ: /PL Data: 3/07/2013 Konfiguracja współpracy programów PC Access i Microsoft Excel ze sterownikiem S7-1200

Pomoc do programu konfiguracyjnego RFID-CS27-Reader User Guide of setup software RFID-CS27-Reader

Zaawansowane programowanie w C++

Programowanie Proceduralne

Programowanie I C / C++ laboratorium 01 Organizacja zajęć

1.1. Programowanie w Visual C++ Programowanie w Visual C++ Środowisko programisty Visual C++ Środowisko programisty Visual C++

Programowanie Proceduralne

Programowanie Komputerów

Grafika 3D OpenGL część II

Programowanie RAD Delphi

Transkrypt:

Terminy oddawania ćwiczeń: Ćwiczenie nr 1 Szkielet aplikacji wykorzystującej bibliotekę OpenGL dla środowiska Windows z wykorzystaniem Visual C++ Podstawowe zasady: Wszystkie wątki wykorzystują jeden OpenGL Rendering Context (hrc) <->GDI Device Context (hdc) Wiele RC może wykorzystywać w jednym oknie Tylko jeden RC może być aktywny w jednym wątku Sposób rysowania w MFC: Ustawić windows pixel format Utwórz RC Ustaw RC jako bieżący Tworzenie aplikacji w środowisku Microsoft Visual C++/MFC 1 (na podstawie [1]): 1) Utworzyć nowy project "MFC AppWizard (exe)"; nazwa projektu: Ex1 Microsoft Visual Studio ver. 6.0 Microsoft Visual Studio 2005 File->New->Project: Visual C++->MFC->MFC Applicatio, Name: Ex1, Solution Name: Ex1 2) Opcje kompilatora: Microsoft Visual Studio ver. 6.0 Microsoft Visual Studio 2005 Single Document Interface, Single Document Interface, Database support: None MFC Standard, Compond Document Support: None MFC In a static library lub MFC In a shared Docking Toolbar: OFF (optional) DLL, Initial Status Bar: OFF (optional) Compound document support: None Printing an Print Preview: OFF Database support: None Context-Sensitive Help: OFF (optional) Initial Status Bar: OFF (optional) 3D Controls: ON (optional) Toolbars: None Use the MFC Standard style of project Context-sensitive Help: None Generate Source File Comments: Yes ActiveX controls: None Use the MFC library as a shared DLL. 3) Opcje linkera Microsoft Visual Studio ver. 6.0 Microsoft Visual Studio 2005 Project-Settings->Link->General-> Object/Library Modules: opengl32.lib glu32.lib glaux.lib Project->Properties: Linker->Input->Additional dependencies: opengl32.lib glu32.lib glaux.lib 4) zmiany w pliku "stdafx.h" #define VC_EXTRALEAN Exclude rarely-used stuff from Windows headers #include <afxwin.h> MFC core and standard components 1 Przykłady tworzenia aplikacji w innych środowiskach mogą być wykorzystane: GLX dla X Windows w [5], [7], Linux [9]; WGL- dla Windows 9x/NT/..., patrz MSDN; PGL dla IBM OS/2 WARP [8]; GLUT inne [4]; MESA dla środowiska Java.

#include <afxext.h> MFC extensions #include <gl\gl.h> #include <gl\glu.h> #include <gl\glaux.h> #pragma comment(lib,opengl32.lib) zamiast pkt.3 (w niektórych implementacjach) #pragma comment(lib,glu32.lib) zamiast pkt.3 (w niektórych implementacjach) #ifndef _AFX_NO_AFXCMN_SUPPORT #include <afxcmn.h> MFC support for Windows 95 Common Controls #endif _AFX_NO_AFXCMN_SUPPORT 5) Zmiany w klasie BOOL CEx1View::PreCreateWindow(CREATESTRUCT& cs){ cs.style = (WS_CLIPCHILDREN WS_CLIPSIBLINGS); return CView::PreCreateWindow(cs); 6) Nowa metoda (tekst pogrubiony nowy tekst do samodzielnego wprowadzenia lub korekty): BOOL CEx1View::SetWindowPixelFormat(HDC hdc){ PIXELFORMATDESCRIPTOR pixeldesc; pixeldesc.nsize = sizeof(pixelformatdescriptor); pixeldesc.nversion = 1; pixeldesc.dwflags = PFD_DRAW_TO_WINDOW PFD_DRAW_TO_BITMAP PFD_SUPPORT_OPENGL PFD_SUPPORT_GDI PFD_STEREO_DONTCARE; pixeldesc.ipixeltype = PFD_TYPE_RGBA; pixeldesc.ccolorbits = 32; pixeldesc.credbits = 8; pixeldesc.credshift = 16; pixeldesc.cgreenbits = 8; pixeldesc.cgreenshift = 8; pixeldesc.cbluebits = 8; pixeldesc.cblueshift = 0; pixeldesc.calphabits = 0; pixeldesc.calphashift = 0; pixeldesc.caccumbits = 64; pixeldesc.caccumredbits = 16; pixeldesc.caccumgreenbits = 16; pixeldesc.caccumbluebits = 16; pixeldesc.caccumalphabits = 0; pixeldesc.cdepthbits = 32; pixeldesc.cstencilbits = 8; pixeldesc.cauxbuffers = 0; pixeldesc.ilayertype = PFD_MAIN_PLANE; pixeldesc.breserved = 0; pixeldesc.dwlayermask = 0; pixeldesc.dwvisiblemask = 0; pixeldesc.dwdamagemask = 0; m_glpixelindex = ChoosePixelFormat( hdc, &pixeldesc); if (m_glpixelindex==0){ Let's choose a default index. m_glpixelindex = 1; if (DescribePixelFormat(hDC, m_glpixelindex, sizeof(pixelformatdescriptor), &pixeldesc)==0) return FALSE; if (SetPixelFormat( hdc, m_glpixelindex, &pixeldesc)==false) return FALSE; return TRUE; 7) Nowe zmienne klasy view int m_glpixelindex; protected

HGLRC m_hglcontext; protected 8) WM_CREATE (tego typu opis oznacza utworzenie metody przechwytującej zdarzenie/komunikat WM_CREATE przez klasę CEx1View: VC6.0 class wizard, VC2005 i nowsze domyślnie ukryte okienko po prawej stronie edytowanego tekstu). int CEx1View::OnCreate(LPCREATESTRUCT lpcreatestruct){ if (CView::OnCreate(lpCreateStruct) == -1) return -1; HWND hwnd = GetSafeHwnd(); HDC hdc = ::GetDC(hWnd); if (SetWindowPixelFormat(hDC)==FALSE) return 0; return 0; 9) Nowa metoda BOOL CEx1View::CreateViewGLContext(HDC hdc){ m_hglcontext = wglcreatecontext(hdc); if (m_hglcontext == NULL) return FALSE; if (wglmakecurrent(hdc, m_hglcontext)==false) return FALSE; return TRUE; 10) WM_CREATE int CEx1View::OnCreate(LPCREATESTRUCT lpcreatestruct){ if (CView::OnCreate(lpCreateStruct) == -1) return -1; HWND hwnd = GetSafeHwnd(); HDC hdc = ::GetDC(hWnd); if (SetWindowPixelFormat(hDC)==FALSE) return 0; if (CreateViewGLContext(hDC)==FALSE) return 0; return 0; 11) WM_DESTROY void CEx1View::OnDestroy(){ if (wglgetcurrentcontext()!=null) make the rendering context not current wglmakecurrent(null, NULL) ; if (m_hglcontext!=null){ wgldeletecontext(m_hglcontext); m_hglcontext = NULL; Now the associated DC can be released. CView::OnDestroy(); 12) Modyfikacja konstruktora klasy View CEx1View::CEx1View(){ m_hglcontext = NULL;

m_glpixelindex = 0; I. Sprawdź i przeanalizuj działanie programu. 13a) WM_SIZE void CEx1View::OnSize(UINT ntype, int cx, int cy){ CView::OnSize(nType, cx, cy); GLsizei width, height; GLdouble aspect; width = cx; height = cy; if (cy==0) aspect = (GLdouble)width; else aspect = (GLdouble)width/(GLdouble)height; glviewport(0, 0, width, height);poczatek u.ws. lewy gorny rog glviewport(width/4, height/4, width/2, height/2); glmatrixmode(gl_projection);nast pne 2 wiersze b d modyfikowały m. PROJECTION glloadidentity();inicjalizacja gluortho2d(0.0, 500.0*aspect, 0.0, 500.0); glmatrixmode(gl_modelview); Nast pny wiersz b dzie modyfikował m. MODELVIEW glloadidentity(); 14a) WM_PAINT void CEx1View::OnPaint(){ CPaintDC dc(this); device context for painting (added by ClassWizard) Wyswietlana scena - poczatek glloadidentity(); glclear(gl_color_buffer_bit); zmiana stanu OpenGL a Kodowanie składowych: red, green, blue, alpha; 0...1;0-ciemne odcienie glcolor4f(1.0f, 0.0f, 0.0f, 1.0f);Red; glvertex2f(100.0f, 50.0f); glcolor4f(0.0f, 1.0f, 0.0f, 1.0f);Green glvertex2f(450.0f, 400.0f); glcolor4f(0.0f, 0.0f, 1.0f, 1.0f);Blue glvertex2f(450.0f, 50.0f); Wyswietlana scena - koniec glflush();start processing buffered OpenGL routines II. Sprawdź i przeanalizuj działanie programu. Uwaga podobny szkielet programu będzie wykorzystywany w następnych ćwiczeniach. 13b) WMPAINT void CEx1View::OnPaint(){ CPaintDC dc(this); device context for painting

CEx1Doc* pdoc = GetDocument(); pdoc->renderscene(); 14b) Zmiany w klasie dokumentu (zmienne) enum GLDisplayListNames{ ArmPart=1 This is a identifier for the display list that we will be creating to draw the parts of the arm. ; double m_transy; This is the y offset of the arm from the world coordinate system origin double m_transx; This is the x offset of the arm from the world coordinate system origin double m_angle2; This is the angle of the second part of the arm with respect to the first part. double m_angle1; This is the angle of the first part of the arm with respect to the world coordinate axis. 14c) Zmiany w klasie dokumentu CEx1Doc::CEx1Doc(){ m_transy=100;m_transx=100; m_angle2=15; m_angle1=15; void CEx1Doc::RenderScene(void){ glclear(gl_color_buffer_bit); Wstepna wersja Przykład 1 glcolor4f(1.0f, 0.0f, 0.0f, 1.0f); glcalllist(armpart); Przykład 2 glpushmatrix(); gltranslated( m_transx, m_transy, 0); glrotated( m_angle1, 0, 0, 1); glcolor4f(1.0f, 0.0f, 0.0f, 1.0f); glcalllist(armpart); glpopmatrix(); Przykład 3 glpushmatrix(); gltranslated( m_transx, m_transy, 0); glrotated( m_angle1, 0, 0, 1); glpushmatrix(); gltranslated( 90, 0, 0); glrotated( m_angle2, 0, 0, 1); glcolor4f(0.0f, 1.0f, 0.0f, 1.0f); glcalllist(armpart); glpopmatrix(); glcolor4f(1.0f, 0.0f, 0.0f, 1.0f); glcalllist(armpart); glpopmatrix(); glflush(); BOOL CEx1Doc::OnNewDocument(){ if (!CDocument::OnNewDocument()) return FALSE; glnewlist(armpart); Original OpenGL glnewlist(armpart, GL_COMPILE); Microsoft VC++ API glvertex2f(-10.0f, 10.0f); glvertex2f(-10.0f, -10.0f); glvertex2f(100.0f, -10.0f); glvertex2f(100.0f, 10.0f);

glendlist(); return TRUE; III. Sprawdź i przeanalizuj działanie programu dla Przykładu 1, 2 i 3. 15c) Klasa view Dodanie możliwości poruszania myszką CPoint m_rightdownpos; Initialize to (0,0) CPoint m_leftdownpos; Initialize to (0,0) BOOL m_rightbuttondown; Initialize to FALSE BOOL m_leftbuttondown; Initialize to FALSE 16c) Nowe metody dla WM_LBUTTONDOWN, WM_LBUTTONUP, WM_RBUTTONDOWN, WM_RBUTTONUP. void CEx1View::OnLButtonUp(UINT nflags, CPoint point){ m_leftbuttondown = FALSE; CView::OnLButtonUp(nFlags, point); void CEx1View::OnLButtonDown(UINT nflags, CPoint point){ m_leftbuttondown = TRUE; m_leftdownpos = point; CView::OnLButtonDown(nFlags, point); void CEx1View::OnRButtonUp(UINT nflags, CPoint point){ m_rightbuttondown = FALSE; CView::OnRButtonUp(nFlags, point); void CEx1View::OnRButtonDown(UINT nflags, CPoint point){ m_rightbuttondown = TRUE; m_rightdownpos = point; CView::OnRButtonDown(nFlags, point); 17c) WM_MOUSEMOVE void CEx1View::OnMouseMove(UINT nflags, CPoint point){ if (m_rightbuttondown){ CEx1Doc* pdoc = GetDocument(); CSize rotate = m_rightdownpos - point; m_rightdownpos = point; pdoc->m_angle1 += rotate.cx/3; pdoc->m_angle2 += rotate.cy/3; InvalidateRect(NULL,FALSE); if (m_leftbuttondown){ CEx1Doc* pdoc = GetDocument(); CSize translate = m_leftdownpos - point; m_leftdownpos = point; pdoc->m_transx -= translate.cx/3;warto mo e ulec zmianie pdoc->m_transy += translate.cy/3;warto mo e ulec zmianie InvalidateRect(NULL,FALSE); CView::OnMouseMove(nFlags, point); 18c) Modyfikacja CEx1View::SetWindowPixelFormat pixeldesc.dwflags = PFD_DRAW_TO_WINDOW PFD_SUPPORT_OPENGL PFD_DOUBLEBUFFER PFD_STEREO_DONTCARE; 19c) Dodanie na koncu CEx1View::OnSize gldrawbuffer(gl_back); 20c) Dodanie na koncu CEx1View::OnPaint:

SwapBuffers(dc.m_ps.hdc); IV, V. Sprawdź i przeanalizuj działanie programu dla Example2 i Example3. 13d) Modyfikacja CEx1View::OnSize void CEx1View::OnSize(UINT ntype, int cx, int cy){ CView::OnSize(nType, cx, cy); GLsizei width, height; GLdouble aspect; width = cx; height = cy; if (cy==0) aspect = (GLdouble)width; else aspect = (GLdouble)width/(GLdouble)height; glviewport(0, 0, width, height); glmatrixmode(gl_projection); glloadidentity(); gluperspective(45, aspect, 1, 10.0); glmatrixmode(gl_modelview); glloadidentity(); gldrawbuffer(gl_back); glenable(gl_lighting); glenable(gl_depth_test); 14d) Modyfikacja CEx1Doc::RenderScene GLfloat RedSurface[] = { 1.0f, 0.0f, 0.0f, 1.0f; GLfloat GreenSurface[] = { 0.0f, 1.0f, 0.0f, 1.0f; GLfloat BlueSurface[] = { 0.0f, 0.0f, 1.0f, 1.0f; GLfloat LightAmbient[] = { 0.1f, 0.1f, 0.1f, 0.1f ; GLfloat LightDiffuse[] = { 0.7f, 0.7f, 0.7f, 0.7f ; GLfloat LightSpecular[] = { 0.0f, 0.0f, 0.0f, 0.1f ; GLfloat LightPosition[] = { 5.0f, 5.0f, 5.0f, 0.0f ; void CEx1Doc::RenderScene(void){ glclear(gl_color_buffer_bit); glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); gllightfv(gl_light0, GL_AMBIENT, LightAmbient); gllightfv(gl_light0, GL_DIFFUSE, LightDiffuse); gllightfv(gl_light0, GL_SPECULAR, LightSpecular); gllightfv(gl_light0, GL_POSITION, LightPosition); glenable(gl_light0); glpushmatrix(); gltranslated(0.0, 0.0, -8.0); glrotated(m_angle1, 1.0, 0.0, 0.0); glrotated(m_angle2, 0.0, 1.0, 0.0); glmaterialfv(gl_front_and_back, GL_AMBIENT, RedSurface); glnormal3d( 1.0, 0.0, 0.0); glvertex3d( 1.0, 1.0, 1.0); glvertex3d( 1.0, -1.0, 1.0); glvertex3d( 1.0, -1.0, -1.0); glvertex3d( 1.0, 1.0, -1.0); glnormal3d( -1.0, 0.0, 0.0); glvertex3d( -1.0, -1.0, 1.0); glvertex3d( -1.0, 1.0, 1.0);

glvertex3d( -1.0, 1.0, -1.0); glvertex3d( -1.0, -1.0, -1.0); glmaterialfv(gl_front_and_back, GL_AMBIENT, GreenSurface); glnormal3d( 0.0, 1.0, 0.0); glvertex3d( 1.0, 1.0, 1.0); glvertex3d( -1.0, 1.0, 1.0); glvertex3d( -1.0, 1.0, -1.0); glvertex3d( 1.0, 1.0, -1.0); glnormal3d( 0.0, -1.0, 0.0); glvertex3d( -1.0, -1.0, 1.0); glvertex3d( 1.0, -1.0, 1.0); glvertex3d( 1.0, -1.0, -1.0); glvertex3d( -1.0, -1.0, -1.0); glmaterialfv(gl_front_and_back, GL_AMBIENT, BlueSurface); glnormal3d( 0.0, 0.0, 1.0); glvertex3d( 1.0, 1.0, 1.0); glvertex3d( -1.0, 1.0, 1.0); glvertex3d( -1.0, -1.0, 1.0); glvertex3d( 1.0, -1.0, 1.0); glnormal3d( 0.0, 0.0, -1.0); glvertex3d( -1.0, 1.0, -1.0); glvertex3d( 1.0, 1.0, -1.0); glvertex3d( 1.0, -1.0, -1.0); glvertex3d( -1.0, -1.0, -1.0); glpopmatrix(); VI, VII, VIII, IX. Sprawdź i przeanalizuj działanie programu; wykasuj pojedyńcze komentarze i powtórz ten punkt (3 testy). Uwaga podobny szkielet programu będzie wykorzystywany w następnych ćwiczeniach.

Wykorzystanie biblioteki GLUT 3.7 [6], [10]. a) Zainstaluj biblioteke Prekompilowany kod znajduje się pod adresem http:www.opengl.org/resources/libraries/glut/ Dynamicznie linkowane pliki (DLL) należy skopiować do katalogu, w którym będzie uruchamiana aplikacja (np. Debug). Przykład konfiguracji: X:\glut-3.7\include w zmiennej INCLUDE. X:\glut-3.7\lib\glut\glut32.lib oraz opengl32.lib w zmiennej LIB. X:\glut-3.7\lib\glut\glut32.dll w zmiennej PATH. dla \\neo\common\tgk jako dysk sieciowy X:. b) gcc plik.c lgl lglu lglut #include stdafx.h #include <windows.h> #include <GL/gl.h> #include <GL/glut.h> #include <stdlib.h> void MyDisplay(void){ Wyswietlana scena - poczatek glloadidentity(); glclear(gl_color_buffer_bit); zmiana stanu OpenGL a glcolor4f(1.0f, 0.0f, 0.0f, 1.0f);Red; glvertex2f(100.0f, 50.0f); glcolor4f(0.0f, 1.0f, 0.0f, 1.0f);Green glvertex2f(450.0f, 400.0f); glcolor4f(0.0f, 0.0f, 1.0f, 1.0f);Blue glvertex2f(450.0f, 50.0f); Wyswietlana scena - koniec glflush();start processing buffered OpenGL routines void MyInit(void){ glclearcolor (0.0, 0.0, 0.0, 0.0);select clearing (background) color /* initialize viewing values */ glviewport(0, 0, 300, 300);pocz tek u.ws. lewy górny róg glmatrixmode(gl_projection);nast pne 2 wiersze b d modyfikowały m. PROJECTION glloadidentity();inicjalizacja gluortho2d(0.0, 500.0*1.2, 0.0, 500.0); glmatrixmode(gl_modelview); Nast pny wiersz b dzie modyfikował m. MODELVIEW glloadidentity(); /*int APIENTRY WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow){ glutinit(& argc, argv); */ int main(int argc, char** argv){ glutinit(&argc, argv); glutinitdisplaymode(glut_single GLUT_RGB);single buffer and RGBA glutinitwindowsize(250, 250);initial window size glutinitwindowposition(100, 100); glutcreatewindow("my window");create widnow, hello title bar MyInit();

glutdisplayfunc(mydisplay);register display function (call-back) /* glutsetmenu(menu); glutreshapefunc(null); glutreshapefunc(null); glutkeyboardfunc(null); glutkeyboardfunc(null); glutmousefunc(null); glutmousefunc(null); glutmotionfunc(null); glutmotionfunc(null); glutvisibilityfunc(null); glutvisibilityfunc(null); glutmenustatefunc(null); glutmenustatefunc(null); glutmenustatusfunc(null); glutmenustatusfunc(null); glutspecialfunc(null); glutspecialfunc(null); glutspaceballmotionfunc(null); glutspaceballmotionfunc(null); glutspaceballrotatefunc(null); glutspaceballrotatefunc(null); glutspaceballbuttonfunc(null); glutspaceballbuttonfunc(null); glutbuttonboxfunc(null); glutbuttonboxfunc(null); glutdialsfunc(null); glutdialsfunc(null); gluttabletmotionfunc(null); gluttabletmotionfunc(null); gluttabletbuttonfunc(null); gluttabletbuttonfunc(null); gluttimerfunc(100, NULL, 1); */ glutmainloop();enter main loop and process events return 0; X. Sprawdź i przeanalizuj działanie programu. Uwaga podobny szkielet programu będzie wykorzystywany w następnych ćwiczeniach. Literatura uzupełniająca do następnych ćwiczeń [2], [3]. Literatura: [1] Alan Oursland Using OpenGL in Visual C++ [2] www.sgi.com/software/opengl/ [3] msdn.microsoft.com/library/default.asp?url=/library/psdk/opengl/int01_2v58.htm [4] Jeff Molofee et al, NeHe OpenGL Tutorial, Last rev. Jan 2000 [5] Mark Kilgard OpenGL Programming for the X Window System Addison-Wesley Developers Press, 1996 [6] OpenGL Programming Guide. 2 nd ed., Addison-Wesley Publishing Company [7] ftp:sgigate.sgi.com/pub/opengl/doc/ [8] http:www.austin.ibm.com/software/opengl/ [9] Norman Lin Linux 3D Graphics Programming. Wordware Publishing 2001 [10] http:www.pobox.com/~ndr/glut.html, http:reality.sgi.com/mjk/glut3/glut3.html, http:www.opengl.org, http:www.sgi.com/technology/opengl

Ćwiczenie nr 2 Budowa podstawowych obiektów oraz opis ich ruchu Zadanie. Narysować następujący obiekt (zbudowany z 24 trójkątów) oraz wprowadzić go w ruch obrotowy względem początkowego środka ciężkości. Wewnętrzne trójkąty obracają się w przeciwnym kierunku (3 obroty/1obrót całości) oraz oddalają się od początkowego środka ciężkości z prędkością 3 długości przyprostokątnej na 10 obrotów całej figury. Można pominąć analizę wzajemnych zderzeń trójkątów. Ćwiczenie nr 3 Modelowanie rzeczywistych obiektów i zjawisk Zadanie. Zamodelować ruch sprężyny oraz kuli połączonych według zamieszczonego poniżej rysunku z uwzględnieniem praw fizyki i ich rzeczywistego wyglądu. Q=-k Δx F=g m Dodatkowe założenia: Kula wykonana z drewna/szkła Sprężyna wykonana z drutu stalowego W początkowej chwili sprężyna jest naciągnięta Zakładamy zerową prędkość początkowa kuli. Model w pełni 3-D, zastosować tekstury do modelowania powierzchni. Powierzchnia sprężyny zamodelowana na podstawie wzoru: xi = cos( ti) ( 3 + cos ( ui) ) yi = sin ( ti) ( 3+ cos( ui) ) zi = 0.6 ti + sin( ui) t = 0,,8 π ; u = 0,, 2π Uwzględnić górne i dolne wykończenie sprężyny (sferacylinder-sfera-cylinder). Podpowiedź dla uproszczenia zastosować równanie ruchu podane w postaci analitycznej.

Projekt Wykonać model jednego z wymienionych niżej obiektów uwzględniający: kształt obiektu, tekstury, cienie, ruch obiektu, możliwość zmiany szybkości ruchu oraz położenia kamery. 1. Chodzący robot. 2. Rękę wykonującą gesty. 3. Twarz ludzką z mimiką. 4. Poruszające się zwierzę (np. pies, kot). 5. Drzewo poruszające gałęziami. 6. Grupę krzewów poruszających gałęziami. 7. Pięć wahadeł umieszczonych wzdłuż linii i zderzających się ze sobą. 8. Ryba płynąca w wodzie i wyskakująca z niej, co pewien czas. 9. Latający motyl. 10. Łódkę pływającą na falach. 11. Jadący samochód. 12. Lecący samolot. 13. Układ słoneczny. 14. Inne o podobnym poziomie trudności do uzgodnienia z prowadzącym. Przykład: