OpenGL – Podstawy

oglP1

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.

Tags: , , ,

Sobota, grudzień 4th, 2010 Programowanie, opengl Brak komentarzy

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:

Screen

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;
}

Tags: , , ,

Środa, grudzień 1st, 2010 Programowanie, opengl 1 Komentarz

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”:

Poniedziałek, kwiecień 19th, 2010 Bez kategorii 1 Komentarz

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.

Tags: , , ,

Środa, luty 24th, 2010 Programowanie Komentarze: 5

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.

Tags: , ,

Piątek, grudzień 25th, 2009 Internet, Programy Komentarze: 4

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:

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.

Tags: , ,

Czwartek, grudzień 3rd, 2009 Wydarzenia Brak komentarzy

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.

Tags: ,

Czwartek, listopad 12th, 2009 Internet, Ogólne, Programowanie Komentarze: 5

Wpis chroniony hasłem: Zabawa z DNS

Ten wpis jest chroniony hasłem. Aby go przeczytać, wpisz hasło poniżej:


Tags: , , , ,

Wtorek, listopad 10th, 2009 Internet, Ogólne Aby przeczytać komentarze, musisz wprowadzić hasło