Sunteți pe pagina 1din 18

CURBE DE FORMA

LIBERA - 1
Prof. univ. dr. ing. Florica Moldoveanu

Curs Sisteme de Prelucrare Grafică – UPB, Automatică şi Calculatoare


2020-2021 1
Utilizari
Pentru forme neconvenţionale (care nu sunt cunoscute
prin functii din geometria analitica: cerc, elipsa, s.a.):
• desen artistic,
• arhitectura,
• caractere de text (fonturi),
• animaṭie: traiectorii oarecare în spaţiu,
• definirea suprafeṭelor de formă liberă,
• descrierea formelor extrase din imagini,
• etc.

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

Ex : p(u) = [x(u) y(u) z(u)]


a0 = [a0x a0y a0z]
P(u) = (x(u), y(u), z(u)) - punct de pe curba

aix, aiy, aiz – coeficientii algebrici ai curbei

4
SPG – Curbe de forma libera
Prin ce se deosebesc diferitele tipuri de
curbe de forma libera?

“Forma algebrică”: p(u) = a3u3 + a2u2 + a1u + a0

▪ NU evidentiaza diferenţele dintre diferite tipuri de curbe de forma libera

▪ Este aceeasi pentru orice curba (segment de curba) cubica

▪ Curbele de forma libera se deosebesc prin condiţiile geometrice pe care le


satisfac: datele geometrice prin care sunt definite.

▪ Conditiile geometrice apar explicit în “forma geometrică”

▪ Forma geometrică reprezintă modelul geometric, specific fiecărui tip de


curbă.

5
SPG – Curbe de forma libera
Curbe Hermite (1)

Datele geometrice prin care este definita o curba Hermite:


punctele extreme și tangentele în punctele extreme

Curba Hermite

- datele geometrice prin care este definita curba:


P0 (P0.x, P0.y, P0.z), P1 (P1.x, P1.y, P1.z), P0u (dx0, dy0, dz0), P1u (dx1, dy1, dz1)

Obtinem forma geometrică plecand de la forma


algebrică:
p(u) = a3u3 + a2u2 + a1u + a0
0<= u <= 1
Se impun conditiile
geometrice in forma
algebrica →
6
SPG – Curbe de forma libera
Curbe Hermite(2)
▪ Se obtin expresiile coeficientilor algebrici, a0, a1,a2, a3, în functie de conditiile
geometrice
▪ Se înlocuiesc coeficientii algebrici in forma algebrica, grupand termenii pt a evidentia
conditiile geometrice.
▪ Rezulta forma geometrică vectorială a curbelor Hermite:

p(u) = (2u3 – 3u2 + 1)P0 + (-2u3 + 3u2)P1 + (u3 – 2u2 + u)P0u + (u3 – u2)P1u

Forma geometrica vectoriala a curbelor Hermite

P0, P1, P0u, P1u sunt conditiile (datele) geometrice


F1, F2, F3, F4 – se numesc ʺfunctii de amestecʺ
(blending functions) sau ˮde ponderareˮ pentru conditiile
geometrice: determina contributia conditiilor geometrice
în calculul punctelor intermediare de pe curba

7
SPG – Curbe de forma libera
Curbe Hermite(3)
Formele matriciale

Formele matriciale permit extinderea directa a modelelor curbelor la


suprafeṭe!
Orice petic de suprafaţă de
forma libera este alcatuita
din 2 familii de curbe de
forma libera ortogonale în
spaṭiul parametric (u,w)!

Curbe p(u, wconst) Curbe p(uconst, w)

Forma algebrica vectoriala:

P = U*A Forma algebrica matriciala


8
SPG – Curbe de forma libera
Curbe Hermite(3)
Formele matriciale

Forma geometrica vectoriala:

- vectorul conditiilor geometrice pentru o curbă Hermite

Matricea de bază Hermite

Forma geometrică matricială a curbelor Hermite


9
SPG – Curbe de forma libera
Curbe Hermite(4)

Conversia de la forma geometrica la cea algebrica:

Compunerea curbelor Hermite

De ce este necesara? - Pentru a obtine curbe care trec prin mai mult de 2
puncte si au proprietatile curbelor Hermite.

Doua curbe Hermite, G1 şi G2:

pot fi compuse daca sunt asigurate conditiile de continuitate geometrica de


ordin 0 si 1 in punctul de jonctiune:
- P1 coincide cu Q0
- cele doua curbe au aceeasi tangenta in punctul de jonctiune

10
SPG – Curbe de forma libera
Curbe Hermite(4)
Afişarea curbelor definite parametric

Se foloseste forma geometrica vectoriala:

p(u) = (x(u), y(u), z(u)) 0<= u <=1

Se discretizeaza curba calculând puncte succesive de pe ea, cu un pas constant, si


se afişează ca polilinie.
Eficient → calculul punctelor de pe curba sa se faca in Geometry shader

11
SPG – Curbe de forma libera
Geometry shader

Creaza geometrie: introduce in banda grafica


primitive care nu au fost transmise din
programul executat pe CPU! 12
void Laborator2::Init()
{
……………………………………………..
// Se definesc programele shader pentru generarea curbelor
{
Shader *shader = new Shader("CurveGeneration");
shader->AddShader("Source/………/VertexShader.glsl", GL_VERTEX_SHADER);
shader->AddShader("Source/………/GeometryShader.glsl", GL_GEOMETRY_SHADER);
shader->AddShader("Source/…../FragmentShader.glsl", GL_FRAGMENT_SHADER);
shader->CreateAndLink();
shaders[shader->GetName()] = 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))
};

vector<unsigned short> indices ={0, 1};


//mesh ce va fi intrare pt Geometry shader
meshes["curve"] = new Mesh("generated curve");
meshes["curve"]->InitFromData(vertices, indices);
meshes["curve"]->SetDrawMode(GL_LINES);
}
……………………………………………………….. 13
Afisare curbe Hermite folosind Geometry shader
layout(lines) in; // se declara tipul primitivei de intrare – aici nu se foloseste
layout(line_strip, max_vertices = 256) out; //iesirea din geometry shader este
// o polilinie
uniform vec3 control_p1, control_p2, control_p3, control_p4;
uniform int no_of_generated_points; // numarul de puncte de pe curba, de generat

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

// control_p1: punctul initial; control_p4: punctul final


// control_p2, control_p3 : folosite in calculul tangentelor in p1 si p4

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

vec3 Tp1 = control_p2 - control_p1; // tangenta in punctul initial


vec3 Tp4 = control_p3- control_p4; // tangenta in punctul final
vec3 Hermite (float u) { //întoarce punctul de pe curba
return (2*u*u*u - 3*u*u +1)*control_p1 + (-2*u*u*u + 3*u*u)*control_p4
+ (u*u*u - 2*u*u + u)*Tp1 + (u*u*u - u*u)*Tp4; }

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

layout(location = 0) out vec4 out_color;


uniform int tip_curbag;
void main()
{
out_color = vec4(0,0,0,0);//poligon
if (tip_curbag == 0 || tip_curbag==2)
out_color = vec4(1,0,0,0);//Hermite sau B-spline2
else
if(tip_curbag==1 || tip_curbag==3)
out_color = vec4(0,0,1,0);//Bezier sau B-spline 3
}

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"];

glUniform3f(glGetUniformLocation(shader->program, "control_p1"), control_p1.x, control_p1.y, control_p1.z)


…………..la fel pentru: control_p2, control_p3 si control_p4………………

glUniform1i(glGetUniformLocation(shader->program, "no_of_generated_points"), no_of_generated_points);

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

S-ar putea să vă placă și