You are on page 1of 31

ĐỒ HỌA 3D

CÁC PHÉP BIẾN ĐỔI 3D


Công thức biến đổi
Bieán ñoåi daïng aùnh xaï
T : R3  R3
P  P'
Bieán ñoåi daïng haøm
P'  T(P)
hay
Px'  Tx (Px ,Py ,Pz ) x'  Tx (x, y, z)
Py'  Ty (Px ,Py ,Pz ) y'  Ty (x, y, z)
Pz'  Tz (Px ,Py ,Pz ) z'  Tz (x, y, z)

Trang 2
Biến đổi Taper
Daïng haøm
x'  Tx (x, y, z)  rx
y'  Ty (x, y, z)  ry
z'  Tz (x, y, z)  z
vôùi r  f(z)

Trang 3
Biến đổi Twist
Daïng haøm
x'  Tx (x, y, z)  x cos   y sin 
y'  Ty (x, y, z)  x sin   y cos 
z'  Tz (x, y, z)  z
vôùi   f(z)

Trang 4
Biến đổi Bend

Trang 5
Biến đổi affine
Daïng haøm :
Px'  m00Px  m10Py  m20Pz  m30
Py'  m01Px  m11Py  m21Pz  m31
Pz'  m02Px  m12Py  m22Pz  m32

Daïng ma traän :
 m00 m01 m02 0
 
 m10 m11 m12 0
P'
P'
P
'
1  Px Py Pz 1
0
x y z
m20 m21 m22
 
 m30 m31 m32 1

Trang 6
Cấu trúc dữ liệu cho biến đổi affine
// Lưu thông tin phép biến đổi
struct TAffine3D {
double M[4][4];
};

Trang 7
Tính chất
Những kết quả của biến đổi 2D vẫn đúng cho biến đổi 3D
Phép biến đổi affine 3D có 3 tính chất
- Bảo toàn tính thẳng
- Bảo toàn tính song song
- Bảo toàn tỉ lệ

Trang 8
Nguyên lý kết hợp và phân rã

Nếu T1, T2 là phép biến đổi affine 3D


Thì
- T = T1 + T2 là phép biến đổi affine 3D
- M = M1 x M2

Mọi phép biến đổi affine đều có thể phân rã thành một chuỗi
các phép biến đổi cơ bản

Trang 9
Phép tịnh tiến
Tham soá :
ñoä dôøi treân truïc Ox : t x
ñoä dôøi treân truïc Oy : t y
ñoä dôøi treân truïc Oz : t z
y

O x

z Trang 10
Công thức
Daïng haøm
Px'  Px  t x
Py'  Py  t y
Pz'  Pz  t z
Daïng ma traän
1 0 0 0
 
0 1 0 0
M 
0 0 1 0
 
t t t 1 
 x y z

Trang 11
Cài đặt
TAffine3D BuildTranslation3D(double tx, double ty, double tz)
{
TAffine3D T;

T.M[0][0]= 1;T.M[0][1]= 0;T.M[0][2]= 0;T.M[0][3]=0;


T.M[1][0]= 0;T.M[1][1]= 1;T.M[1][2]= 0;T.M[1][3]=0;
T.M[2][0]= 0;T.M[2][1]= 0;T.M[2][2]= 1;T.M[2][3]=0;
T.M[3][0]=tx;T.M[3][1]=ty;T.M[3][2]=tz;T.M[3][3]=1;

return T;
}

Trang 12
Phép tỉ lệ
Tham soá :
Taâm tæ leä : O
Heä soá tæ leä treân 3 truïc : sx , sy , sz

O x

z
Trang 13
Công thức
Daïng haøm
Px'  sxPx
Py'  syPy
Pz'  szPz
Daïng ma traän
 sx 0 0 0
 
0 sy 0 0
M 
0 0 sz 0
 
0 0 0 1 

Trang 14
Cài đặt
TAffine3D BuildScaling3D(double sx, double sy, double sz)
{
TAffine3D T;

T.M[0][0]=sz;T.M[0][1]= 0;T.M[0][2]= 0;T.M[0][3]=0;


T.M[1][0]= 0;T.M[1][1]=sy;T.M[1][2]= 0;T.M[1][3]=0;
T.M[2][0]= 0;T.M[2][1]= 0;T.M[2][2]=sz;T.M[2][3]=0;
T.M[3][0]= 0;T.M[3][1]= 0;T.M[3][2]= 0;T.M[3][3]=1;

return T;
}

