Professional Documents
Culture Documents
Transformari Geometrice 3D
Transformari Geometrice 3D
3D
Prof. univ. dr. ing. Florica Moldoveanu
dreapta stȃnga
Sistemul de coordonate în care este descrisa scena într-o aplicatie OpenGL: sistem de
coordonate carteziene 3D dreapta.
2
EGC – Transformari geometrice 3D
Transformările geometrice 3D elementare
➢ Translaţia
➢ Scalarea faţă de origine
➢ Rotaţiile în jurul axelor principale ale sistemului de coordonate
➢ Oglindirea faţă de un plan principal al sistemului de coordonate
➢ Forfecarea faţă de originea sistemului de coordonate
Considerăm punctele din spaţiu reprezentate prin vectori coloană, pentru a respecta
conventia din OpenGL:
x x
y
y
=M M este matricea de transformare a
z z punctului (x, y, z), în coordonate omogene
1 1 3
Translaţia
4
EGC – Transformari geometrice 3D
Scalarea faţă de origine
x x s x 0 0 0 x
y = 0 sy 0 0 y
z z 0 0
s z 0 z
1 0 0
0 1 1
y
Rotatia in planul Y0Z
7
EGC – Transformari geometrice 3D
Rotaţia pozitivă în jurul axei oy
8
EGC – Transformari geometrice 3D
Alte transformari geometrice 3D elementare
9
EGC – Transformari geometrice 3D
Transformari geometrice 3D compuse
Exemple:
10
EGC – Transformari geometrice 3D
Rotaţia în jurul unei drepte paralele cu axa OX
y
C(xc,yc,zc) d
x' x
y
y'
= T(xc, yc, zc) R (u) T(-xc, - yc, - zc)
z' x z
1 1
11
EGC – Transformari geometrice 3D
Rotatia cu în jurul unei drepte oarecare (1)
Se considera dreapta data printr-un punct (xd, yd, zd) si directia sa, D[a, b, c].
1. Translatie prin care dreapta va trece prin origine: T(-xd, -yd, -zd)
2.1. Rotatie in jurul axei OX, cu un unghi ux, prin care dreapta ajunge in planul XOZ: Rx(ux)
2.2. Rotatie in jurul axei OY, cu un unghi uy, prin care dreapta se suprapune pe axa OZ: Ry(uy)
3. Rotatia cu unghiul dat, u, in jurul axei pe care s-a aliniat dreapta: rotatie in jurul axei OZ : Rz(u)
12
EGC – Transformari geometrice 3D
Rotatia in jurul unei drepte oarecare (2)
y
1. Translatie astfel incat dreapta sa treaca prin origine
2. Aliniere dreapta cu una din axe
D [a, b, c] 3. Rotatia propriu-zisa.
(xd, yd, zd) 4. Transformarea inversa de la punctul 2
x 5. Transformarea inversa de la punctul 1
z
13
EGC – Transformari geometrice 3D
Rotatia in jurul unei drepte oarecare (3)
1. Translaţie
y
1 0 0 − xd
0 1 0 − yd
T =
[a,b,c] 0 0 1 − zd
(xd, yd, zd) 0 0 0 1
x
14
EGC – Transformari geometrice 3D
Rotatia in jurul unei drepte oarecare (4)
2. Aliniere D cu axa OZ
y
uy
ux O
x
Rotatie in jurul axei OX cu un unghi Rotatie in jurul axei OY, cu un unghi uy,
ux, prin care dreapta ajunge in planul
prin care dreapta se suprapune pe axa OZ:
XOZ: Rx(ux)
Ry(uy)
15
Rotatia in jurul unei drepte oarecare (5)
l = b2 + c 2
(0,0,c) b
sin( ux) =
b = l*sin(ux) l
(a,0,l)
c = l*cos(ux)
c
cos( ux) =
l
Rx(ux) Prin rotatia lui OA in jurul axei Ox cu
unghiul ux, acesta va ajunge in planul XOZ
16
Rotatia in jurul unei drepte oarecare (6)
O a = L*sin(-uy)
- uy x l = L*cos(-uy)
A’’(0, 0, l)
z M(a, 0, l)
sin( −uy ) = a / L− sin( uy ) = −a / L
Ry(uy) cos(−uy ) = cos(uy ) = l / L
17
EGC – Transformari geometrice 3D
Rotatia in jurul unei drepte oarecare (7)
cos( u ) − sin( u ) 0 0
sin( u ) cos( u ) 0 0
Rz (u ) =
0 0 1 0
0 0 0 1
x
u
z
18
EGC – Transformari geometrice 3D
Exemplu: rotatia unui cub (1)
void AnimatieTransformari3D::Init()
{ polygonMode = GL_FILL;
Mesh* mesh = new Mesh("box");
mesh->LoadMesh(RESOURCE_PATH::MODELS + "Primitives", "box.obj");
meshes[mesh->GetMeshID()] = mesh;
auto camera = GetSceneCamera();
camera->SetPositionAndRotation(glm::vec3(0, 4, 10), glm::quat(glm::vec3(-20 *
TO_RADIANS, 0, 0)));
camera->Update();
// initializare tx, ty and tz (pasii de translatie)
translateX = 0; translateY = 0; translateZ = 0;
// initialize sx, sy and sz (factorii de scalare)
scaleX = 1; scaleY = 1; scaleZ = 1;
// initializare pasi de rotatie
angularStepOX = 0; angularStepOY = 0; angularStepOZ = 0;
}
21
EGC – Transformari geometrice 3D
Implementarea transformarilor 3D – exemplu (2)
void AnimatieTransformari3D::FrameStart()
{ // clears the color buffer and depth buffer
glClearColor(0, 0, 0, 1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glm::ivec2 resolution = window->GetResolution();
// sets the screen area where to draw
glViewport(0, 0, resolution.x, resolution.y);
}
void AnimatieTransformari3D::Update(float deltaTimeSeconds)
{ modelMatrix = glm::mat4(1);
modelMatrix *= Transform3D::RotateOX(angularStepOX);
modelMatrix *= Transform3D::RotateOY(angularStepOY);
modelMatrix *= Transform3D::RotateOZ(angularStepOZ);
modelMatrix *= Transform3D::Scale(scaleX, scaleY, scaleZ);
modelMatrix *= Transform3D::Translate(translateX, translateY, translateZ);
RenderMesh(meshes["box"], shaders["VertexNormal"], modelMatrix);
}
void AnimatieTransformari3D::FrameEnd()
{ DrawCoordinatSystem(); } 22
Implementarea transformarilor 3D – exemplu (3)
void AnimatieTransformari3D::OnInputUpdate(float deltaTime, int mods)
{//apelata la fiecare deltaTime secunde
if (window->KeyHold(GLFW_KEY_1)) angularStepOX += step * deltaTime;
if (window->KeyHold(GLFW_KEY_2)) angularStepOX -= step * deltaTime;
if (window->KeyHold(GLFW_KEY_3)) angularStepOY += step * deltaTime;
if (window->KeyHold(GLFW_KEY_4)) angularStepOY -= step * deltaTime;
if (window->KeyHold(GLFW_KEY_5)) angularStepOZ += step * deltaTime;
if (window->KeyHold(GLFW_KEY_6)) angularStepOZ -= step * deltaTime;
if (window->KeyHold(GLFW_KEY_7)) scaleX += step * deltaTime;
if (window->KeyHold(GLFW_KEY_8)) scaleX -= step * deltaTime;
if (window->KeyHold(GLFW_KEY_9)) scaleY += step * deltaTime;
if (window->KeyHold(GLFW_KEY_0)) scaleY -= step * deltaTime;
if (window->KeyHold(GLFW_KEY_MINUS)) scaleZ -= step * deltaTime;
if (window->KeyHold(GLFW_KEY_EQUAL)) scaleZ += step * deltaTime;
if (window->KeyHold(GLFW_KEY_UP)) translateY += step * deltaTime;
if (window->KeyHold(GLFW_KEY_DOWN)) translateY -= step * deltaTime;
if (window->KeyHold(GLFW_KEY_LEFT)) translateX -= step * deltaTime;
if (window->KeyHold(GLFW_KEY_RIGHT)) translateX += step * deltaTime;
if (window->KeyHold(GLFW_KEY_PAGE_UP)) translateZ += step * deltaTime;
if (window->KeyHold(GLFW_KEY_PAGE_DOWN)) translateZ -= step * deltaTime;
23
}
Implementarea transformarilor 3D – exemplu (4)
24
EGC – Transformari geometrice 3D