Three.js - 使用 scale.set() 缩放模型或增加模型大小?

24

如何在Three.js(或其他3D渲染器)中缩放3D模型的最佳实践是什么?

这里有一个我刚遇到的例子:

我加载一个模型后发现它太小了。然后我使用 mesh.scale.set(2,2,2); 缩放网格,这样就可以达到完美的大小。

在这种情况下,我应该采取什么行动,是保持它以这种方式缩放(通过程序缩放),还是返回我的3D建模软件并将模型的大小加倍?

谢谢

1个回答

34

这不是关于最佳实践,而是关于优化。如果您的网格将始终被缩放,则最好在建模软件中进行缩放。那个简单的语句 mesh.scale.set(2,2,2); 是一个需要在每个渲染帧上执行的矩阵乘法。现在也许你的场景没有太多几何形状,所以你并不在意。但正如我所说,这是一种优化的问题。如果您的场景有1000个这样的网格或者是1000000个呢?那么这个矩阵乘法就需要对每一个网格进行运算。在您可以优化的时候请务必这样做。


24
gaitat - 这不正确。mesh.scale.set() 只调用一次。默认情况下,无论缩放的值如何,每个帧都会重新计算 mesh.matrix - WestLangley
3
是的,但我认为即使在解释型JavaScript中,乘以1仍然是一个无操作(no-op),而乘以2则不是。 - gaitat
4
有一件事我需要指出,就是你应该注意到 mesh.scale.set(2,2,2) 可以生效,但是 mesh.scale = new THREE.Vector3(2,2,2) 无法生效。这可能是由于网格对象内部进行了某种缓存处理的原因。 - Steven Lu
13
你可以使用mesh.geometry.scale(2, 2, 2)对几何体进行"预缩放"。这只会发生一次,会修改几何体中的实际顶点。根据上面的评论,mesh.scale.copy(new THREE.Vector3(2, 2, 2))也能达到同样的效果。如果你要重复使用缩放向量,这将非常有用。 - Killroy
3
谢谢 @Killroy - 我一直在使用.geometry.scale.set()... 没想到你可以直接使用.geometry.scale(). 希望你的回答更加明显! - 1owk3y
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接