我正在从事一个three.js项目,用户可以将.obj模型上传到场景中。问题是,我有两个不同大小的模型(一个缩放到mm,另一个有任意大小)。在三维模型程序(如MeshLab和Blender,)中加载时,它们的大小非常明显不同,但它们出现在场景中的大小完全相同!
Q:,是什么原因导致这两个大小明显不同的模型以完全相同的大小加载到three.js中?
下面是有问题的three.js项目:https://pcforge.tech/3d-viewer/
免责声明-这不是一个自我推销的尝试,所以请不要把它看作一个整体。我只是在寻求帮助,因为我找不出问题的原因。
编辑:经过一些研究后,显然.OBJ文件没有保存跨软件平台的单元/规模数据,所以我计划允许用户在上传模型时设置自己的单元尺寸(mm),并在上传时将这些单元转换为SI单元。
发布于 2017-12-29 04:07:04
不幸的是,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大得多,而且比OBJ复杂得多,但是存储单元,并且通常有很好的支持。THREE.js有一个collada进口商 (我还没有对自己进行测试,所以我不知道它涵盖了多少collada的范围,或者它导入得有多好)。
https://stackoverflow.com/questions/47995531
复制相似问题