Wednesday, July 10, 2019

EGC tema 3 Seria CB, an III sem 1

https://ocw.cs.pub.ro/courses/egc/teme/2018/03


Table of Contents

Tema 3

  • Responsabili: Alex Gradinaru, Alex Dinu 
  • Perioada de lucru: 8/12/2018 – 13/01/2019
  • Termen de predare: 13/01/2019, 23:55 

New Vegas

Scopul acestei teme este de a stimula creativitatea prin generarea procedurala a unui oras in 3D. Va veti folosi cunostintele din domeniul graficii asistate de calculator, anume generare de modele 3Dtransformari geometriceiluminare si texturare
Tema isi propune un minim de complexitate, descris in cerintele ce urmeaza, insa va incurajeaza sa veniti cu idei si abordari proprii, astfel incat sa va exercitati capabilitatile programatice si creativitatea, prin generare procedurala. 
Utilitatea deprinderilor dobandite in urma crearii acestui mediu virtual se regaseste in industrii precum: jocuri video(mai ales open world, e.g. No Man's Sky), filme(Hollywood CGI), retail(e.g. geometric patterns).

Generare procedurală

Generarea procedurala este procesul prin care entitati ale unei clase sunt generate prin instantierea repetata de obiecte(indivizi) de acea clasa, fiecarui individ atribuindu-se valori pseudoaleatoare, ghidate de un set de reguli.
Desi aceasta definitie pare abstracta, avantajul este ca nu sunteti constransi in vreun fel de a genera cladirile si strazile, astfel ca puteti utiliza aparate matematice la alegere pentru generarea geometriei si astfel puteti fi foarte creativi.

Orașul. Clădiri și străzi

Scopul generarii procedurale in aceasta tema este de a crea un oras virtual.
Elementele din acesta sunt:
  • Cladiri
  • Strazi
  • Elemente decorative(e.g. elemente de trafic, iluminare stradala, etc.)
Cladirile si strazile vor fi generate exclusiv procedural.
Elementele decorative nu e nevoie sa fie generate procedural, pot fi meshe importate de voi, insa plasarea lor in scena trebuie sa fie pur procedurala. Alegerea elementelor decorative este lasata la latitudinea voastra. Trebuie sa aveti minim trei tipuri de elemente decorative.
Nu sunteti constransi in a nu adauga elemente decorative pe cladiri, insa ferestrele cladirilor nu sunt elemente decorative.

Cerinte

Se va genera procedural o scena cu elementele mentionate mai sus.
Utilizatorul se poate plimba prin intreaga scena utilizand camera din laborator.
La fiecare noua rulare a aplicatiei, orasul va arata diferit.

Clădrile

Cladirile sunt formate prin asamblare de primitive cu geometrie alterata procedural. Asamblarea este controlata printr-un proces pseudorandom creat de voi. Primitivele pot fi, de exemplu, cilindri cu distanta nu neaparat uniforma intre oricare 2 puncte succesive de pe conturul cercului generator, cu numar variabil de puncte, etc. Pot fi paralelipipede, etc.
Pentru fiecare triunghi generat, trebuie sa generati si coordonatele de texturare corespunzatoare, astfel incat puteti aplica o textura repetitiva (tileable, folositi GL_REPEAT) cu ferestre. Puteti gandi triunghiurile constituente ale primitivelor cate 2, formand un quad, caruia sa-i dati coordonate de texturare in afara intervalului (0,1)x(0,1), astfel incat sa folositi GL_REPEAT corespunzator.
Asamblarea primitivelor constituente unei cladiri consta in aplicarea de transformari (scalare, translatie, rotatie) acestora dupa un set de reguli(constrangeri) creat de voi astfel incat rezultatul arata ca o potentiala cladire.

Străzile

Algoritmul de generare a strazilor este lasat la latitudinea voastra, cu precizarea ca intre 2 rulari succesive ale aplicatiei, reteaua de drumuri arata diferit ca topologie si ca distanta intre strazi. Reteaua de drumuri trebuie sa fie conexa, adica exista un drum intre oricare 2 intersectii.
Strazile trebuie sa fie si ele texturate utilizand GL_REPEAT.
Geometriile cladirilor nu se vor suprapune peste geometriile strazilor.
Minimul de complexitate implica doar strazi pe verticala si pe orizontala. Cladirile vor fi plasate in celulele formate intre strazi. Minimul de complexitate implica o cladire per celula.

Elementele decorative

Orasul va contine elemente decorative plasate printr-un algoritm procedural, dupa un set de reguli ales de voi, astfel ca nu se intersecteaza cu alte elemente, iar pozitia, rotatia si dimensiunea acestora le incadreaza corespunzator in scena.
Elementele pot fi meshe alese de voi. O resursa buna on-line este TurboSquid Trebuie sa aveti minim 3 tipuri de astfel de elemente.

Luminile

Veti avea o lumina directionala (L constant pentru toate fragmentele iluminate) care va ilumina intreg orasul.
Fiecare cladire va avea un set de lumini de tip spot care o ilumineaza doar pe aceasta, cu directia aproximativ perpendiculara pe ground plane. Si aceastea vor fi generate procedural.

Exemplu de Implementare

Sunteti incurajati sa va ghidati dupa implementarea de la acest link:
https://youtu.be/-d2-PtK4F6Y
Puteti folosi gramatici independente de context pentru construirea algoritmului de generare procedurala.

Alte exemple orientative

Resurse utile

Bonus

  • Orice aduce un plus de realism scenei.
  • Orice imbunatateste atmosfera scenei si/sau este captivant vizual.
  • Animatii, dinamism.
  • Trafic dinamic.

Barem

  • 20p - Generare procedurala a geometriei cladirilor
  • 20p - Generare procedurala a retelei de drumuri
  • 20p - Texturarea cladirilor
  • 20p - Texturarea strazilor
  • 15p - Iluminare scena
  • 5p - Readme&Comentarii

Arhivarea proiectului

  • in mod normal arhiva trebuie sa contina toate resursele necesare compilarii si rularii
  • inainte de a face arhiva asigurati-va ca ati dat clean la proiect
    • click dreapta pe proiect in Solution Explorer → Clean Solution, sau
    • stergeti folderul /Visual Studio/obj
  • stergeti fisierul /Visual Studio/Framework_EGC.sdf (in caz ca exista)
  • stergeti fisierul /Visual Studio/Framework_EGC.VC.db (in caz ca exista)
  • stergeti folderul /x64 sau /x86 (in caz ca exista)
    • executabilul final este generat in folderul /x86 sau /x64 la finalul link-editarii in functie de arhitectura aleasa la compilare (32/64 biti)
  • in cazul in care arhiva tot depaseste limita de 20MB (nu ar trebui), puteti sa stergeti si folderul /libs sau /Resources intrucat se pot adauga la testare. Nu este recomandat sa faceti acest lucru intrucat ingreuneaza mult testarea in cazul in care versiunea curenta a librariilor/resurselor difera de versiunea utilizata la momentul scrierii temei.

Observatii

Alte aspecte ce nu au fost prezentate raman la latitudinea voastra.
  • Se poate utiliza framework-ul de laborator sau o implementare proprie.
  • Documentatia pentru evenimentele de mouse se gaseste in fisierul /Core/Window/InputController.h
Punctajul este oferit doar pentru cerintele integrate in aceeasi scena.
Punctajul bonus se ofera doar daca cerintele obligatorii sunt implementate corect.

PROGRAME SURSA


OpenGL-backed city builder game for Windows and Linux.


TypeNameLatest commit messageCommit time
graphicsUpdate zones icon2 years ago
readmeAdd screenshot to README8 months ago
srcAdd clang-tidy modernize checks to the project8 months ago
testAdd Google Test2 years ago
.clang-formatFormatting: Set AlwaysBreakTemplateDeclarations to true8 months ago
.gitignoreUpdate .gitignore8 months ago
LICENSE.txtAdd README, LICENSE, and SVG logo2 years ago
MakefileAdd clang-tidy modernize checks to the project8 months ago
README.mdAdd screenshot to README8 months ago
setup-deps.shAdd missing linux deps

Project preview
Simple city-builder using OpenGL. For Windows and Linux. See http://konstruisto.com/ for more.

Building

  1. Setup dependencies (below)
  2. Run make rebuild run
To build release configuration: make rebuild run CONFIG=RELEASE. Command make help shows all possible options.

Dependencies

Windows dependencies

  1. You will need makeclangclang++clang-format in PATH.
  2. Install GLEW in ext/glew-2.0.0
  3. Install GLFW in ext/glew-3.2.1
  4. Extract glm library to ext/glm
  5. Extract cereal library to ext/cereal-1.2.2
  6. Put stb_image.h to ext/stb/stb/stb_image.h
  7. Build and install nanovg (see below)
  8. You will need windres in PATH from mingw-w64
Building nanovg
You will need premake4 (download).
  1. Extract repo into ext/nanovg.
  2. Build x64 release:
    cd ext/nanovg
    premake --cc=gcc gmake
    mv build build-[windows|linux]
    cd build-[windows|linux]
    make config=release64 nanovg
    

Linux dependencies

You can just run setup-deps.sh, it will setup everything for you.
git clone git@github.com:kantoniak/konstruisto.git konstruisto &&
cd konstruisto &&
chmod +x setup-deps.sh &&
sudo ./setup-deps.sh &&
cd - &&
make build run
If you want to do everything by hand, here's the list of dependencies:
  1. Install clang-3.9 lldb-3.9. Export clangclang++clang-format to PATH.
  2. Install libglew-dev (2.0.0): https://launchpad.net/ubuntu/+source/glew
  3. Install libglfw3-dev (3.2.1): https://launchpad.net/ubuntu/+source/glfw3
  4. Download glm and extract to ext/glm
    wget https://github.com/g-truc/glm/releases/download/0.9.8.4/glm-0.9.8.4.zip &&
    unzip glm-0.9.8.4.zip -d ext/ &&
    rm glm-0.9.8.4.zip
    
  5. Download cereal and extract to ext/cereal-1.2.2
    wget https://github.com/USCiLab/cereal/archive/v1.2.2.zip --no-check-certificate -O cereal-1.2.2.zip &&
    unzip cereal-1.2.2.zip -d "$EXT" &&
    rm cereal-1.2.2.zip
    
  6. Download stb_image.h to ext/stb/stb/stb_image.h
    mkdir -p ext/stb/stb/ &&
    wget https://raw.githubusercontent.com/nothings/stb/master/stb_image.h -P ext/stb/stb/
    
  7. Build and install nanovg (you will need premake4)
    git clone git@github.com:memononen/nanovg.git ext/nanovg &&
    cd ext/nanovg &&
    premake4 --cc=gcc gmake &&
    mv build/ build-linux/ &&
    cd build-linux/ &&
    make config=release64 nanovg
    

Author and Open Source license

Copyright © 2017 Krzysztof Antoniak
Contents of this repository is licensed under GNU General Public License, version 3.0 (GPL-3.0) with additional term according to the section 7(c) of the license: should you make a derivative of this repository, please do not use the name "Konstruisto", Konstruisto logo or use similar naming for your game what could misguide users. See LICENSE.txt for details.

Used libraries

  • GLFW 3.2.1 under the zlib/libpng license
  • GLEW 2.0.0 under the Modified BSD License, the Mesa 3-D License (MIT) and the Khronos License (MIT)
  • GLM 0.9.8.4 under the MIT License
  • Cereal 1.2.2 under BSD license
  • NanoVG under the zlib/libpng license

No comments:

Post a Comment