我有一个3D模型作为obj文件加载到 Three.js 。模特本身就是一个家具。
问题是,家具材料是动态的,并且尺寸(厚度)不同。我需要能够使材料的厚度更大,但模型的总尺寸不能改变。所以缩放不是一个选择。
有没有办法可以调整模型的某些部分(很少有特定的网格)并且不会损害网格本身的结构?我需要改变结构的厚度,但模型的内部部分不应该改变。
我能想到的唯一解决方案是改变某些网格的比例,然后根据它改变其他网格的全局位置。这是正确的方法吗?
object.traverse(function(child) {
if (child instanceof THREE.Mesh) {
// resize and reposition some of the meshes
}
});
解决问题的可能方法:
答案 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 编辑器。它更简单、更高效。