IZG labs #5:
3D transformace
Lukáš Maršík
Fakulta informačních technologií
Vysoké učení technické v Brně
Zobrazení 3D scény
IZG labs #5: 3D transformace 2
Jak na to?
Transformační matice
• Bod ve 3D: (𝑥, 𝑦, 𝑧)
• Použití homogenních souřadnic: (𝑥, 𝑦, 𝑧, 𝑤)
• Konverze: 𝑥, 𝑦, 𝑧, 𝑤 →𝑥
𝑤,
𝑦
𝑤,
𝑧
𝑤
• Transformace bodu:
𝑥′, 𝑦′, 𝑧′, 𝑤 = (𝑥, 𝑦, 𝑧, 1)
𝑎00 𝑎01 𝑎02 𝑎03𝑎10 𝑎11 𝑎12 𝑎13𝑎20 𝑎21 𝑎22 𝑎23𝑎30 𝑎31 𝑎32 𝑎33
IZG labs #5: 3D transformace 3
Jednotková matice
• Lze použít pro inicializaci matice
IZG labs #5: 3D transformace 4
𝑥′, 𝑦′, 𝑧′, 𝑤 = (𝑥, 𝑦, 𝑧, 1)
1 0 0 00 1 0 00 0 1 00 0 0 1
𝑥′ = 𝑥 𝑦′ = 𝑦 𝑧′ = 𝑧 𝑤′ = 1
Transformace - translace
• Důležitá dílčí operace pro manipulaci s objekty
uvnitř scény
IZG labs #5: 3D transformace 5
𝑥′, 𝑦′, 𝑧′, 𝑤 = (𝑥, 𝑦, 𝑧, 1)
1 0 0 00 1 0 00 0 1 0
𝑑𝑥 𝑑𝑦 𝑑𝑧 1
𝑥′ = 𝑥 + 𝑑𝑥 𝑦′ = 𝑦 + 𝑑𝑦 𝑧′ = 𝑧 + 𝑑𝑧 𝑤′ = 1
Transformace - rotace
• Další důležitá operace pro manipulaci s objekty
IZG labs #5: 3D transformace 6
𝑥′, 𝑦′, 𝑧′, 𝑤 = (𝑥, 𝑦, 𝑧, 1)
cos 𝛼 0 sin 𝛼 00 1 0 0
− sin 𝛼 0 cos 𝛼 00 0 0 1
𝑥′ = 𝑥 cos 𝛼 − 𝑧 sin 𝛼 𝑦′ = 𝑦 𝑧′ = 𝑥 sin 𝛼 + 𝑧 cos 𝛼 𝑤′ = 1
Transformace – měřítko
• Lze použít i pro inverzi některé z os (například pro osu x bude 𝑆𝑥 = −1, 𝑆𝑦 = 1, 𝑆𝑧 = 1)
IZG labs #5: 3D transformace 7
𝑥′, 𝑦′, 𝑧′, 𝑤 = (𝑥, 𝑦, 𝑧, 1)
𝑆𝑥 0 0 00 𝑆𝑦 0 0
0 0 𝑆𝑧 00 0 0 1
𝑥′ = 𝑥𝑆𝑥 𝑦′ = 𝑦𝑆𝑦
𝑧′ = 𝑧𝑆𝑧 𝑤′ = 1
Perspektivní projekce
• Také známá jako středové promítání
• Scéna se jeví reálně
IZG labs #5: 3D transformace 8
Perspektivní projekce – princip
𝑥
𝑑 + 𝑧=
𝑢
𝑑
𝑢 = 𝑥𝑑
𝑑 + 𝑧= ⋯ = 𝑥
1
1 +𝑧𝑑
IZG labs #5: 3D transformace 9
d
(x,y,z)
(0,0,-d)
x
z
u
Perspektivní projekce – maticově
IZG labs #5: 3D transformace 10
𝑥′, 𝑦′, 𝑧′, 𝑤 = (𝑥, 𝑦, 𝑧, 1)
1 0 0 00 1 0 0
0 0 01
𝑑0 0 0 1
𝑥′ = 𝑥
𝑦′ = 𝑦
𝑧′ = 0 𝑢 = 𝑥
1+𝑧
𝑑
𝑤′ =𝑧
𝑑+ 1
Demonstrační aplikace
• Zobrazení scény s
jedním objektem a
“zrcadlem”
• Ovládání pomocí
myši a klávesnice
• Možnost načítání
různých modelů
pomocí parametru
příkazového řadku
• Linux i Windows
IZG labs #5: 3D transformace 11
Back-face culling
• Vyloučení polygonů odvrácených směrem od
pozorvatele z procesu vykreslování
• Výsledkem je zpravidla snížení zátěže
vykreslovací jednotky
IZG labs #5: 3D transformace 12
Orientace trojúhelníku
• Lze určit pomocí
skalárního součin
vektoru směřujícího k
pozorovateli a
normálového vektoru
trojúhelníku
• Pokud je čelní plocha
alespoň trochu
natočena směrem k
pozorovateli (úhel
mezi vektory je ostrý),
výsledek je kladné
číslo
IZG labs #5: 3D transformace 13
Orientace trojúhelníku ve scéně
IZG labs #5: 3D transformace 14
(0,0,-CAMERA_DIST)
(0,0,0)
p1
p3 p2
VIEW VECTOR
n
n
n
n
Společný úkol
• Vykreslujte pouze
přivrácené
trojúhelníky
• Odvrácené
trojúhelníky zahazujte
• Pozice kamery je
(0,0,-CAMERA_DIST)
• Při výpočtu orientace
myslete na použitou
perspektivní projekci!
• Doplňujte pouze
soubor student.cpp
IZG labs #5: 3D transformace 15
Vykreslení scény
• Předem dané pořadí operací pro vytvoření
scény
• Projekce vždy jako první
• Následuje nastavení kamery
IZG labs #5: 3D transformace 16
Projekce Natočení
Scény
Umístění
Objektu
Objekt Zrcadlo
Natočení
objektu
Natočení
Objektu
Natočení
Scény
Umístění
Scény
Vykreslení scény – DrawScene()
void DrawScene()
{
trProjectionPerspective(CAMERA_DIST, frame_w, frame_h);
trLoadIdentity();
trTranslate(0.0, 0.0, scene_move_z);
trRotateX(scene_rot_x * 0.01);
trRotateY(scene_rot_y * 0.01);
ProjectLine(S_Coords(0, -2, -2), S_Coords(0, 2, -2), COLOR_BLUE);
ProjectLine(S_Coords(0, 2, -2), S_Coords(0, 2, 2), COLOR_BLUE);
ProjectLine(S_Coords(0, 2, 2), S_Coords(0, -2, 2), COLOR_BLUE);
ProjectLine(S_Coords(0, -2, 2), S_Coords(0, -2, -2), COLOR_BLUE);
trTranslate(obj_move_x * 0.015, obj_move_y * 0.015, 0.0);
trRotateX(obj_rot_x * 0.01);
trRotateY(obj_rot_y * 0.01);
ProjectObject(MAT_RED);
}
IZG labs #5: 3D transformace 17
Vykreslení scény – zrcadlený objekt
IZG labs #5: 3D transformace 18
Projekce Umístění
Objektu Objekt
Get/Set Matrix trGetMatrix()
Zrcadlo
Umístění
Objektu Objekt
Zrcadlení
Objektu
trSetMatrix()
Natočení
Scény
Umístění a
natočení
Scény
Natočení
objektu
Natočení
Objektu
Natočení
objektu
Natočení
Objektu
Bodovaný úkol
• Vykreslete druhý
objekt zrcadlený
podle modrého
obdélníku
• Pro kreslení použijte
materiál MAT_RED2
• Pozor na pořadí
dílčích transformací!
IZG labs #5: 3D transformace 19
Reference
• Původní prezentace od Michala Španěla
připravená pro cvičení předmětu IZG
• Toho času aktuální prezentace z přednášek
předmětu IZG
IZG labs #5: 3D transformace 20
DĚKUJI VÁM ZA POZORNOST
IZG labs #5: 3D transformace 21