2

新巴比伦 JS 用户,希望了解这个出色的框架。玩过沙盒和在线编辑器,使用标准组件(Box、Sphere 等)从头开始构建我自己的编码模型。我的问题与如何加载更复杂的自定义几何图形有关。对 3D CAD - STL/OBJ 文件非常满意,将一些从 Blender 导出为 .Babylon 格式的导出文件很好地导入了 Babylon 的在线沙盒和编辑器。但是,我似乎无法让 SceneLoader 从本地 C:/ 驱动器读取文件。代码摘录如下:

// Create new Babylon Scene
var scene = new BABYLON.Scene(engine);

// Change scene background color
scene.clearColor = new BABYLON.Color3(1, 1, 1);

// Create and positions a free camera
var camera = new BABYLON.FreeCamera("camera1", new BABYLON.Vector3(0, 10, 0), scene);

 // Target the camera to scene origin
 camera.setTarget(BABYLON.Vector3.Zero());

// Attach camera to the canvas
camera.attachControl(canvas, true);

// Define built-in 'box' shape.
var box = BABYLON.Mesh.CreateBox("sphere1", 1, scene);

// Define 'ground' plane
var ground = BABYLON.Mesh.CreateGround("ground1", 100, 100, 100, scene);
            ground.position.y = 0;
//Load local .babylon file from root Dir
BABYLON.SceneLoader.Load("", "Test.babylon", engine, scene);

我的模型有一个带有地平面的几何标准框。巴比伦的所有渲染都很棒——直到我添加了 SceneLoader 行。当我添加这个时,我卡在了巴比伦加载介绍启动画面(旋转巴比伦标志)上。如果我注释掉模型上方的最后一行代码,则该框可以很好地呈现。看过各种论坛页面,让我的大脑陷入困境,例如:http ://www.html5gamedevs.com/topic/20924-stlobj-file-loader/ & https://www.eternalcoding。 com/?p=313 我相信谷歌浏览器可能为了安全而锁定了本地文件链接,尝试在 -Allow-Local-File-Access 模式下运行,仍然卡在加载页面上。我需要一个网络服务器(我不知道从哪里开始!)或者我可以在本地运行巴比伦场景吗?

4

3 回答 3

2

OP 提出的第一个问题:浏览器未从文件系统加载网格。

解决方案:使用 Web 服务器,例如 Simple HTTP Server (Python)。根据您的 Python 版本,执行此操作的方法略有不同。要在 Windows 上检查 Python 版本,请打开命令提示符并键入python --version. 记住版本号以备后用:)

使用 Python和命令提示符设置简单的 Web 服务器:

  • index.html在文件资源管理器中导航到您的文件所在的目录
  • 左键单击路径框内的空白区域(上面写着This PC > Documents等...)
  • 键入cmd,它将在当前目录中打开命令提示符
  • 输入适当的命令...

    python -m SimpleHTTPServer [optional port number] if you are using Python 2

    python -m http.server [optional port number] if you are using Python 3

    我通常会省略端口号,只需键入python -m http.server.

  • 现在打开您喜欢的浏览器并输入localhost:8000您的地址栏。(8000 是默认端口号。如果您指定了端口,请使用您指定的端口号。)如果代码没有错误,它应该加载您的网格。

OP 提出的第二个问题:SceneLoader.Load 方法会覆盖先前加载的网格。

解决方案:

我知道这个问题已经有几年了,但如果有人对此仍有疑问,我希望这个答案能有所帮助。

于 2018-09-15T09:19:30.307 回答
1

所以我不是 100% 确定这个答案,但希望它会有所帮助。我遵循了本教程(跳到加载场景的部分)。一个问题肯定是跨源问题,另一个问题是您如何调用该SceneLoader.Load方法。

当我使用常规 Chrome 尝试本教程中的代码时,我在 Web 控制台中看到三个警告。关于 Test.babylon.manifest 的两个错误(使用您的示例文件命名)和一个关于 Test.babylon 的错误。您可以忽略有关清单 afaik 的那些。重要的是 Test.babylon 本身的错误。因此,默认情况下不允许跨源请求,并且不加载巴比伦文件(如预期的那样)。

现在,当我关闭 Chrome 并通过open -a "Google Chrome" --args --allow-file-access-from-files在终端中运行重新打开它(我在 OSX Yosemite 上),然后加载页面时,对象加载正常。我仍然在 Web 控制台中看到关于清单的两个错误,但可以忽略它们。

注意BABYLON.SceneLoader.Load函数是如何被调用的。导入过程是异步的,最后一个参数看起来是一个回调函数,用于在对象成功加载后执行的操作,所以我认为您不能scene像在原始代码中那样传递。查看函数文档

于 2016-04-19T23:10:04.013 回答
1

好的 - 进步。我使用 SceneLoader.ImportMesh 实现了它,但我必须使用 Python (v3) 设置一个简单的 HTTP 服务器。这个链接帮助很大:http ://www.linuxjournal.com/content/tech-tip-really-simple-http-server-python 因此,您从 Babylon index.html 所在的目录运行 Python HTTP 服务器,它就像 HTTP 绕过 Chrome 中的本地文件访问限制一样运行。所以我的问题几乎得到了解答。我现在将来自 Test.Baylon 文件的网格几何体放入我的主场景中。使用 SceneLoader.Load 仍然存在问题,因为进来的新场景取代了我的原始场景并且原始几何体消失了。大卫-我认为您对所需功能的看法是正确的,尽管我认为这是可选的。正如我所说,教程示例创建一个 newScene 并在函数内呈现,在我的情况下,我不知道在函数中做什么......也许只是“返回”?

于 2016-04-20T08:07:49.293 回答