Cocos Creator 中 _worldMatrix 到底是什么(上)

1. (矩阵)Matrix是什么,有什么用

(矩阵)Matrix一个神奇的存在?在开发过程中对里边各项值的含义是不是抓耳挠腮,百思不得其解?今天我们就来庖丁解牛,拨开它的神秘面纱。由于内容较多,关于Cocos Creator 中的_worldMatrix会分为三篇文章完成。最终形成一个完整的demo

首先我们先看看在Cocos Creator编辑器中,对应图形的变化都有那些属性,如下图

红框的地方分别是位移、旋转、缩放、倾斜它们都一一对应一个变换矩阵。

Cocos Creator 中的(矩阵)Matrix 是一个长度16的一维数组,按照先列后行的顺序存储一个 4 x 4 的放方阵。数组索引 0 1 2 3 分别表示矩阵第一列1 2 3 4 的数据。在2d的游戏坐标系中,一个三维矩阵就可以满足基本的变换,但cocos creator 采用了四维矩阵,应该是为了和3d保持一致。矩阵表示如下(左边体现Mat4对应属性排列位置。右边表示代码中经常用到的变量a b c d tx ty与矩阵对应的位置信息)

$$
\left[
\begin{matrix}
m00&m04&m08&m12\
m01&m05&m09&m13\
m02&m06&m10&m14\
m03&m07&m11&m15\
\end{matrix}
\right]
=>
\left[
\begin{matrix}
a&c&0&0\
b&d&0&0\
0&0&1&0\
tx&ty&tz&1
\end{matrix}
\right]
$$

这样的信息有什么用呢?用来存储节点 旋转 缩放 倾斜 平移的图形变换信息。要想知道其中缘由,复习一下线性代数及高数是很有必要的

  1. 矩阵乘法,以及相关性质
  2. 单位矩阵、逆矩阵、矩阵转置
  3. 向量
  4. 齐次坐标
  5. 三角函数

有了以上知识,我们就可以简单的推导下2d情况下,图形变换对应的4中情况

2. 旋转矩阵推导

在2d坐标系中,假设存在点(x,y),我们将该点同原点(0,0)相连形成一个线段。此时线段与坐标系中x轴的弧度为a 。 我们将在以原点为圆心,线段的长度半径r。逆时针旋转弧度 b,该条线段另外一端坐标变为(x1,y1),如下图(左1)

三个函数相关知识

  • 正弦函数和余弦函数
    sin(a)=y/r => y = rsin(a)
    cos(a)=x/r => x = r
    cos(a)
  • 和角公式
    cos(a+b) = cos(a)cos(b) - sin(a)sin(b)
    sin(a+b) = sin(a)cos(b) + cos(a)sin(b)

由三角函数可以推导出
x1 = rcos(a+b) = rcos(a)cos(b) - rsin(a)sin(b) = xcos(b) - ysin(b)
y1 = r
sin(a+b) =rsin(a)cos(b) + rcos(a)sin(b) = ycos(b) + xsin(b) = xsin(b)+ysin(b)
转换矩阵形式 B=AX

$$
\left[
\begin{matrix}
x1\y1\1
\end{matrix}
\right]
=
\left[
\begin{matrix}
cos(b)&-sin(b)&0\
sin(b)&cos(b)&0\
0&0&1
\end{matrix}
\right]
\times
\left[
\begin{matrix}
x\y\1
\end{matrix}
\right]
$$

在cocos creator中 ,采用行矩阵的写法。以上在cocos creator实际运行形式如下,转换公式如下 $B^T=X^T*A^T$。cocos creator 中剩下的缩放,倾斜,平移,请按照转置矩阵,自行推导。

$$
\left[
\begin{matrix}
x1&y1&1
\end{matrix}
\right]
=
\left[
\begin{matrix}
x&y&1
\end{matrix}
\right]
\times
\left[
\begin{matrix}
cos(b)&sin(b)&1\
-sin(b)&cos(b)&1\
0&0&1
\end{matrix}
\right]
$$

3. 缩放矩阵推导

在2d坐标系中,假设存在点(x,y)缩放就是将坐标的x或y分别乘以一个缩放因子sx或sy。得到一个新的坐标(x1,y1),如下图左2。

由此可得到缩放公式
x1=xsx = xsx + y0
y1=x
sy = x0 + ysy
转换矩阵形式 B=AX

