Threejs-如何按距离偏移2D几何图形上的所有点

时间:2018-06-20 21:32:52

标签: vector three.js geometry geometry-surface

使用Three.js,(尽管我相信这与数学更相关),我有一组2D点可以创建2D几何。例如正方形,矩形,五边形或自定义2D形状。基于原始的2D形状,我想创建一种方法来像附加的图像一样均匀地向内或向外偏移点。

我不知道是否有一种简单的方法可以向内或向外均匀地偏移/增长/缩小2D形状上的所有点(vector3)。如果是这样,我可以将点偏移X距离会很酷吗?有点像是说将2D形状上的点向外或向内偏移X距离。

不,我不是指从中心点缩放。虽然缩放可能适用于对称形状,但对于非对称形状则无效。

例如查看图片 enter image description here

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以阅读forum thread

enter image description here

我对ProfiledContourGeometry进行了一些更改,得到了OffsetContour,所以我把它留在这里,以防万一,如果有帮助的话:)

  function OffsetContour(offset, contour) {

    let result = [];

    offset = new THREE.BufferAttribute(new Float32Array([offset, 0, 0]), 3);
    console.log("offset", offset);

    for (let i = 0; i < contour.length; i++) {
      let v1 = new THREE.Vector2().subVectors(contour[i - 1 < 0 ? contour.length - 1 : i - 1], contour[i]);
      let v2 = new THREE.Vector2().subVectors(contour[i + 1 == contour.length ? 0 : i + 1], contour[i]);
      let angle = v2.angle() - v1.angle();
      let halfAngle = angle * 0.5;

      let hA = halfAngle;
      let tA = v2.angle() + Math.PI * 0.5;

      let shift = Math.tan(hA - Math.PI * 0.5);
      let shiftMatrix = new THREE.Matrix4().set(
             1, 0, 0, 0, 
        -shift, 1, 0, 0,
             0, 0, 1, 0,
             0, 0, 0, 1
      );


      let tempAngle = tA;
      let rotationMatrix = new THREE.Matrix4().set(
        Math.cos(tempAngle), -Math.sin(tempAngle), 0, 0,
        Math.sin(tempAngle),  Math.cos(tempAngle), 0, 0,
                          0,                    0, 1, 0,
                          0,                    0, 0, 1
      );

      let translationMatrix = new THREE.Matrix4().set(
        1, 0, 0, contour[i].x,
        0, 1, 0, contour[i].y,
        0, 0, 1, 0,
        0, 0, 0, 1,
      );

      let cloneOffset = offset.clone();
      console.log("cloneOffset", cloneOffset);
        shiftMatrix.applyToBufferAttribute(cloneOffset);
      rotationMatrix.applyToBufferAttribute(cloneOffset);
      translationMatrix.applyToBufferAttribute(cloneOffset);

      result.push(new THREE.Vector2(cloneOffset.getX(0), cloneOffset.getY(0)));
    }


    return result;
  }

随时对其进行修改:)

答案 1 :(得分:1)

对于不包含边缘修改数量的解决方案,我有些疑问。

我在这个项目中遇到了同样的问题,我想确保voronoi细胞之间的距离已知,然后我很快发现比例尺不能满足用例的要求。但是我面临的一个复杂问题是我不得不在while循环中处理的某些边缘的消失。调试是如此困难,以至于我不得不创建一个调试模式以帮助查看点和线,因此我也可以使用它。可以通过以下复选框激活此调试模式:

请注意图片,我将它们作为未嵌入的链接,因为我仍然是新贡献者(以后可能会改进)。

应消失的边缘以红色显示 retraction snapshot1

retraction with edges discard 1

retraction with edges discard 2

在这里有一个正在使用的函数的链接,您可能需要修改它以具有其他点格式: https://github.com/WebSVG/voronoi/blob/8893768e3929ea713a47dba2c4d273b775e0bd82/src/voronoi_diag.js#L278

这里有一个集成了此功能的完整项目的链接,它也有一个现场演示的链接 https://github.com/WebSVG/voronoi