This shows you the differences between two versions of the page.
egc:teme:2024:02 [2024/11/27 00:14] 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 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 130: | Line 130: | ||
Alte recomandari pentru tastele / input-urile folosite pot fi: | 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) | + | * 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). | + | * 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 143: | 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: |