不幸的是,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 的多少范围或它的导入情况)。