Differences

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

Link to this comparison view

egc:teme:2024:02 [2024/11/26 23:37]
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:​** ​15 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
-  * 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. 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 (+ un acoperis de tip prisma daca este singurul tip de obstacol).+      * 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 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:
egc/teme/2024/02.1732657034.txt.gz · Last modified: 2024/11/26 23:37 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