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计算得:

时间: 2024-10-07 21:39:45

cocos2d-x的CCAffineTransform相关变换实现原理的相关文章

断点 相关技术与原理(2)

继续对OD的断点技术做个笔记. 1.硬件断点: Intel CPU中有8个调试寄存器(Debug Register)DR0 - DR7,当中DR0 - DR3用于设置硬件断点地址,DR6保存状态,DR7负责控制.当指令运行到DR所指地址时,CPU中断,等待OllyDbg进一步操作. OllyDbg中,选定一行后按F4键.用于运行到指定位置,就是暂时设置了一个硬件断点. 硬件訪问/写入断点是断在触发硬件断点的下一条指令处. 方法: 在代码处右键->断点->硬件运行.在寄存器窗体右键->查看

OpenCV2马拉松第22圈——Hough变换直线检测原理与实现

计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/27220445 收入囊中 Hough变换 概率Hough变换 自己实现Hough变换直线检测 葵花宝典 先看一下我实现的效果图 下面,我们进入Hough变换的原理讲解. 看上图,我们知道,经过一点(x0,y0)的直线可以表示成y0 = mox + b0 反过来看方程,b = –x0m + y0 ,于是我们从原来的坐标系转移到了Hough空间,m是横

人脸表情识别相关研究

1. 国内外研究人脸表情识别的公司与产品介绍 现在,国内外都有人脸识别的相关产品,尤其在美国,已经能够通过机器人识别人脸表情,还能推断人的年龄等.而在国内,以杭州热知科技为代表的主要是生产人脸识别和表情识别的嵌入式设备. 国外: 1.美国汉森机器人公司 爱因斯坦机器人Einstein 图1 美国汉森机器人公司的爱因斯坦机器人 Einstein是美国汉森机器人公司的机器人专家大卫·汉森设计的一款类人机器人.它不仅能识别喜怒哀乐.恐惧.迷茫等数以百计的面部表情,推断人的年龄和性别,还能做出相应表情回

学习 opencv---(13)opencv霍夫变换:霍夫线变换,霍夫圆变换

在本篇文章中,我们将一起学习opencv中霍夫变换相关的知识点,以及了解opencv中实现霍夫变换的HoughLines,HoughLinesP函数的使用方法,实现霍夫圆变换的HoughCircles函数的使用方法. 先尝鲜一下其中一个示例程序的运行截图: 一.引言 在图像处理和计算机视觉领域中,如何从当前的图像中提取所需要的特征信息是图像识别的关键所在.在许多应用场合中需要快速准确的检测出直线或者圆.其中一种非常有效的解决问题的方法是霍夫(Hough)变换,其为图像处理中从图像识别几何形状的基

安卓自定义View进阶-Matrix原理

Matrix原理 作者微博: @GcsSloop [本系列相关文章] 前言 本文内容偏向理论,和 画布操作 有重叠的部分,本文会让你更加深入的了解其中的原理. 本篇的主角Matrix,是一个一直在后台默默工作的劳动模范,虽然我们所有看到View背后都有着Matrix的功劳,但我们却很少见到它,本篇我们就看看它是何方神圣吧. 由于Google已经对这一部分已经做了很好的封装,所以跳过本部分对实际开发影响并不会太大,不想深究的粗略浏览即可,下一篇中将会详细讲解Matrix的具体用法和技巧. Matr

相关滤波跟踪(MOSSE)

相关滤波跟踪(MOSSE) 在信号处理中,有这么一个概念--相关性(correlation),用来描述两个因素之间的联系.而相关性又分为cross-correlation(互相关,两个信号之间的联系)和auto-correlation(自相关,本身在不同频域的相关性). 2010年CVPR,David S.Bolme在文章<visual object tracking using adaptive correlation filters>中首次将相关滤波用在了跟踪领域,在其文章的基础之上,很多

Android中图像变换Matrix的原理、代码验证和应用

转自 http://biandroid.iteye.com/blog/1399462 第一部分 Matrix的数学原理 在Android中,如果你用Matrix进行过图像处理,那么一定知道Matrix这个类.Android中的Matrix是一个3 x 3的矩阵,其内容如下: Matrix的对图像的处理可分为四类基本变换: Translate           平移变换 Rotate                旋转变换 Scale                  缩放变换 Skew    

Cocos2d中的Menu使用

学习cocos2d-x中的菜单主要需要了解:菜单(CCMenu)和菜单项(CCMenuItem)以及CCMenuItem的具体子类. a. 下面来学习一下相关的类. 1. CCMenu 菜单,是CCLayer的子类,是一个层(容器),可以往里面添加菜单项.下面是它的类结构图: CCMenu默认接受触屏事件的优先级是-128(优先级很高,因为值越小,响应触屏事件的优先级越高),可以通过继承它实现自定义的效果,创建CCMenu对象的函数: static CCMenu* menuWithItems(C

【OpenCV新手教程第14】OpenCVHough变换:霍夫变换线,霍夫变换圆汇编

本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26977557 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本号: 2.4.9 本篇文章中.我们一起探讨了OpenCV