Projekt końcowy z przedmiotu Grafika komputerowa prezentujący działanie algorytmu Boids.
Go to file
2025-02-09 21:42:41 +01:00
.vs/grk-cw Again some changes in .gitignore 2025-02-06 00:07:47 +01:00
Debug Again some changes in .gitignore 2025-02-06 00:07:47 +01:00
dependencies first commit 2025-01-23 09:35:31 +01:00
projekt Merge branch 'main' of https://git.wmi.amu.edu.pl/s481875/GRKProjekt_boids 2025-02-09 19:30:55 +01:00
Release Cleanup project; Change camera's movement 2025-02-05 20:27:28 +01:00
.gitignore Separate camera class; Change the based expositure; log current values during changing boids parameters; 2025-02-08 22:43:29 +01:00
grk-cw.sln Cleanup project; Change camera's movement 2025-02-05 20:27:28 +01:00
README.md Add some inputs to README 2025-02-09 21:42:41 +01:00

Projekt Boids

Struktura projektu:

|-projekt - główny folder projektu
|	- models - folder zawierający modele
|		- chair.obj - model krzesła
|		- desk.obj - model ławki
|		- door.obj - model drzwi
|		- window.obj - model okna
|		- floor.obj - model podłogi
|		- room.obj - model pokoju
|		- paperplane.ojb - model samolotu papierowego (boid)
|	- shaders - folder zawierający shadery
|		- shader_lamp.frag/shader_lamp.vert - shadery dla lampy
|		- skybox.frag/skybox.vert - shadery dla modeli
|		- shader_object.frag/shader_object.vert - shadery dla obiektów
|		- depth.frag/depth.vert - shadery dla głębokości i shadow mappingu
|	- textures - folder zawierający tekstury
|		- skyBox - folder zawierający tekstury dla skyboxa
|		- floor.jpg - tekstura podłogi
|		- chair.jpg/chair2.jpg - tekstury krzeseł
|		- desk.jpg/desk2.jpg - tekstura ławki
|	- src - folder zawierający pliki źródłowe
|		- SOIL - folder zawierajacy pliki biblioteki SOIL ładujacy tekstury
|		- main.cpp - plik main
|		- projekt.hpp - główny plik projektu
|		- Boid.h/Boid.cpp - pliki klasy Boid
|		- Camera.h/Camera.cpp - pliki klasy Camera
|		- Collidable.h - klasa abstrakcyjna reprezentująca obiekty kolizyjne
|		- Object.h/Object.cpp - Obiekty w przestrzeni (dziedziczące po Collidable)
|		- Render_Utils.h/Render_Utils.cpp - Klasa pomocnicza z funkcjami renderującymi
|		- Shader_Loader_.h/Shader_Loader_.cpp - Klasa pomocnicza z funkcjami ładującymi shadery
|		- Texture.h/Texture.cpp - Klasa pomocnicza z funkcjami wczytującymi tekstury
|-README.md - opis projektu

Opis projektu:

Projekt symuluje zachowanie boidów w przestrzeni 3D. Boidy są reprezentowane przez modele samolotów papierowych, które poruszają się w przestrzeni sali lekcyjnej. W projekcie zaimplementowano kolizje między boidami oraz między boidami przy pomocy metody AABB (Axis-Aligned Bounding Box), a obiektami w przestrzeni.

Boidy poruszają się zgodnie z zasadami:

  • Separacji - unikanie kolizji z innymi boidami
  • Wyrównania - poruszanie się w tym samym kierunku co sąsiedzi
  • Spójności - poruszanie się w kierunku uśrednionego kierunku sąsiadów

Środowisko jest wzbogacone również o graficzne ulepszenia, tworzące estetyczny wygląd symulacji. Przestrzeń jest oświetlona za pomocą światła, którego działanie jest obliczane w odpowiednim shaderze, większość modeli posiada własne tekstury nadające im bardziej realistyczny wygląd, a wokół przestrzeni izolacji możemy zaobserwować SkyBox przenoszacy nas nad wybrzeze Yokohamy

Dodatkowo, użytkownik ma możliwość swobodnego poruszania się po przestrzeni symulacji za pomocą kamery, a także może wpływać na symulację boidów oraz graficzne jej aspekty (więcej w sekcji Interakcja z symulacją).

Interakcja z symulacją:

W trakcie działania symulacji użytkownik ma możliwość interakcji z nią za pomocą klawiszy na klawiaturze. Poniżej znajduje się lista klawiszy oraz ich funkcji:

Poruszanie się kamerą:

  • W - poruszanie się do przodu
  • A -poruszanie się w lewo
  • S - poruszanie się do tyłu
  • D - poruszanie się w prawo
  • Q - obrót kamery w lewo
  • E - obrót kamery w prawo
  • Górna strzałka - poruszanie się do góry
  • Dolna strzałka - poruszanie się w dół

