Hi u ng slice 3D (slice engine _ph n I)
(Th Hai, 25/02/2008-10:18 AM)
Đi u mà cng ta c g ng t o ra là mô ph ng m t v t th 3D
(Three - Dimensional) trong m t không gian 2D (Two -
Dimensional). đây chúng ta s phân tích quá trình mô ph ng 1
n đ o theo kĩ thu t Slice 3D.
NGUYÊN LÍ CƠ BN
Điu mà chúng ta c gng to ra là mô phng mt vt th 3D (Three - Dimensional) trong mt
không gian 2D (Two - Dimensional). đây chúng ta s phân tích quá trình mô phng 1 hòn đảo
theo kĩ thut Slice 3D.
Nguyên lí cơ bn là to ra 1 series các lp đồng mc ca hòn đảo, sau đó đặt các lp này chng
lên nhau và s dng chut để tương tác th hin các góc độ ca vt th
Để mô phng vt th 3D, tng slice phi b kéo nghiêng, ta có th làm điu này th công bng
cách dùng công c Free Transform
Nhìn hình sau s rõ hơn
Như bn thy, tt c các slice đều b xoay hoc nghiêng đi mt góc bng nhau to ra mt o giác
đó là vt th 3D.
TO RA MOVIE CLIP CA VT TH
Phn này hướng dn chúng ta làm mc cha các slice ca hòn đảo để s dng viết code sau này.
B1: Chúng ta có th tham kho trong file sau step1_final.fla. Nhưng tác gi khuyên chúng ta t to
ra mc này. Trên stage, dùng Pencil, để filter là Smooth, v mt đường đng mc, đường này là to
nht vì nó thp nht trong hòn đảo. Fill nó bng linear hay solid cũng được, nh rng đây là mt
hòn đảo, vì vy bn nên chn màu đất như màu nâu chng hn.
B2: Convert nó thành mc, tên: slice container
B3: Nhp đôi vào mc trên library (Edit), to mt keyframe ti frame 15. Ti đây, scale cái đường
đồng mc hi nãy cho nh li, tượng trưng cho đường trên cùng ca hòn đảo. Fill nó bng linear
hay solid, nhưng phi khác vi kiu filled keyframe 1.
B4: To Shape tween, bt Onion skin và Onion skin outlines lên bn s d hình dung hơn
TO CÁC GLOBAL VAR VÀ N ĐỊNH GIÁ TR
Phn nay hướng dn bn to và n định các global var cn thiết trong kĩ thut slice 3D. Bn cn
phi linkage cái mc slice container để attach vào stage v sau này, bn nhp chut phi vào mc
trên library, chn linkage, check vào ô "Export for ActionScript", đin tên vào là inner
Tiếp theo ti frame 1 bn code như sau, mình s chú thích luôn trong đó:
Code:
// cái này làm gim cưng độ hot động ca CPU để nhng máy yếu có th chy mà không b git
_quality = "low";
//s slice
sliceNum = 15;
//khong cách gia 2 slice liên tiếp
step = 4;
//góc to bi sườn ca hòn đảo vi trc tung (y-axis)
angle = 20;
//kim soát độ nhy ca vic xoay hòn đảo theo chiu dc, da trên trc tung
scaleFactor = 0.5;
//kim soát độ nhy ca vic xoay hòn đảo theo chiu ngang, da trên trc hoành (x-axis)
rotSpeed = 0.05;
//var cha v trí ca mc trên stage
offsetX = 200;
offsetY = 200;
//to mc base cha các slice
createEmptyMovieClip("base", 0);
//v trí ca base mc trên stage
base._x = offsetX;
base._y = offsetY;
Bn có th tham kho trong file này step2_final.fla
ĐƯA CÁC SLICE VÀO MC BASE
Bn đã to ra các biến s, bây gi bn s đi vào vic to hình hòn đảo da trên mc slice container
(nên nh là bn đã linage mc này tên là inner nhé, bn s dùng tên này trong code ch không
dùng tên slice container na).
Đầu tiên, bn cn to mt vòng lp để attach các slice vào và thay đổi thuc tính ca nó. Thêm
vào đon code sau đây tiếp theo đon code lúc nãy
Code:
for (i=0;i<sliceNum;i++) {
//to mc cha các slice
base.createEmptyMovieClip("slice"+i,i);
//đưa các slice t mc slice container vào mc mi
base["slice"+i].attachMovie("inner","inner"+i,i);
//định v trí ca mc mi dc theo trc tung
base["slice"+i]._y = - i*step*Math.cos (angle*Math.PI/180);
//tính toán scale mc theo trc tung sao cho góc nhìn là 20 độ
base["slice"+i]._yscale = Math.sin (angle*Math.PI/180)*100;
//đi ti frame tiếp theo để tiếp tc vòng lp
base["slice"+i]["inner"+i].gotoAndStop(i+1);
//đặt var cho tng slice tương ng vi v trí ca nó trong hòn đảo
base["slice"+i].myNum = i;
}
Bây gi đon code ca chúng ta trông như sau:
Code:
_quality = "low";
sliceNum = 15;
step = 4;
angle = 20;
scaleFactor = 0.5;
rotSpeed = 0.05;
offsetX = 200;
offsetY = 200;
createEmptyMovieClip("base", 0);
base._x = offsetX;
base._y = offsetY;
for (i=0;i<sliceNum;i++) {
base.createEmptyMovieClip("slice"+i,i);
base["slice"+i].attachMovie("inner","inner"+i,i);
base["slice"+i]._y = - i*step*Math.cos (angle*Math.PI/180);
base["slice"+i]._yscale = Math.sin (angle*Math.PI/180)*100;
base["slice"+i]["inner"+i].gotoAndStop(i+1);
base["slice"+i].myNum = i;
}
Đon code này s dng hình hòn đảo dng tĩnh vi góc nhìn là 20 độ, nhng phn sau chúng
ta s cho nó tương tác vi chut.
Bn cn phi đặt nhng slice chng lên nhau theo th t, vì vy bn đặt chúng dc theo trc tung.
Các slice s được đặt t v trí gc ta độ 0 tr lên trên. Vì Flash s dng h trc tung ngược: phn
trc âm s gim dn hướng lên trên, bn cn chú ý điu này. Khong cách gia các slice vi nhau
chính là biến step má chúng ta đã gán lúc nãy. Bn xem hình sau:
và khi bn xoay vt th theo chiu dc, tc là angle tăng, do đó step gim
do đó thuc tính y ca slice s được tính bng công thc
Code:
y = step * Cosin (angle*Pi/180)