Differences

This shows you the differences between two versions of the page.

Link to this comparison view

egc:teme:2024:02 [2024/11/18 00:22]
vlad.novetschi
egc:teme:2024:02 [2024/12/09 14:41] (current)
irina.mocanu
Line 2: Line 2:
   * **Responsabili:​** Anca Băluțoiu, Vlad Novetschi, Robert Caragicu, Silviu Stăncioiu   * **Responsabili:​** Anca Băluțoiu, Vlad Novetschi, Robert Caragicu, Silviu Stăncioiu
   * **Lansare:​** 18 noiembrie 2024   * **Lansare:​** 18 noiembrie 2024
-  * **Termen de predare:​** ​13 decembrie 2024, ora 23:59+  * **Termen de predare:​** ​17 decembrie 2024, ora 23:59
   * **Regulament:​** [[egc:​teme:​regulament|]]   * **Regulament:​** [[egc:​teme:​regulament|]]
   * **Notă: Orice informație ce nu a fost acoperită în acest document este la latitudinea voastră!**   * **Notă: Orice informație ce nu a fost acoperită în acest document este la latitudinea voastră!**
Line 53: Line 53:
   * Drona controlată de jucător   * Drona controlată de jucător
   * Un plan ce reprezintă terenul   * Un plan ce reprezintă terenul
-  * Obstacole ​pe care jucătorul trebuie să le evite. Obstacolele pot fi orice obiecte va doriti însă aveți grijă să puteți respecta cerința legată de coliziuni. De exemplu: ​+  * Cel putin un tip de obstacole ​pe care jucătorul trebuie să îl evite. Obstacolele pot fi orice obiecte va doriti însă aveți grijă să puteți respecta cerința legată de coliziuni ​(Cel putin unul din tipurile de obstacole trebuie sa fie format din 2 corpuri geometrice). De exemplu: ​
       * Copaci formați dintr-un cilindru maro ce reprezintă trunchiul și două conuri așezate ca în figură ce reprezinta frunzele       * Copaci formați dintr-un cilindru maro ce reprezintă trunchiul și două conuri așezate ca în figură ce reprezinta frunzele
-      * Clădiri reprezentate prin paralelipipede.+      * Clădiri reprezentate prin paralelipipede ​(+ un acoperis in forma de prisma daca este singurul tip de obstacole).
  
 Obstacolele pot fi de diferite mărimi, pentru a evita un aspect uniform al scenei. Obstacolele pot fi de diferite mărimi, pentru a evita un aspect uniform al scenei.
Line 73: Line 73:
 Acest mesh va fi generat în C++ folosind o listă de vertecși și una de indici, precum în laboratorul 2. Toți vertecșii vor fi generați având componenta y a poziției egală cu 0, obținându-se un grid drept. Culorile și normalele atribuite în crearea mesh-ului nu au importanță,​ puteți alege valori constante pentru acestea. Acest mesh va fi generat în C++ folosind o listă de vertecși și una de indici, precum în laboratorul 2. Toți vertecșii vor fi generați având componenta y a poziției egală cu 0, obținându-se un grid drept. Culorile și normalele atribuite în crearea mesh-ului nu au importanță,​ puteți alege valori constante pentru acestea.
  
