我们正在尝试构建“编辑手柄”,允许用户通过在8个位置之一拖动来调整(投影的)平面的大小(4个角落+4个边缘)。这种调整大小只应在拖动方向上缩放/拉伸表面,因此three.js的默认比例机制不适用,因为它会同时沿着两个相反的方向进行缩放,就像在此示例中看到的那样。
我已经阅读并尝试了很多内容,特别是这两篇文章:
- 仅将Three.js几何体缩放 - 以顶部为参考在一个方向上缩放几何体 按照这些方法,我得到了以下结果:
结果与我的期望不符: 缩放发生在两个相反的方向,因此平移彼此抵消 - 因此,如果将中心/原点放置在右边缘,则缩放不会发生,或者是我有误解。 另一方面,这个可以正常工作。
但是反复重置网格的位置真的很不专业,而且我曾经看过缩放网格的性能较差,因为这种转换需要每一帧都重新应用(但我可能记错了:Three.js - Scale model with scale.set() or increase model size?),而对基础几何图形的变换则已被融入数据中。
我还查看了TransformControls源代码,但由于它不能按我们想要的方式工作,并且我还没有完全理解四元数的概念,所以我就放弃了。
那么我的问题是:有没有一种方法可以进行单向调整大小而不必纠正网格的位置?
我已经阅读并尝试了很多内容,特别是这两篇文章:
- 仅将Three.js几何体缩放 - 以顶部为参考在一个方向上缩放几何体 按照这些方法,我得到了以下结果:
// preparing to resize into -x direction aka "left edge"
// moving the geometry center to the right edge
mesh.geometry.translate(width/2, 0, 0);
mesh.geometry.scale(scaleX, 1, 1);
// moving the geometry center back to the middle
// as more resizing might happen, into another direction, as per comment here:
// https://dev59.com/KIXca4cB1Zd3GeqPCAFG#PlYdoYgBc1ULPQZFJVAG
mesh.geometry.translate(-(width/2 * scaleX), 0, 0);
结果与我的期望不符: 缩放发生在两个相反的方向,因此平移彼此抵消 - 因此,如果将中心/原点放置在右边缘,则缩放不会发生,或者是我有误解。 另一方面,这个可以正常工作。
mesh.scale.set(scaleX, 1, 1);
mesh.position.x = (-width / 2);
但是反复重置网格的位置真的很不专业,而且我曾经看过缩放网格的性能较差,因为这种转换需要每一帧都重新应用(但我可能记错了:Three.js - Scale model with scale.set() or increase model size?),而对基础几何图形的变换则已被融入数据中。
我还查看了TransformControls源代码,但由于它不能按我们想要的方式工作,并且我还没有完全理解四元数的概念,所以我就放弃了。
那么我的问题是:有没有一种方法可以进行单向调整大小而不必纠正网格的位置?
.translate
等来更改位置。 - Benjamin Seiller