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

标签 javascript three.js .obj objloader

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

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

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

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

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

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

最佳答案

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

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

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

文件头示例:

####
#
#   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 的范围或它导入的效果如何)。

关于javascript - Three.js:加载适当的模型比例/大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47995531/

相关文章:

javascript - 使用Javascript库SJCL加密,使用PHP解密

javascript - jQuery UI 所见即所得?

javascript - Gulp.js : how to rewrite relative paths?

three.js - 如何将边缘渲染为圆柱体?

c++ - 通过 C++ 中的#pragma 将 .obj 文件包含到 Visual Studio 中的项目

javascript - AngularJS 将对象参数绑定(bind)到对象 var

javascript - THREE.js生成UV坐标

javascript - Three.js 当渲染器位于 div 而不是整个窗口时如何获取准确的世界坐标

javascript - THREE.js 不使用 .mtl 渲染 .obj - 为 THREE.js 导出文件

algorithm - 将多个 .OBJ 索引缓冲区映射/折叠到 OpenGL 的第一个索引缓冲区