Documente Academic
Documente Profesional
Documente Cultură
LIBERA - 1
Prof. univ. dr. ing. Florica Moldoveanu
2
SPG – Curbe de forma libera
Cum sunt definite?
• Prin puncte din plan (curbe 2D) sau din spaţiu
(curbe 3D)
• In unele cazuri se mai dau tangente în punctele
respective
2 tipuri de curbe de forma libera:
• De interpolare: trec prin toate punctele date
• De aproximare: punctele date controleaza forma
curbei
3
SPG – Curbe de forma libera
Ecuatiile parametrice ale unei curbe de forma libera
Reprezentarea parametrica vectoriala
p(u) = a3u3 + a2u2 + a1u + a0
0<= u <= 1
p(u), a0, a1, a2, a3 – vectori de 2/ 3 componente
4
SPG – Curbe de forma libera
Prin ce se deosebesc diferitele tipuri de
curbe de forma libera?
5
SPG – Curbe de forma libera
Curbe Hermite (1)
Curba Hermite
p(u) = (2u3 – 3u2 + 1)P0 + (-2u3 + 3u2)P1 + (u3 – 2u2 + u)P0u + (u3 – u2)P1u
7
SPG – Curbe de forma libera
Curbe Hermite(3)
Formele matriciale
De ce este necesara? - Pentru a obtine curbe care trec prin mai mult de 2
puncte si au proprietatile curbelor Hermite.
10
SPG – Curbe de forma libera
Curbe Hermite(4)
Afişarea curbelor definite parametric
11
SPG – Curbe de forma libera
Geometry shader
// Creaza o linie
{ vector<VertexFormat> vertices
{ VertexFormat(glm::vec3(-4.0, -2.5, 1.0), glm::vec3(0, 1, 0)),
VertexFormat(glm::vec3(-4.0, 5.5, 1.0), glm::vec3(0, 1, 0))
};
Geometry shader
p1, p2, p2, p4
(Genereaza varfurile v0, v1, v2, v3, v4, v5………
poliliniei care aproximeaza
no_of_generated_
curba) Secventa de varfuri
points ale poliliniei
14
Afisarea unei curbe Hermite
Geometry shader (1)
layout(lines) in; // nu se foloseste
layout(line_strip, max_vertices = 256) out; //iesirea din geometry shader
uniform int tip_curbag; //tipul curbei de generat
uniform mat4 View, Projection;
uniform vec3 control_p1, control_p2, control_p3, control_p4;
uniform int no_of_generated_points; // numarul de puncte de pe curba, de generat
// control_p1: punctul initial; control_p4: punctul final
// control_p2, control_p3 : folosite in calculul tangentelor in p1 si p4
15
Afisarea unei curbe Hermite
Geometry shader (2)
void main()
{ mat4 ViewProj = Projection*View;
float du = 1.0/float(no_of_generated_points);
switch (tip_curbag){
case 0: // generare curba Hermite
for( float u=0; u<1; u+=du)
{ vec3 point = Hermite(u);
gl_Position = ViewProj * vec4(point, 1); EmitVertex();
}
vec3 point = control_p4 ;
gl_Position = ViewProj * vec4(point, 1); EmitVertex();
EndPrimitive(); break;
case 10:
// generare vectori tangenti in extremitati
…………………………………………..
}
16
SPG – Curbe de forma libera
Afisarea unei curbe Hermite
Fragment shader
17
SPG – Curbe de forma libera
Afisarea unei curbe Hermite
Functia Update
Shader *shader = shaders["CurveGeneration"];
shader->Use(); //se activeaza cele 3 shadere folosite la generarea curbelor
Mesh* mesh = meshes["curve"];
if (tip_curba == 0) //Hermite
{ //desenare tangente in punctele extreme
glUniform1i(glGetUniformLocation(shader->program, "tip_curbag"), 10);
RenderMesh(mesh, shader, glm::mat4(1));
// desenare curba
glUniform1i(glGetUniformLocation(shader->program, "tip_curbag"), tip_curba);
RenderMesh(mesh, shader, glm::mat4(1));
}
18
SPG – Curbe de forma libera