lufy's legend

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 26822|回复: 13

关于对象的旋转中心和缩放中心的设置

[复制链接]

37

主题

8

好友

9304

积分

诸侯王

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

发表于 2014-7-18 01:00:19 |显示全部楼层
经常有人问关于LBitmap和LSprite对象如何设置旋转的注册点,就是以哪个点为中心来旋转的问题。
当然,还有缩放也是。
每次都回答同样的问题,是一件很郁闷的事,所以我在这里把这个问题单独拿出来详细讲解一下。

先来看默认情况。
首先是LBitmap,LBitmap默认的旋转是以它自己的中心位置为注册点来旋转的。
当然,这个默认的设置是可以通过rotateCenter来设置的,rotateCenter默认值是true,即沿着中心旋转。
而LBitmap的缩放坐标是以自己本身的起始点为缩放中心的。
效果如下图
スクリーンショット 2014-07-18 1.00.47.png


如果设置rotateCenter=false;那么效果就变成了下图
スクリーンショット 2014-07-18 1.01.02.png

对比上图,你会发现,旋转的中心变为了对象的原点坐标,缩放没有影响。
以上效果,可以通过下面的URL测试
http://lufylegend.com/demo/test/42.html

接着,看一下LSprite 对象旋转和缩放的中心坐标
LSPrite对象没有rotateCenter属性,它的旋转中心和缩放中心都是它的起始坐标,效果如图
スクリーンショット 2014-07-18 1.01.02.png

http://lufylegend.com/demo/test/43.html

那么,如何来设置任意的旋转中心和缩放中心呢?

LBitmap对象和LSprite对象都有rotatex和rotatey两个隐藏属性,下面我只说LSprite,LBitmap同理
如果在旋转和缩放的时候,添加以下设置的话
  1. sprite.rotatex = 50;
  2.         sprite.rotatey = 0;
复制代码
效果如下图
スクリーンショット 2014-07-18 1.19.51.png

上面的黑点是rotatex和rotatey确定的位置,可以看到,旋转的中心点变为了(rotatex,rotatey),而缩放无影响。
测试连接
http://lufylegend.com/demo/test/44.html

那么如何即设置旋转中心,同时也设置缩放中心呢?
原理就是将这个LBitmap或者LSprite对象A放到另一个LSprite对象B里,然后设置对象A和对象B的相对位置,比如将对象A的坐标设置为(-50,0).
那么,效果如下图
スクリーンショット 2014-07-18 1.32.43.png

可以看到,无论是旋转还是缩放,中心点都发生了变化,变为了(50,0).
根据这个原理,你可以任意修改这个旋转中心和缩放中心了,
比如将一个LBitmap对象做下面坐标设置
        bitmap.x = -bitmap.getWidth()*0.5;
        bitmap.y = -bitmap.getHeight()*0.5;
这样就可以让对象沿着自己的中心旋转和缩放,下面是效果
スクリーンショット 2014-07-18 1.33.02.png

测试连接
http://lufylegend.com/demo/test/45.html

你也可以利用这个原理,制作一个钟摆,如下
スクリーンショット 2014-07-18 1.58.20.png




测试连接
http://lufylegend.com/demo/test/22.html


好了,剩下的就是自由发挥了。
不回答与技术和引擎不相关的问题
回复

使用道具 举报

0

主题

0

好友

12

积分

士兵

Rank: 1

发表于 2014-10-14 10:20:16 |显示全部楼层
收藏,透彻!
回复

使用道具 举报

16

主题

0

好友

372

积分

帐下督

Rank: 2

发表于 2016-1-16 15:38:08 |显示全部楼层
多谢。很不错
回复

使用道具 举报

3

主题

0

好友

57

积分

士兵

Rank: 1

发表于 2016-3-1 17:24:22 |显示全部楼层
本帖最后由 var 于 2016-3-3 01:25 编辑

我早期使用的负数,负一倍的距离就可以在中心,后来这种选择的东西过多,多设置负数会导致后期操作的一些计算变的复杂
就将物件设置被静态刚体,使用的box2d的setAngle
回复

使用道具 举报

3

主题

0

好友

47

积分

士兵

Rank: 1

发表于 2016-6-17 16:47:52 |显示全部楼层
本帖最后由 islzc 于 2016-6-17 16:49 编辑

你好我想问一下我设置了Lsprite的旋转点rotatex,rotatey点在中心,围绕着中心旋转  Lsprite是绑定的点击事件的,旋转后点击图层所在的位置却获取的不是图层本身了
回复

使用道具 举报

37

主题

8

好友

9304

积分

诸侯王

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

发表于 2016-6-17 18:12:28 |显示全部楼层
islzc 发表于 2016-6-17 16:47
你好我想问一下我设置了Lsprite的旋转点rotatex,rotatey点在中心,围绕着中心旋转  Lsprite是绑定的点击事件 ...

用上面介绍的最后一种方式来做就可以了
不回答与技术和引擎不相关的问题
回复

使用道具 举报

3

主题

0

好友

47

积分

士兵

Rank: 1

发表于 2016-6-19 22:58:20 |显示全部楼层
lufy 发表于 2016-6-17 18:12
用上面介绍的最后一种方式来做就可以了

可能我说的不够清楚,我的意思是围绕着中心旋转已经实现(实现的方式是改变他的rotatex,rotatey)到图层的中心,但是旋转过后,但问题是图层所绑定的点击事件没有办法在旋转后的区域抓取到改图层了  就是说实际点击区域跟改变了旋转中心后的区域不相符
回复

使用道具 举报

37

主题

8

好友

9304

积分

诸侯王

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

发表于 2016-6-20 01:08:18 |显示全部楼层
islzc 发表于 2016-6-19 22:58
可能我说的不够清楚,我的意思是围绕着中心旋转已经实现(实现的方式是改变他的rotatex,rotatey)到图层的中 ...

我知道你的意思,我说的就是解决办法,用最后一种方法来设置中心点就能解决你的问题
不回答与技术和引擎不相关的问题
回复

使用道具 举报

7

主题

0

好友

189

积分

士兵

Rank: 1

发表于 2018-3-1 14:15:00 |显示全部楼层
直接缩放或平移画布之后所有的坐标点都会偏移,是不是因为中心点的问题?有没有更好的办法缩放和平移画布保证坐标点不变?
回复

使用道具 举报

37

主题

8

好友

9304

积分

诸侯王

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

发表于 2018-3-1 16:00:00 |显示全部楼层
zb0819 发表于 2018-3-1 14:15
直接缩放或平移画布之后所有的坐标点都会偏移,是不是因为中心点的问题?有没有更好的办法缩放和平移画布保 ...

原理我已经讲的很明白了吧,具体想怎么设置中心点,上面都已经给了方法了
不回答与技术和引擎不相关的问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

防止垃圾广告,请填写任意字符

Archiver|lufy's legend

GMT+8, 2024-3-29 04:59 , Processed in 0.066010 second(s), 34 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部