多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > cocos2dx坐標系介紹

cocos2dx坐標系介紹

來源:程序員人生   發布時間:2014-09-02 09:42:29 閱讀次數:2516次

GL坐標系

Cocos2D以OpenglES為圖形庫,所以它使用OpenglES坐標系。GL坐標系原點在屏幕左下角,x軸向右,y軸向上。

屏幕坐標系

蘋果的Quarze2D使用的是不同的坐標系統,原點在屏幕左上角,x軸向右,y軸向下。ios的屏幕觸摸事件CCTouch傳入的位置信息使用的是該坐標系。因此在cocos2d中對觸摸事件做出響應前需要首先把觸摸點轉化到GL坐標系。可以使用CCDirector的convertToGL來完成這一轉化。

世界坐標系

世界坐標系也叫做絕對坐標系,是游戲開發中的概念,它建立了描述其他坐標系所需要的參考框架。我們能夠用世界坐標系來描述其他坐標系的位置,而不能用更大的,外部的坐標系來描述世界坐標系。cocos2d中的元素是有父子關系的層級結構,我們通過CCNode的position設定元素的位置使用的是相對與其父節點的本地坐標系而非世界坐標系。最后在繪制屏幕的時候cocos2d會把這些元素的本地坐標映射成世界坐標系坐標。世界坐標系和GL坐標系一致,原點在屏幕左下角,x軸向右,y軸向上。

本地坐標系

本地坐標系也叫做物體坐標系,是和特定物體相關聯的坐標系。每個物體都有它們獨立的坐標系,當物體移動或改變方向時,和該物體關聯的坐標系將隨之移動或改變方向。例如坐出租車的時候對駕駛員說“向左轉”,我們使用的是車的物體坐標系,“前”、“后”、“左”、“右”只有在物體坐標系中才有意義。但如果我們說“向東開”,我們使用的就是世界坐標系了,無論是車內還是車外的人都知道應該向什么方向開。CCNode的position使用的就是父節點的本地坐標系,它和GL坐標系也是一致的,x軸向右,y軸向上,原點在父節點的左下角。如果父節點是場景樹中的頂層節點,那么它使用的本地坐標系就和世界坐標系重合了。在CCNode對象中有幾個方便的函數可以做坐標轉換:convertToWorldSpace方法可以把基于當前節點的本地坐標系下的坐標轉換到世界坐標系中。convertToNodeSpace方法可以把世界坐標轉換到當前節點的本地坐標系中。注意這些方法轉換的是基于當前節點的坐標,而一個節點的position所使用的坐標是基于它父節點的本地坐標,因此我們要把node的位置轉換到世界坐標系中應該調用父節點的convertToWorldSpace函數 [node.parent convertToWorldSpace:[node position]]。幾乎所有的游戲引擎都會使用本地坐標系而非世界坐標系來指定元素的位置,這樣做的好處是當計算物體運動的時候使用同一本地坐標系的元素可以作為一個子系統獨立計算,最后再加上坐標系的運動即可,這是物理研究中常用的思路。例如一個在行駛的車廂內上下跳動的人,我們只需要在每幀繪制的時候計算他在車廂坐標系中的位置,然后加上車的位置就可以計算出人在世界坐標系中的位置,如果使用單一的世界坐標系,人的運動軌跡就變復雜了。

錨點

每一個CCNode都有一個錨點(anchor point),錨點指定了texture上和所在節點原點(也就是position所表示的點)重合的點的位置,因此只有在節點使用了texture的情況下,錨點才有意義。錨點的默認值是(0.5, 0.5),它表示的并不是一個像素點,而是一個乘數因子。(0.5, 0.5) 表示錨點位于texture長度乘以0.5和寬度乘以0.5的地方,即texture的中心。改變錨點的值并不會改變節點的位置(position),雖然可能看起來節點的圖像位置發生了變化,其實變化的只是texture相對于position的位置,相當于你在移動節點里面的texture,而非節點本身。如果把錨點設置成(0,0),texture的左下角就會和節點的position點重合,這可能使得元素定位更為方便,但會影響到元素的縮放和旋轉等一系列變換,所以不推薦這么做。 因此在錨點為默認值(0.5,0.5)的情況下要把一個精靈放置到屏幕底部中央,應該如下設置position

[plain] view plaincopy
  1. CGSize screenSize = [[CCDirector sharedDirector] winSize];  
  2. float imageHeight = player.contentSize.height;  
  3. player.position = CGPointMake(screenSize.width / 2, imageHeight / 2);  

仿射變換

