Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Three.js中控制自定义几何图形的缩放_Javascript_Three.js_3d_Csg_Threecsg - Fatal编程技术网

Javascript 在Three.js中控制自定义几何图形的缩放

Javascript 在Three.js中控制自定义几何图形的缩放,javascript,three.js,3d,csg,threecsg,Javascript,Three.js,3d,Csg,Threecsg,我有一个自定义对象,它是两个网格的减法。此减法创建类似于帧的对象 createFrame(x,y,z){ const frameMesh=new THREE.Mesh(new THREE.BoxGeometry(1,1,1)); frameMesh.scale.set(x,y,z); const smallerFrameMesh=frameMesh.clone() smallerFrameMesh.scale.set(x-4,y-4,z); //减法 const frameGeometry=fr

我有一个自定义对象,它是两个网格的减法。此减法创建类似于帧的对象

createFrame(x,y,z){
const frameMesh=new THREE.Mesh(new THREE.BoxGeometry(1,1,1));
frameMesh.scale.set(x,y,z);
const smallerFrameMesh=frameMesh.clone()
smallerFrameMesh.scale.set(x-4,y-4,z);
//减法
const frameGeometry=fromCSG(toCSG(frameGeometry).subtract(toCSG(smallerFrameMesh));
const frame=new THREE.Mesh(frameGeometry,new THREE.MeshStandardMaterial(0xffffff));
frame.geometry.computeVertexNormals();
frame.userData.isFrame=true;
返回框;
}
现在,每当大小发生变化时,我都会动态缩放此帧。问题是使用
.scale
只能使对象拉伸,而我希望它保持帧的宽度(在本例中为4)

是否可以指定对象应如何缩放(如编写我自己的缩放函数实现),或者是否有一个属性/方法可用于保留“空白”与“对象”部分?提前感谢。

通过将每个顶点的位置相乘,
scale()
方法可以对每个顶点进行相等的变换。因此,如果帧的内边缘位于
x=6
,而外边缘位于
x=10
,则将其缩放2将得到内:
x=12
,外:
x=20
,使帧宽8个单位

为了缓解这种情况,您可以将框架分为4个不同的框:顶部、底部、左侧和右侧。如果要在x轴上缩放,可以拉伸顶部和底部,只需移动左右边缘即可。这样可以保持厚度为4:


如果要在y轴上缩放,可以进行反转。您可以拉伸左右框,然后移动顶部和底部,使它们对齐。

这就是我想实现的。问题是,我有多个这样的“帧”(比如说至少20个),需要缩放,每个帧的缩放方式不同,这就是为什么我考虑重写它的缩放函数,这样我就可以操纵它处理顶点的方式。我想我没有任何机会独自做这件事,所以你的解决方案可能是唯一的。