?? flash_3d教程——閃吧 flash8.htm
字號(hào):
face=宋體> 這就是z旋轉(zhuǎn)的公式。用同樣的方法可推出x旋轉(zhuǎn),y旋轉(zhuǎn)的公式??偨Y(jié)如下:</FONT></DIV>
<DIV></DIV>
<P>
<DIV><FONT face=宋體>給定點(diǎn):(x,y,z)</FONT></DIV>
<DIV></DIV>
<P>
<DIV><FONT face=宋體>繞x軸旋轉(zhuǎn)后的點(diǎn)</FONT><FONT
face=宋體>(x1,y1,z1)<BR>繞y軸旋轉(zhuǎn)后的點(diǎn)</FONT><FONT
face=宋體>(x2,y2,z2)<BR>繞z軸旋轉(zhuǎn)后的點(diǎn)(x3,y3,z3)</FONT></DIV>
<DIV></DIV>
<P>
<DIV><FONT face=宋體></FONT><FONT face=宋體> x旋轉(zhuǎn)(x不變</FONT><FONT
face=宋體>)<BR> </FONT><FONT face=宋體>x1=x<BR> </FONT><FONT
face=宋體>y1=y*cosb-z*sinb<BR> z1=z*cosb+y*sinb</FONT></DIV>
<DIV></DIV>
<P>
<P><FONT face=宋體>
<TABLE cellSpacing=0 cellPadding=0 width="100%">
<TBODY>
<TR>
<TD>
<DIV v:shape="_x0000_s1037">
<DIV>注:x旋轉(zhuǎn)要注意,在FLASH中x1=x<BR> y1=y*cosb+z*sinb<BR> z1=z*cosb-y*sinb</DIV>
<DIV></DIV>
<P>
<DIV>是先加后減,因?yàn)镕LASH里的Y軸是反的,箭頭向下的。</DIV>
<DIV></DIV>
<DIV></DIV>
<DIV></DIV>
<DIV></DIV>
<DIV></DIV>
<DIV></DIV>
<DIV></DIV></DIV></TD></TR></TBODY></TABLE></FONT></P>
<DIV></DIV>
<P>
<DIV><FONT face=宋體></FONT></DIV>
<DIV></DIV>
<P>
<DIV><FONT face=宋體></FONT></DIV>
<DIV></DIV>
<P>
<DIV><FONT face=宋體></FONT></DIV>
<DIV></DIV>
<P>
<DIV><FONT face=宋體></FONT></DIV>
<DIV></DIV>
<P>
<DIV><FONT face=宋體></FONT></DIV>
<DIV></DIV>
<P>
<DIV><FONT face=宋體></FONT></DIV>
<DIV></DIV>
<P>
<DIV><FONT face=宋體></FONT></DIV>
<DIV></DIV>
<P>
<DIV><FONT face=宋體> y旋轉(zhuǎn)(y不變</FONT><FONT face=宋體>)<BR> </FONT><FONT
face=宋體>x2=x*cosb-z1*sinb<BR> </FONT><FONT
face=宋體>y2=y1<BR> z2=z1*cosb+x*sinb</FONT></DIV>
<DIV></DIV>
<P>
<DIV><FONT face=宋體> z旋轉(zhuǎn)(z不變</FONT><FONT face=宋體>)<BR> </FONT><FONT
face=宋體>x3=x2*cosb-y1*sinb<BR> </FONT><FONT
face=宋體>y3=y1*cosb+x2*sinb<BR> z3=z2</FONT></DIV>
<DIV></DIV>
<P>
<DIV><FONT
face=宋體> 從以上公式可看出,在flash要實(shí)現(xiàn)旋轉(zhuǎn),先要求x軸的旋轉(zhuǎn)點(diǎn),再求y軸的旋轉(zhuǎn)點(diǎn),最后再求出z軸的旋轉(zhuǎn)點(diǎn)。最后我們來(lái)一個(gè)x旋轉(zhuǎn)的應(yīng)用</FONT></DIV>
<DIV></DIV>
<P>
<DIV><FONT face=宋體>三、制作x軸旋轉(zhuǎn)的正方體</FONT></DIV>
<DIV></DIV>
<P>
<DIV><FONT face=宋體> 1、在場(chǎng)景中畫(huà)一小球,并按F8轉(zhuǎn)換為mc,實(shí)例命名為qiu。</FONT></DIV>
<DIV></DIV>
<P>
<DIV><FONT face=宋體> 2、增加一層,命名為as,接下去我們來(lái)寫(xiě)as,如下:</FONT></DIV>
<DIV></DIV>
<P>
<DIV><FONT face=宋體>_root.onLoad = function() {<BR>shumu = 8;<BR>//
</FONT><FONT face=宋體>定義復(fù)制小球的數(shù)目</FONT><BR><FONT face=宋體>qiu._x =
6000;<BR>// </FONT><FONT face=宋體>讓原始小球消失</FONT><BR><FONT face=宋體>for
(var i = 0; i<shumu; i++) {<BR>duplicateMovieClip("qiu", "qiu"+i,
i);<BR>}<BR>// </FONT><FONT face=宋體>復(fù)制小球,作為正方體的八個(gè)頂點(diǎn)</FONT><BR><FONT
face=宋體>qiu_pos_x = new Array(100, 0, 0, 100, 100, 0, 0,
100);<BR>qiu_pos_y = new Array(100, 100, 100, 100, 0, 0, 0,
0);<BR>qiu_pos_z = new Array(50, 50, -50, -50, 50, 50, -50,
-50);<BR>// </FONT><FONT
face=宋體>從三維坐標(biāo)中取正方體的8個(gè)頂點(diǎn)的坐標(biāo),保存在數(shù)組中</FONT><BR><FONT face=宋體>D =
200;<BR>// </FONT><FONT face=宋體>觀察者與屏幕的距離</FONT><BR><FONT
face=宋體>hutu = 0.001;<BR>// </FONT><FONT
face=宋體>控制旋轉(zhuǎn)的速度</FONT><BR><FONT face=宋體>b = hutu*180/Math.PI;<BR>//
</FONT><FONT face=宋體>角、弧度的轉(zhuǎn)換</FONT><BR><FONT
face=宋體>};<BR>_root.onEnterFrame = function() {</FONT></DIV>
<DIV></DIV>
<P>
<DIV><FONT face=宋體>for (var i = 0; i<shumu; i++) {<BR>x1 =
qiu_pos_x[i];<BR>y1 =
qiu_pos_y[i]*Math.cos(b)-qiu_pos_z[i]*Math.sin(b);<BR>z1 =
qiu_pos_z[i]*Math.cos(b)+qiu_pos_y[i]*Math.sin(b);<BR>//
</FONT><FONT face=宋體>按公式計(jì)算</FONT><BR><FONT face=宋體>qiu_pos_x[i] =
x1;<BR>qiu_pos_y[i] = y1;<BR>qiu_pos_z[i] = z1;<BR>// </FONT><FONT
face=宋體>更新數(shù)組元素</FONT><BR><FONT face=宋體>ratio =
D/(D+z1);<BR>perspective_x = x1*ratio;<BR>perspective_y =
y1*ratio;<BR>// </FONT><FONT face=宋體>按公式計(jì)算</FONT><BR><FONT
face=宋體>_root["qiu"+i]._x = 275+perspective_x;<BR>_root["qiu"+i]._y
= 200-perspective_y;<BR>/ </FONT><FONT
face=宋體>設(shè)置球的坐標(biāo)</FONT><BR><FONT face=宋體>_root["qiu"+i]._xscale =
_root["qiu"+i]._yscale=50*ratio;<BR>// </FONT><FONT
face=宋體>球的大小</FONT><BR><FONT
face=宋體>_root["qiu"+i].swapDepths(10000-qiu_pos_z[i]);<BR>//
</FONT><FONT face=宋體>球的層次</FONT><BR><FONT
face=宋體>_root["qiu"+i]._alpha=100*ratio;//</FONT><FONT
face=宋體>設(shè)置透明度</FONT></DIV>
<DIV></DIV>
<P>
<DIV><FONT face=宋體>}<BR>};</FONT></DIV>
<DIV></DIV>
<P>
<DIV><FONT face=宋體>3、按CTRL+Enter測(cè)試,一個(gè)簡(jiǎn)單的3D旋轉(zhuǎn)就形成了。</FONT></DIV>
<DIV></DIV>
<P>
<DIV><FONT face=宋體>(至此為止,上面部分的教程很大程度上是參考《<B>flash 3D
</B><B>基礎(chǔ)教程</B>》(作者:zjs35 文章來(lái)源:flashempire
更新時(shí)間:2004-4-7)的,本人只在上面做了微小部分的修改,主要因?yàn)檫@篇對(duì)FLASH_3D效果的基礎(chǔ)理論確實(shí)寫(xiě)的很好。修改的部分,是本人在學(xué)習(xí)之后,自己在實(shí)踐練習(xí)中發(fā)現(xiàn)的一些需要注意的地方。)</FONT></DIV>
<DIV></DIV>
<P>
<DIV><FONT
face=宋體>接下來(lái)將為大家解析一篇某人大蝦寫(xiě)的立方體旋轉(zhuǎn)的FLASH_AS,這位大蝦是用純AS寫(xiě)的,只要把代碼全部復(fù)制到第一楨就可以了。我將做詳細(xì)的解析!!!</FONT></DIV>
<DIV></DIV>
<P>
<DIV><FONT face=宋體>//</FONT><FONT
face=宋體>先給各項(xiàng)賦值,為后面的編輯作做準(zhǔn)備</FONT><FONT face=宋體> <BR>plane = [0, [0,
1, 2, 3, 4], [0, 5, 6, 7, 8], [0, 1, 2, 6, 5], [0, 2, 3, 7, 6], [0,
4, 3, 7, 8], [0, 1, 4, 8, 5]];
//給立方體的8個(gè)點(diǎn)都標(biāo)上數(shù),這里定義的數(shù)組是立方體的6個(gè)面,每個(gè)面上4個(gè)點(diǎn),上面的數(shù)字就是哪四個(gè)點(diǎn)組成一個(gè)面,每組前面多個(gè)0,是為了下面做循環(huán)調(diào)用是方便,循環(huán)可以從i=1開(kāi)始。大家自己可以根據(jù)上面的數(shù)組。畫(huà)出它在三維坐標(biāo)中的立體圖形。另,第一“0“,其實(shí)是[0,0,0,0,0]。</FONT><BR><FONT
face=宋體>dx = [0, 1, -1, -1, 1, 1, -1, -1, 1]; //</FONT><FONT
face=宋體>這里是給8個(gè)點(diǎn)在三維坐標(biāo)定義數(shù)組,豎著看,沒(méi)一行就是一個(gè)點(diǎn)坐標(biāo)的(x,y,z)
,另沒(méi)組前面多個(gè)0,是為了下面做循環(huán)調(diào)用是方便,循環(huán)可以從i=1開(kāi)始。</FONT><BR><FONT face=宋體>dy = [0,
1, 1, 1, 1, -1, -1, -1, -1]; //<BR>dz = [0, 1, 1, -1, -1, 1, 1, -1,
-1]; //<BR>colour=0x4499FF //</FONT><FONT
face=宋體>這里定義的是立方體的顏色,其實(shí),要6個(gè)面,每個(gè)面的顏色不同,就把這個(gè)colour定義成數(shù)組就可以了。同樣前面加個(gè)0,也是上面的理由。</FONT></DIV>
<DIV></DIV>
<P>
<DIV><FONT
face=宋體>//colour=[0,0x4499FF,0x6F13EC,0xF1F00E,0x6CE31C,0x26D9A3,0x808080];</FONT></DIV>
<DIV></DIV>
<P>
<DIV><FONT face=宋體>trans = Math.PI/180; //</FONT><FONT
face=宋體>下面的弧度和角度的轉(zhuǎn)換用</FONT><BR><FONT face=宋體>cube_width = 100;
//</FONT><FONT face=宋體>用于設(shè)定立方體的邊的長(zhǎng)度</FONT><BR><FONT face=宋體>d = 400;
//// </FONT><FONT face=宋體>觀察者與屏幕的距離</FONT><BR><FONT
face=宋體>num_planes = plane.length-1; //num_planes=6<BR>num_nodes =
dx.length-1; //num_nodes=8<BR>num_nodes_per_plane =
plane[1].length-1;//num_nodes_per_plane=4 <BR>xz_angle_inc = 0;
//</FONT><FONT face=宋體>下面這4個(gè)定義對(duì)用鼠標(biāo)控制旋轉(zhuǎn)的速度有關(guān),</FONT><BR><FONT
face=宋體>yz_angle_inc = 0; <BR>angle_inc_factor = .1;
<BR>angle_dec_factor = .9; <BR>o_x = Stage.width/2; //</FONT><FONT
face=宋體>把坐標(biāo)原點(diǎn)移到屏幕中心</FONT><BR><FONT face=宋體>o_y = Stage.height/2;
<BR>node = new Array(); //</FONT><FONT face=宋體>定義新數(shù)組</FONT><BR><FONT
face=宋體>p_node = new Array(); <BR>//</FONT><FONT face=宋體>邊長(zhǎng)調(diào)整...
主要是求出8個(gè)點(diǎn),在設(shè)定邊長(zhǎng),情況下的坐標(biāo)</FONT><BR><FONT face=宋體>for (i=1;
i<=num_nodes; i++) { <BR>node[i] = new Object(); <BR>node[i].x =
dx[i]*(cube_width/2); <BR>node[i].y = dy[i]*(cube_width/2);
<BR>node[i].z = dz[i]*(cube_width/2); <BR>} <BR>for (i=1;
i<=num_planes; i++) { //</FONT><FONT
face=宋體>建立6個(gè)空白的影片剪輯,主要用于,每天影片剪輯,畫(huà)一個(gè)立方體的面。</FONT><BR><FONT
face=宋體>_root.createEmptyMovieClip("plane"+i, i); <BR>}
<BR>//</FONT><FONT face=宋體>版面的調(diào)整 下面的_root.onEnterFrame
會(huì)調(diào)用這里進(jìn)行畫(huà)立方體</FONT></DIV>
<DIV></DIV>
<P>
<DIV><FONT face=宋體>//</FONT><FONT
face=宋體>對(duì)這里不理解的,看附錄一的代碼!</FONT><BR><FONT face=宋體>function
create_planes() { <BR>for (var i = 1; i<=num_planes; i++) {
<BR>depth = 0; //</FONT><FONT face=宋體>設(shè)定深度初始值</FONT><BR><FONT
face=宋體>mc = _root["plane"+i]; //</FONT><FONT
face=宋體>每個(gè)影片剪輯畫(huà)一個(gè)立方體的一個(gè)面</FONT><BR><FONT face=宋體>mc.clear();
//</FONT><FONT
face=宋體>清除上次畫(huà)的面,不用這句語(yǔ)句,可以看到面的連續(xù)旋轉(zhuǎn)的會(huì)是什么軌跡,程序是怎么畫(huà)的。不過(guò),很難看。</FONT><BR><FONT
face=宋體>mc.beginFill(colour, 100); //</FONT><FONT
face=宋體>設(shè)置立方體面的顏色,colour可以變數(shù)組colour[i],這樣每個(gè)面可以畫(huà),不同的顏色。</FONT></DIV>
<DIV></DIV>
<P>
<DIV><FONT
face=宋體>mc.lineStyle(3,0xFF0000,100);//設(shè)置立方體的棱的顏色</FONT></DIV>
<DIV></DIV>
<P>
<DIV><FONT face=宋體>mc.moveTo(p_node[plane[i][1]].x,
p_node[plane[i][1]].y);//</FONT><FONT
face=宋體>這里設(shè)定每個(gè)正方形面,開(kāi)始畫(huà)時(shí)的啟始點(diǎn)。</FONT><FONT face=宋體> <BR>for
(j=num_nodes_per_plane; j>=1; j--) {
//這里是連續(xù)讀取4個(gè)點(diǎn),畫(huà)好一個(gè)正方形</FONT><BR><FONT
face=宋體>mc.lineTo(p_node[plane[i][j]].x, p_node[plane[i][j]].y);
<BR>depth += node[plane[i][j]].z; //</FONT><FONT
face=宋體>求每個(gè)面上4點(diǎn)旋轉(zhuǎn)后,4個(gè)點(diǎn)的深度變化,并相加</FONT><BR><FONT face=宋體>} <BR>depth
/= -num_nodes_per_plane;//</FONT><FONT
face=宋體>注意除以負(fù)數(shù),這樣符合,F(xiàn)LASH的深度變化的遠(yuǎn)近情況</FONT><FONT face=宋體>
<BR>mc.swapDepths(depth);
//有點(diǎn)的深度變化,來(lái)控制面的層次變化,如果沒(méi)有這句,可以看到一個(gè)立方體在旋轉(zhuǎn)是6個(gè)面的層次混亂。</FONT><BR><FONT
face=宋體>amount = depth/50*100+15;//</FONT><FONT
face=宋體>用深度變化,在傳值,這個(gè)參數(shù)主要用于下面的語(yǔ)句,下面的語(yǔ)句,用于立方體在旋轉(zhuǎn)時(shí),面的亮度的調(diào)整,符合一定的光照效果。</FONT><FONT
face=宋體> <BR>new Color(mc).setTransform({ra:amount, ga:amount,
ba:amount}); //這句語(yǔ)句可以查看FLASH_AS語(yǔ)法參考,可以找到的。主要是對(duì)色彩的設(shè)置。</FONT><BR><FONT
face=宋體>} <BR>} <BR><BR>//</FONT><FONT face=宋體>鼠標(biāo)激發(fā)</FONT><FONT
face=宋體> <BR>_root.onMouseDown = function() { <BR>mouse_down = true;
<BR>}; <BR>_root.onMouseUp = function() { <BR>mouse_down = false;
<BR>}; <BR>_root.onEnterFrame = function() { <BR>if (mouse_down) {
//判斷,鼠標(biāo)情況,對(duì)鼠標(biāo)移動(dòng)距離的相加,如果,沒(méi)有“+=”而用“=”,這樣鼠標(biāo)每點(diǎn)一次,圖象就跳回初始狀態(tài)??梢宰约簩?shí)驗(yàn)看下效果,進(jìn)行對(duì)比。</FONT><BR><FONT
face=宋體>xz_angle_inc += (_xmouse-old_mx)*angle_inc_factor;
<BR>yz_angle_inc += (_ymouse-old_my)*angle_inc_factor; <BR>} <BR>for
(i=1; i<=num_nodes; i++) { <BR>sin_xz =
Math.sin(xz_angle_inc*trans); //</FONT><FONT
face=宋體>對(duì)弧度與角度的轉(zhuǎn)化公式。</FONT><BR><FONT face=宋體>cos_xz =
Math.cos(xz_angle_inc*trans); <BR>sin_yz =
Math.sin(yz_angle_inc*trans); <BR>cos_yz =
Math.cos(yz_angle_inc*trans); <BR>rx1 =
cos_xz*node[i].x-sin_xz*node[i].z; //</FONT><FONT
face=宋體>這里就是上面的坐標(biāo)轉(zhuǎn)換公式里的,先按Y軸旋轉(zhuǎn),再按X軸旋轉(zhuǎn)。</FONT><BR><FONT face=宋體>ry1 =
node[i].y; <BR>rz1 = cos_xz*node[i].z+sin_xz*node[i].x; <BR>rx2 =
rx1; <BR>ry2 = cos_yz*ry1+sin_yz*rz1; <BR>rz2 =
cos_yz*rz1-sin_yz*ry1; <BR>node[i].x = rx2; //</FONT><FONT
face=宋體>這里是把每個(gè)旋轉(zhuǎn)后,得到的先的坐標(biāo)保存在變量里</FONT><BR><FONT face=宋體>node[i].y =
ry2; <BR>node[i].z = rz2; <BR>p_ratio = d/(d+node[i].z);
//</FONT><FONT face=宋體>這個(gè)是上面</FONT><FONT
face=宋體>d/(d+z)<BR>p_node[i] = new Object(); <BR>p_node[i].x =
o_x+node[i].x*p_ratio; //確定在屏幕上點(diǎn)的位置</FONT><BR><FONT
face=宋體>p_node[i].y = o_y-node[i].y*p_ratio; <BR>} <BR>xz_angle_inc
*= angle_dec_factor; //</FONT><FONT
face=宋體>這個(gè)加速鼠標(biāo)控制時(shí)的旋轉(zhuǎn)速度</FONT><BR><FONT face=宋體>yz_angle_inc *=
angle_dec_factor; <BR>old_mx = _xmouse; //</FONT><FONT
face=宋體>得到影片開(kāi)始時(shí)的鼠標(biāo)坐標(biāo)</FONT><BR><FONT face=宋體>old_my = _ymouse;
<BR>create_planes(); //</FONT><FONT
face=宋體>調(diào)用上面的函數(shù),畫(huà)出立方體</FONT><BR><FONT face=宋體>}; </FONT></DIV>
<DIV></DIV>
<P>
<DIV><FONT face=宋體>//</FONT><FONT
face=宋體>點(diǎn)評(píng):本人只所以選擇這個(gè)例子進(jìn)行解析,主要是因?yàn)楫?huà)立方體,是很常見(jiàn)的例子,也是3D里的一個(gè)基本的畫(huà)法。另,這個(gè)例子的代碼是很精練,簡(jiǎn)潔,再加上代碼的前部分定義的一些值,利于以后做其他項(xiàng)目的開(kāi)發(fā),可以把這個(gè)程序改成一個(gè)類(lèi),適合自身以后,對(duì)畫(huà)立方體時(shí)調(diào)用。同時(shí),可以在這個(gè)程序基礎(chǔ)上做進(jìn)一步開(kāi)發(fā)!比如,將好幾個(gè)立方體疊起來(lái),把圖片放在立方體的面上,做一些旋轉(zhuǎn)立體按鈕等等,都是可以的。</FONT><BR><FONT
face=宋體>//</FONT><FONT face=宋體>附錄一:</FONT></DIV>
<DIV></DIV>
<P>
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -