2.2.1以后的版本,如果想使用skew,该怎么使用3d node替代呢?

大家好!

最近项目升级到2.3.0,以前一直使用skew,但现在一直警告需要使用3d node替代。但不知道要如何去使用node 的rotation来实现如下效果,

我自己尝试用rotation,但都达不到上面的效果,要实现以前 skewX=-20这样的效果,有没有什么公式计算出rotationnXYZ的值

要用3D节点实现skewX=-20,可以这样算得rotationXYZ和scale:

        let k = Math.abs(Math.tan(skewX * Math.PI / 180));
        let angle = Math.acos((Math.sqrt(4 + k * k) - k) / 2) * 180 / Math.PI;
        let scale = 2 / (Math.sqrt(4 + k * k) - k);
        this.node.is3DNode = true;
        this.node.eulerAngles = cc.v3(angle, skewX < 0 ? -angle : angle, 0);
        this.node.scale = scale;
10赞

哈哈,真棒!

1赞

感谢大神,方案可行,从小几何成绩不行,求问如果是skewY的话,是改eulerAngles=cc.v3(skewY < 0 ? -angle : angle, angle, 0)么?

大佬,我节点里有改动rotation 和scale,我应该怎么把之前改过的rotation和scale附加到你这个公式下呢。

算这个skewX也耗尽了我残存不多的立体几何知识。。skewY这样不行,我忘记当时为什么没算出skewY了,但是可以通过两层节点实现,即外层2D节点旋转90度,内层3D节点使用skewX=(skewY的值)。

在3D的skewX节点外层再加一个2D节点控制rotation和scale,比较方便。否则要自己算3维旋转矩阵

大佬方便留个qq么。。实在头大。。我搞不懂这个。。

我准备写个一键修复skew节点的插件,传到商店免费提供大家使用。。现在不知道怎么算公式。。

1赞

感谢大佬,虽然搞定了这个,但是要加3D模块,所以这块效果最后还是被砍了,后来发现好像shader可以模拟这个功能,只是用shader的话触摸、碰撞那些就会有问题

你这种计算skewY值的算法可行吗。。

我没试过,我是学渣,大佬回复我不得行

SkewY的值怎么计算的呢 改掉skew确实有些许麻烦

前提:
欧拉角的计算有先后顺序。据我的观察,顺序是XYZ。
(如果先Y后X的话,2楼的算法得出的是skewY)

记x的旋转角为alpha ,y的旋转角为betatheta = skewX,phi = skewY,显然,z的旋转角就是phi

计算过程省略,3个轴先后旋转后,
根据skewX角度的要求,可得式子1:

式子1

根据skew面积不变,可得式子2:

式子2

最后,scale为:

scale

联立式子1和式子2,可以把未知数alphabeta 算出来。

如果skewY为0,根据式子2,alphabeta 相等,此时的结果和2楼的算法一样。

到这一步,后续的解方程我没有继续算下去。也有可能我计算过程中有错误导致结果不对。
在这里,我希望有后来者可以把方程解出来。亦或是找到一个更好的方法。

哈哈,我也希望能有个方法可以算出skewY。但是数学能力有限。如果能弄出来,我就搞个一键适配skewX,和skewY的插件免费给大家用。

let k = Math.abs(Math.tan(skewX * Math.PI / 180));
let angle = Math.acos((Math.sqrt(4 + k * k) - k) / 2) * 180 / Math.PI;
let scale = 2 / (Math.sqrt(4 + k * k) - k);
this.node.is3DNode = true;
this.node.eulerAngles = cc.v3(angle, angle * (1 - Math.floor(skewX / 90) % 2 * 2), 0);
this.node.scale = scale;

2楼的解决方案在skewX为-90~90的情况下是对的,其它情况下可能会与Creator的符号相反。这里第5行对angle符号的处理才与Creator一致。

我算出来了两个式子,接下去就是解方程,你可以试一下

我数学是真滴不行。。我问问数学系大佬吧。。

我是用矩阵分解来列式的,即一个三维Skew矩阵C,是否可分解为一个三维旋转矩阵A乘以一个三维缩放矩阵B?如果存在A*B=C的话,就可以用A的旋转角度和B的缩放倍数来模拟C。但我当时也是只计算出skewY=0的情况下有解,也就是2楼的结果。
考虑另一种情况,即skewX=0,skewY!=0,那么可以等效地先旋转-90度,然后把skewY当作skewX操作,再旋转90度复原。设D为三维旋转-90度矩阵,那么就要计算AB=DTABD=C。其中A与B就是可以模拟skewY的三维旋转与三维缩放矩阵。但是我忘记当时怎么记算的了,感觉是解不出A与B,因此只好用三层节点来模拟skewY,即第一层2D节点旋转-90度,中间层3D节点用skewX代替skewY,第三层2D节点旋转90度。

我纳闷的一点:skew是节点变形,为何修改欧拉角+scale可这样变形?