Three.js网格调整大小

时间:2016-07-09 19:32:33

标签: javascript 3d three.js

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

enter image description here

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

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

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

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

解决问题的可能方法:

  1. Bones
  2. Deformation

3 个答案:

答案 0 :(得分:3)

你可以使用Clara.io,它建立在ThreeJS之上,允许你在Clara.io场景中设置的几何体上运行运算符。您可以使用Clara.io中的厚度操作符。

此处的文档:http://clara.io/learn/sdk/interactive-experiences

您可以在Clara.io编辑器中执行任何操作,您可以在交互式嵌入中执行此操作。

答案 1 :(得分:2)

好吧,如果所有网格都是单独的图元,那么您只需更改要沿一个轴更改的每个零件的比例,并设置锚点以限制到外部。因此,对于边框上的碎片,您可以缩放它们所附着的空对象,以便它们保持外壳。

EG:

 OOOOOO
OMMMMMMO
OMmmmmMO
OMmmmmMO
OMMMMMMO
 OOOOOO

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

但是你通过遍历走上正轨。你只需要这样做。 为了便于遍历,我会给你想要改变其.userData对象中某些属性的所有东西。因为在某些情况下,您希望缩放空对象(O)(以便您可以有效地移动锚点),而在其他情况下,您将要在适当的位置缩放网格(m)。所以它不是纯粹基于网格的操作(因为网格想要从它们的中心缩放)。做一些标记会使遍历变得更简单:

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

如果您正确设置了heirarchy和.userData标记,那么您只需缩放内容并保留外壳。

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

答案 2 :(得分:0)

您可以使用更改不同网格大小和其他位置的方法,但是当您使用 object.scale.set( x, y, z ); 时,浏览器必须为渲染的每一帧更改模型的比例。因此,如果您将其用于大量网格,它会降低您的游戏性能。最好的方法是使用像 Blender 这样的 3d 编辑器。它更简单、更高效。