1

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

问:什么可能导致这两个大小明显不同的模型加载到大小完全相同的三个.js 中?

这是以不同比例加载和保存对象的证明

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

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

编辑:经过一些研究,很明显 .OBJ 文件不保留跨软件平台的单位/比例数据,所以我计划允许用户在上传模型时设置自己的单位尺寸 (mm),并将这些单位转换为上传时的 SI 单位。

4

1 回答 1

1

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

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

一些软件在导入时通过尝试识别生成模型的软件来解决这个问题。如果有的话,您唯一可以找到此信息的地方是文件头中的非标准化注释部分。

文件头示例:

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

(一个非标准化的标题,但在这种情况下您可以扫描“Lightwave3D ..”并为此使用固定比例。)

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

#
# 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 文件并将它们缩放到适当的单位,则后者或某种精神上的东西也是您需要实现的。我的建议是首先标准化几何,设置正交相机,使用对象轮廓/卡通渲染并使用显示比例的背景作为标尺;然后让用户改变背景比例,直到它是正确的,或者类似的东西(你可以想象这可以在不同的复杂性下朝许多不同的方向发展)。

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

于 2017-12-29T04:07:04.950 回答