Three.js:加载适当的模型比例/大小

时间:2017-12-27 16:30:47

标签: javascript three.js .obj objloader

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

问:可能导致这两个尺寸明显不同的模型加载到具有完全相同尺寸的three.js?

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

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

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

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

1 个答案:

答案 0 :(得分: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有一个importer for collada(我还没有自己测试过,所以我不知道它涵盖的collada范围有多大或进口有多好。)