一、三維座標系轉化成二維座標系
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...