谢谢!
我终于明白了。
在以下示例代码中,图像 imgObj 围绕旋转
imgObj.rotPoint = {x: 500, y: 500}
有几个问题需要解决:
您不能只设置绝对旋转点,您必须更改相对于其标准位置(图像的左上边缘)的偏移量。然后你必须将图像向后移动,因为偏移量的变化移动了图像。
对于旋转,我启用了拖动并使用了 dragBoundFunc。
设置
return {x: this.getAbsolutePosition().x, y: this.getAbsolutePosition().y};
会向您保证,不会有真正的拖动 - 只是旋转。
对于旋转本身,您需要六个值:
拖动开头的三个值:
- posMouseStart:鼠标的 x-y 位置
- radMouseStart:正 x 轴与从旋转点到 posMouseStart 的向量之间的角度,单位为弧度
- radImageStart:图像的当前旋转(可能已经旋转了?)
我通过绑定 onmousedown 来获取这些值,如果有拖放,则仅使用这些值。
三个值在拖放时一直在变化:
- posMouseNow:此时鼠标右侧的 x-y 位置
- radMouseNow:正 x 轴与从旋转点到 posMouseStart 的向量之间的角度,以弧度表示
- radImageNow:图像的当前旋转(也许它已经旋转了?)就在那个时刻
我在我的 dragBoundFunc 中得到这些值。
在使用 Math.atan2() 获取角度时,您必须注意,您不是在 xy 坐标系中,而是在 x-(-y) 坐标系中 - 所以请使用:Math.atan2(- y,x)。
通过从 radMouseNow 中减去 radMouseStart,您将获得必须旋转的角度,以将图像从开始位置变为现在位置。但是,当我们围绕这个角度旋转时,图像会像疯了一样旋转。
为什么会这样? - 在图像已经旋转的“开始”和“现在”之间有几毫秒。所以:当你“现在”旋转时,你不是从 radMouseStart 开始,而是从 radImageNow - radImageStart + radMouseStart 开始。
\o/所有问题都解决了\o/
代码:
var imgObj = new Kinetic.Image
({
image: YourImg,
x: YourSize.x,
y: YourSize.y,
draggable: true
});
imgObj.rotPoint = {x: 500, y: 500};
imgObj.setOffset
(
imgObj.rotPoint.x - imgObj.getAbsolutePosition().x,
imgObj.rotPoint.y - imgObj.getAbsolutePosition().y
);
imgObj.move(imgObj.getOffsetX(),imgObj.getOffsetY());
var o = {x: imgObj.rotPoint.x, y: imgObj.rotPoint.y}; // shortcut
imgObj.on('mousedown', function()
{
posMouseStart = stage.getMousePosition();
radMouseStart = Math.atan2(-(posMouseStart.y - o.y), posMouseStart.x - o.x);
radImageStart = this.getRotation();
});
imgObj.setDragBoundFunc(function(pos)
{
var posMouseNow = stage.getMousePosition();
var radMouseNow = Math.atan2(-(posMouseNow.y - o.y), posMouseNow.x - o.x);
var radImageNow = this.getRotation();
var radMouseDiff = -(radMouseNow - radMouseStart);
this.rotate(radImageStart + radMouseDiff - radImageNow);
return {x: this.getAbsolutePosition().x, y: this.getAbsolutePosition().y};
});