OpenGL – Podstawy

W ostatnim wpisie wspomniałem o możliwej serii artykułów dotyczących programowania grafiki 3D w OpenGL, pomysł wprowadzam w życie i seria rusza. Planuje około 7 wpisów, w których opisywać będę różne techniki dzięki którym na końcu serii ‘złożymy’ prosta ‘grę’.
Nie można, a wręcz nie wolno traktować tych wpisów jako jakiś kurs OpenGL, bo nie będę tu omawiał szczegółowo tej biblioteki tylko postaram się opisać najważniejsze rzeczy które pomogą nam przy mini grze.
1. Świat z trójkątów?:
Tak, obiekty 3D to nic innego jak np. Trójkąty. Z prostych elementów takich jak linia, trójkąt, wielokąt czy punkt możemy stworzyć rozbudowane obiekty.
Poniżej masz kod który prezentuje definiowanie linii, trójkąta, wielokąta i punktu:
#include "stdafx.h"
#include
void Punkt()
{
glPushMatrix ();
glPointSize(20.0f); //wielkosc punktu
glEnable(GL_POINT_SMOOTH); //wygładzanie krawędzi
glBegin (GL_POINTS); //wyswietlamy punkty
glColor3f (1.0f, 0.0f, 0.0f); //kolor punktu
glVertex3f (0.0f, 0.0f,0.0f); //wyznaczanie wierzchołków glVertex3f(x,y,z) float
glEnd ();
glPointSize(1.0f); //resetowanie wielkosci punktu
glDisable(GL_POINT_SMOOTH); //wyłączenie wygładzania krawędzi
glPopMatrix ();
}
void Linia()
{
glPushMatrix ();
glLineWidth(3.0f);
glBegin(GL_LINES);
glColor3f(1.0f,1.0f,0.0f);
glVertex3f(-0.5f,0.2f,0.0f);
glVertex3f(0.5f,0.5f,-0.0f);
glEnd();
glPopMatrix ();
}
void Wielokat()
{
glPushMatrix ();
glPointSize(5.0f);
glEnable(GL_POINT_SMOOTH);
glBegin (GL_POLYGON);
glColor3f (0.0f, 1.0f, 0.0f);
glVertex3f (-0.3f, -0.3f,0.0f);
glVertex3f (-0.2f, -0.1f,0.0f);
glVertex3f (0.0f, -0.1f,0.0f);
glVertex3f (-0.4f, 0.1f,0.0f);
glVertex3f (-0.4f, -0.2f,0.0f);
glEnd ();
glPointSize(1.0f);
glDisable(GL_POINT_SMOOTH);
glPopMatrix ();
}
void Trojkat()
{
glPushMatrix ();
glPointSize(5.0f);
glEnable(GL_POINT_SMOOTH);
glBegin (GL_TRIANGLES);
glColor3f (0.0f, 0.0f, 1.0f); //kolor
glVertex3f (0.3f, 0.3f,0.0f); //lista wierzchołków glVertex3f(x,y,z) float
glVertex3f (0.2f, 0.1f,0.0f);
glVertex3f (0.0f, 0.1f,0.0f);
glEnd ();
glPointSize(1.0f);
glDisable(GL_POINT_SMOOTH);
glPopMatrix ();
}
void Renderuj()
{
glClearColor (0.0f, 0.0f, 0.0f, 0.0f);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // GL_COLOR_BUFFER_BIT- czyscim bufor kolorów, GL_DEPTH_BUFFER_BIT- czyscimy bufor głębi.
glEnable(GL_DEPTH_TEST);
Punkt();
Linia();
Trojkat();
Wielokat();
glutSwapBuffers();
}
int main (int argc, char *argv[])
{
glutInit (&argc,argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize (800,600);
glutCreateWindow ("OGL - Podstawy");
glutDisplayFunc (Renderuj);
Renderuj();
glutMainLoop ();
return 0;
}
2. Przekształcenia:
Czyli skalowanie, obrót i translacja. SA to przekształcenia wierzchołków które są już wbudowane w OpenGL.
glTranslatef() -mnoży macierz widoku przez macierz translacji,wektor przesunięcia.
glScale() -mnoży macierz widoku przez macierz skalowania pozwala rozciągać obiekty.
glRotatef() -mnoży macierz widoku przez macierz rotacji, są to właśnie obroty układu współrzędnych.
#include "stdafx.h"
#include <GL/glut.h>
void Renderuj()
{
glClearColor (0.0f, 0.0f, 0.0f, 0.0f);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -2.0f); //translacja kamery, przesuniecie o wektor [0,0,-2]
glScalef(1.0f,0.5f,0.5f); // rozciaga
glRotatef(20,0.0f,1.0f,0.0f); //obraca szescian
glutWireCube(1.0f); //renderuje szescian
glFlush();
glutSwapBuffers();
}
void Wymiar (int width, int height)
{
glViewport(0, 0, (GLsizei)width, (GLsizei)height);
glMatrixMode(GL_PROJECTION); //macierz rzutowania
glLoadIdentity();
gluPerspective(60, (GLfloat)width / (GLfloat)height, 1.0, 100.0); // macierz perspektywy
glMatrixMode(GL_MODELVIEW); //macierz modelowania
}
int main (int argc, char *argv[])
{
glutInit (&argc,argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize (800,600);
glutCreateWindow ("OGL - Podstawy");
glutDisplayFunc (Renderuj);
Renderuj();
glutReshapeFunc(Wymiar);
glutMainLoop ();
return 0;
}
To byłoby na tyle, zachęcam do modyfikowania kodu.
Konfiguracja OpenGL pod VS 2010
Witam, dzisiejszy wpis dotyczyć będzie konfiguracji Visual Studio 2010 do pracy z biblioteką OpenGL.
Możliwe również że owy wpis będzie początkiem serii wpisów dotyczących programowania grafiki 3D z użyciem OpenGL , ale o tym wkrótce.
Pierwszą rzeczą jaka należy zrobić, jest pobranie biblioteki GLUT(OpenGL Utility Toolkit).
http://margalski.net/blog_dane/glut.rar
Po rozpakowaniu, kopiujemy plik – glut32.dll do
C:\Windows\System32
kolejno glut.h do
C:\Program Files\Microsoft Visual Studio 10.0\VC\include\GL
(folder GL tworzymy sami)
następny plik to glut32.lib kopiujemy go do
C:\Program Files\Microsoft Visual Studio 10.0\VC\lib
Możemy odpalić teraz nasze środowisko. Tworzymy nowy projekt C++, aplikacja konsolowa.
Teraz należy dołączyć biblioteki do projektu poprzez Linker,: Project- „NazwaAplikacji” Properties. W nowym oknie rozwijamy Configuration Properties, potem rozwijamy Linker klikając na Input, po prawej stronie okna musimy edytować Additional Dependencie dodając biblioteki
opengl32.lib, glu32.lb, glut32.lib
– tak jak na poniższym screenie:
Jeśli wszystko poszło zgodnie z naszym planem poniższy kod powinien bez problemu się nam skompilować i uruchomić:
//Testowa aplikacja
#include "stdafx.h"
#include <GL/glut.h>
void Renderuj()
{
glClearColor (0.0f, 0.0f, 0.0f, 0.0f);
glClear (GL_COLOR_BUFFER_BIT);
glPushMatrix ();
glBegin (GL_TRIANGLES);
glColor3f (1.0f, 0.0f, 0.0f); glVertex2f (0.0f, 1.0f);
glColor3f (0.0f, 1.0f, 0.0f); glVertex2f (0.87f, -0.5f);
glColor3f (0.0f, 0.0f, 1.0f); glVertex2f (-0.87f, -0.5f);
glEnd ();
glPopMatrix ();
glutSwapBuffers();
}
int main (int argc, char *argv[])
{
glutInit (&argc,argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize (800,600);
glutCreateWindow ("OGL in VS2010");
glutDisplayFunc (Renderuj);
Renderuj();
glutMainLoop ();
return 0;
}
Malowanie obudowy telefonu
Jako iż obudowa mojego najlepszego telefonu na świecie SE p910i po kilku latach uległa znacznym zniszczeniom… Postanowiłem ją pomalowac. Kazdy teraz sie zastanawia czemu nie kupic nowej? ano za drogo;p Sama pokrywa od baterii kosztuje 20-30zł a koszt farby 16zł ;p
Poniżej zamieszczam krótką fotorelacje z akcji “Odnawianie obudowy”:








Dynamiczne strony- nie tylko PHP i ASP
Nie trzeba poznawać rożnych języków programowania takich jak php czy asp żeby móc tworzyć dynamicznie generowane strony internetowe. Pamiętam jak dawno temu kiedy nie znałem php i tworzyłem strony w html’u przyszło mi coś zmienić z tabeli menu, musiałem zrobić to samo na wszystkich podstronach(sic!). Czy można includowac pliki nie używając innych języków programowania? Okazuje się ze można… z pomocą przychodzi mechanizm SSI.
SSI (ang. Server Side Includes) to prosty mechanizm skryptowy służący do dynamicznego generowania stron WWW na serwerze WWW. Używany przede wszystkim do włączania zdefiniowanych plików do dokumentu wynikowego (include). Pozwala na zagnieżdżanie w kodzie dokumentu wartości zmiennych serwera i wyników działania programów uruchomionych po stronie serwera. Domyślnie pliki generowane (filtrowane) przez SSI mają rozszerzenie .shtml.
źródło: http://pl.wikipedia.org/wiki/Server_Side_Includes
SSI to ciekawy mechanizm pozwalający na dynamiczne generowanie treści po stronie serwera. Niestety nie każdy serwer ma owy mechanizm domyśle włączony, można zrobić to edytując plik httpd.conf dodając do pliku:
AddType text/html
AddOutputFilter Includes
Jeśli nie mamy możliwości możemy zamieścić na serwerze plik .htaccess w którym umieścimy:
AddHandler server-parsed .html
Po poprawnym skonfigurowaniu serwera będzie on przeszukiwał pliki .html szukając poleceń SSI.
Wracając do morderczego edytowania plików html każdego z osobna… wystarczy treść zamieścić np w plikach txt i używając polecenia ssi:
#include file="artykul.txt"
zamieścić treść artykułu w odpowiedniej tabeli.
Dzięki temu mamy jedna stronę głowna(szablon) a reszta treści generowana jest dynamicznie.
SSI posiada wiele różnych dyrektyw, nie tylko do includowania plików:
* zwrócenie nazwy wykonywanego pliku#echo var="DOCUMENT_NAME"
* adres IP klienta
#echo var="REMOTE_ADDR"
* data i godzina na serwerze
#echo var="DATE_LOCAL"
* włączenie pliku foo.txt
#include file="foo.txt"
* data ostatniej modyfikacji pliku index.shtml
#flastmod file="index.shtml"
Fakt faktem SSI jest juz przestarzale i w sumie nie warte stosowania, ale uznałem iż jednak warte poznania ;>
————————————–
Nie wiedzieć czemu WordPress interpretował komentarze html’a…
przez co polecenia SSI nie sa w całosci.
Powinny wyglądać tak:
< ! - - POLECENIE - - >
Bez spacji miedzy znakami.
Synergy
Dzisiejszy ‘świąteczny’ wpis chciałbym poświęcić pewnej aplikacji o nazwie “Synergy”. Z angielskiego Synergy-Synergia oznacza wspólne działanie dające większe, lepsze efekty. Nazwa programu idealnie do niego pasuje. Ostatnio znalazłem się w sytuacji w której na moim biurku znalazły się dwa laptopy z dwoma rożnymi systemami(Vista i 7). Sterowanie było dosyć nieporęczne. I właśnie w takich przypadkach idealnym rozwiązaniem jest Synergy. Wykorzystując program można jedną myszką i jedną klawiaturą sterować dwoma(albo i więcej) niezależnymi pecetami czy laptopami.
Konfiguracja jest bajecznie prosta, instalujemy Synergy na komputerach którymi mamy zamiar sterować. Jeden z nich służy jako ’serwer’, to z jego myszki i klawiatury będą korzystać inne systemy.
Laptop 1(serwer):

Zaznaczamy ‘Share this computer’s…’ Nastepnie ‘Configure…’. W nowym oknie dodajemy nasze komputery(preferowana nazwa to nazwa uzytkownika danego komputera). W moim przypadku abc-PC jest głownym, a margalski-PC dołączonym. Po dodaniu, nalezy ‘ustawic’ nasze systemy, u mnie ‘margalski-PC’ znajduje sie po prawej stronie, a ‘abc-PC’ po lewej.
Laptop 2:

W tym przypadku wystarczy zainstalowac i zaznaczyć ‘Use antoher computer’s…’ i wpisac nazwe serwera, np. abc-PC.
Teraz wystarczy nacisnać ‘Start’ w obu systemach(zaczynajac od serwera). Aplikacja do połączenia wykorzystuje sieć.
Strona domowa aplikacji znajduje sie pod adresem: Synergy
Jeśli natomiast ktoś chce wykorzystac tylko ekran swojego laptopa jako dodatkowy bez wykorzystywania jego zasobów polecam [blog] w ktorym został opisany program MaxiVista.
Pozdrawiam i zycze Wesołych Świat.
Windows 7 Community Launch
Dnia 15. grudnia 2009 na Wydziale Matematyki i Informatyki UWM w Olsztynie
odbędzie się Windows 7 Community Launch. Wydarzenie to organizowane jest przez olsztyńską społeczność skupioną wokół grupy zawodowej OLMUG, oraz akademickiej Eastgroup.pl. Ma ono na celu przybliżenie uczestnikom najnowszej wersji systemu operacyjnego firmy Microsoft – Windows 7.
W trakcie spotkania przedstawione zostaną dwie prezentacje:
- Co nowego w Windows 7, którą poprawadzą Kamil Lemański i Daniel Plawgo,
- Windows 7 dla deweloperów, którą poprowadzi pracownik firmy Microsoft – Bartłomiej Zass.
Na wydzarzenie zapraszamy pasjonatów, ekspertów, pracowników działów IT i nie tylko – wszyscy zainteresowani tematem będą mile widziani.
Spotkanie odbędzie się na ul. Żołnierskiej 14, w sali 49. Zaczynamy o godzinie 17:00!
Lista miejsc jest ograniczona, dlatego już dziś warto zarejestrować się przez portal MS-Groups. Rejestracja oraz udział są bezpłatne! Na aktywnych uczestników czekają nagrody.
Niebezpieczny host
Wyobraźmy sobie sytuacje w której pewna osoba organizuje konkurs na swojej stronie, nagrodą główną jest możliwość hostingowania swoich plików. Kusząca oferta. Załóżmy ze wygrywamy ten konkurs, otrzymujemy nasz adres www.wygrana.jego.pl i 500mb powierzchni.
Wszystko pięknie, darmowy serwer i fajny adres, ale czy bezpiecznie? Hmm..
Zwycięzca konkursu może od tej pory umieszczać dowolne pliki na wydzielonym katalogu, ale nie ma dostępu do innych.
Na swoim serwerze administrator trzyma pliki których źródła raczej nie chciałby ujawiać, np. plik config.php który zawiera dane do MySQL. Niestety organizator konkursu nie przewidział tego iż jesteśmy przebiegli i napiszemy pewien prosty skrytp:
<?php
header(’Content-Type: text/plain’);
readfile($_GET['plik']);
?>
/Funkcja readfile() słuzy do dołączania tresci zawartych w plikach, dane pobierane nie sa przetwarzane przez PHP./
Uploaduje go do swojego katalogu /wygrana/ pod nazwa czytaj.php po czym wpisuje adres:
www.wygrana.jego.pl/czytaj.php?plik =/home/account/jego/config.php
I naszym oczom ukazuje się zrodło pliku config.php który zawiera dane do polaczenia z mysql.
Prosty skrypt dzieki któremu możemy odczytac każdy plik na serwerze. Wystarczy znac jego polozenie.
Niestety nie ma idealnego rozwiązania tego problemu, jedynym słusznym wyjsciem jest nieudostepnianie swojego hosta.
Pozdrawiam.
———————————————–
Tekst ten został napisany wyłącznie w celach edukacyjnych i informacyjnych. Autor tekstu nie ponosi odpowiedzialności za jakiekolwiek wykorzystanie zawartej w teksie treści.
Moje strony
Kategorie
Najświeższe komentarze
- pawel do wpisu Konfiguracja OpenGL pod VS 2010
- zabawki edukacyjne do wpisu Synergy
- Dedloo do wpisu Malowanie obudowy telefonu
- Tomasz Kowalczyk do wpisu Dynamiczne strony- nie tylko PHP i ASP
- margalski do wpisu Dynamiczne strony- nie tylko PHP i ASP
