【问题标题】:Three.js: Load proper model scale/sizeThree.js:加载适当的模型比例/尺寸
【发布时间】:2018-06-08 07:06:56
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • OBJ 没有任何单位设置,只有比例和比例将与加载它的软件解释的任何内容相关。不幸的是,允许用户在上传时设置 mm 无济于事,因为原始单位/比例是未知的。
  • 嗯。所以没有办法取一个obj。将文件放入 three.js 并尝试使用 SI 单位测量(或分配)模型?对不起,我是新人:)
  • 我本来打算添加评论,但我做了一个回答:)希望它提供一些意见。

标签: javascript three.js .obj objloader


【解决方案1】:

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

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

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

文件头示例:

####
#
#   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 有一个importer for collada(我还没有测试过自己,所以我不知道它涵盖了多少 collada 的范围或它的导入效果如何)。

【讨论】:

  • K3N,感谢您的详细解释和建议!我想在尝试第一个建议之前,我会调查 collada 进口商。 :)
  • 嘿 K3N,您对 JSON 文件有什么意见吗?它们是否比 .dae 更好用?如果 JSON 文件也支持对象单元,那么理论上它会更适合这个带有three.js 的应用程序?
  • @JonathanDrummond 我不熟悉三种使用的 json 格式,所以我无法即时判断,但如果它有一个单元以及一个单元代表的内容,那应该可以工作。
  • 我正在研究与您的第一个建议类似的解决方案,但我需要帮助。我的方法是使用向用户显示boundingbox 尺寸,以便他们可以将模型调整到合适的尺寸,但我不知道如何实时显示边界框尺寸。我做了一个单独的帖子here,所以如果你能看一下我会非常感激。再次感谢:^)
猜你喜欢
  • 1970-01-01
  • 2019-01-30
  • 1970-01-01
  • 1970-01-01
  • 2022-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多