cocos creator学习笔记2017.2.14

本文介绍了如何在canvas中使用组件component来管理多个相似元素的数据逻辑。通过将相同类型的组件组织成数组,可以有效地简化对每个元素的管理流程。文章还提到了常见的Sprite和Button组件的应用。


充分理解组件component的含义。

canvas上的任一组件都可以绑定相对应得script代码。

比如座位有四个,每一个座位都可以绑定一个Seat.js的文件作为其其中的一个component组件。

我们在处理这四个座位上的数据逻辑时,我们可以在相关的数据地方做集中处理,比如在初始化登录协议的地方做相应的方法处理,我们可以对这四个座位上的同一个组件用一个数组进行管理,从而简化了对每个座位的管理逻辑。

canvas上比较常见的是添加Sprite组件和Button组件。




<think>我们正在讨论Cocos Creator中的向量变换,特别是cc.vmath.vec2.transformMat4方法的使用。这个方法用于将一个二维向量通过一个4x4矩阵进行变换。在Cocos Creator中,cc.vmath模块提供了一些数学工具,包括向量和矩阵的操作。 根据Cocos Creator的文档,`cc.vmath.vec2.transformMat4`方法的作用是将一个二维向量(vec2)与一个4x4矩阵(mat4)相乘,得到一个新的二维向量。这个操作通常用于将点或向量从局部坐标系转换到世界坐标系,或者进行其他空间变换。 函数签名通常如下: ```javascript cc.vmath.vec2.transformMat4(out, v, m); ``` 参数说明: - `out`: 用于存储结果的二维向量(vec2)。 - `v`: 输入的二维向量(vec2),即待变换的向量。 - `m`: 一个4x4变换矩阵(mat4)。 注意:这个方法会考虑矩阵的平移、旋转和缩放,但因为是二维向量,所以通常只使用矩阵的前两行和前两列(以及平移部分)。但要注意,4x4矩阵的第三列和第四列(以及第三行)在变换二维向量时可能会被忽略或产生特定效果(具体取决于矩阵的内容)。实际上,在变换二维向量时,我们通常使用一个3x3矩阵,但Cocos Creator提供了使用4x4矩阵的方法,可能是为了与3D系统兼容。 使用示例: 假设我们有一个二维向量`v = (1, 0)`,和一个4x4矩阵`m`(例如一个旋转矩阵,绕z轴旋转90度,那么旋转后向量应该变成`(0,1)`)。注意,在二维变换中,我们通常使用3x3矩阵,但这里我们使用4x4矩阵,其中z轴的分量可以忽略(或者设为0,w设为1)。 但是,请注意,`cc.vmath.vec2.transformMat4`方法在变换时,会将向量视为一个齐次坐标为(0,0,0,1)的点?还是向量?实际上,对于向量(没有位置,只有方向)和点(有位置)的变换处理是不同的。通常,在变换向量时,我们忽略平移,只考虑旋转和缩放。而变换点时,则需要考虑平移。 根据Cocos Creator的文档,`cc.vmath.vec2.transformMat4`方法默认是将向量视为点(即需要平移)还是向量(不需要平移)?实际上,在内部实现中,这个方法会使用矩阵的完整4x4变换,包括平移。因此,如果你要变换一个向量(方向向量),那么你可能需要先将其转换为齐次坐标,然后设置w分量为0(以避免平移的影响),但这个方法本身是用于二维向量的,它可能已经做了处理。 然而,在Cocos Creator的源码中,我们可以查看`vec2.transformMat4`的实现(或者查看文档)。根据经验,这个方法通常用于变换点,所以它会包括平移。如果你要变换一个方向向量(即只考虑旋转和缩放),那么应该使用另一个方法,或者手动将向量的齐次坐标的w分量设为0(但这个方法不接受w分量)。 因此,我们需要明确:`cc.vmath.vec2.transformMat4`方法在变换时,会将输入向量视为一个点(即齐次坐标为(v.x, v.y, 0, 1)),然后应用矩阵变换,最后取结果的前两个分量(x和y)作为输出。所以,平移分量会被应用。 如果你需要变换一个方向向量(忽略平移),那么你可能需要自己实现,或者使用3x3矩阵(只考虑旋转和缩放)来变换。在Cocos Creator中,可能没有直接提供使用4x4矩阵变换方向向量(忽略平移)的方法,但我们可以通过将向量扩展到三维(z=0)然后使用`mat4.transformVector`方法(如果存在)来实现。 但是,在`cc.vmath`模块中,我们并没有找到专门为方向向量设计的方法。因此,我们可能需要自己处理: 1. 将二维向量扩展为三维向量(z=0)。 2. 使用4x4矩阵变换这个三维向量(忽略平移,即使用矩阵的左上3x3部分),在Cocos Creator中,可以使用`cc.vmath.vec3.transformMat4`(但这个方法同样会应用平移)?所以不行。 实际上,在Cocos Creator中,变换方向向量(忽略平移)的标准做法是使用矩阵的左上3x3部分(或者2x2部分,如果是二维)来变换向量。我们可以通过提取矩阵的旋转缩放部分来实现。 不过,针对用户的问题,我们只讨论`cc.vmath.vec2.transformMat4`的使用,它用于变换点(包括平移)。 示例代码: ```javascript // 引入vmath模块 const vmath = cc.vmath; // 创建一个二维向量 let v = vmath.vec2.create(1, 0); // 创建一个4x4矩阵,这里我们创建一个绕z轴旋转90度的旋转矩阵(注意:旋转90度,弧度值为Math.PI/2) let rotation = Math.PI/2; let cos = Math.cos(rotation); let sin = Math.sin(rotation); let m = vmath.mat4.create(); // 设置旋转矩阵(绕z轴),注意:mat4.create()创建一个单位矩阵,然后我们设置旋转部分 m[0] = cos; m[4] = -sin; m[8] = 0; m[12] = 0; m[1] = sin; m[5] = cos; m[9] = 0; m[13] = 0; m[2] = 0; m[6] = 0; m[10]=1; m[14] = 0; m[3] = 0; m[7] = 0; m[11]=0; m[15] = 1; // 或者,使用mat4的set方法,但这里我们直接设置数组元素(因为mat4在内部是一个16个元素的数组) // 创建一个输出向量 let out = vmath.vec2.create(); // 进行变换 vmath.vec2.transformMat4(out, v, m); // 输出结果应该是 (0, 1) cc.log(out); // 输出:vec2(0, 1) ``` 注意:上面的矩阵是一个绕z轴旋转90度的矩阵,由于我们变换的是二维向量,所以z轴分量不会影响。但是,如果矩阵中包含平移(例如m[12]和m[13]不为0),那么平移量会被加到结果中。 例如,如果我们设置矩阵的平移分量为(10, 20, 0): ```javascript m[12] = 10; m[13] = 20; ``` 那么变换后的向量将是(10, 21),因为原始向量(1,0)旋转90度后变成(0,1),然后加上平移(10,20)得到(10,21)。 所以,这个方法适用于变换点(需要平移),而不适用于变换方向向量(不需要平移)。 对于方向向量,我们可以使用以下方法: 1. 使用矩阵的左上2x2部分(即旋转缩放部分)来变换向量,忽略平移。 2. 或者,将向量视为齐次坐标的w=0(这样平移就不会被应用),但这个方法需要手动进行矩阵乘法。 由于`cc.vmath.vec2.transformMat4`没有提供忽略平移的选项,所以对于方向向量,我们需要自己处理。例如,我们可以这样计算方向向量的变换: ```javascript function transformDirection(out, v, m) { // 提取矩阵的左上2x2部分 let x = v.x * m[0] + v.y * m[4]; let y = v.x * m[1] + v.y * m[5]; out.x = x; out.y = y; return out; } ``` 总结: - 使用`cc.vmath.vec2.transformMat4`来变换点(包括平移、旋转和缩放)。 - 对于方向向量(只考虑旋转和缩放),需要自己实现变换,或者使用上述方法提取矩阵的2x2部分。 希望这个解释能帮助你理解`cc.vmath.vec2.transformMat4`的使用。 [^1]: 搞懂 Cocos Creator 3.0 坐标之间的转换 [^2]: Cocos Creator 3D后期效果解决方案源码剖析--从入门到融汇贯通 §§相关问题§§ 1. Cocos Creator中如何变换一个方向向量(忽略平移)? 2.Cocos Creator中,4x4矩阵和3x3矩阵在变换二维向量时有什么区别? 3. 如何创建一个旋转、缩放或平移的4x4变换矩阵?</think>在 Cocos Creator 中使用 `cc.vmath.vec2.transformMat4` 进行向量矩阵变换时,需要注意以下关键点: ### 方法说明 ```javascript cc.vmath.vec2.transformMat4(out: Vec2, v: Vec2, m: Mat4): Vec2 ``` - **功能**:将 2D 向量 `v` 通过 4x4 矩阵 `m` 进行变换(包括旋转、缩放、平移) - **参数**: - `out`:存储结果的输出向量 (`Vec2` 类型) - `v`:原始输入向量 (`Vec2` 类型) - `m`:4x4 变换矩阵 (`Mat4` 类型) - **返回值**:变换后的向量(直接修改 `out` 并返回) ### 使用示例 ```javascript // 创建原始向量和矩阵 const v = cc.vmath.vec2.create(1, 0); // 原始向量 (1, 0) const m = cc.vmath.mat4.create(); // 单位矩阵 // 设置变换矩阵(绕Z轴旋转90度 + 平移(10, 5)) cc.vmath.mat4.fromRotationTranslation( m, cc.vmath.quat.rotateZ(cc.vmath.quat.create(), Math.PI/2), cc.vmath.vec3.create(10, 5, 0) ); // 执行变换 const out = cc.vmath.vec2.create(); cc.vmath.vec2.transformMat4(out, v, m); console.log(out); // 输出: [10, 6] // 解释: // 旋转90度: (1,0) -> (0,1) // 平移(10,5): (0+10, 1+5) = (10,6) ``` ### 关键注意事项 1. **向量类型处理**: - 输入向量 `v` 会被视为 **齐次坐标点** $(x, y, 0, 1)$ - 矩阵中的平移分量会被应用(适用于变换点坐标) - 若需处理方向向量(忽略平移),需手动设置矩阵平移分量为0: ```javascript m[12] = 0; m[13] = 0; m[14] = 0; // 重置平移分量 ``` 2. **矩阵兼容性**: - 虽然使用 4x4 矩阵,但实际计算等效于: $$ \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} = \begin{bmatrix} m_{00} & m_{04} & m_{12} \\ m_{01} & m_{05} & m_{13} \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} $$ - 矩阵索引对应关系: ```javascript [m00, m04, m08, m12] // 第一列 (x轴变换) [m01, m05, m09, m13] // 第二列 (y轴变换) ``` 3. **性能优化**: - 复用输出向量对象避免频繁创建: ```javascript // 推荐 const result = cc.vmath.vec2.create(); cc.vmath.vec2.transformMat4(result, v1, m); cc.vmath.vec2.transformMat4(result, v2, m); // 不推荐(反复创建新对象) const result1 = cc.vmath.vec2.transformMat4(v1, m); ``` ### 典型应用场景 1. **UI坐标转换** 将节点本地坐标转换为世界坐标: ```javascript const localPos = cc.vmath.vec2.create(100, 50); const worldMatrix = node.getWorldMatrix(); const worldPos = cc.vmath.vec2.transformMat4(localPos, worldMatrix); ``` 2. **摄像机投影** 将世界坐标转换为屏幕坐标: ```javascript const camera = cc.Camera.main; const viewProjMat = camera.getViewProjMatrix(); const screenPos = cc.vmath.vec2.transformMat4(worldPos, viewProjMat); ``` 3. **物理系统** 应用刚体变换到碰撞点: ```javascript const bodyTransform = rigidBody.node.getWorldMatrix(); const globalCollisionPoint = cc.vmath.vec2.transformMat4(localPoint, bodyTransform); ``` > 注:在 Cocos Creator 3.4+ 版本中,建议使用新的坐标转换 API `node.getWorldPosition()` 和 `node.convertToWorldSpaceAR()` 获得更高性能[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值