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

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

// author:herbert 公众号:小院不小 wx:464884492 if (hasSkew) { let a = t.m00, b = t.m01, c = t.m04, d = t.m05; let skx = Math.tan(this._skewX * ONE_DEGREE); let sky = Math.tan(this._skewY * ONE_DEGREE); if (skx === Infinity) skx = 99999999; if (sky === Infinity) sky = 99999999; t.m00 = a + c * sky; t.m01 = b + d * sky; t.m04 = c + a * skx; t.m05 = d + b * skx; }

由于 tan(90)趋近无穷大,当计算值为Infinity skx 和 sky 分别做一个值限定。接下来看代码对应的矩阵变换。首先先从y到x的顺序,将Asky和Askx相乘得到一个复合矩阵。再左乘当前变换矩阵p,为了和前边对照,依然采用a b c d

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

矩阵乘法满足结合率,先将右边的两个矩阵相乘

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

所以通过矩阵乘法规则得到新的值
m00=a+c*sky m04=c+a*skx
m01=d+b*sky m05=d+b*skx

6. 总结

中篇相对于上篇,中间间隔了一个多月的时间,原创实属不易。这期间一直在恶补图形学和矩阵相关知识。最初分析版本2.0.10,当时代码中存在rotationX rotationY 旋转,当rotationX 和rotationY 不相等时,一直卡在那段代码的分析过程中。后来还去官方论坛提问 https://forum.cocos.com/t/topic/84680/4 ,没有得到满意的结果,也没多少人回复。后来各种查资料,才发现官方将那段代码移除了,采用欧拉角的方式。所有我将本地版本升级成v2.1.3版本。到这个版本后,又卡在了 let rotation = -this._eulerAngles.z这个号问题。越分析越,感觉欠缺的越多,欧拉角,四元数。同时感觉可能写不出中篇了,不过我还是找了一个感觉是对的推导将中篇完成了。当然其中我觉得不清楚的地方还有

在2.0.10 版本中Y轴旋转和X轴选中问题,为啥可以根据Z轴旋转的结果一分为二

在2.1.3 版本中旋转取欧拉角z负号问题,旋转矩阵 b c 值相互取反问题

复合矩阵变换左乘右乘问题,在本文中我通过代码推导应该是左乘

倾斜变换Asky和Askx两个居中相乘顺序问题,本文通过y右乘x得到代码结果

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

微信关注【小院不小】

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

微信群

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

小游戏坦克侠

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdxdd.html