$$
\left[
\begin{matrix}
x1\y1\1
\end{matrix}
\right]
=
\left[
\begin{matrix}
sx&0&0\
0&sy&0\
0&0&1
\end{matrix}
\right]
\times
\left[
\begin{matrix}
x\y\1
\end{matrix}
\right]
$$

4. 倾斜矩阵推导

在2d坐标系中,假设存在点(x,y)倾斜分为x轴倾斜以及y轴倾斜。沿x轴倾斜,就是将该点与点(x,0)连接而成的线段,以(x,0)为圆心,旋转弧度a。如下图(左3,左4) 得到一个新的坐标(x1,y1)。

由此可得到倾斜公式

  • 沿x轴倾斜弧度a (图左3)
    x1=x+ytan(a)
    y1=y
    转换矩阵形式 B=AX

$$
\left[
\begin{matrix}
x1\y1\1
\end{matrix}
\right]
=
\left[
\begin{matrix}
1&tan(a)&0\
0&1&0\
0&0&1
\end{matrix}
\right]
\times
\left[
\begin{matrix}
x\y\1
\end{matrix}
\right]
$$

  • 沿y轴倾斜弧度a (图左4)
    x1=x
    y1=y+xtan(a)=xtan(a)+y
    转换矩阵形式 B=AX

$$
\left[
\begin{matrix}
x1\y1\1
\end{matrix}
\right]
=
\left[
\begin{matrix}
1&0&0\
tan(a)&1&0\
0&0&1
\end{matrix}
\right]
\times
\left[
\begin{matrix}
x\y\1
\end{matrix}
\right]
$$

5. 平移矩阵推导

在2d坐标中,假设存在点(x,y)平移分别是将 x 或 y 加上 x方向位移 tx 或 y方向位移 ty。从而得到新的点坐标(x1,y1)(图左5)

此可得到公式

x1=x+tx
y1=y+ty

转换矩阵形式 B=AX

$$
\left[
\begin{matrix}
x1\y1\1
\end{matrix}
\right]
=
\left[
\begin{matrix}
1&0&tx\
0&1&ty\
0&0&1
\end{matrix}
\right]
\times
\left[
\begin{matrix}
x\y\1
\end{matrix}
\right]
$$

6. 复合变换

将变换矩阵,依次相乘得到一个新的矩阵记为$T_c$,使得$B=X*T_c$。所以**Cocos Creator中的,_worldMatrix,就是当前节点在世界坐标系中对应的复合变换矩阵**$T_c$。矩阵的乘法不满足交换律。所以不同的顺序,变换的效果会不相同。

7.小结

未完待续,中篇,我将分析CCNode.js 中 _updateLocalMatrix 方法为切入点,来加强对Cocos Creator 中 _worldMatrix理解。下篇,利用理解的知识完成图形变换demo。再次加强对_worldMatrix认知。

欢迎感兴趣的朋友关注我的微信订阅号"小院不小",或者点击下方的二维码关注。我将多年开发中遇到的难点,以及一些有意思的功能,体会都会一一发布到我的订阅号中。需要本文demo可以在公众号中回复matrix

维护了一个Coscos Creator 的游戏开发群,欢迎喜欢聊技术的朋友加入

闲来无事,采用cocos creator开发了一个小游戏【坦克侠】,感兴趣的朋友一个可以来玩玩

Cocos Creator 中 _worldMatrix 到底是什么(上)的更多相关文章

  1. Cocos Creator 中 _worldMatrix 到底是什么(中)

    Cocos Creator 中 _worldMatrix 到底是什么(中) 1. 中篇摘要 在上篇中主要做了三件事 简单表述了矩阵的基本知识,以及需要涉及到的三角函数知识 推导了图形变换中 位移 .旋 ...

  2. CocosCreator中_worldMatrix到底是什么(下)

    Cocos Creator 中 _worldMatrix 到底是什么(下) 1. 摘要 上篇介绍了矩阵的基本知识以及对应图形变换矩阵推倒.中篇具体介介绍了对应矩阵转换成cocos creator代码的 ...

  3. 在 Cocos Creator 中使用 Protobufjs(一)

    一. 环境准备 我一直在探索Cocos H5正确的开发姿势,目前做javascript项目已经离不开 nodejs.npm或grunt等脚手架工具了. 1.初始化package.json文件 npm ...

  4. Cocos Creator中按钮组件数组的使用

    Cocos Creator游戏开发中经常使用到按钮,特别是大量按钮的情况,此时使用数组来管理这些按钮就显得更具通用性.我大致走了一下官方的示例,好像没有发现有这个小内容(或者有,但我却是没有找到),于 ...

  5. Cocos Creator 中的动作系统那些事儿

    动作系统就是可以在一定的时间内实现位移.旋转.缩放.跳动等各种动作. 需要注意的是,动作系统跟 Cocos Creator 编译器的动画系统不同,动作系统是面向程序员的API接口,而动画系统是通过编译 ...

  6. kbengine_js_plugins 在Cocos Creator中适配

    kbengine_js_plugins 改动(2017/7/6) 由于Cocos Creator使用严格模式的js,而原本的kbengine_js_plugins是非严格模式的,因此为了兼容和方 便C ...

  7. cocos creator 中的粒子效果

    途中的粒子效果,通过plist文件和png两个文件,创建一个粒子节点,将plist文件拖入到粒子节点的file属性中,然后给custom属性打钩,把png文件拖入到texture属性中即可.

  8. Cocos Creator中使用事件中心

    export class EventCenter { /** 监听数组 */ private listeners = {}; /** * 注册事件 * @param name 事件名称 * @para ...

  9. cocos creator中粒子效果的使用

    就如同上图的星星特效一样,在触碰时产生特效,但是并不销毁节点,因为要使用很多次,因此使用节点池NodePool保存起来的. 以下是使用粒子效果使要使用到的一些基本控制函数: 我的使用:

随机推荐

  1. iOS学习——iOS 宏(define)与常量(const)的正确使用

    概述 在iOS开发中,经常用到宏定义,或用const修饰一些数据类型,经常有开发者不知怎么正确使用,导致项目中乱用宏与const修饰.你能区分下面的吗?知道什么时候用吗? #define HSCode ...

  2. 6090A一种手指笔

    发明名称--一种手指笔 申请号   CN201821972396.6 申请日   2018.11.28 公开(公告)号   CN209224777U 公开(公告)日   2019.08.09 IPC分 ...

  3. 90002CAD相关操作

    第一章   初识CAD 1.1 CAD能干什么 (1)绘制机械图/建筑图/装修图等二维复杂工程图的不二之选.二维设计软件的王者. (2)CAD可以绘制平面图.轴测图(二维线框表示三维图形).立体图(三 ...

  4. egret之弹幕

    要实现弹幕功能,首先需要将弹幕配置成配置表.然后代码随机生成. /**生成单个弹幕 */ private showCaptionAnim(captionText: string) { egret.lo ...

  5. Java网络编程之URL和URI

    Java网络编程之URL与URI 一.URL与URI简介 URI = Universal Resource Identifier 统一资源标志符 URL = Universal Resource Lo ...

  6. Python基础 2-2 列表的实际应用场景

    引言 本章主要介绍列表在实际应用中的使用场景,多维列表(嵌套列表) 如果你需要在列表保存每个人员的一些基本信息,使用列表嵌套来保存这种信息是个不错的主意. 多维列表 列表可以根据实际情况嵌套使用,比如 ...

  7. js数组的五种迭代遍历方式 every filter forEach map some

    ECMAScript 5 为数组定义了 5 个迭代方法. 每个方法都接收两个参数   数组项的值和索引 every():对数组中的每一项运行给定函数,如果该函数对每一项都返回 true,则返回 tru ...

  8. C# Memcache集群原理、客户端配置详细解析

    概述 memcache是一套开放源的分布式高速缓存系统.由服务端和客户端组成,以守护程序(监听)方式运行于一个或多个服务器中,随时会接收客户端的连接和操作.memcache主要把数据对象缓存到内存中, ...

  9. Python——常用模块(time/datetime, random, os, shutil, json/pickcle, collections, hashlib/hmac, contextlib)

    1.time/datetime 这两个模块是与时间相关的模块,Python中通常用三种方式表示时间: #时间戳(timestamp):表示的是从1970年1月1日00:00:00开始按秒计算的偏移量. ...

  10. 前端开发-CSS语法标准

    一.命名规则说明: 1.命名规则说明: 所有的命名最好都小写 属性的值一定要用双引号("")括起来,且一定要有值如class="nav",id="na ...