cocos2d-x的CCAffineTransform相關變換實現原理


  稍有opengl或3d基礎的都知道平移/旋轉/縮放這幾個基本模型視圖變換的實現原理, 最近看了下cocos2d-x相關部分的實現, 了解了這些實現那些各種坐標變換基本不在話下了, cocos2d-x本身還是相對簡單的引擎.

1. CCAffineTransform

struct CCAffineTransform {
    float a, b, c, d;
    float tx, ty;
};

表示變換矩陣:

構造CCAffineTransform結構

CCAffineTransform __CCAffineTransformMake(float a, float b, float c, float d, float tx, float ty)
{
  CCAffineTransform t;
  t.a = a; t.b = b; t.c = c; t.d = d; t.tx = tx; t.ty = ty;
  return t;
}

 

2. 單位矩陣

CCAffineTransform CCAffineTransformMakeIdentity()
{
    return __CCAffineTransformMake(1.0, 0.0, 0.0, 1.0, 0.0, 0.0);
}

將CCAffineTransform構造為單位矩陣:

 

3. 平移

CCAffineTransform CCAffineTransformTranslate(const CCAffineTransform& t, float tx, float ty)
{
    return __CCAffineTransformMake(t.a, t.b, t.c, t.d, t.tx + t.a * tx + t.c * ty, t.ty + t.b * tx + t.d * ty);
}

將CCAffineTransform矩陣和平移矩陣的結果:

 

4. 旋轉

CCAffineTransform CCAffineTransformRotate(const CCAffineTransform& t, float anAngle)
{
    float fSin = sin(anAngle);
    float fCos = cos(anAngle);

    return __CCAffineTransformMake(    t.a * fCos + t.c * fSin,
                                    t.b * fCos + t.d * fSin,
                                    t.c * fCos - t.a * fSin,
                                    t.d * fCos - t.b * fSin,
                                    t.tx,
                                    t.ty);
}

繞Z軸旋轉矩陣右乘以變換矩陣:

 

5. 縮放

CCAffineTransform CCAffineTransformScale(const CCAffineTransform& t, float sx, float sy)
{
    return __CCAffineTransformMake(t.a * sx, t.b * sx, t.c * sy, t.d * sy, t.tx, t.ty);
}

 

6. Concate

/* Concatenate `t2' to `t1' and return the result:
     t' = t1 * t2 */
CCAffineTransform CCAffineTransformConcat(const CCAffineTransform& t1, const CCAffineTransform& t2)
{
    return __CCAffineTransformMake(    t1.a * t2.a + t1.b * t2.c, t1.a * t2.b + t1.b * t2.d, //a,b
                                    t1.c * t2.a + t1.d * t2.c, t1.c * t2.b + t1.d * t2.d, //c,d
                                    t1.tx * t2.a + t1.ty * t2.c + t2.tx,                  //tx
                                    t1.tx * t2.b + t1.ty * t2.d + t2.ty);                  //ty
}

結果相當於t2 . t1

 

7. CCPointApplyAffineTransform

CCPoint __CCPointApplyAffineTransform(const CCPoint& point, const CCAffineTransform& t)
{
  CCPoint p;
  p.x = (float)((double)t.a * point.x + (double)t.c * point.y + t.tx);
  p.y = (float)((double)t.b * point.x + (double)t.d * point.y + t.ty);
  return p;
}

 

8. CCAffineTransformInvert

CCAffineTransform CCAffineTransformInvert(const CCAffineTransform& t)
{
    float determinant = 1 / (t.a * t.d - t.b * t.c);

    return __CCAffineTransformMake(determinant * t.d, -determinant * t.b, -determinant * t.c, determinant * t.a,
                            determinant * (t.c * t.ty - t.d * t.tx), determinant * (t.b * t.tx - t.a * t.ty) );
}

求矩陣的逆矩陣,通過Mathematica計算得:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM