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 = / (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计算得:
cocos2d-x的CCAffineTransform相关变换实现原理的更多相关文章
- 【Linux】iptables相关实践,原理及参数解释
1.禁止指定IP地址的主机进行连接 iptables -I INPUT -s .***.***. -j DROP 2.解除禁止指定IP地址的主机进行连接 iptables -D INPUT -s .* ...
- Cocos2d入门--1--初涉相关属性或代码
Cocos2d vision: cocos2d-x-3.8.1 万丈高楼,起于累土.对于一个游戏框架的学习,其实在于框架功能的使用积累,学会了如何在cocos2d游戏引擎的基础上使用它提供的各种功能 ...
- 微信测试帐号如何设置URL和Token,以及相关验证的原理
首先说明,本帮助文档是利用javaweb的Servlet来进行“接口配置信息配置信息”认证的. 在学习微信公众号开发的时候,读到填写服务器配置的帮助部分,总是不能理解为啥按照他的步骤做总是设置失败(吐 ...
- 双机相关知识(原理、LVM、Raid技术)
1 双机知识 1.1 预备知识 1.1.1 基本概念 双机热备:双机热备双机管理软件可以根据心跳自动检测环境运行情况,如果发现一个节点挂掉了,会自动切换到另外一个 ...
- EM算法和GMM算法的相关推导及原理
极大似然估计 我们先从极大似然估计说起,来考虑这样的一个问题,在给定的一组样本x1,x2······xn中,已知它们来自于高斯分布N(u, σ),那么我们来试试估计参数u,σ. 首先,对于参数估计的方 ...
- prometheus入门介绍及相关组件、原理讲解
1:介绍 Prometheus 是由 SoundCloud 开源监控告警解决方案. prometheus是由谷歌研发的一款开源的监控软件,目前已经被云计算本地基金会托管,是继k8s托管的第二个项目. ...
- 深度学习中常见的 Normlization 及权重初始化相关知识(原理及公式推导)
Batch Normlization(BN) 为什么要进行 BN 防止深度神经网络,每一层得参数更新会导致上层的输入数据发生变化,通过层层叠加,高层的输入分布变化会十分剧烈,这就使得高层需要不断去重新 ...
- OpenCV2马拉松第22圈——Hough变换直线检測原理与实现
计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/27220445 收入囊中 Hough变换 概率Ho ...
- opencv —— HoughLines、HoughLinesP 霍夫线变换原理(标准霍夫线变换、多尺度霍夫线变换、累积概率霍夫线变换)及直线检测
霍夫线变换的原理 一条直线在图像二维空间可由两个变量表示,有以下两种情况: ① 在笛卡尔坐标系中:可由参数斜率和截距(k,b)表示. ② 在极坐标系中:可由参数极经和极角(r,θ)表示. 对于霍夫线变 ...
随机推荐
- 第一章.C语言简介
C语言第一章 C语言简介 目录 一.C语言介绍 二.C语言特点 三.Hello World 四.转义符 五.占位符 六.俄罗斯方块游戏 七.文件下载 一.C语言介绍 C是一种通用的编程语言,广泛用 ...
- windows重建图标缓存(解决快捷方式图标丢失,图标加载时间长问题)
新建一个文本文档,把下边的代码输入进去,保存为.bat格式,运行即可 有快捷方式图标丢失或者觉得图标加载速度慢了,就run一下这个,很实用的小工具 rem 关闭Windows外壳程序explorer ...
- [转]Part1: Understanding !PTE , Part 1: Let’s get physical
http://blogs.msdn.com/b/ntdebugging/archive/2010/02/05/understanding-pte-part-1-let-s-get-physical.a ...
- HTTP 错误 403.14 - Forbidden Web 服务器被配置为不列出此目录的内容
今天把一个.NET的网站部署到IIS上打开网页的时候出现了这个错误,刚开始以为是没有配置默认页,但是直接打开固定的页面地址也不行. 于是怀疑是.NET版本的问题,但是看了一下程序的目标框架是4.0没错 ...
- laravel的配置文件
app/config 中的配置说明 1 在 app/config 文件夹中经常配置的一般有两个文件:app.php 和 database.php 两个文件,他们一个是配置项目杂项的.一个是配置数据 ...
- CentOS 7 最小化安装的无线网络配置
1.首先下载iw工具. yum -y install iw 2.获取无线网卡的名称 执行iw dev,假设获得名称为 wlp3s0(示例) 3.激活无线网络接口 执行ip link set wlp3s ...
- Google开源SLAM软件cartographer中使用的UKF滤波器解析
在Google开源SLAM软件cartographer中,相对<SLAM for dummies>使用了更为复杂.性能更好的Scan匹配与UKF算法,这里简单介绍下cartographer ...
- Tomcat 6 --- JNDI详解
点击查看推荐博文
- 汇编语言写出的helloworld运行过程
一:首先说一点,这篇文章建立在懂一点汇编的基础上,有几个简单的命令,说以下: 1:-r命令 -r 查看寄存器 -r 寄存器 (如 -r AX) 修改寄存器的值: 2:-d命令 -d 地址:xxxx:x ...
- C++11语法糖
1.constexpr变量:声明为constexpr的变量一定是一个常量,新标准允许定义一种特殊的constexpr函数使得编译时就可计算结果,这样就能用constexpr函数去初始化constexp ...