javascript - Three.js 网格调整大小

标签 javascript 3d three.js

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

enter image description here

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

有没有一种方法可以调整模型部分(少数特定网格)的大小并且不损害网格本身的结构?我需要改变结构的厚度,但模型的内部零件不应该改变。

我能想到的唯一解决方案是更改一些网格的比例,然后基于此更改其他网格的全局位置。这是正确的方法吗?

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

可能的解决方法:

  1. Bones
  2. Deformation

最佳答案

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

如:

 OOOOOO
OMMMMMMO
OMmmmmMO
OMmmmmMO
OMMMMMMO
 OOOOOO

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

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

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

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

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

关于javascript - Three.js 网格调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38285601/

相关文章:

javascript - 如何更改 chessboard.js 中的转弯?

java - 修复了 3D 相机在它面对的方向上移动的问题?

python - 使用 matplotlib 堆叠 3d 条形图

3d - Cannon.js 复杂形状

javascript - 三个js-纹理加载-async/await

javascript - Three.js 不支持 FBX 二进制格式

javascript - 连接 JS 文件

javascript - 如何在 IE 上找到流氓 Ajax 请求的来源?

javascript - 如何更改 react 路由器路由?

3d - 任何使用 SpriteKit 在 2D 游戏中模拟 3D 球运动的方法?