fabric.js - 基于父级旋转“子”对象,不带分组

Posted

技术标签:

【中文标题】fabric.js - 基于父级旋转“子”对象,不带分组【英文标题】:fabric.js - Rotate "Child" Object based on Parent w/o Grouping 【发布时间】:2018-03-17 04:49:07 【问题描述】:

使用 fabric.js (1.7.11) ,我试图让一个对象跟随另一个对象的旋转而不将它们分组,同时保持子对象与父对象的相对位置。所以我相信我需要(1)将“子”对象的旋转中心设置为“父”对象的旋转中心,然后(2)当父对象旋转时,将该旋转增量应用于子对象(可能已经开始处于旋转状态)。最终结果是孩子对父母来说似乎“卡住”了(就像游戏板上的便签,然后你旋转游戏板)

这是伪代码

canvas.on('object:rotating', canvasEvent_ObjectRotating);

function canvasEvent_ObjectRotating(e)

    // set r2'2 center of rotation = r1's center of rotation

    // r2.angle += ( delta of rotation of r1 angle ) 


这是一个小提琴:

https://jsfiddle.net/emaybert/bkb5awj6/

对 1 或 2 的任何帮助将不胜感激。如何获得对象中的角度增量:旋转回调,和/或如何围绕任意点旋转对象。我已经看到了对fabric.util.rotatePoint 的引用以及如何使用它来旋转线条而不是对象的示例,并且无法进行这种心理转变。

【问题讨论】:

【参考方案1】:

这是您想要做的事情吗? https://jsfiddle.net/logie17/ofr8e6qd/1/

function canvasEvent_ObjectRotating(e)

  origX = r2.getCenterPoint().x;
  origY = r2.getCenterPoint().y;
  let topLeftPoint = new fabric.Point(origX, origY);

  if (!previousAngle) 
    previousAngle = r1.getAngle();
  
  let angle = fabric.util.degreesToRadians(r1.getAngle() - previousAngle);
  previousAngle = r1.getAngle();
  let center = r1.getCenterPoint();
  let origin = new fabric.Point(r1.left, r1.top);
  let newCoords = fabric.util.rotatePoint(topLeftPoint,origin,angle);

  r2.set( left: newCoords.x, top: newCoords.y ).setCoords();

【讨论】:

谢谢洛根。这太棒了,而且 90% 都在寻找我想要的东西。最终的解决方案是让蓝色方块与外部方块“一起”旋转(就像现在一样),但不让它本身旋转。 因此请注意,当它从蓝色方块的角开始接触外部红色方块时。在旋转期间,此配置应保持不变。无论红色方块如何旋转,蓝色方块上的那个点始终与红色方块上的同一点接触。 我能想到的最好的类比是想象一个游戏板放在地板上。然后在游戏板上贴一张便签。然后旋转板子。 (便签跟随板子旋转但不独立旋转)

以上是关于fabric.js - 基于父级旋转“子”对象,不带分组的主要内容,如果未能解决你的问题,请参考以下文章

基于Three.js中的父/其他对象坐标系保持对象旋转?

防止 Fabric js 对象超出画布边界

嵌套视图不遵守旋转父级的约束(变换)

Fabric.js 画布上的多个剪切区域

从 Fabric.js 中的 JSON 加载加载默认属性

旋转fabric.js时的组控制偏移