Sterowanie symulacją:

  • ESC - wyjście z programu
  • 1 - Zmniejszenie jasności
  • 2 - Zwiększenie jasności
  • 3 - Wyłączenie światła zewnętrznego
  • 4 - Włączenie światła zewnętrznego
  • 5 - Wyłączenie światła wewnętrznego
  • 6 - Włączenie światła wewnętrznego
  • R - Zwiększenie maksymalnego przyciągania boidów
  • F - Zmniejszenie maksymalnego przyciągania boidów
  • T - Zwiększenie maksymalnej prędkości boidów
  • G - Zmniejszenie maksymalnej prędkości boidów
  • Y - Zwiększenie obszaru detekcji sąsiadów
  • H - Zmniejszenie obszaru detekcji sąsiadów
  • U - Zwiększenie obszaru separacji boidów
  • J - Zmniejszenie obszaru separacji boidów
  • I - Zwiększenie wagi wyrównania
  • K - Zmniejszenie wagi wyrównania
  • O - Zwiększenie wagi spójności
  • L - Zmniejszenie wagi spójności
  • P - Zwiększenie wagi separacji
  • ; - Zmniejszenie wagi separacji
  • [ - Zwiększenie obszaru symulacji
  • ' - Zmniejszenie obszaru symulacji
  • ] - Zwiększenie mocy obszaru symulacji
  • \ - Zmniejszenie mocy obszaru symulacji

Najważniejsze metody i klasy:

główny plik projektu (projekt.hpp):


// Metoda ładująca modele z plików obj bez tekstury i rysująca je z oświetleniem PBR 
void drawObjectPBR(Core::RenderContext& context, glm::mat4 modelMatrix, glm::vec3 color, float roughness, float metallic)

// Metoda ładująca model z pliku obj i rysująca go z teksturą i oświetleniem PBR
void drawObjectPBRWithTexture(Core::RenderContext& context, glm::mat4 modelMatrix, GLuint textureID, float roughness, float metallic);

// Metoda renderująca scenę i wywoływana w głównej pętli programu
void renderScene(GLFWwindow* window)

// Metoda obliczająca przestrzeń kolizji obiektów
void computeBoundingBox(const aiScene* scene, glm::vec3& minBounds, glm::vec3& maxBounds)

// Metoda inicjalizująca przestrzeń symulacji
void init(GLFWwindow* window)

// Metoda obsługująca interakcje użytkownika z symulacją
void processInput(GLFWwindow* window)

// Główna pętla programu
void renderLoop(GLFWwindow* window)

Klasa Boid (Boid.h/Boid.cpp):

// Konstruktor klasy Boid, przyjmujący pozycje i rozmiar boida
Boid::Boid(glm::vec3 position, glm::vec3 size)

// Metoda aktualizująca stan boida
void Boid::update(float deltaTime, const std::vector<Boid>& boids, const std::vector<Collidable*>& obstacles)

// Metoda obliczająca kierunek ruchu boida
glm::vec3 Boid::calculateSteering(const glm::vec3& target) const

// Metoda ograniczająca prędkość boida
void Boid::limitVelocity()

// Metoda ograniczająca przestrzeń poruszania się boida
void Boid::handleBoundaries()

// Metoda unikająca kolizji z innymi obiektami 
glm::vec3 Boid::avoidObstacle(const Collidable* obstacle) const

// Metoda aktualizująca zakres przestrzeni symulacji 
void Boid::updateBounds()

// Metoda sprawdzająca kolizje boida z obiektami
bool Boid::CheckCollisions(const Collidable* obj) const

Klasa Camera (Camera.h/Camera.cpp):

//Konstruktor klasy Camera, ustawia wartosci domyslne aspect raito na 1.0f,  pozycje kamery na glm::vec3(0.5f, 1.25f, -2.f) i kierunek na glm::vec3(0.f, 0.f, 1.f)
Camera::Camera()

// Metoda tworzaca macierz perspektywy
glm::mat4 Camera::createPerspectiveMatrix()

// Metoda tworzaca macierz kamery
glm::mat4  Camera::createCameraMatrix()

Klasa Collidable (Collidable.h):

// Metoda wirtualna zwracająca minimalne współrzędne obiektu
virtual glm::vec3 getMinBounds() const
// Metoda wirtualna zwracająca maksymalne współrzędne obiektu
virtual glm::vec3 getMaxBounds() const
// Metoda wirtualna zwracająca pozycję obiektu
virtual glm::vec3 getPosition() const

Klasa Object (Object.h/Object.cpp):

// TA KLASA W CAŁOŚCI IMPLEMENTUJE METODY Z KLASY COLLIDABLE

Klasa Shader_Loader (Shader_Loader.h/Shader_Loader.h)_:

// Metoda wczytująca shader z pliku
std::string Shader_Loader::ReadShader(char *filename)
// Metoda tworząca shader
GLuint Shader_Loader::CreateShader(GLenum shaderType, std::string source, char* shaderName)
// Metoda usuwająca program
void Shader_Loader::DeleteProgram( GLuint program )

Klasa Texture (Texture.h/Texture.cpp):

// Metoda ładująca teksturę z pliku
GLuint Core::LoadTexture( const char * filepath )
// Metoda ustawiająca aktywną teksturę
void Core::SetActiveTexture(GLuint textureID, const char * shaderVariableName, GLuint programID, int textureUnit)

klasa skyBox (SkyBox.h/SkyBox.cpp):

// Metoda ładująca sześcian na którego nałożymy skybox
GLuint loadCubemap(std::vector<std::string> faces)
// Metoda inicjalizująca skybox
void initSkybox()
// Metoda renderująca skybox
void renderSkybox(glm::mat4 view, glm::mat4 projection)

Autorzy:

  • Michał Bojara - Algorytm Boid, obsługa kamery, dokumentacja
  • Adam Mikołajczak - Tekstury, oświetlenie, SkyBox
  • Mikołaj Szulc - Algorytm Boid, Detekcja kolizji, ładowanie modeli