Three.js网格调整大小

two*_*e88 5 javascript 3d three.js

我有一个3D模型作为obj文件加载到Three.js.模特本身就是一个家具.

在此输入图像描述

问题是,家具材料是动态的并且尺寸(厚度)不同.我需要能够使材料的厚度更大,但模型的总尺寸不能改变.因此缩放不是一种选择.

有没有办法可以调整模型的一部分(很少有特定的网格)并且不会损害网格本身的结构?我需要改变结构的厚度,但模型的内部部分不应该改变.

我能想到的唯一解决方案是改变某些网格的比例,然后根据它改变其他网格的全局位置.这是正确的方法吗?

object.traverse(function(child) {
    if (child instanceof THREE.Mesh) {
        // resize and reposition some of the meshes
    }
});
Run Code Online (Sandbox Code Playgroud)

可能的解决方法:

  1. 骨头
  2. 形变

小智 3

好吧,如果所有网格都是单独的图元,那么您只需更改要沿一个轴更改的每个部分的比例,然后设置锚点以约束到外部即可。因此,对于边界上的部分,您可以缩放它们所附加的空对象,以便它们保持外壳。

例如:

 OOOOOO
OMMMMMMO
OMmmmmMO
OMmmmmMO
OMMMMMMO
 OOOOOO
Run Code Online (Sandbox Code Playgroud)

其中 O 是带有相邻 Mesh-M 的 Object3D,m 表示自行缩放的网格。这样,如果您调整所有“m”和“O”的比例,外壳就会保持在原位,

但你的遍历是在正确的轨道上。你只需要这样做。为了一种简单的遍历方法,我会提供您想要更改其 .userData 对象中的某些属性的所有内容。因为在某些情况下,您需要缩放空对象 (O)(以便可以有效地移动锚点),而在其他情况下,您需要缩放就地网格 (m)。所以它不纯粹是基于网格的操作(因为网格想要从其中心缩放)。做一些标记可以使遍历更简单:

object.traverse(function(child){
    if(child instanceof THREE.Mesh){
        if(child.userData.isScalable){
            //do the scaling.
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

如果您正确设置了层次结构和 .userData 标记,那么您只需缩放事物并保留外壳即可。

你问的是这个吗?因为问题不清楚。