-Pentru a-i oferi terenului o formă și o aparență plăcută, în timpul randării, se va modifica înălțimea vertecșilor acestuia (componenta y a poziției în Object Space) în Vertex Shader. ​Tot în Vertex ​Shader se vor atribui și culori diferite vertecșilor pentru a obține un efect de textură, iar input-urile de culoare ale vertex shader-ului vor fi ignorate.+Pentru a-i oferi terenului o formă și o aparență plăcută, în timpul randării, se va modifica înălțimea vertecșilor acestuia (componenta y a poziției în Object Space) în Vertex Shader. ​În Fragment ​Shader se vor atribui și culori diferite vertecșilor pentru a obține un efect de textură.
  
 O modalitate simplă pentru a face această modificare a înălțimilor este folosirea de noise: [[https://​thebookofshaders.com/​11/​]] . O modalitate simplă pentru a face această modificare a înălțimilor este folosirea de noise: [[https://​thebookofshaders.com/​11/​]] .
Line 81: Line 81:
 Noise-ul returnează o valoare cuprinsă între 0 și 1 (sau între -1 și 1 în funcție de implementare),​ valoare care poate fi folosită pentru a modifica înălțimea vertexului. ​ Noise-ul returnează o valoare cuprinsă între 0 și 1 (sau între -1 și 1 în funcție de implementare),​ valoare care poate fi folosită pentru a modifica înălțimea vertexului. ​
  
-Această valoare poate fi folosită și pentru alegerea culorii unui vertex, tot în cadrul Vertex Shader-ului,​ astfel:+Această valoare poate fi folosită și pentru alegerea culorii unui fragment.
  
 <​code>​ <​code>​
Line 92: Line 92:
  
 Pentru coliziuni, puteți aproxima obiectele astfel: Pentru coliziuni, puteți aproxima obiectele astfel:
-  * Drona va fi un punct sau o sfera +  * Drona va fi un punct sau o sferă 
-  * Obstacolele vor fi construite din 2 corpuri geometrice diferite la alegere dintre ​(paralelipiped aliniat cu axele, ​sfera, cilindru, con, prisma cu baza aliniata cu axele)+  * Obstacolele vor fi construite din minim 2 corpuri geometrice diferite la alegere dintreparalelipiped aliniat cu axele, ​sferă, cilindru, con, prisma cu baza aliniata cu axele, capsulă.
   * Checkpoint-urile pot fi de mai multe feluri, fie folosind unul din corupurile geometrice de mai sus, fie detectand daca drona a trecut de o parte sau de alta a unui patrat / cerc (ca in demo)   * Checkpoint-urile pot fi de mai multe feluri, fie folosind unul din corupurile geometrice de mai sus, fie detectand daca drona a trecut de o parte sau de alta a unui patrat / cerc (ca in demo)
   * Pachetul va fi un paralelipiped aliniat cu axele   * Pachetul va fi un paralelipiped aliniat cu axele
Line 128: Line 128:
   * **Yaw**: tastele A/D.   * **Yaw**: tastele A/D.
   * **Roll**: săgețile stânga/​dreapta.   * **Roll**: săgețile stânga/​dreapta.
 +
 +Alte recomandari pentru tastele / input-urile folosite pot fi: 
 + * Shift/Z W/S Q/E A/D (Thrust Pitch Yaw Roll), care ar permite si utilizarea mouse-ului pentru o alta functionalitate (ex tragerea in alta directie decat centrul ecranului)
 + * Utilizarea mouse-ului pentru pitch si yaw sau roll (pentru mai multa precizie).
  
 **Metode de Traducere a Input-ului Utilizatorului în Unghiurile Dronei** **Metode de Traducere a Input-ului Utilizatorului în Unghiurile Dronei**
Line 139: Line 143:
 <​html><​canvas id="​c"​ width="​800"​ height="​600"​ style="​background-color:​ #​87CEEB;"></​canvas><​script>​const c=document.getElementById("​c"​),​ctx=c.getContext("​2d"​),​keys={};​let d={x:​c.width/​2,​y:​c.height/​2,​vx:​0,​vy:​0,​thrust:​0,​pitch:​0,​a:​0,​g:​0.1,​maxT:​0.3,​f:​0.98,​targetAngle:​0};​let mode="​ACRO";​document.addEventListener("​keydown",​e=>​keys[e.key]=true);​document.addEventListener("​keyup",​e=>​keys[e.key]=false);​document.addEventListener("​keydown",​e=>​{if(e.key==="​m"​)mode=mode==="​ACRO"?"​ANGLE":"​ACRO"​});​function update(){if(mode==="​ACRO"​){d.thrust=keys["​w"​]?​d.maxT:​0;​d.pitch=keys["​a"​]?​-0.05:​(keys["​d"​]?​0.05:​0);​d.a+=d.pitch}else{d.targetAngle=keys["​a"​]?​-Math.PI/​6:​(keys["​d"​]?​Math.PI/​6:​0);​d.a+=(d.targetAngle-d.a)*0.1;​d.thrust=keys["​w"​]?​d.maxT:​0}d.vx+=Math.sin(d.a)*d.thrust;​d.vy+=d.g-Math.cos(d.a)*d.thrust;​d.vx*=d.f;​d.vy*=d.f;​d.x+=d.vx;​d.y+=d.vy;​d.x=Math.max(0,​Math.min(c.width,​d.x));​d.y=Math.max(0,​Math.min(c.height,​d.y))}function draw(){ctx.clearRect(0,​0,​c.width,​c.height);​ctx.save();​ctx.translate(d.x,​d.y);​ctx.rotate(d.a);​ctx.fillStyle="​grey";​ctx.fillRect(-20,​-5,​40,​10);​ctx.fillStyle="​black";​ctx.fillRect(-25,​-5,​5,​10);​ctx.fillRect(20,​-5,​5,​10);​if(d.thrust>​0){ctx.strokeStyle="​white";​ctx.lineWidth=2;​ctx.beginPath();​ctx.moveTo(-15,​10);​ctx.lineTo(-15,​20);​ctx.moveTo(15,​10);​ctx.lineTo(15,​20);​ctx.stroke()}ctx.restore();​ctx.fillStyle="​black";​ctx.font="​16px Arial";​ctx.fillText("​Mod:​ "​+mode+"​ (controale W,A,D si M pentru a schimba modul)",​10,​20)}(function loop(){update();​draw();​requestAnimationFrame(loop)})();</​script></​html>​ <​html><​canvas id="​c"​ width="​800"​ height="​600"​ style="​background-color:​ #​87CEEB;"></​canvas><​script>​const c=document.getElementById("​c"​),​ctx=c.getContext("​2d"​),​keys={};​let d={x:​c.width/​2,​y:​c.height/​2,​vx:​0,​vy:​0,​thrust:​0,​pitch:​0,​a:​0,​g:​0.1,​maxT:​0.3,​f:​0.98,​targetAngle:​0};​let mode="​ACRO";​document.addEventListener("​keydown",​e=>​keys[e.key]=true);​document.addEventListener("​keyup",​e=>​keys[e.key]=false);​document.addEventListener("​keydown",​e=>​{if(e.key==="​m"​)mode=mode==="​ACRO"?"​ANGLE":"​ACRO"​});​function update(){if(mode==="​ACRO"​){d.thrust=keys["​w"​]?​d.maxT:​0;​d.pitch=keys["​a"​]?​-0.05:​(keys["​d"​]?​0.05:​0);​d.a+=d.pitch}else{d.targetAngle=keys["​a"​]?​-Math.PI/​6:​(keys["​d"​]?​Math.PI/​6:​0);​d.a+=(d.targetAngle-d.a)*0.1;​d.thrust=keys["​w"​]?​d.maxT:​0}d.vx+=Math.sin(d.a)*d.thrust;​d.vy+=d.g-Math.cos(d.a)*d.thrust;​d.vx*=d.f;​d.vy*=d.f;​d.x+=d.vx;​d.y+=d.vy;​d.x=Math.max(0,​Math.min(c.width,​d.x));​d.y=Math.max(0,​Math.min(c.height,​d.y))}function draw(){ctx.clearRect(0,​0,​c.width,​c.height);​ctx.save();​ctx.translate(d.x,​d.y);​ctx.rotate(d.a);​ctx.fillStyle="​grey";​ctx.fillRect(-20,​-5,​40,​10);​ctx.fillStyle="​black";​ctx.fillRect(-25,​-5,​5,​10);​ctx.fillRect(20,​-5,​5,​10);​if(d.thrust>​0){ctx.strokeStyle="​white";​ctx.lineWidth=2;​ctx.beginPath();​ctx.moveTo(-15,​10);​ctx.lineTo(-15,​20);​ctx.moveTo(15,​10);​ctx.lineTo(15,​20);​ctx.stroke()}ctx.restore();​ctx.fillStyle="​black";​ctx.font="​16px Arial";​ctx.fillText("​Mod:​ "​+mode+"​ (controale W,A,D si M pentru a schimba modul)",​10,​20)}(function loop(){update();​draw();​requestAnimationFrame(loop)})();</​script></​html>​
  
 +Dacă observați ca menținerea altitudinii este dificilă in acest mod, puteți opta (ca funcționalitate bonus) pentru implementarea unui controller pid pentru altitudine.
  
 <note tip>​Dacă dețineți / preferați gamepad, îl puteți folosii ca metodă de input cu: <note tip>​Dacă dețineți / preferați gamepad, îl puteți folosii ca metodă de input cu:
Line 299: Line 304:
  
 <note important>​Alte funcționalități pe care nu le-am descris vor fi punctate în concordanță cu dificultatea / calitatea implementării.</​note>​ <note important>​Alte funcționalități pe care nu le-am descris vor fi punctate în concordanță cu dificultatea / calitatea implementării.</​note>​
 +
 +<​note>​
 +Este permisa utilizarea modelelor externe / create in blender / importate *doar* pentru obstacole (si alte obiecte care nu au fost descrise in enunt). Drona si terenul trebuie generate din cod. Coliziunea cu obiectele importate va fi in continuare efectuată asa cum a fost descris in enunt (minim 2 corpuri de coliziune, aceastea trebuie sa fie cat mai apropiate de forma modelului). Este indicat ca daca folositi modele externe, scena sa pastreze o anumita coeziune estetica (daca drona si terenul sunt cu numar mic de poligoane si netexturate,​ modelele ar trebuii sa aiba un stil similar).
 +</​note>​
  
 <note warning>​In cazul in care punctajul obtinut din cerințele avansate depășește cele 75p alocate, la bonus se vor adăuga punctele în plus dar cu o valoare de 3 ori mai mica, si se pot obține până la 25 de puncte în plus.  <note warning>​In cazul in care punctajul obtinut din cerințele avansate depășește cele 75p alocate, la bonus se vor adăuga punctele în plus dar cu o valoare de 3 ori mai mica, si se pot obține până la 25 de puncte în plus. 
egc/teme/2024/02.1731882128.txt.gz · Last modified: 2024/11/18 00:22 by vlad.novetschi
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0