Flash 3D的一些轉換基礎

2021-08-08 23:28:52 字數 2833 閱讀 9127

一、三維座標系轉化成二維座標系

1、flash中的二維座標系

(1)、座標的轉換

flash中場景左上角為(0,0),而在數學中是場景中心為(0,0),怎樣把它轉成數學中的座標系呢?假設場景寬度:550,高度400。

x=550/2+this._x;//x右移

y=400/2-thix._y;//y下移

如圖1。

(2)、角度的轉換

flash中角度的計算:如圖2

hudu = math.atan2(y, x);

// 利用公式tg a=y/x,計算a的值,flash中a是以弧度表示的,我們要把它轉換成角度,設圓的半徑r為1,整個弧長為2*pai*r,也就是說360度等於2*pai弧度,所以轉成角度的公式為:

jiaodu = hudu*180/math.pi;

// 把弧度轉換為角度,公式為:角度=弧度*180/3.14,3.14為pai

if (jiaodu<0)

2、flash中的三維座標系

如圖3,z軸表示乙個物體離螢幕的遠近,當物體的z軸位置增加時,物體朝遠離螢幕的方向運動,當物體的z值減小時,物體朝接近螢幕的方向運動。

3、三維座標轉換成二維座標

如圖4,已知乙個點(x,y,z),怎樣確定該點螢幕上的位置呢?利用三角形相似的原理,可以得出下列結論:

d/(d+z)=y1/y,推出:y1=d*y/(d+z),這公式就是浪子講的經典的演算法,可在二維平面上來表現空間上的點的位置。我們還可把它進一步把它簡化。提出因子d/(d+z),用ratio(比率)表示,這個公式就變為

ratio=d/(d+z);

y1=ratio*y;同理可推出

x1=ratio*x;

二、控制物體的屬性(大小,層次,透明度等)

通過第一步的學習,我們就可建立一些三維的效果,但是還有很多不足之處,如遠的物體和近的物體的大小一樣,層次可能也不一樣,怎麼辦呢?

1、控制mc的大小

在三維座標中,當z值增大,也就是遠離螢幕時,物體應越小,反之越大。我們怎麼在flash中表示乙個mc的大小呢?還記得上一步的ratio嗎?現在就要用到這東東。當z增加時,ratio減少,因為在ratio中,z是作為分母的。反之,當z減少時,ratio增加。所以可用ratio來控制mc的大小。如下:

mc1._xscale=mc._xscale*ratio;

mc1._yscale=mc._yscale*ratio;

2、控制mc的層次

z值最大,物體應在最底層,最小,在最上層,所以我們可用乙個很大的常數減去z值,用此值作為mc的層次。flash中,設定mc的層次用swapdepths,如下:

mc.swapdepths(1000-z);//設定mc的層次

3、控制mc的透明度

遠處的物體看上去模糊些,近處的物體清晰些,在flash中,可用_alpha來控制,方法和控制大小類似,不在介紹原理。如下:

mc._alpha=100*ratio;

4、控制mc的角度(旋轉)

這一步最難,也最好的東東。學習以後,你將能製作出非常cool的效果

旋轉有三種,x旋**座標x不變,y旋**y不變,z旋**z不變,我們先來推導z旋轉。

如下圖:從點(x,y,0)轉到(x1.y1.0),求點(x1.y1.0)

利用數學中的正弦、余弦公式得出

x1=r*cos(a+b),而cos(a+b)=sina*cosb+cosa*sinb

推出:x1=r(cosa*cosb-sina*sinb)

又因為x=r*cosa,y=r*sina

所以x1=x*cosb-y*sinb

同樣推出:y1=y*cosb+x*sinb

這就是z旋轉的公式。用同樣的方法可推出x旋轉,y旋轉的公式。總結如下:

給定點:(x,y,z)

繞x軸旋轉後的點(x1,y1,z1)

繞y軸旋轉後的點(x2,y2,z2)

繞z軸旋轉後的點(x3,y3,z3) 

x旋轉(x不變) 

x1=x 

y1=y*cosb-z*sinb 

z1=z*cosb+y*sinb 

y旋轉(y不變) 

x2=x*cosb-z1*sinb 

y2=y1 

z2=z1*cosb+x*sinb 

z旋轉(z不變) 

x3=x2*cosb-y1*sinb 

y3=y1*cosb+x2*sinb 

z3=z2

從以上公式可看出,在flash要實現旋轉,先要求x軸的旋轉點,再求y軸的旋轉點,最後再求出z軸的旋轉點。最後我們來乙個x旋轉的應用

三、製作x軸旋轉的正方體

1、在場景中畫一小球,並按f8轉換為mc,例項命名為qiu。

2、增加一層,命名為as,接下去我們來寫as,如下:

_root.onload = function()

// 複製小球,作為正方體的八個頂點

qiu_pos_x = new array(100, 0, 0, 100, 100, 0, 0, 100);

qiu_pos_y = new array(100, 100, 100, 100, 0, 0, 0, 0);

qiu_pos_z = new array(50, 50, -50, -50, 50, 50, -50, -50);

// 從三維座標中取正方體的8個頂點的座標,儲存在陣列中

d = 200;

// 觀察者與螢幕的距離

hutu = 0.001;

// 控制旋轉的速度

b = hutu*180/math.pi;

// 角、弧度的轉換};

_root.onenterframe = function()

};

U3D的一些常用基礎指令碼

修改渲染顏色和貼圖2 3 function start 遍歷並刪除孩子節點function start 7 建立預設的遊戲物件並在5秒後銷毀2 var pos vector3 3 var rot quaternion 4 5 function start 具有父子關係的遊戲物件間訊息的傳遞funct...

unity3d 一些新用法

1.ref 用法setstate ref this.curstate,animatorstate.other 如果用上ref的話,操作的是同乙個變數,所以會改變值,如果沒用上ref的話,操作的不是同乙個變數,所以值不會改變。呼叫的引數要在呼叫前就要初始化,賦值2.physics2d linecast...

一些有用的轉換

relation with conversion 1.wchar tchar widechartomultibyte wcstombs cstring atl macros ole2a w2t w2ct lstrcpy note include swprintf wchar,l ls char wc...