Three.js: 加载合适的模型 scale/size

Three.js: Load proper model scale/size

我正在开发一个 three.js 项目,用户可以在其中将 .obj 模型上传到场景中。问题是我有两个不同大小的模型(一个缩放到毫米,另一个具有任意比例)。当加载到 MeshLab 和 Blender 等 3D 模型程序中时,它们的大小非常明显不同,但它们出现在场景中时大小完全相同!

问: 是什么原因导致这两个尺寸明显不同的模型加载到 three.js 时尺寸完全相同?

Here is proof the objects are loaded and saved with different scale

这是有问题的 three.js 项目:https://pcforge.tech/3d-viewer/

免责声明 - 这不是一种自我推销的尝试,因此请不要将其视为一种尝试。我只是寻求帮助,因为我无法找出问题的原因。

编辑:经过一些研究,显然 .OBJ 文件不会跨软件平台保留 unit/scale 数据,因此我计划允许用户设置上传模型时使用自己的单位尺寸 (mm),上传时将这些单位转换为 SI 单位。

不幸的是,Wavefront OBJ 格式不包含 unit 参数,这意味着任何顶点和比例都可以相对于任何单位,让我们只能猜测。

即使模型具有完全相同的顶点和比例,它们也可以制作在适合每个 object 的不同单位,但将被导入和以相同尺寸显示。建模器软件可能会使用其本机单位作为比例或自定义单位的基础,或者完全忽略它。它可能包含原始顶点,也可能在导出时被归一化。这里没有标准。

一些软件在导入时通过尝试识别生成模型的软件来解决此问题。您可以找到此信息的唯一位置(如果有的话)是在文件 header.

中的 non-standardized 评论部分。

文件示例header:

####
#
#   OBJ File Generated by LightWave3D
#   LightWave3D OBJ Export v2.3
#
####
...

(a non-standardized header 但在这种情况下您可以扫描 "Lightwave3D .." 并为此使用固定比例。)

但是,您必须知道如何解析每种评论风格,并且在某些情况下,模型已被 third-party 软件转换并且原始来源丢失:

#
# Wavefront OBJ file: X:\somemodel.obj
#
# Converted by the PolyTrans geometry converter from Okino Computer Graphics, Inc.
# Date/time of export: 02/02/2017 10:02:41
#
# Bounding box of geometry = (-163.899,-822.297,-1250.76) to (178.462,123.762,141.221).

...

(哪个软件制作了原版?)。

有些会提供一个导入对话框,让您根据它选择源和比例,但这也带来了它自己的挑战,例如上面提到的挑战。

如果您想要导入 OBJ 文件并将它们缩放到适当的单位,则后者或具有它精神的东西也是您需要实现的。我的建议是首先标准化几何体,设置正交相机,使用 object outline/cartoon 渲染并使用显示比例的背景作为标尺;然后让用户更改背景比例直到它是正确的,或者类似的东西(正如你可以想象的那样,这可以在不同的复杂性下朝着许多不同的方向发展)。

另一种方法是支持嵌入单元的格式。在这种情况下,这种格式可以是 Collada("dae" 个文件)。它的范围更广,比 OBJ 更复杂,但存储单位并且通常有很好的支持。 THREE.js 有一个 importer for collada(我还没有测试过自己,所以我不知道它涵盖了多少 collada 的范围或它导入的效果如何)。