.vs/grk-cw | ||
Debug | ||
dependencies | ||
projekt | ||
Release | ||
.gitignore | ||
grk-cw.sln | ||
README.md |
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