【问题标题】:Three.js .obj loader not working with 3Ds Max .objThree.js .obj 加载器不适用于 3Ds Max .obj
【发布时间】:2016-05-19 18:21:06
【问题描述】:

我正在尝试使用 objLoader 将 .obj 加载到 Three.js 中。

var loader = new THREE.OBJLoader( manager );
                loader.load( 'obj/gate-2.obj', function ( object ) {

                    object.traverse( function ( child ) {

                        if ( child instanceof THREE.Mesh ) {

                            child.material.map = texture;

                        }

                    } );

使用搅拌机模型一切正常,但是每当我尝试使用自己的自定义 3Ds Max 模型时,.obj 不会在浏览器中加载并给出错误。是我导出错误还是 Three.js 不支持 3Ds Max .obj 导出器?

错误信息

    Error: Unexpected line: s 2
parseOBJLoader.js:339
(anonymous function)OBJLoader.js:24
(anonymous function)three.min.js:376:387

【问题讨论】:

  • 先尝试一次,只导出像立方体这样简单的东西。然后检查它是否有效......你使用的是什么版本的 Three.js。
  • @Wilt 我假设是最新版本,因为我前几天才下载它,模型在搅拌机中重新渲染时可以工作,我不确定问题但是现在试试立方体!
  • 好吧,s 2 将是一个平滑设置。 loader是否支持平滑?我会假设它只会跳过它不理解的行。我认为这是为了平滑组。
  • OBJLoader 可以处理从 3ds max 导出的 .obj 文件,但here 概述的单独对象除外。导出一个非常简单的对象并将 .obj 文件的内容粘贴到您的问题中
  • 查看 OBJLoader.js 的代码,平滑组的正则表达式只能处理“s 1”,但不能处理“s 2”、“s 3”等其他设置。我不不知道这意味着什么,因为我对 obj 格式或 3DSMax 不够熟悉。但是我在尝试将从 3DSMax 导出的 OBJ 导入到threejs时遇到了同样的问题。

标签: javascript three.js 3dsmax


【解决方案1】:

我目前遇到了同样的错误:

Error: Unexpected line: s 2

使用由 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware 导出的 .obj 文件。

我已关注 @2pha 的 link 与缺少的对象名称相关,虽然这是真的,但在手动插入对象名称后,我仍然遇到“意外行”错误。

我的解决方案是在 Blender (https://www.blender.org/) 中导入 .obj 文件,然后立即导出一个 .obj 文件,虽然不是针对此错误发生原因的具体修复。似乎可以使用 Three.js THREE.OBJLoader 导入 Blender v2.76 (sub 0) OBJ Exporter 创建的 .obj 文件,无需额外的人工劳动。

我希望有一天 Three.js 或 3ds Max 会纠正这个错误(它似乎正在为 Three.js here 工作),但与此同时,没有人有时间去做。

更新:我已经提交了一个拉取请求来解决这个问题:https://github.com/mrdoob/three.js/pull/8118,同时你可以修改你的 smoothing_pattern 以支持多位数:

Line 220: var smoothing_pattern = /^s\s+(\d+|on|off)/;

【讨论】:

  • 哈哈我做了完全一样的事情 XD 因为当时这是唯一有意义的事情,而且令人惊讶的是,我不得不下载搅拌机,这很烦人;p
  • 作为记录,我也无法在 Maya 中打开 3ds Max 生成的 .obj 文件。但是,在运行 Blender 之后,这是可能的。很高兴听到我不是唯一处理这种疯狂的人!
  • 当你有一个 mtl 文件时,Blender 解决方案是否仍然有效,或者它是否以某种方式搞砸了?我尝试在 Meshlab 中打开 obj 并再次导出 - 这会将所有材质名称更改为某个默认设置(material_0、material_1 等),所以这不是很有用。
  • 我相信是的,我有一个 mtl 文件,而且名称实际上保持不变。
  • @Nuitari 根据您提交的答案,我已经用支持多位数字的正则表达式更新了我的。这确实解决了这个问题。谢谢! (我无法评论你的回答,因为我没有足够高的声誉......)
【解决方案2】:

我在使用 3ds Max Wavefront OBJ Exporter v0.97b 和 Threejs 的最新版本 (74) 时遇到了完全相同的错误。

我没有解决方案,但我可以看到问题在于,当 OBJLoader.js 解析 obj 文件时,它会查找格式为 \^s\s+([01]|on|off)\ 的平滑组,它只匹配 "s 1" 或 "s 0" 和因此将在“s 2”及以上抛出错误。 (您可以使用https://regex101.com 检查正则表达式,以防像我一样看不懂正则表达式;))

它在使用 Blender 导入然后导出时有效,因为 Blender 将仅使用“s 1”和“s off”作为参数导出它。

【讨论】:

    猜你喜欢
    • 2011-05-31
    • 2018-12-28
    • 2011-08-18
    • 2018-06-21
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    相关资源
    最近更新 更多