一般來說游戲中會大量使用旋轉,縮放,平移等仿射變換( 所謂仿射變換是指在線性變換的基礎上加上平移,平移不是線性變換)。2D計算機圖形學中的仿射變換通常是通過和3x3齊次矩陣相乘來實現的。cocos2d中的仿射變換使用了Quartz 2D中的CGAffineTransform類來表示:

[cpp] view plaincopy
  1. struct CGAffineTransform {  
  2.    CGFloat a;  
  3.    CGFloat b;  
  4.    CGFloat c;  
  5.    CGFloat d;  
  6.    CGFloat tx;  
  7.    CGFloat ty;  
  8. };  
  9. typedef struct CGAffineTransform CGAffineTransform;  
CGAffineTransform類表示的齊次矩陣如下,由于變換矩陣最后一列總是[0,0,1],所以被省略了:


由于cocos2d的繪制使用了OpenglES,因此CGAffineTransform只是用來表示2D仿射變換,最終還是要轉化成OpenglES的4x4變換矩陣(Opengl是3D的世界,因此它接受的齊次矩陣是4x4的)。轉換工作由CGAffineToGL(const CGAffineTransform *t, GLfloat *m)來完成,Opengl的變換矩陣以一維數組表示,它和CGAffineTransform的映射關系如下:

[plain] view plaincopy
  1. | m[0] m[4] m[8]  m[12] |     | m11 m21 m31 m41 |     | a c 0 tx |  
  2. | m[1] m[5] m[9]  m[13] |     | m12 m22 m32 m42 |     | b d 0 ty |  
  3. | m[2] m[6] m[10] m[14] | <=> | m13 m23 m33 m43 | <=> | 0 0 1  0 |  
  4. | m[3] m[7] m[11] m[15] |     | m14 m24 m34 m44 |     | 0 0 0  1 |  

PS關于3x3齊次矩陣: 
對于2D平面上的點[x,y],2x2的變換矩陣(右乘)表示的是線性變換,不包含平移。這很容易理解:根據矩陣乘法的性質,零向量總是變換成零向量,因此任何能用矩陣乘法表達的變換都不包含平移。事實上,平移是矩陣加法,而不是矩陣乘法。齊次坐標系的引入是一種數學上的技巧,通過合并矩陣運算中的乘法和加法,使得變換矩陣可以處理平移。所謂齊次坐標就是將一個原本是n維的向量用一個n+1維向量來表示。2D向量[x,y]的齊次表示就是[x,y,h],h叫做齊次因子,可以是任意非零值,因此一個向量的齊次表示是不唯一的,比如齊次坐標[8,4,2]、[4,2,1]表示的都是2D點[4,2]。h=0通常可以理解為無窮遠點,通過計算不難發現,[x,y,0]乘以3x3平移變換矩陣,平移無效。換句話說,h分量有開關3x3矩陣的平移部分的功能。這個現象是非常有用的,盡管數學表示上相同,從幾何意義上來說向量和點是完全不同的: 向量只表示方向,沒有位置,而點表示位置,[x,y]可以代表向量也可以代表點(當表示點的時候,其實指的是相對于原點的位移)。點可以平移但向量不可以,因此從幾何意義上講,[x,y,h],當h≠0時表示的是點,當h=0時表示的是向量。

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 色福利在线 | 成人精品视频 | 中文字幕免费在线视频 | 久久亚洲国产视频 | 性做久久久久久免费观看 | 天堂mv亚洲mv在线播放9蜜 | 欧美日本一区视频免费 | 久久精品国产999久久久 | 午夜视频在线免费看 | 午夜影院在线免费观看 | 亚洲成人天堂 | 国产精品99爱免费视频 | 亚洲一区二区三区久久精品 | 亚洲an天堂an在线观看 | 国产1区2区 | 欧美成人a视频 | 久久免费精品一区二区 | 国产成人免费a在线资源 | 午夜影院网站 | 在线播放免费一级毛片欧美 | 多人伦交性欧美精品欧 | 日韩欧美伊人久久大香线蕉 | 午夜三级三级三点在线 | 国产一区自拍视频 | 日本免费一区二区三区最新vr | 五月国产综合视频在线观看 | 久久久久久久综合日本亚洲 | 五月天综合久久 | 国产精品亚洲片在线观看麻豆 | 欧洲freexxxx性播放 | 亚洲欧洲第一页 | 国产三级在线观看播放 | 亚洲最大的黄色网 | 动漫美女羞羞网站 | 最近最新中文字幕免费1 | 国产美女久久久 | 视频一区二区中文字幕 | 国产精品久久一区二区三区 | 亚洲国产精品乱码一区二区三区 | 国产福利在线观看精品 | 性高跟鞋xxxxhd |