Trang 15
Phép quay
Tham soá :

Truïc quay : v  x y z
Goùc quay : 
y


v  x y z

O x

z Trang 16
Quay quanh trục Oz
Tham soá :

Truïc quay : v  0 0 1
Goùc quay : 
y

O x

z Trang 17
Công thức

Q’

P’
Q

O P x

Trang 18
Công thức
Daïng haøm
Px'  cos Px  sin Py
Py'  sin Px  cos Py
Pz'  Pz
Daïng ma traän
 cos  sin  0 0 
 
  sin  cos  0 0 
M  
0 0 1 0
 
 0 0 0 1 

Trang 19
Quay quanh trục Ox
Tham soá :

Truïc quay : v  1 0 0
Goùc quay :  y

O x

z Trang 20
Công thức
Daïng haøm
Px'  Px
Py'  cos Py  sin Pz
Pz'  sin Py  cos Pz
Daïng ma traän
 1 0 0 0 
 
 0 cos  sin  0 
M  
0  sin  cos  0
 
 0 0 0 1 

Trang 21
Quay quanh trục Oy
Tham soá :

Truïc quay : v  0 1 0
Goùc quay : 
y

O x

z Trang 22
Công thức
Daïng haøm
Px'  cos Px  sin Pz
Py'  Py
Pz'   sin Px  cos Pz
Daïng ma traän
 cos  0  sin  0 
 
 0 1 0 0 
M  
sin  0 cos  0
 
 0 0 0 1 

Trang 23
Quay quanh trục đi qua gốc

 Phép biến đổi Quay(trục v, )


v  x y z được phân tích thành :
1. Quay(trục Ox, )

2. Quay(trục Oy, )
3. Quay(trục Oz, )
4. Quay(trục Oy, -)
5. Quay(trục Ox, -)
O x

Trang 24
Quay(trục Ox, )

 
u v

O x
 
z u v
Trang 25
Quay(trục Oy, )

O x

z

v v
Trang 26
Quay(trục Oz, )

O x

z 
v
Trang 27
Công thức
Daïng ma traän

v  x y z
c  cos
s  sin
 xx(1 c)  c yx(1 c)  zs zx(1 c)  ys 0 
 
 xy(1 c)  zs yy(1 c)  c zy(1 c)  xs 0 
M  
xz(1 c)  ys yz(1 c)  xs zz(1 c)  c 0
 
 0 0 0 1 

Trang 28
Cài đặt
TAffine3D BuildRotation3D(double angle,
double x, double y, double z)
{
TAffine3D T;
double c, s, d;

angle *= PI/180;
c = cos(angle);
s = sin(angle);
d = sqrt(x*x + y*y + z*z);
if(d == 0) return;
x /= d;
y /= d;
z /= d;

T.M[0][0] = x*x*(1-c) + c;
T.M[1][0] = x*y*(1-c) - z*s;
T.M[2][0] = x*z*(1-c) + y*s;
T.M[3][0] = 0;

Trang 29
Cài đặt …
T.M[0][1] = y*x*(1-c) + z*s;
T.M[1][1] = y*y*(1-c) + c;
T.M[2][1] = y*z*(1-c) - x*s;
T.M[3][1] = 0;

T.M[0][2] = z*x*(1-c) - y*s;


T.M[1][2] = z*y*(1-c) + x*s;
T.M[2][2] = z*z*(1-c) + c;
T.M[3][2] = 0;

T.M[0][3] = 0;
T.M[1][3] = 0;
T.M[2][3] = 0;
T.M[3][3] = 1;

return T;
}

Trang 30
Quay quanh một trục bất kỳ

y p1
 
v Tính v
 v = p 1 – p0
Biến đổi Quay(trục p0p1, ) được
phân tích thành
1. Tịnh_tiến(-p0x, -p0y, -p0z)
p0
2. Quay(trục v, )
3. Tịnh_tiến(p0x, p0y, p0z)
O x

Trang 31

You might also like