[cocos2d-x]从源码角度思考convertToWorldSpace()与convertToWorldSpaceAR()坐标系的转换
convertToWorldSpace()
话不多说,先上源码,之后再慢慢讲解:
(5和6图截图的时候重复了,这里就不弄出来了)
只要通过图1到图8中我写的注释进行分析(不懂的地方可以自己去翻一下cocos2dx的源码,这样可能更直接)
所以结论就很明显:最后的结果=子节点在父节点中的坐标+父节点在世界坐标系下的坐标
convertToWorldSpaceAR()
当然,我们由此也可以来看下convertToWorldSpaceAR()的实现:
从图中的源码,我们其实很好理解,就是将子节点在父节点中的坐标加上父节点的锚点(以像素为单位的锚点)
最后的结论就是:最后的坐标=子节点在父节点中的坐标+父节点在世界坐标系下的坐标+父节点的锚点(以像素为单位,也就是anchorPoint*ContentSize())
一个简单的例子来验证
这个例子是我从cocos2dx-lua实战书中看到的,从图中的结果我们可以看到转换后的坐标的计算方式:
convertToWorldSpace():
最后坐标(250,450)=(0,0)+(250,450)
convertToWorldSpace():
最后坐标(400,500)=(0,0)+(250,450)+(0.5,0.5)×(300,100)
最后下个总结
convertToWorldSpace():最后的结果=子节点在父节点中的坐标+父节点在世界坐标系下的坐标
convertToWorldSpace():最后的坐标=子节点在父节点中的坐标+父节点在世界坐标系下的坐标+父节点的锚点(以像素为单位,也就是anchorPoint*ContentSize())
总结中的总结:
虽然convertToNodeSpace()和convertToNodeSpaceAR()没有分析,但是我想实现的过程应该是差不多相反的过程,下次有时间再去看一下源码。
好吧,其实通过分析这个源码,我还是没有从底层的原理上透彻理解坐标保存在矩阵中所进行的矩阵运算的原理,比如下面几个问题都还困扰着我:
为什么要将其坐标轴保存在其对应的位置并且还要加上一个单位矩阵?
四维向量中第四个向量代表的是什么意思?
父节点和子节点之间的坐标矩阵乘法的原理是什么,为什么要这样乘呢?
and so on….
这些答案可能还需要以后进一步的学习才理解,共勉!
[cocos2d-x]从源码角度思考convertToWorldSpace()与convertToWorldSpaceAR()坐标系的转换的更多相关文章
- Android -- 带你从源码角度领悟Dagger2入门到放弃
1,以前的博客也写了两篇关于Dagger2,但是感觉自己使用的时候还是云里雾里的,更不谈各位来看博客的同学了,所以今天打算和大家再一次的入坑试试,最后一次了,保证最后一次了. 2,接入项目 在项目的G ...
- Android -- 带你从源码角度领悟Dagger2入门到放弃(一)
1,以前的博客也写了两篇关于Dagger2,但是感觉自己使用的时候还是云里雾里的,更不谈各位来看博客的同学了,所以今天打算和大家再一次的入坑试试,最后一次了,保证最后一次了. 2,接入项目 在项目的G ...
- 从源码角度深入理解Toast
Toast这个东西我们在开发中经常用到,使用也很简单,一行代码就能搞定: 1: Toast.makeText(", Toast.LENGTH_LONG).show(); 但是我们经常会遇到这 ...
- Android -- 带你从源码角度领悟Dagger2入门到放弃(二)
1,接着我们上一篇继续介绍,在上一篇我们介绍了简单的@Inject和@Component的结合使用,现在我们继续以老师和学生的例子,我们知道学生上课的时候都会有书籍来辅助听课,先来看看我们之前的Stu ...
- 从源码角度入手实现RecyclerView的Item点击事件
RecyclerView 作为 ListView 和 GridView 的替代产物,相信在Android界已广为流传. RecyclerView 本是不会有类似 ListView 的那种点击事件,但是 ...
- 从template到DOM(Vue.js源码角度看内部运行机制)
写在前面 这篇文章算是对最近写的一系列Vue.js源码的文章(https://github.com/answershuto/learnVue)的总结吧,在阅读源码的过程中也确实受益匪浅,希望自己的这些 ...
- Android布局性能优化—从源码角度看ViewStub延迟加载技术
在项目中,难免会遇到这种需求,在程序运行时需要动态根据条件来决定显示哪个View或某个布局,最通常的想法就是把需要动态显示的View都先写在布局中,然后把它们的可见性设为View.GONE,最后在代码 ...
- Android进阶:二、从源码角度看透 HandlerThread 和 IntentService 本质
上篇文章我们讲日志的存储策略的时候用到了HandlerThread,它适合处理"多而小的任务"的耗时任务的时候,避免产生太多线程影响性能,那这个HandlerThread的原理到底 ...
- 从JDK源码角度看Short
概况 Java的Short类主要的作用就是对基本类型short进行封装,提供了一些处理short类型的方法,比如short到String类型的转换方法或String类型到short类型的转换方法,当然 ...
随机推荐
- 一键上手时下最火AI作画工具
摘要:在华为云ModelArts上, 无需考虑计算资源.环境的搭建,就算不懂代码,也能按照教程案例,通过Stable Diffusion成为艺术大师. 本文分享自华为云社区<跟着华为云Model ...
- JVM中的堆
堆 内存结构 堆的核心概念 <java虚拟机规范>中对java堆的描述是:所有的对象实例以及数组都应当在运行时分配在堆上. 一个JVM实例只存在一个堆内存(就是new 出来一个对象),ja ...
- 在某网站的登录页面登录时如果选择“记住用户名”,登录成功后会跳转到一个中间层(页面代码将登录的用户名和密码存在cookie),中间页面中存在一个超链接,单击超链接可以链接到第三个页面查看信息。若选择“
Response实现登录并记录用户名和密码信息 在某网站的登录页面登录时如果选择"记住用户名",登录成功后会跳转到一个中间层(页面代码将登录的用户名和密码存在cookie),中间页 ...
- echarts的使用 超好用的报表制作、数据的图形化展示
地址链接:https://echarts.apache.org/zh/index.html 1.图形选择 2.对应的js代码
- 【.NET 6】RabbitMQ延迟消费指南
背景 最近遇到一个比较特殊需求,需要修改一个的RabbitMQ消费者,以实现在消费某种特定的类型消息时,延迟1小时再处理,几个需要注意的点: 延迟是以小时为单位 不是所有消息都延迟消费,只延迟特定类型 ...
- 如何清除取消KMS激活
1.首先要卸载掉用KMS激活的程序. 2.卸载完成之后,以管理员身份打开命令提示符. 3.依次输入以下命令 slmgr /upk slmgr /ckms slmgr /rearm 输入完成后会显示需要 ...
- python导包
我们将完成特定功能的代码块放在一个.py结尾的文件中,这个文件被称为模块.在这个模块中可能包含变量,函数,类等等内容. 当我们从外部需要用到这个模块时,就需要将这个模块导入到我们当前环境.导入方式有以 ...
- JS中数值类型的本质
一.JS中的数值类型 众所JS爱好友周知,JS中只有一个总的数值类型--number,它包含了整型.浮点型等数值类型.其中,浮点数的实现思想有点复杂,它把一个数拆成两部分来存储.第一部分是有效位数,也 ...
- JS数据结构与算法-概述
JS数据结构与算法概述 数据结构: 计算机存储, 组织数据的方式, 就像锅碗瓢盆 算法: 一系列解决问题的清晰指令, 就像食谱 两者关系: 程序 = 数据结构 + 算法 邂逅数据结构与算法 什么是数据 ...
- 学习ASP.NET Core Blazor编程系列十——路由(中)
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...