This shows you the differences between two versions of the page.
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 dintre: paralelipiped 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. |