如果获得node在世界节点下的缩放尺寸

如题,如何获得任意node在世界坐标下的缩放值,或者说node之间如何换算缩放值。

例如:node1和node2是同样的图片,但处于不同的父节点下,且两者在画面上的视觉大小不一样,现在想让node1和node2的视觉大小一样,该怎么做?

断点时,发现核心代码中有个getWorldScale方法,虽然没有开放给用户使用,但算法可以拿出来自己定义个方法用。因此,上面的问题暂时得到解决。
很奇怪creator竟然没提供scale换算方面的api。

从该节点开始依次往上遍历你节点,scale相乘就是在世界坐标中的scale

1赞

沒必要。節點轉世界矩陣。然後世界矩陣結果tx ty=0之後調用矩陣應用點(1, 0)。得到的結果就是縮放

你的这个回答深奥,验证一下…

var matrix = node.getNodeToWorldTransformAR();
matrix.tx = 0;
matrix.ty = 0;
var result = cc.pointApplyAffineTransform(1, 0, matrix);
// 考慮到矩陣數據可能被旋轉過,result就會xy都非零
var scale = Math.sqrt(result.x * result.x, result.y * result.y);

另外一種可靠一點

var matrix = node.getNodeToWorldTransformAR();
var result1 = cc.pointApplyAffineTransform0, 0, matrix);
var result2 = cc.pointApplyAffineTransform(1, 0, matrix);
// 考慮到矩陣數據可能被旋轉過,result就會xy都非零
var dx = result1.x - result2.x;
var dy = result1.y - result2.y;
var scale = Math.sqrt(dx * dx + dy * dy);

// 以上代碼沒有經過測試,就在帖子上打的。理論上可行,

对于未旋转的已经验证,完全可行,

var t = this.nodes[0].getNodeToWorldTransformAR();
t.tx = t.ty = 0;
var scale = new cc.Vec2(1, 1);
scale = cc.pointApplyAffineTransform(scale, t);
cc.log(scale);

谢谢,
下一步,验证下有旋转的

第二種算有旋轉可靠一些。

你的方法可以,就是不明白为什么用(1,0),不用(1,1)。
得补习一下线性代数了。

多谢。

通过getNodeToWorldTransformAR()获得的AffineTransform里的a,b,c,d,tx,td,
tx, td似乎就是节点的世界坐标,而abcd就包含着缩放和旋转,有什么方法能通过操作abcd得出世界缩放和世界旋转吗?

因為如果用極坐標表示1,0 等於長度1,旋轉為0
1,1表示為旋轉=45度,長度為根號2
所以當我算出結果後。如果用1,1,我還得多算一次長度,如果1,0,就不用算了。

1赞

厉害!!

AffineTransform
[a b] [sxcos® -sxsin®]
[c d] => [sysin® sycos®]
[tx td] [ tx td ]

如果上面成立,那么tx td与a b c d没有关联性。就可以解方程了

mark一下这个:
https://blog.csdn.net/hunter_wwq/article/details/21473519

我記得應該是三次方程。逆著解非常困難(不止一個解)。也沒什麼實際用處。

NodeUtils.getWorldRotation(node)
剛才路過看到這個應該也行。

http://forum.cocos.com/t/ccc1-9-3/63287

NodeUtils是个伪代码,我没在cocos中找到啊。你找到了吗?

难道是ccc2.0中的api?

我看了。是編輯器下才能用。坑。請無視。那條回覆我是從官方團隊回覆裡copy出