Javascript Three.js:加载适当的模型比例/尺寸

Javascript Three.js:加载适当的模型比例/尺寸,javascript,three.js,.obj,objloader,Javascript,Three.js,.obj,Objloader,我正在做一个three.js项目,在这个项目中,用户可以将.obj模型上传到场景中。问题是我有两个不同大小的模型(一个缩放到毫米,另一个具有任意比例)。在3D模型程序(如MeshLab和Blender)中加载时,它们的大小明显不同,但它们在场景中显示的大小完全相同 Q:是什么原因导致这两个大小明显不同的模型以完全相同的大小加载到三个.js中 下面是正在讨论的three.js项目: 免责声明-这不是自我推销的尝试,因此请不要将其视为自我推销。我只是请求帮助,因为我无法找出问题的原因 编辑:经过一

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

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

下面是正在讨论的three.js项目:

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


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

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

即使模型具有完全相同的顶点和比例,它们也可以以不同的单位制作,这对于每个对象都是合适的,但将以相同的大小导入和显示。modeler软件可以使用其本机单位作为缩放或自定义单位的基础,也可以完全忽略它。它可以包含原始顶点,也可以在导出时进行规格化。这里没有标准

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

文件头的一个示例:

####
#
#   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文件并将其缩放到适当的单位,则后者或其精神上的东西也是您需要实现的。我的建议是首先规范化几何体,设置正交摄影机,使用对象轮廓/卡通渲染,并使用显示比例的背景作为标尺;然后让用户更改背景比例,直到它正确为止,或者类似的事情(正如您可以想象的那样,这可以在不同的复杂度下向不同的方向发展)


另一种方法是支持嵌入单元的格式。在本例中,这种格式可能会导致数据丢失(“dae”文件)。它比OBJ的范围更广,也更复杂,但是它存储单元,并且通常具有良好的支持。THREE.js有一个(我还没有测试过自己,所以我不知道collada的范围有多大,也不知道它的导入效果如何)。

OBJ没有任何单位设置,只有比例和比例与加载它的软件解释为什么有关。不幸的是,允许用户在上传时设置mm没有帮助,因为原始单位/比例未知。Hmm。所以没有办法接受obj。文件转换为three.js并尝试使用国际单位制测量(或分配)模型?对不起,我是新来的:)我本来想添加一条评论,但我做了一个回答:)希望它能提供一些信息。K3N,谢谢你的详细解释和建议!我想在尝试第一个建议之前,我会调查一下collada进口商。:)嘿,K3N,您对JSON文件有什么意见吗?它们是否比.dae更好?如果JSON文件也支持对象单位,那么它在理论上更适合使用three.js的这个应用程序?@JonathanDrummond我不熟悉three使用的JSON格式,所以我无法即时判断,但是如果它有一个单位以及一个单位所代表的东西,那么应该可以工作。我正在研究一个类似于你第一个建议的解决方案,但我需要帮助。我的方法是使用display
boundingbox
向用户显示尺寸,以便他们可以将模型调整到适当的大小,但我不知道如何实时显示boundingbox尺寸。我发了一篇单独的帖子,如果你能看一看,我将非常感激。再次感谢:^)