1. 程式人生 > >理解Cocos2d-x座標系統

理解Cocos2d-x座標系統

座標系Coordinator

這個概念非常普遍,而且非常的常用,使用過二維繪圖、三維繪圖的應該都不陌生。

笛卡爾座標系:這個接觸過OpenGL的都不陌生,以左下角為原點,x向右,y向上,z向外,符合右手定則。Cocos2d使用的就是此座標系,原點為左下角,x向右,y向上。

螢幕座標系:與笛卡爾座標系不同,以左上角為原點,x向右,y向下,這個是常用的開發中的座標系。

世界座標系和本地座標系

世界座標系,任何一個物體都存在一個世界中,任何一個點在世界中都是唯一的,然而,這個唯一點在使用時不一定是最方便的,很大一部分使用的是相對座標系,也說本地座標系。這一概念無論是二維繪圖還是三維繪圖都是成立的。

錨點AnchorPoint

接觸過二維繪圖的應該比較熟悉,一個圖元,加入到圖層或者場景中時,除了指定position之外,還有一個重要的概念就是錨點,一般在圖元的轉換中使用較多,如旋轉、拉伸等。Cocos2d中,把一個節點加入到父節點時,要指定位置,這個位置就是錨點的位置。Cocos2d中的錨點引數是一個比例因子,在0~1之間。預設情況下,Layer的錨點在(0, 0),其他的則在(0.5, 0.5)。並且,Layer的錨點在設定時,需要呼叫ignoreAnchorPointForPosition( false ),然後呼叫setAnchorPoint()。

座標點轉換問題(convertToNodeSpace和convertToWorldSpace的區別)

convertToWorldSpace:將座標轉換成世界座標,也就是世界座標系下的點。查閱原始碼,這個函式的實現,有一個對矩陣轉換的一個遍歷乘積。

Mat4 Node::getNodeToWorldTransform() const
{
    Mat4 t = this->getNodeToParentTransform();

    for (Node *p = _parent; p != nullptr; p = p->getParent())
    {
        t = p->getNodeToParentTransform() * t;
    }

    return t;
}
舉例來說,把一個節點,加入到parent中,可以使用getPosition獲得這個相對於父節點的座標點,使用parent呼叫該函式可以得到該節點的世界座標。

convertToWorldSpace:將座標轉成相對座標,可以把世界座標轉換成相對座標。繼續上面的例子,使用parent呼叫該函式,將轉換後的世界座標轉換回原相對座標。