Babylon JS - 本地文件中的SceneLoader

时间:2016-04-19 09:00:27

标签: javascript babylonjs

新的Babylon JS用户,希望快速掌握这个梦幻般的框架。玩过Sandbox和在线编辑器,使用标准组件 - Box,Sphere等从头开始编写我自己的编码模型。我的问题涉及如何加载更复杂的自定义几何体。非常适合使用3D CAD - STL / OBJ文件,从Blender到.Babylon格式进行了一些输出,这些格式导入了巴比伦的在线Sandbox& amp;编辑。但是,我似乎无法让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模式下运行,仍然停留在加载页面上。我需要一个Web服务器(我不知道从哪里开始!)或者我可以在本地运行Babylon场景吗?

3 个答案:

答案 0 :(得分:1)

所以我对这个答案并不是100%肯定,但希望它会有所帮助。我遵循了这个tutorial(跳到场景加载的部分)。一个问题绝对是交叉起源的事情,另一个问题是你如何调用SceneLoader.Load方法。

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

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

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

答案 1 :(得分:1)

好的 - porgress。 我使用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作为新场景进入取代我的原始场景并且原始几何消失。大卫 - 我认为你对所需的功能是正确的,尽管我认为这是可选的。正如我所说,Tutorial示例创建了一个newScene并在函数内呈现,在我的情况下我不知道该在函数中做什么...也许只是'return'?

答案 2 :(得分:0)

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

解决方案:使用网络服务器,例如简单HTTP服务器(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方法将覆盖先前加载的网格。

解决方案:

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