如何获得在Three.js中由骨骼缩放的网格的大小?

时间:2018-09-22 11:30:22

标签: three.js gltf

我的项目是一个带有three.js的小型javascript网络游戏。

我使用GLTFLoader将带有动画的GLTF文件导入到我的项目中。模型已加载,我可以播放所有动画。 我的目标是使网络流量尽可能小。这就是为什么我只想导入几个GLTF模型作为基本模型,并使用three.js更改它们在客户端的外观的原因。 通过缩放模型的特定骨骼,我可以使模型看起来很高,而不会干扰骨骼的动画。

唯一的问题是:

如果通过缩放某些骨骼来更改模型的大小,则模型大小将在整个Y轴上更改。正面和负面。

例如:

如果我将“人类”模型放置在平面上,然后通过缩放骨骼来缩放模型,则由于缩放,模型的脚会移动到平面下方。 这就是为什么在通过缩放骨骼更改大小之前和之后,我需要知道模型的确切高度或大小。这样,我可以计算出将模型推到飞机上方所需的距离。

我尝试过

mesh.geometry.computeBoundingBox()

而不是得到boundingBox的大小,但这只是给我模型的未更改几何的大小。

我还尝试使用以下方法创建一个新的Box3对象,并使其大小与更改后的模型相同:

new Box3().setFromObject(mesh);

但这也给了我不变的几何尺寸。

那么,如何获得在Three.js中由骨骼缩放的网格的大小? 还是有其他方法可以解决我的问题?

期待阅读您的建议。

1 个答案:

答案 0 :(得分:0)

出于性能原因,将外观(骨骼引起的顶点转换)应用于GPU,并且永远不会将顶点位置读回到应用程序内存中。结果,诸如geometry.computeBoundingBox()mesh.scale和光线投射之类的方法将不会考虑皮肤。

如果用例很简单(例如,只有一根骨头会影响蒙皮),则始终可以获取该特定骨头的比例并将其与原始边界框相乘:

var bone = model.getObjectByName('MyScalingBone');
console.log(bone.scale);